diff --git a/src/writer/glsl/generator_impl.cc b/src/writer/glsl/generator_impl.cc
index 2331565..66bf4da 100644
--- a/src/writer/glsl/generator_impl.cc
+++ b/src/writer/glsl/generator_impl.cc
@@ -324,6 +324,54 @@
   return true;
 }
 
+bool GeneratorImpl::EmitBitwiseBoolOp(std::ostream& out,
+                                      const ast::BinaryExpression* expr) {
+  auto* bool_type = TypeOf(expr->lhs)->UnwrapRef();
+  auto* uint_type = BoolTypeToUint(bool_type);
+
+  // Cast result to bool scalar or vector type.
+  if (!EmitType(out, bool_type, ast::StorageClass::kNone,
+                ast::Access::kReadWrite, "")) {
+    return false;
+  }
+  ScopedParen outerCastParen(out);
+  // Cast LHS to uint scalar or vector type.
+  if (!EmitType(out, uint_type, ast::StorageClass::kNone,
+                ast::Access::kReadWrite, "")) {
+    return false;
+  }
+  {
+    ScopedParen innerCastParen(out);
+    // Emit LHS.
+    if (!EmitExpression(out, expr->lhs)) {
+      return false;
+    }
+  }
+  // Emit operator.
+  if (expr->op == ast::BinaryOp::kAnd) {
+    out << " & ";
+  } else if (expr->op == ast::BinaryOp::kOr) {
+    out << " | ";
+  } else {
+    TINT_ICE(Writer, diagnostics_)
+        << "unexpected binary op: " << FriendlyName(expr->op);
+    return false;
+  }
+  // Cast RHS to uint scalar or vector type.
+  if (!EmitType(out, uint_type, ast::StorageClass::kNone,
+                ast::Access::kReadWrite, "")) {
+    return false;
+  }
+  {
+    ScopedParen innerCastParen(out);
+    // Emit RHS.
+    if (!EmitExpression(out, expr->rhs)) {
+      return false;
+    }
+  }
+  return true;
+}
+
 bool GeneratorImpl::EmitBinary(std::ostream& out,
                                const ast::BinaryExpression* expr) {
   if (IsRelational(expr->op) && !TypeOf(expr->lhs)->UnwrapRef()->is_scalar()) {
@@ -363,6 +411,10 @@
     out << "(" << name << ")";
     return true;
   }
+  if ((expr->op == ast::BinaryOp::kAnd || expr->op == ast::BinaryOp::kOr) &&
+      TypeOf(expr->lhs)->UnwrapRef()->is_bool_scalar_or_vector()) {
+    return EmitBitwiseBoolOp(out, expr);
+  }
 
   out << "(";
   if (!EmitExpression(out, expr->lhs)) {
@@ -2737,6 +2789,17 @@
   return true;
 }
 
+sem::Type* GeneratorImpl::BoolTypeToUint(const sem::Type* type) {
+  auto* u32 = builder_.create<sem::U32>();
+  if (type->Is<sem::Bool>()) {
+    return u32;
+  } else if (auto* vec = type->As<sem::Vector>()) {
+    return builder_.create<sem::Vector>(u32, vec->Width());
+  } else {
+    return nullptr;
+  }
+}
+
 }  // namespace glsl
 }  // namespace writer
 }  // namespace tint
diff --git a/src/writer/glsl/generator_impl.h b/src/writer/glsl/generator_impl.h
index 886cf9e..c03d1b7 100644
--- a/src/writer/glsl/generator_impl.h
+++ b/src/writer/glsl/generator_impl.h
@@ -73,6 +73,11 @@
   /// @param stmt the statement to emit
   /// @returns true if the statement was emitted successfully
   bool EmitAssign(const ast::AssignmentStatement* stmt);
+  /// Handles emission of bitwise operators (&|) on bool scalars and vectors
+  /// @param out the output of the expression stream
+  /// @param expr the binary expression
+  /// @returns true if the expression was emitted, false otherwise
+  bool EmitBitwiseBoolOp(std::ostream& out, const ast::BinaryExpression* expr);
   /// Handles generating a binary expression
   /// @param out the output of the expression stream
   /// @param expr the binary expression
@@ -470,6 +475,11 @@
                          const sem::Builtin* builtin,
                          F&& build);
 
+  /// Create a uint type corresponding to the given bool or bool vector type.
+  /// @param type the bool or bool vector type to convert
+  /// @returns the corresponding uint type
+  sem::Type* BoolTypeToUint(const sem::Type* type);
+
   TextBuffer helpers_;  // Helper functions emitted at the top of the output
   std::function<bool()> emit_continuing_;
   std::unordered_map<DMAIntrinsic, std::string, DMAIntrinsic::Hasher>
diff --git a/test/benchmark/particles.wgsl.expected.glsl b/test/benchmark/particles.wgsl.expected.glsl
index 399de23..b0eccd3 100644
--- a/test/benchmark/particles.wgsl.expected.glsl
+++ b/test/benchmark/particles.wgsl.expected.glsl
@@ -185,7 +185,7 @@
       for(int level = (textureQueryLevels(tint_symbol_1); - 1); (level > 0); level = (level - 1)) {
         vec4 probabilites = texelFetch(tint_symbol_1, coord, level);
         vec4 value = vec4(rand());
-        bvec4 mask = (greaterThanEqual(value, vec4(0.0f, probabilites.xyz)) & lessThan(value, probabilites));
+        bvec4 mask = bvec4(uvec4(greaterThanEqual(value, vec4(0.0f, probabilites.xyz))) & uvec4(lessThan(value, probabilites)));
         coord = (coord * 2);
         coord.x = (coord.x + (any(mask.yw) ? 1 : 0));
         coord.y = (coord.y + (any(mask.zw) ? 1 : 0));
diff --git a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_UseInPhiCountsAsUse.spvasm.expected.glsl b/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_UseInPhiCountsAsUse.spvasm.expected.glsl
deleted file mode 100644
index 6def1e9..0000000
--- a/test/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_UseInPhiCountsAsUse.spvasm.expected.glsl
+++ /dev/null
@@ -1,38 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-struct S {
-  uint field0;
-  float field1;
-  uint field2[2];
-};
-
-void main_1() {
-  bool x_101_phi = false;
-  bool x_11 = (true & true);
-  bool x_12 = !(x_11);
-  x_101_phi = x_11;
-  if (true) {
-    x_101_phi = x_12;
-  }
-  bool x_101 = x_101_phi;
-  return;
-}
-
-void tint_symbol() {
-  main_1();
-}
-
-void main() {
-  tint_symbol();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:12: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' const bool' and a right operand of type ' const bool' (or there is no acceptable conversion)
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/unittest/reader/spirv/SpvParserTest_LogicalAnd_SpvBinaryLogicalTest_EmitExpression_0.spvasm.expected.glsl b/test/unittest/reader/spirv/SpvParserTest_LogicalAnd_SpvBinaryLogicalTest_EmitExpression_0.spvasm.expected.glsl
deleted file mode 100644
index 55da344..0000000
--- a/test/unittest/reader/spirv/SpvParserTest_LogicalAnd_SpvBinaryLogicalTest_EmitExpression_0.spvasm.expected.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-void main_1() {
-  bool x_1 = (true & false);
-  return;
-}
-
-void tint_symbol() {
-  main_1();
-}
-
-void main() {
-  tint_symbol();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' const bool' and a right operand of type ' const bool' (or there is no acceptable conversion)
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/unittest/reader/spirv/SpvParserTest_LogicalAnd_SpvBinaryLogicalTest_EmitExpression_1.spvasm.expected.glsl b/test/unittest/reader/spirv/SpvParserTest_LogicalAnd_SpvBinaryLogicalTest_EmitExpression_1.spvasm.expected.glsl
deleted file mode 100644
index 2a8b795..0000000
--- a/test/unittest/reader/spirv/SpvParserTest_LogicalAnd_SpvBinaryLogicalTest_EmitExpression_1.spvasm.expected.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-void main_1() {
-  bvec2 x_1 = (bvec2(true, false) & bvec2(false, true));
-  return;
-}
-
-void tint_symbol() {
-  main_1();
-}
-
-void main() {
-  tint_symbol();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' const 2-component vector of bool' and a right operand of type ' const 2-component vector of bool' (or there is no acceptable conversion)
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/unittest/reader/spirv/SpvParserTest_LogicalOr_SpvBinaryLogicalTest_EmitExpression_0.spvasm.expected.glsl b/test/unittest/reader/spirv/SpvParserTest_LogicalOr_SpvBinaryLogicalTest_EmitExpression_0.spvasm.expected.glsl
deleted file mode 100644
index b8752ad..0000000
--- a/test/unittest/reader/spirv/SpvParserTest_LogicalOr_SpvBinaryLogicalTest_EmitExpression_0.spvasm.expected.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-void main_1() {
-  bool x_1 = (true | false);
-  return;
-}
-
-void tint_symbol() {
-  main_1();
-}
-
-void main() {
-  tint_symbol();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type ' const bool' and a right operand of type ' const bool' (or there is no acceptable conversion)
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/unittest/reader/spirv/SpvParserTest_LogicalOr_SpvBinaryLogicalTest_EmitExpression_1.spvasm.expected.glsl b/test/unittest/reader/spirv/SpvParserTest_LogicalOr_SpvBinaryLogicalTest_EmitExpression_1.spvasm.expected.glsl
deleted file mode 100644
index e83a55d..0000000
--- a/test/unittest/reader/spirv/SpvParserTest_LogicalOr_SpvBinaryLogicalTest_EmitExpression_1.spvasm.expected.glsl
+++ /dev/null
@@ -1,25 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-void main_1() {
-  bvec2 x_1 = (bvec2(true, false) | bvec2(false, true));
-  return;
-}
-
-void tint_symbol() {
-  main_1();
-}
-
-void main() {
-  tint_symbol();
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:5: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type ' const 2-component vector of bool' and a right operand of type ' const 2-component vector of bool' (or there is no acceptable conversion)
-ERROR: 0:5: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 237995c..0000000
--- a/test/vk-gl-cts/graphicsfuzz/control-flow-in-function/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,216 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_25;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec3 drawShape_vf2_(inout vec2 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;
-  mat4x2 GLF_live7m42 = mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  mat3 GLF_live7m33 = mat3(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.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  int GLF_live7c_1 = 0;
-  int GLF_live7r_1 = 0;
-  int x_180 = 0;
-  mat3 indexable = mat3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  float x_182 = pos.x;
-  c2 = (x_182 > 1.0f);
-  if (c2) {
-    return vec3(1.0f, 1.0f, 1.0f);
-  }
-  float x_188 = pos.y;
-  c3 = (x_188 < 1.0f);
-  if (c3) {
-    return vec3(1.0f, 1.0f, 1.0f);
-  }
-  float x_194 = pos.y;
-  c4 = (x_194 > 1.0f);
-  if (c4) {
-    return vec3(1.0f, 1.0f, 1.0f);
-  }
-  float x_200 = pos.x;
-  c5 = (x_200 < 1.0f);
-  if (c5) {
-    return vec3(1.0f, 1.0f, 1.0f);
-  }
-  float x_206 = pos.x;
-  c6 = ((x_206 + 1.0f) > 1.0f);
-  if (c6) {
-    return vec3(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 = mat4x2(vec2(1.0f, 0.0f), vec2(0.0f, 1.0f), vec2(0.0f, 0.0f), vec2(1.0f, 0.0f));
-      GLF_live7m33 = mat3(vec3(1.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), vec3(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);
-                      GLF_live7m33[(((GLF_live7c >= 0) & (GLF_live7c < 3)) ? GLF_live7c : 0)][(((GLF_live7r >= 0) & (GLF_live7r < 3)) ? GLF_live7r : 0)] = 1.0f;
-                      float x_267 = x_25.injectionSwitch.y;
-                      if ((0.0f > x_267)) {
-                      } else {
-                        GLF_live7m42[(((GLF_live7c >= 0) & (GLF_live7c < 4)) ? GLF_live7c : 0)][(((GLF_live7r >= 0) & (GLF_live7r < 2)) ? 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;
-          GLF_live7sums[(((GLF_live7sum_index >= 0) & (GLF_live7sum_index < 9)) ? 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)) {
-                  int x_310 = (((GLF_live7sum_index >= 0) & (GLF_live7sum_index < 9)) ? GLF_live7sum_index : 0);
-                  mat3 x_312 = transpose(GLF_live7m33);
-                  if ((GLF_live7c_1 < 3)) {
-                    x_180 = 1;
-                  } else {
-                    float x_318 = x_25.injectionSwitch.x;
-                    x_180 = int(x_318);
-                  }
-                  int x_320 = x_180;
-                  int x_93 = GLF_live7r_1;
-                  indexable = x_312;
-                  float x_324 = indexable[x_320][((x_93 < 3) ? 1 : 0)];
-                  float x_326 = GLF_live7sums[x_310];
-                  GLF_live7sums[x_310] = (x_326 + x_324);
-                  int x_332 = (((GLF_live7sum_index >= 0) & (GLF_live7sum_index < 9)) ? GLF_live7sum_index : 0);
-                  float x_334 = GLF_live7m42[1][GLF_live7r_1];
-                  float x_336 = GLF_live7sums[x_332];
-                  GLF_live7sums[x_332] = (x_336 + x_334);
-                }
-              }
-            }
-          }
-          GLF_live7sum_index = (GLF_live7sum_index + 1);
-        }
-      }
-    }
-  }
-  return vec3(1.0f, 1.0f, 1.0f);
-}
-
-void main_1() {
-  vec2 position = vec2(0.0f, 0.0f);
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  int i = 0;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  float x_161 = x_25.injectionSwitch.x;
-  if ((x_161 >= 2.0f)) {
-    vec4 x_165 = tint_symbol;
-    position = vec2(x_165.x, x_165.y);
-    param = position;
-    vec3 x_168 = drawShape_vf2_(param);
-    param_1 = position;
-    vec3 x_170 = drawShape_vf2_(param_1);
-    i = 25;
-    {
-      for(; (i > 0); i = (i - 1)) {
-        param_2 = position;
-        vec3 x_178 = drawShape_vf2_(param_2);
-      }
-    }
-  }
-  x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:105: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:105: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 7ccedbd..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-module-small-number/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,99 +0,0 @@
-SKIP: FAILED
-
-warning: use of deprecated builtin
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf1 {
-  strided_arr x_GLF_uniform_int_values[2];
-};
-
-struct strided_arr_1 {
-  float el;
-};
-
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_float_values[1];
-};
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 1) uniform buf1_1 {
-  strided_arr x_GLF_uniform_int_values[2];
-} x_8;
-
-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 * floor((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;
-  float x_42 = s1;
-  f1 = (10.0f - (x_42 * floor((10.0f / x_42))));
-  bool x_48 = (isinf(f1) | (s1 == 1.0f));
-  x_73_phi = x_48;
-  if (!(x_48)) {
-    bool x_54 = (f0 == f1);
-    x_63_phi = x_54;
-    if (!(x_54)) {
-      x_62 = ((f0 > 0.99000001f) & (f0 < 0.01f));
-      x_63_phi = x_62;
-    }
-    bool x_63 = x_63_phi;
-    x_72_phi = x_63;
-    if (!(x_63)) {
-      x_71 = ((f1 > 0.99000001f) & (f1 < 0.01f));
-      x_72_phi = x_71;
-    }
-    x_72 = x_72_phi;
-    x_73_phi = x_72;
-  }
-  if ((x_73_phi | (f1 == 10.0f))) {
-    int x_81 = x_8.x_GLF_uniform_int_values[1].el;
-    int x_84 = x_8.x_GLF_uniform_int_values[0].el;
-    int x_87 = x_8.x_GLF_uniform_int_values[0].el;
-    int x_90 = x_8.x_GLF_uniform_int_values[1].el;
-    x_GLF_color = vec4(float(x_81), float(x_84), float(x_87), float(x_90));
-  } else {
-    int x_94 = x_8.x_GLF_uniform_int_values[0].el;
-    float x_95 = float(x_94);
-    x_GLF_color = vec4(x_95, x_95, x_95, x_95);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:43: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:43: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.glsl
deleted file mode 100644
index c42e697..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-apfloat-tanh/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,44 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  vec4 v = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  float dist1 = 0.0f;
-  float dist2 = 0.0f;
-  v = vec4(1.0f, 2.0f, 3.0f, 4.0f);
-  dist1 = distance(tanh(v), (sinh(v) / cosh(v)));
-  dist2 = distance(tanh(v), vec4(0.761590004f, 0.964030027f, 0.995050013f, 0.999329984f));
-  if (((dist1 < 0.100000001f) & (dist2 < 0.100000001f))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:13: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.glsl
deleted file mode 100644
index c191135..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-const-folding-clamp-inside-while/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,50 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(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);
-  }
-  if (((i == 9) & (j == 10))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:19: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:19: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.glsl
deleted file mode 100644
index f5fd0fd..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-constant-folding-atan-over-tanh/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  float f = 0.0f;
-  f = atan(1.0f, tanh(1.0f));
-  if (((f > 0.910000026f) & (f < 0.930000007f))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:9: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:9: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 1a75fe7..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-divide-matrix-transpose-by-constant/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat2 m = mat2(0.0f, 0.0f, 0.0f, 0.0f);
-  m = (transpose(mat2(vec2(1.0f, 2.0f), vec2(3.0f, 4.0f))) * (1.0f / 2.0f));
-  mat2 x_33 = m;
-  if ((all(equal(x_33[0u], mat2(vec2(0.5f, 1.5f), vec2(1.0f, 2.0f))[0u])) & all(equal(x_33[1u], mat2(vec2(0.5f, 1.5f), vec2(1.0f, 2.0f))[1u])))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:10: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:10: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.glsl
deleted file mode 100644
index 07c55d6..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-const-variable/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,40 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  bool a = false;
-  a = false;
-  if ((true & a)) {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  } else {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:9: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' const bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:9: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.glsl
deleted file mode 100644
index b898335..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-and-constant/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  int i = 0;
-  i = 2;
-  while (true) {
-    i = (i + 1);
-    {
-      float x_35 = tint_symbol.x;
-      if (((x_35 >= 0.0f) & false)) {
-      } else {
-        break;
-      }
-    }
-  }
-  if ((i == 3)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:14: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' const bool' (or there is no acceptable conversion)
-ERROR: 0:14: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.glsl
deleted file mode 100644
index e0962bf..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-logical-or-constant/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,41 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  float x_22 = tint_symbol.x;
-  if (((x_22 < 0.0f) | true)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:9: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' const bool' (or there is no acceptable conversion)
-ERROR: 0:9: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.glsl
deleted file mode 100644
index a575f8d..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-fold-shift-gte32/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,82 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  uint one;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  uint one;
-} x_6;
-
-vec4 x_GLF_color = vec4(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;
-  uint x_41 = x_6.one;
-  a = ((77u + x_41) >> 32u);
-  uint x_45 = x_6.one;
-  b = ((3243u + x_45) >> 33u);
-  uint x_49 = x_6.one;
-  c = ((23u + x_49) >> 345u);
-  uint x_53 = x_6.one;
-  d = ((2395u + x_53) << 32u);
-  uint x_57 = x_6.one;
-  e = ((290485u + x_57) << 33u);
-  uint x_61 = x_6.one;
-  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;
-  }
-  if (((((((a == 1u) & (b == 0u)) & (c == 1u)) & (d == 0u)) & (e == 1u)) & (f == 0u))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:51: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:51: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 01f5b05..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-div-mul/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  float one;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  float one;
-} x_6;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  float f = 0.0f;
-  float x_28 = x_6.one;
-  f = (4.0f / (2.0f * x_28));
-  if (((f > 1.899999976f) & (f < 2.099999905f))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:18: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:18: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.glsl
deleted file mode 100644
index b2ee650..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-divs/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  float four;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  float four;
-} x_6;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  float a = 0.0f;
-  float x_27 = x_6.four;
-  a = (2.0f / (1.0f / x_27));
-  if (((a > 7.900000095f) & (a < 8.100000381f))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:18: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:18: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.glsl
deleted file mode 100644
index eb1e063..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-folding-rules-merge-mul-div/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,49 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  float one;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  float one;
-} x_6;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  float f = 0.0f;
-  float x_28 = x_6.one;
-  f = (4.0f * (2.0f / x_28));
-  if (((f > 7.900000095f) & (f < 8.100000381f))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:18: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:18: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.glsl
deleted file mode 100644
index e9dcfbe..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-global-loop-counter-main-function-call/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,89 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_int_values[3];
-};
-
-int x_GLF_global_loop_count = 0;
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_int_values[3];
-} x_7;
-
-vec4 x_GLF_color = vec4(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);
-    int x_78 = x_7.x_GLF_uniform_int_values[0].el;
-    return x_78;
-  }
-  int x_80 = x_7.x_GLF_uniform_int_values[2].el;
-  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;
-    }
-    {
-      if ((true & (x_GLF_global_loop_count < 100))) {
-      } else {
-        break;
-      }
-    }
-  }
-  int x_42 = func_();
-  a = x_42;
-  int x_43 = a;
-  int x_45 = x_7.x_GLF_uniform_int_values[2].el;
-  if ((x_43 == x_45)) {
-    int x_51 = x_7.x_GLF_uniform_int_values[0].el;
-    int x_54 = x_7.x_GLF_uniform_int_values[1].el;
-    int x_57 = x_7.x_GLF_uniform_int_values[1].el;
-    int x_60 = x_7.x_GLF_uniform_int_values[0].el;
-    x_GLF_color = vec4(float(x_51), float(x_54), float(x_57), float(x_60));
-  } else {
-    int x_64 = x_7.x_GLF_uniform_int_values[1].el;
-    float x_65 = float(x_64);
-    x_GLF_color = vec4(x_65, x_65, x_65, x_65);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:42: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' const bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:42: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 3fbdde5..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-increment-multiple-integers/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,111 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_int_values[5];
-};
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_int_values[5];
-} x_6;
-
-vec4 x_GLF_color = vec4(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;
-  int x_31 = x_6.x_GLF_uniform_int_values[0].el;
-  a = x_31;
-  int x_33 = x_6.x_GLF_uniform_int_values[2].el;
-  b = x_33;
-  c = 1;
-  while (true) {
-    int x_38 = b;
-    int x_40 = x_6.x_GLF_uniform_int_values[4].el;
-    if (((x_38 < x_40) & (a < 10))) {
-    } else {
-      break;
-    }
-    if ((c > 5)) {
-      break;
-    }
-    a = (a + 1);
-    c = (c + 1);
-    b = (b + 1);
-  }
-  while (true) {
-    int x_60 = a;
-    int x_62 = x_6.x_GLF_uniform_int_values[1].el;
-    if ((x_60 < x_62)) {
-    } else {
-      break;
-    }
-    {
-      a = (a + 1);
-    }
-  }
-  int x_67 = a;
-  int x_69 = x_6.x_GLF_uniform_int_values[1].el;
-  bool x_70 = (x_67 == x_69);
-  x_77_phi = x_70;
-  if (x_70) {
-    int x_73 = b;
-    int x_75 = x_6.x_GLF_uniform_int_values[3].el;
-    x_76 = (x_73 == x_75);
-    x_77_phi = x_76;
-  }
-  bool x_77 = x_77_phi;
-  x_84_phi = x_77;
-  if (x_77) {
-    int x_80 = c;
-    int x_82 = x_6.x_GLF_uniform_int_values[3].el;
-    x_83 = (x_80 == x_82);
-    x_84_phi = x_83;
-  }
-  if (x_84_phi) {
-    int x_89 = x_6.x_GLF_uniform_int_values[2].el;
-    int x_92 = x_6.x_GLF_uniform_int_values[0].el;
-    int x_95 = x_6.x_GLF_uniform_int_values[0].el;
-    int x_98 = x_6.x_GLF_uniform_int_values[2].el;
-    x_GLF_color = vec4(float(x_89), float(x_92), float(x_95), float(x_98));
-  } else {
-    int x_102 = x_6.x_GLF_uniform_int_values[0].el;
-    float x_103 = float(x_102);
-    x_GLF_color = vec4(x_103, x_103, x_103, x_103);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:34: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:34: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.glsl
deleted file mode 100644
index cea0071..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-condition-double-negate/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,107 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_int_values[6];
-};
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_int_values[6];
-} x_6;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  int arr[3] = int[3](0, 0, 0);
-  int index = 0;
-  bool x_76 = false;
-  bool x_86 = false;
-  bool x_77_phi = false;
-  bool x_87_phi = false;
-  int x_33 = x_6.x_GLF_uniform_int_values[3].el;
-  int x_35 = x_6.x_GLF_uniform_int_values[5].el;
-  int x_37 = x_6.x_GLF_uniform_int_values[2].el;
-  int tint_symbol_1[3] = int[3](x_33, x_35, x_37);
-  arr = tint_symbol_1;
-  index = 1;
-  while (true) {
-    bool x_51 = false;
-    bool x_52_phi = false;
-    x_52_phi = true;
-    if (true) {
-      int x_46 = x_6.x_GLF_uniform_int_values[0].el;
-      x_51 = !(((x_46 == 1) & (index <= 1)));
-      x_52_phi = x_51;
-    }
-    if (!(x_52_phi)) {
-    } else {
-      break;
-    }
-    int x_56_save = index;
-    int x_57 = arr[x_56_save];
-    arr[x_56_save] = (x_57 + 1);
-    index = (index + 1);
-  }
-  int x_62 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_64 = arr[x_62];
-  int x_66 = x_6.x_GLF_uniform_int_values[3].el;
-  bool x_67 = (x_64 == x_66);
-  x_77_phi = x_67;
-  if (x_67) {
-    int x_71 = x_6.x_GLF_uniform_int_values[0].el;
-    int x_73 = arr[x_71];
-    int x_75 = x_6.x_GLF_uniform_int_values[4].el;
-    x_76 = (x_73 == x_75);
-    x_77_phi = x_76;
-  }
-  bool x_77 = x_77_phi;
-  x_87_phi = x_77;
-  if (x_77) {
-    int x_81 = x_6.x_GLF_uniform_int_values[3].el;
-    int x_83 = arr[x_81];
-    int x_85 = x_6.x_GLF_uniform_int_values[2].el;
-    x_86 = (x_83 == x_85);
-    x_87_phi = x_86;
-  }
-  if (x_87_phi) {
-    int x_92 = x_6.x_GLF_uniform_int_values[0].el;
-    int x_95 = x_6.x_GLF_uniform_int_values[1].el;
-    int x_98 = x_6.x_GLF_uniform_int_values[1].el;
-    int x_101 = x_6.x_GLF_uniform_int_values[0].el;
-    x_GLF_color = vec4(float(x_92), float(x_95), float(x_98), float(x_101));
-  } else {
-    int x_105 = x_6.x_GLF_uniform_int_values[1].el;
-    float x_106 = float(x_105);
-    x_GLF_color = vec4(x_106, x_106, x_106, x_106);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_2 = main_out(x_GLF_color);
-  return tint_symbol_2;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 97f36d5..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-loop-increment-matrix-element-break-after-first-iteration/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,114 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  float el;
-};
-
-struct buf1 {
-  strided_arr x_GLF_uniform_float_values[2];
-};
-
-struct strided_arr_1 {
-  int el;
-};
-
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_int_values[4];
-};
-
-layout(binding = 1) uniform buf1_1 {
-  strided_arr x_GLF_uniform_float_values[2];
-} x_7;
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr_1 x_GLF_uniform_int_values[4];
-} x_10;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat2x3 m23 = mat2x3(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  int i = 0;
-  float x_46 = x_7.x_GLF_uniform_float_values[1].el;
-  m23 = mat2x3(vec3(x_46, 0.0f, 0.0f), vec3(0.0f, x_46, 0.0f));
-  i = 1;
-  while (true) {
-    bool x_80 = false;
-    bool x_81_phi = false;
-    int x_54 = i;
-    int x_56 = x_10.x_GLF_uniform_int_values[3].el;
-    if ((x_54 < x_56)) {
-    } else {
-      break;
-    }
-    int x_60 = x_10.x_GLF_uniform_int_values[0].el;
-    int x_62 = x_10.x_GLF_uniform_int_values[2].el;
-    float x_64 = x_7.x_GLF_uniform_float_values[0].el;
-    float x_66 = m23[x_60][x_62];
-    m23[x_60][x_62] = (x_66 + x_64);
-    float x_70 = tint_symbol.y;
-    float x_72 = x_7.x_GLF_uniform_float_values[0].el;
-    if ((x_70 < x_72)) {
-    }
-    x_81_phi = true;
-    if (true) {
-      float x_79 = tint_symbol.x;
-      x_80 = (x_79 < 0.0f);
-      x_81_phi = x_80;
-    }
-    if (!(x_81_phi)) {
-      break;
-    }
-    {
-      i = (i + 1);
-    }
-  }
-  mat2x3 x_87 = m23;
-  int x_89 = x_10.x_GLF_uniform_int_values[1].el;
-  int x_92 = x_10.x_GLF_uniform_int_values[1].el;
-  int x_95 = x_10.x_GLF_uniform_int_values[1].el;
-  int x_98 = x_10.x_GLF_uniform_int_values[1].el;
-  int x_101 = x_10.x_GLF_uniform_int_values[1].el;
-  int x_104 = x_10.x_GLF_uniform_int_values[0].el;
-  mat2x3 x_108 = mat2x3(vec3(float(x_89), float(x_92), float(x_95)), vec3(float(x_98), float(x_101), float(x_104)));
-  if ((all(equal(x_87[0u], x_108[0u])) & all(equal(x_87[1u], x_108[1u])))) {
-    int x_122 = x_10.x_GLF_uniform_int_values[0].el;
-    int x_125 = x_10.x_GLF_uniform_int_values[1].el;
-    int x_128 = x_10.x_GLF_uniform_int_values[1].el;
-    int x_131 = x_10.x_GLF_uniform_int_values[0].el;
-    x_GLF_color = vec4(float(x_122), float(x_125), float(x_128), float(x_131));
-  } else {
-    int x_135 = x_10.x_GLF_uniform_int_values[1].el;
-    float x_136 = float(x_135);
-    x_GLF_color = vec4(x_136, x_136, x_136, x_136);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:76: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:76: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 8c470ea..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-matrix-double-transpose/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,64 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_int_values[2];
-};
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_int_values[2];
-} x_6;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat2 m = mat2(0.0f, 0.0f, 0.0f, 0.0f);
-  int x_29 = x_6.x_GLF_uniform_int_values[0].el;
-  float x_30 = float(x_29);
-  m = transpose(transpose(mat2(vec2(x_30, 0.0f), vec2(0.0f, x_30))));
-  mat2 x_36 = m;
-  int x_38 = x_6.x_GLF_uniform_int_values[0].el;
-  float x_39 = float(x_38);
-  mat2 x_42 = mat2(vec2(x_39, 0.0f), vec2(0.0f, x_39));
-  if ((all(equal(x_36[0u], x_42[0u])) & all(equal(x_36[1u], x_42[1u])))) {
-    int x_56 = x_6.x_GLF_uniform_int_values[0].el;
-    int x_59 = x_6.x_GLF_uniform_int_values[1].el;
-    int x_62 = x_6.x_GLF_uniform_int_values[1].el;
-    int x_65 = x_6.x_GLF_uniform_int_values[0].el;
-    x_GLF_color = vec4(float(x_56), float(x_59), float(x_62), float(x_65));
-  } else {
-    int x_69 = x_6.x_GLF_uniform_int_values[1].el;
-    float x_70 = float(x_69);
-    x_GLF_color = vec4(x_70, x_70, x_70, x_70);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:27: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:27: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 7095408..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-nested-functions-accumulate-global-matrix/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,151 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf2 {
-  float one;
-};
-
-struct strided_arr {
-  float el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_float_values[1];
-};
-
-struct strided_arr_1 {
-  int el;
-};
-
-struct buf1 {
-  strided_arr_1 x_GLF_uniform_int_values[4];
-};
-
-mat4x2 m = mat4x2(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 2) uniform buf2_1 {
-  float one;
-} x_10;
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_float_values[1];
-} x_12;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 1) uniform buf1_1 {
-  strided_arr_1 x_GLF_uniform_int_values[4];
-} x_16;
-
-vec4 x_GLF_color = vec4(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;
-  int x_124 = x;
-  bool x_125 = (x_124 < 1);
-  x_139_phi = x_125;
-  if (!(x_125)) {
-    int x_129 = x;
-    bool x_130 = (x_129 > 1);
-    x_138_phi = x_130;
-    if (x_130) {
-      float x_134 = x_10.one;
-      float x_136 = x_12.x_GLF_uniform_float_values[0].el;
-      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;
-  }
-  float x_143 = x_10.one;
-  float x_145 = x_12.x_GLF_uniform_float_values[0].el;
-  if ((x_143 == x_145)) {
-    i = 0;
-    while (true) {
-      if ((i < 2)) {
-      } else {
-        break;
-      }
-      {
-        int x_154 = x;
-        int x_155 = clamp(x_154, 0, 3);
-        int x_156 = i;
-        float x_158 = x_12.x_GLF_uniform_float_values[0].el;
-        float x_160 = m[x_155][x_156];
-        m[x_155][x_156] = (x_160 + x_158);
-        i = (i + 1);
-      }
-    }
-  }
-  return;
-}
-
-void func1_() {
-  int param = 0;
-  float x_167 = tint_symbol.y;
-  if ((x_167 < 0.0f)) {
-    return;
-  }
-  param = 1;
-  func0_i1_(param);
-  return;
-}
-
-void main_1() {
-  m = mat4x2(vec2(0.0f, 0.0f), vec2(0.0f, 0.0f), vec2(0.0f, 0.0f), vec2(0.0f, 0.0f));
-  func1_();
-  func1_();
-  mat4x2 x_54 = m;
-  int x_56 = x_16.x_GLF_uniform_int_values[0].el;
-  int x_59 = x_16.x_GLF_uniform_int_values[0].el;
-  int x_62 = x_16.x_GLF_uniform_int_values[1].el;
-  int x_65 = x_16.x_GLF_uniform_int_values[1].el;
-  int x_68 = x_16.x_GLF_uniform_int_values[0].el;
-  int x_71 = x_16.x_GLF_uniform_int_values[0].el;
-  int x_74 = x_16.x_GLF_uniform_int_values[0].el;
-  int x_77 = x_16.x_GLF_uniform_int_values[0].el;
-  mat4x2 x_83 = mat4x2(vec2(float(x_56), float(x_59)), vec2(float(x_62), float(x_65)), vec2(float(x_68), float(x_71)), vec2(float(x_74), float(x_77)));
-  if ((((all(equal(x_54[0u], x_83[0u])) & all(equal(x_54[1u], x_83[1u]))) & all(equal(x_54[2u], x_83[2u]))) & all(equal(x_54[3u], x_83[3u])))) {
-    int x_107 = x_16.x_GLF_uniform_int_values[3].el;
-    int x_110 = x_16.x_GLF_uniform_int_values[0].el;
-    int x_113 = x_16.x_GLF_uniform_int_values[0].el;
-    int x_116 = x_16.x_GLF_uniform_int_values[3].el;
-    x_GLF_color = vec4(float(x_107), float(x_110), float(x_113), float(x_116));
-  } else {
-    int x_120 = x_16.x_GLF_uniform_int_values[0].el;
-    float x_121 = float(x_120);
-    x_GLF_color = vec4(x_121, x_121, x_121, x_121);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:113: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:113: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.glsl
deleted file mode 100644
index e436d2b..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-pow-undefined/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,63 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  float el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_float_values[2];
-};
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_float_values[2];
-} x_8;
-
-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);
-  float x_30 = c;
-  x_GLF_color = vec4(x_30, x_30, x_30, x_30);
-  if (((a == -1.0f) & (b == 1.700000048f))) {
-    float x_41 = x_8.x_GLF_uniform_float_values[0].el;
-    float x_43 = x_8.x_GLF_uniform_float_values[1].el;
-    float x_45 = x_8.x_GLF_uniform_float_values[1].el;
-    float x_47 = x_8.x_GLF_uniform_float_values[0].el;
-    x_GLF_color = vec4(x_41, x_43, x_45, x_47);
-  } else {
-    float x_50 = x_8.x_GLF_uniform_float_values[0].el;
-    x_GLF_color = vec4(x_50, x_50, x_50, x_50);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:27: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:27: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.glsl
deleted file mode 100644
index 5e8bad9..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-reduce-load-array-replace-extract/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,61 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  int zero;
-};
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  int zero;
-} x_5;
-
-void main_1() {
-  int x_9[1] = int[1](0);
-  int x_10_phi = 0;
-  int x_6 = x_9[0u];
-  while (true) {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-    int x_7 = x_5.zero;
-    int x_8 = x_9[x_7];
-    if ((x_8 == x_6)) {
-      x_10_phi = 1;
-      break;
-    }
-    x_10_phi = 2;
-    break;
-  }
-  int x_10 = x_10_phi;
-  if (((x_10 == 1) | (x_10 == 2))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:30: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:30: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.glsl
deleted file mode 100644
index c7dea64..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-reinitialize-matrix-after-undefined-value/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,102 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf0 {
-  strided_arr x_GLF_uniform_int_values[4];
-};
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr x_GLF_uniform_int_values[4];
-} x_5;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat2 m = mat2(0.0f, 0.0f, 0.0f, 0.0f);
-  float f = 0.0f;
-  int i = 0;
-  int j = 0;
-  int x_36 = x_5.x_GLF_uniform_int_values[1].el;
-  if ((x_36 == 1)) {
-    float x_40 = f;
-    m = mat2(vec2(x_40, 0.0f), vec2(0.0f, x_40));
-  }
-  int x_45 = x_5.x_GLF_uniform_int_values[1].el;
-  i = x_45;
-  while (true) {
-    int x_50 = i;
-    int x_52 = x_5.x_GLF_uniform_int_values[0].el;
-    if ((x_50 < x_52)) {
-    } else {
-      break;
-    }
-    int x_56 = x_5.x_GLF_uniform_int_values[1].el;
-    j = x_56;
-    while (true) {
-      int x_61 = j;
-      int x_63 = x_5.x_GLF_uniform_int_values[0].el;
-      if ((x_61 < x_63)) {
-      } else {
-        break;
-      }
-      int x_66 = i;
-      int x_67 = j;
-      int x_68 = i;
-      int x_70 = x_5.x_GLF_uniform_int_values[0].el;
-      m[x_66][x_67] = float(((x_68 * x_70) + j));
-      {
-        j = (j + 1);
-      }
-    }
-    {
-      i = (i + 1);
-    }
-  }
-  mat2 x_80 = m;
-  int x_82 = x_5.x_GLF_uniform_int_values[1].el;
-  int x_85 = x_5.x_GLF_uniform_int_values[2].el;
-  int x_88 = x_5.x_GLF_uniform_int_values[0].el;
-  int x_91 = x_5.x_GLF_uniform_int_values[3].el;
-  mat2 x_95 = mat2(vec2(float(x_82), float(x_85)), vec2(float(x_88), float(x_91)));
-  if ((all(equal(x_80[0u], x_95[0u])) & all(equal(x_80[1u], x_95[1u])))) {
-    int x_109 = x_5.x_GLF_uniform_int_values[2].el;
-    int x_112 = x_5.x_GLF_uniform_int_values[1].el;
-    int x_115 = x_5.x_GLF_uniform_int_values[1].el;
-    int x_118 = x_5.x_GLF_uniform_int_values[2].el;
-    x_GLF_color = vec4(float(x_109), float(x_112), float(x_115), float(x_118));
-  } else {
-    int x_122 = x_5.x_GLF_uniform_int_values[1].el;
-    float x_123 = float(x_122);
-    x_GLF_color = vec4(x_123, x_123, x_123, x_123);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:65: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:65: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.glsl
index d0cbc9b..c7982a2 100644
--- a/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.glsl
+++ b/test/vk-gl-cts/graphicsfuzz/cov-target-lowering-dfdx-cos/0-opt.spvasm.expected.glsl
@@ -21,7 +21,7 @@
   a = ddx(cos(x_33));
   float x_37 = x_8.two;
   b = mix(2.0f, x_37, a);
-  if (((b >= 1.899999976f) & (b <= 2.099999905f))) {
+  if (bool(uint((b >= 1.899999976f)) & uint((b <= 2.099999905f)))) {
     x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
   } else {
     x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 24594c7..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-transpose-multiply/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,42 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat2 m = mat2(0.0f, 0.0f, 0.0f, 0.0f);
-  m = mat2(vec2(1.0f, 2.0f), vec2(3.0f, 4.0f));
-  mat2 x_30 = (transpose(m) * transpose(m));
-  mat2 x_34 = transpose((m * m));
-  if ((all(equal(x_30[0u], x_34[0u])) & all(equal(x_30[1u], x_34[1u])))) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:11: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:11: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.glsl
deleted file mode 100644
index bb41dfa..0000000
--- a/test/vk-gl-cts/graphicsfuzz/cov-unused-matrix-copy-inside-loop/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,116 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct strided_arr {
-  int el;
-};
-
-struct buf1 {
-  strided_arr x_GLF_uniform_int_values[4];
-};
-
-struct strided_arr_1 {
-  float el;
-};
-
-struct buf0 {
-  strided_arr_1 x_GLF_uniform_float_values[1];
-};
-
-layout(binding = 1) uniform buf1_1 {
-  strided_arr x_GLF_uniform_int_values[4];
-} x_6;
-
-layout(binding = 0) uniform buf0_1 {
-  strided_arr_1 x_GLF_uniform_float_values[1];
-} x_10;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat4 m0 = mat4(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;
-  mat4 m1 = mat4(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_40 = x_6.x_GLF_uniform_int_values[1].el;
-  float x_41 = float(x_40);
-  m0 = mat4(vec4(x_41, 0.0f, 0.0f, 0.0f), vec4(0.0f, x_41, 0.0f, 0.0f), vec4(0.0f, 0.0f, x_41, 0.0f), vec4(0.0f, 0.0f, 0.0f, x_41));
-  int x_48 = x_6.x_GLF_uniform_int_values[2].el;
-  c = x_48;
-  while (true) {
-    int x_53 = c;
-    int x_55 = x_6.x_GLF_uniform_int_values[0].el;
-    if ((x_53 < x_55)) {
-    } else {
-      break;
-    }
-    m1 = m0;
-    int x_59 = c;
-    int x_61 = x_6.x_GLF_uniform_int_values[3].el;
-    int x_64 = x_6.x_GLF_uniform_int_values[2].el;
-    float x_66 = x_10.x_GLF_uniform_float_values[0].el;
-    m1[(x_59 % x_61)][x_64] = x_66;
-    int x_68 = c;
-    int x_70 = x_6.x_GLF_uniform_int_values[3].el;
-    int x_73 = x_6.x_GLF_uniform_int_values[2].el;
-    float x_75 = x_10.x_GLF_uniform_float_values[0].el;
-    m0[(x_68 % x_70)][x_73] = x_75;
-    {
-      c = (c + 1);
-    }
-  }
-  mat4 x_79 = m0;
-  int x_81 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_84 = x_6.x_GLF_uniform_int_values[2].el;
-  int x_87 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_90 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_93 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_96 = x_6.x_GLF_uniform_int_values[2].el;
-  int x_99 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_102 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_105 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_108 = x_6.x_GLF_uniform_int_values[2].el;
-  int x_111 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_114 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_117 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_120 = x_6.x_GLF_uniform_int_values[2].el;
-  int x_123 = x_6.x_GLF_uniform_int_values[1].el;
-  int x_126 = x_6.x_GLF_uniform_int_values[1].el;
-  mat4 x_132 = mat4(vec4(float(x_81), float(x_84), float(x_87), float(x_90)), vec4(float(x_93), float(x_96), float(x_99), float(x_102)), vec4(float(x_105), float(x_108), float(x_111), float(x_114)), vec4(float(x_117), float(x_120), float(x_123), float(x_126)));
-  if ((((all(equal(x_79[0u], x_132[0u])) & all(equal(x_79[1u], x_132[1u]))) & all(equal(x_79[2u], x_132[2u]))) & all(equal(x_79[3u], x_132[3u])))) {
-    int x_156 = x_6.x_GLF_uniform_int_values[2].el;
-    int x_159 = x_6.x_GLF_uniform_int_values[1].el;
-    int x_162 = x_6.x_GLF_uniform_int_values[1].el;
-    int x_165 = x_6.x_GLF_uniform_int_values[2].el;
-    x_GLF_color = vec4(float(x_156), float(x_159), float(x_162), float(x_165));
-  } else {
-    int x_169 = x_6.x_GLF_uniform_int_values[1].el;
-    float x_170 = float(x_169);
-    x_GLF_color = vec4(x_170, x_170, x_170, x_170);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:79: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' global bool' and a right operand of type ' global bool' (or there is no acceptable conversion)
-ERROR: 0:79: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.glsl
deleted file mode 100644
index bbe0055..0000000
--- a/test/vk-gl-cts/graphicsfuzz/loop-dead-if-loop/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,82 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_6;
-
-vec4 x_GLF_color = vec4(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, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-  int donor_replacementGLF_dead0top = 0;
-  int x_54 = 0;
-  vec4 matrix_b = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-  int b = 0;
-  k = 0;
-  {
-    for(; (k < 4); k = (k + 1)) {
-      float x_62 = x_6.injectionSwitch.y;
-      if ((0.0f > x_62)) {
-        GLF_dead0j = 1;
-        while (true) {
-          int x_13 = donor_replacementGLF_dead0stack[0];
-          if ((1 <= x_13)) {
-          } else {
-            break;
-          }
-        }
-        if (((donor_replacementGLF_dead0top >= 0) & (donor_replacementGLF_dead0top < 9))) {
-          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 = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-      b = 3;
-      {
-        for(; (b >= 0); b = (b - 1)) {
-          int x_20 = b;
-          float x_87 = matrix_b[b];
-          matrix_b[x_20] = (x_87 - 1.0f);
-        }
-      }
-    }
-  }
-  x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:35: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:35: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.glsl
deleted file mode 100644
index 91863a8..0000000
--- a/test/vk-gl-cts/graphicsfuzz/nested-loops-switch/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,100 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_6;
-
-vec4 x_GLF_color = vec4(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.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  i = 0;
-  while (true) {
-    int x_45 = i;
-    float x_47 = x_6.injectionSwitch.x;
-    if ((x_45 >= int(x_47))) {
-      break;
-    }
-    float x_53 = x_6.injectionSwitch.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: {
-                          int x_96 = (((msb10 >= 0) & (msb10 < 9)) ? msb10 : 0);
-                          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 = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:46: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:46: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.glsl
deleted file mode 100644
index db85f5d..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,279 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-struct buf1 {
-  vec2 resolution;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_254 = from;
-  k = x_254;
-  int x_255 = from;
-  i = x_255;
-  int x_256 = mid;
-  j = (x_256 + 1);
-  while (true) {
-    int x_262 = i;
-    int x_263 = mid;
-    int x_265 = j;
-    int x_266 = to;
-    if (((x_262 <= x_263) & (x_265 <= x_266))) {
-    } else {
-      break;
-    }
-    int x_272 = data[i];
-    int x_275 = data[j];
-    if ((x_272 < x_275)) {
-      int x_280 = k;
-      k = (x_280 + 1);
-      int x_282 = i;
-      i = (x_282 + 1);
-      int x_285 = data[x_282];
-      temp[x_280] = x_285;
-    } else {
-      int x_287 = k;
-      k = (x_287 + 1);
-      int x_289 = j;
-      j = (x_289 + 1);
-      int x_292 = data[x_289];
-      temp[x_287] = x_292;
-    }
-  }
-  while (true) {
-    int x_298 = i;
-    int x_300 = i;
-    int x_301 = mid;
-    if (((x_298 < 10) & (x_300 <= x_301))) {
-    } else {
-      break;
-    }
-    int x_305 = k;
-    k = (x_305 + 1);
-    int x_307 = i;
-    i = (x_307 + 1);
-    int x_310 = data[x_307];
-    temp[x_305] = x_310;
-  }
-  int x_312 = from;
-  i_1 = x_312;
-  while (true) {
-    int x_317 = i_1;
-    int x_318 = to;
-    if ((x_317 <= x_318)) {
-    } else {
-      break;
-    }
-    int x_321 = i_1;
-    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;
-  float x_87 = x_28.injectionSwitch.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)) {
-      int x_136 = j_1;
-      int x_139 = data[j_1];
-      temp[x_136] = x_139;
-    }
-  }
-  mergeSort_();
-  float x_145 = tint_symbol.y;
-  if ((int(x_145) < 30)) {
-    int x_152 = data[0];
-    grey = (0.5f + (float(x_152) / 10.0f));
-  } else {
-    float x_157 = tint_symbol.y;
-    if ((int(x_157) < 60)) {
-      int x_164 = data[1];
-      grey = (0.5f + (float(x_164) / 10.0f));
-    } else {
-      float x_169 = tint_symbol.y;
-      if ((int(x_169) < 90)) {
-        int x_176 = data[2];
-        grey = (0.5f + (float(x_176) / 10.0f));
-      } else {
-        float x_181 = tint_symbol.y;
-        if ((int(x_181) < 120)) {
-          int x_188 = data[3];
-          grey = (0.5f + (float(x_188) / 10.0f));
-        } else {
-          float x_193 = tint_symbol.y;
-          if ((int(x_193) < 150)) {
-            discard;
-          } else {
-            float x_200 = tint_symbol.y;
-            if ((int(x_200) < 180)) {
-              int x_207 = data[5];
-              grey = (0.5f + (float(x_207) / 10.0f));
-            } else {
-              float x_212 = tint_symbol.y;
-              if ((int(x_212) < 210)) {
-                int x_219 = data[6];
-                grey = (0.5f + (float(x_219) / 10.0f));
-              } else {
-                float x_224 = tint_symbol.y;
-                if ((int(x_224) < 240)) {
-                  int x_231 = data[7];
-                  grey = (0.5f + (float(x_231) / 10.0f));
-                } else {
-                  float x_236 = tint_symbol.y;
-                  if ((int(x_236) < 270)) {
-                    int x_243 = data[8];
-                    grey = (0.5f + (float(x_243) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_247 = grey;
-  vec3 x_248 = vec3(x_247, x_247, x_247);
-  x_GLF_color = vec4(x_248.x, x_248.y, x_248.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.glsl
deleted file mode 100644
index a75f0f6..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,289 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-struct buf1 {
-  vec2 resolution;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_255 = from;
-  k = x_255;
-  int x_256 = from;
-  i = x_256;
-  int x_257 = mid;
-  j = (x_257 + 1);
-  while (true) {
-    int x_263 = i;
-    int x_264 = mid;
-    int x_266 = j;
-    int x_267 = to;
-    if (((x_263 <= x_264) & (x_266 <= x_267))) {
-    } else {
-      break;
-    }
-    int x_273 = data[i];
-    int x_276 = data[j];
-    if ((x_273 < x_276)) {
-      int x_281 = k;
-      k = (x_281 + 1);
-      int x_283 = i;
-      i = (x_283 + 1);
-      int x_286 = data[x_283];
-      temp[x_281] = x_286;
-    } else {
-      int x_288 = k;
-      k = (x_288 + 1);
-      int x_290 = j;
-      j = (x_290 + 1);
-      int x_293 = data[x_290];
-      temp[x_288] = x_293;
-    }
-  }
-  while (true) {
-    int x_299 = i;
-    int x_301 = i;
-    int x_302 = mid;
-    if (((x_299 < 10) & (x_301 <= x_302))) {
-    } else {
-      break;
-    }
-    int x_306 = k;
-    k = (x_306 + 1);
-    int x_308 = i;
-    i = (x_308 + 1);
-    int x_311 = data[x_308];
-    temp[x_306] = x_311;
-  }
-  int x_313 = from;
-  i_1 = x_313;
-  while (true) {
-    int x_318 = i_1;
-    int x_319 = to;
-    if ((x_318 <= x_319)) {
-    } else {
-      break;
-    }
-    int x_322 = i_1;
-    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;
-  float x_88 = x_28.injectionSwitch.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)) {
-      int x_137 = j_1;
-      int x_140 = data[j_1];
-      temp[x_137] = x_140;
-    }
-  }
-  mergeSort_();
-  float x_146 = tint_symbol.y;
-  if ((int(x_146) < 30)) {
-    int x_153 = data[0];
-    grey = (0.5f + (float(x_153) / 10.0f));
-  } else {
-    float x_158 = tint_symbol.y;
-    if ((int(x_158) < 60)) {
-      int x_165 = data[1];
-      grey = (0.5f + (float(x_165) / 10.0f));
-    } else {
-      float x_170 = tint_symbol.y;
-      if ((int(x_170) < 90)) {
-        int x_177 = data[2];
-        grey = (0.5f + (float(x_177) / 10.0f));
-      } else {
-        float x_182 = tint_symbol.y;
-        if ((int(x_182) < 120)) {
-          int x_189 = data[3];
-          grey = (0.5f + (float(x_189) / 10.0f));
-        } else {
-          float x_194 = tint_symbol.y;
-          if ((int(x_194) < 150)) {
-            discard;
-          } else {
-            float x_201 = tint_symbol.y;
-            if ((int(x_201) < 180)) {
-              int x_208 = data[5];
-              grey = (0.5f + (float(x_208) / 10.0f));
-            } else {
-              float x_213 = tint_symbol.y;
-              if ((int(x_213) < 210)) {
-                int x_220 = data[6];
-                grey = (0.5f + (float(x_220) / 10.0f));
-              } else {
-                float x_225 = tint_symbol.y;
-                if ((int(x_225) < 240)) {
-                  int x_232 = data[7];
-                  grey = (0.5f + (float(x_232) / 10.0f));
-                } else {
-                  float x_237 = tint_symbol.y;
-                  if ((int(x_237) < 270)) {
-                    int x_244 = data[8];
-                    grey = (0.5f + (float(x_244) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_248 = grey;
-  vec3 x_249 = vec3(x_248, x_248, x_248);
-  x_GLF_color = vec4(x_249.x, x_249.y, x_249.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.glsl
deleted file mode 100644
index e8d2725..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-double-branch-to-same-block3/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,283 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-struct buf1 {
-  vec2 resolution;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_256 = from;
-  k = x_256;
-  int x_257 = from;
-  i = x_257;
-  int x_258 = mid;
-  j = (x_258 + 1);
-  while (true) {
-    int x_264 = i;
-    int x_265 = mid;
-    int x_267 = j;
-    int x_268 = to;
-    if (((x_264 <= x_265) & (x_267 <= x_268))) {
-    } else {
-      break;
-    }
-    int x_274 = data[i];
-    int x_277 = data[j];
-    if ((x_274 < x_277)) {
-      int x_282 = k;
-      k = (x_282 + 1);
-      int x_284 = i;
-      i = (x_284 + 1);
-      int x_287 = data[x_284];
-      temp[x_282] = x_287;
-    } else {
-      int x_289 = k;
-      k = (x_289 + 1);
-      int x_291 = j;
-      j = (x_291 + 1);
-      int x_294 = data[x_291];
-      temp[x_289] = x_294;
-    }
-  }
-  while (true) {
-    if (!((256.0f < 1.0f))) {
-    } else {
-      continue;
-    }
-    int x_301 = i;
-    int x_303 = i;
-    int x_304 = mid;
-    if (((x_301 < 10) & (x_303 <= x_304))) {
-    } else {
-      break;
-    }
-    int x_309 = k;
-    k = (x_309 + 1);
-    int x_311 = i;
-    i = (x_311 + 1);
-    int x_314 = data[x_311];
-    temp[x_309] = x_314;
-  }
-  int x_316 = from;
-  i_1 = x_316;
-  while (true) {
-    int x_321 = i_1;
-    int x_322 = to;
-    if ((x_321 <= x_322)) {
-    } else {
-      break;
-    }
-    int x_325 = i_1;
-    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;
-  float x_89 = x_28.injectionSwitch.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)) {
-      int x_138 = j_1;
-      int x_141 = data[j_1];
-      temp[x_138] = x_141;
-    }
-  }
-  mergeSort_();
-  float x_147 = tint_symbol.y;
-  if ((int(x_147) < 30)) {
-    int x_154 = data[0];
-    grey = (0.5f + (float(x_154) / 10.0f));
-  } else {
-    float x_159 = tint_symbol.y;
-    if ((int(x_159) < 60)) {
-      int x_166 = data[1];
-      grey = (0.5f + (float(x_166) / 10.0f));
-    } else {
-      float x_171 = tint_symbol.y;
-      if ((int(x_171) < 90)) {
-        int x_178 = data[2];
-        grey = (0.5f + (float(x_178) / 10.0f));
-      } else {
-        float x_183 = tint_symbol.y;
-        if ((int(x_183) < 120)) {
-          int x_190 = data[3];
-          grey = (0.5f + (float(x_190) / 10.0f));
-        } else {
-          float x_195 = tint_symbol.y;
-          if ((int(x_195) < 150)) {
-            discard;
-          } else {
-            float x_202 = tint_symbol.y;
-            if ((int(x_202) < 180)) {
-              int x_209 = data[5];
-              grey = (0.5f + (float(x_209) / 10.0f));
-            } else {
-              float x_214 = tint_symbol.y;
-              if ((int(x_214) < 210)) {
-                int x_221 = data[6];
-                grey = (0.5f + (float(x_221) / 10.0f));
-              } else {
-                float x_226 = tint_symbol.y;
-                if ((int(x_226) < 240)) {
-                  int x_233 = data[7];
-                  grey = (0.5f + (float(x_233) / 10.0f));
-                } else {
-                  float x_238 = tint_symbol.y;
-                  if ((int(x_238) < 270)) {
-                    int x_245 = data[8];
-                    grey = (0.5f + (float(x_245) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_249 = grey;
-  vec3 x_250 = vec3(x_249, x_249, x_249);
-  x_GLF_color = vec4(x_250.x, x_250.y, x_250.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:37: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:37: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.glsl
deleted file mode 100644
index 37cb9ef..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,363 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_8;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-  int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 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;
-  float x_60 = x_8.injectionSwitch.x;
-  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;
-    int x_63 = x_63_phi;
-    int x_68[10] = data;
-    int tint_symbol_3[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-    data = tint_symbol_3;
-    data = x_68;
-    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;
-      }
-    }
-    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;
-    int x_103 = x_103_phi;
-    if ((x_103 < 10)) {
-    } else {
-      break;
-    }
-    {
-      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;
-    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;
-      int x_119 = x_119_phi;
-      if ((x_119 < 9)) {
-      } else {
-        break;
-      }
-      int x_125 = (x_119 + x_112);
-      int x_126 = (x_125 - 1);
-      int x_120 = (x_119 + (2 * x_112));
-      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;
-        int x_134 = x_134_phi;
-        x_136 = x_136_phi;
-        if (((x_136 <= x_126) & (x_134 <= x_129))) {
-        } else {
-          break;
-        }
-        int x_143_save = x_136;
-        int x_144 = data[x_143_save];
-        int x_145_save = x_134;
-        int x_146 = data[x_145_save];
-        int x_132 = (x_131 + 1);
-        if ((x_144 < x_146)) {
-          x_151 = (x_136 + 1);
-          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);
-          int x_155 = data[x_145_save];
-          temp[x_131] = x_155;
-          x_135_phi = x_154;
-          x_137_phi = x_136;
-        }
-        int x_135 = x_135_phi;
-        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;
-        int x_158 = x_158_phi;
-        int 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 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;
-        int x_171 = x_171_phi;
-        if ((x_171 <= x_129)) {
-        } else {
-          break;
-        }
-        {
-          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;
-  float x_180 = tint_symbol.y;
-  x_181 = int(x_180);
-  if ((x_181 < 30)) {
-    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)) {
-      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)) {
-        int x_205 = data[2];
-        x_208 = (0.5f + (float(x_205) * 0.100000001f));
-        x_261_phi = x_208;
-      } else {
-        if ((x_181 < 120)) {
-          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)) {
-              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)) {
-                int x_236 = data[6];
-                x_239 = (0.5f + (float(x_236) * 0.100000001f));
-                x_258_phi = x_239;
-              } else {
-                if ((x_181 < 240)) {
-                  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;
-                  }
-                  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;
-  }
-  float x_263 = x_263_phi;
-  x_GLF_color = vec4(x_263, x_263, x_263, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_4 = main_out(x_GLF_color);
-  return tint_symbol_4;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:174: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:174: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.glsl
deleted file mode 100644
index 5b14e49..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-O-prop-up-mutate-var/2.spvasm.expected.glsl
+++ /dev/null
@@ -1,359 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_8;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-  int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 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;
-  float x_60 = x_8.injectionSwitch.x;
-  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;
-    int x_63 = x_63_phi;
-    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;
-      }
-    }
-    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;
-    int x_102 = x_102_phi;
-    if ((x_102 < 10)) {
-    } else {
-      break;
-    }
-    {
-      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;
-    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;
-      int x_118 = x_118_phi;
-      if ((x_118 < 9)) {
-      } else {
-        break;
-      }
-      int x_124 = (x_118 + x_111);
-      int x_125 = (x_124 - 1);
-      int x_119 = (x_118 + (2 * x_111));
-      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;
-        int x_133 = x_133_phi;
-        x_135 = x_135_phi;
-        if (((x_135 <= x_125) & (x_133 <= x_128))) {
-        } else {
-          break;
-        }
-        int x_142_save = x_135;
-        int x_143 = data[x_142_save];
-        int x_144_save = x_133;
-        int x_145 = data[x_144_save];
-        int x_131 = (x_130 + 1);
-        if ((x_143 < x_145)) {
-          x_150 = (x_135 + 1);
-          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);
-          int x_154 = data[x_144_save];
-          temp[x_130] = x_154;
-          x_134_phi = x_153;
-          x_136_phi = x_135;
-        }
-        int x_134 = x_134_phi;
-        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;
-        int x_157 = x_157_phi;
-        int 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 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;
-        int x_170 = x_170_phi;
-        if ((x_170 <= x_128)) {
-        } else {
-          break;
-        }
-        {
-          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;
-  float x_179 = tint_symbol.y;
-  x_180 = int(x_179);
-  if ((x_180 < 30)) {
-    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)) {
-      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)) {
-        int x_204 = data[2];
-        x_207 = (0.5f + (float(x_204) * 0.100000001f));
-        x_260_phi = x_207;
-      } else {
-        if ((x_180 < 120)) {
-          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)) {
-              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)) {
-                int x_235 = data[6];
-                x_238 = (0.5f + (float(x_235) * 0.100000001f));
-                x_257_phi = x_238;
-              } else {
-                if ((x_180 < 240)) {
-                  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;
-                  }
-                  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;
-  }
-  float x_262 = x_262_phi;
-  x_GLF_color = vec4(x_262, x_262, x_262, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:170: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:170: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.glsl
deleted file mode 100644
index 436b0e2..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,275 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_251 = from;
-  k = x_251;
-  int x_252 = from;
-  i = x_252;
-  int x_253 = mid;
-  j = (x_253 + 1);
-  while (true) {
-    int x_259 = i;
-    int x_260 = mid;
-    int x_262 = j;
-    int x_263 = to;
-    if (((x_259 <= x_260) & (x_262 <= x_263))) {
-    } else {
-      break;
-    }
-    int x_269 = data[i];
-    int x_272 = data[j];
-    if ((x_269 < x_272)) {
-      int x_277 = k;
-      k = (x_277 + 1);
-      int x_279 = i;
-      i = (x_279 + 1);
-      int x_282 = data[x_279];
-      temp[x_277] = x_282;
-    } else {
-      int x_284 = k;
-      k = (x_284 + 1);
-      int x_286 = j;
-      j = (x_286 + 1);
-      int x_289 = data[x_286];
-      temp[x_284] = x_289;
-    }
-  }
-  while (true) {
-    int x_295 = i;
-    int x_297 = i;
-    int x_298 = mid;
-    if (((x_295 < 10) & (x_297 <= x_298))) {
-    } else {
-      break;
-    }
-    int x_302 = k;
-    k = (x_302 + 1);
-    int x_304 = i;
-    i = (x_304 + 1);
-    int x_307 = data[x_304];
-    temp[x_302] = x_307;
-  }
-  int x_309 = from;
-  i_1 = x_309;
-  while (true) {
-    int x_314 = i_1;
-    int x_315 = to;
-    if ((x_314 <= x_315)) {
-    } else {
-      break;
-    }
-    int x_318 = i_1;
-    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;
-  float x_84 = x_28.injectionSwitch.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)) {
-      int x_133 = j_1;
-      int x_136 = data[j_1];
-      temp[x_133] = x_136;
-    }
-  }
-  mergeSort_();
-  float x_142 = tint_symbol.y;
-  if ((int(x_142) < 30)) {
-    int x_149 = data[0];
-    grey = (0.5f + (float(x_149) / 10.0f));
-  } else {
-    float x_154 = tint_symbol.y;
-    if ((int(x_154) < 60)) {
-      int x_161 = data[1];
-      grey = (0.5f + (float(x_161) / 10.0f));
-    } else {
-      float x_166 = tint_symbol.y;
-      if ((int(x_166) < 90)) {
-        int x_173 = data[2];
-        grey = (0.5f + (float(x_173) / 10.0f));
-      } else {
-        float x_178 = tint_symbol.y;
-        if ((int(x_178) < 120)) {
-          int x_185 = data[3];
-          grey = (0.5f + (float(x_185) / 10.0f));
-        } else {
-          float x_190 = tint_symbol.y;
-          if ((int(x_190) < 150)) {
-            discard;
-          } else {
-            float x_197 = tint_symbol.y;
-            if ((int(x_197) < 180)) {
-              int x_204 = data[5];
-              grey = (0.5f + (float(x_204) / 10.0f));
-            } else {
-              float x_209 = tint_symbol.y;
-              if ((int(x_209) < 210)) {
-                int x_216 = data[6];
-                grey = (0.5f + (float(x_216) / 10.0f));
-              } else {
-                float x_221 = tint_symbol.y;
-                if ((int(x_221) < 240)) {
-                  int x_228 = data[7];
-                  grey = (0.5f + (float(x_228) / 10.0f));
-                } else {
-                  float x_233 = tint_symbol.y;
-                  if ((int(x_233) < 270)) {
-                    int x_240 = data[8];
-                    grey = (0.5f + (float(x_240) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_244 = grey;
-  vec3 x_245 = vec3(x_244, x_244, x_244);
-  x_GLF_color = vec4(x_245.x, x_245.y, x_245.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:33: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.glsl
deleted file mode 100644
index 9942e20..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-dead-code/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,295 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_262 = from;
-  k = x_262;
-  int x_263 = from;
-  i = x_263;
-  int x_264 = mid;
-  j = (x_264 + 1);
-  while (true) {
-    int x_270 = i;
-    int x_271 = mid;
-    int x_273 = j;
-    int x_274 = to;
-    if (((x_270 <= x_271) & (x_273 <= x_274))) {
-    } else {
-      break;
-    }
-    int x_280 = data[i];
-    int x_283 = data[j];
-    if ((x_280 < x_283)) {
-      int x_288 = k;
-      k = (x_288 + 1);
-      int x_290 = i;
-      i = (x_290 + 1);
-      int x_293 = data[x_290];
-      temp[x_288] = x_293;
-    } else {
-      int x_295 = k;
-      k = (x_295 + 1);
-      int x_297 = j;
-      j = (x_297 + 1);
-      int x_300 = data[x_297];
-      temp[x_295] = x_300;
-    }
-  }
-  while (true) {
-    int x_306 = i;
-    int x_308 = i;
-    int x_309 = mid;
-    if (((x_306 < 10) & (x_308 <= x_309))) {
-    } else {
-      break;
-    }
-    int x_313 = k;
-    k = (x_313 + 1);
-    int x_315 = i;
-    i = (x_315 + 1);
-    int x_318 = data[x_315];
-    temp[x_313] = x_318;
-  }
-  int x_320 = from;
-  i_1 = x_320;
-  while (true) {
-    int x_325 = i_1;
-    int x_326 = to;
-    if ((x_325 <= x_326)) {
-    } else {
-      break;
-    }
-    int x_329 = i_1;
-    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;
-  float x_86 = x_28.injectionSwitch.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) {
-    bool x_133 = (j_1 < 10);
-    float x_135 = x_28.injectionSwitch.x;
-    if (!((x_135 <= 1.0f))) {
-      grey = 1.0f;
-    }
-    if (x_133) {
-    } else {
-      break;
-    }
-    int x_140 = j_1;
-    int x_143 = data[j_1];
-    temp[x_140] = x_143;
-    {
-      j_1 = (j_1 + 1);
-    }
-  }
-  mergeSort_();
-  float x_149 = tint_symbol.y;
-  if ((int(x_149) < 30)) {
-    int x_156 = data[0];
-    grey = (0.5f + (float(x_156) / 10.0f));
-  } else {
-    float x_161 = tint_symbol.y;
-    if ((int(x_161) < 60)) {
-      int x_168 = data[1];
-      grey = (0.5f + (float(x_168) / 10.0f));
-    } else {
-      float x_173 = tint_symbol.y;
-      if ((int(x_173) < 90)) {
-        int x_180 = data[2];
-        grey = (0.5f + (float(x_180) / 10.0f));
-      } else {
-        float x_185 = tint_symbol.y;
-        if ((int(x_185) < 120)) {
-          int x_192 = data[3];
-          grey = (0.5f + (float(x_192) / 10.0f));
-        } else {
-          float x_197 = tint_symbol.y;
-          if ((int(x_197) < 150)) {
-            discard;
-          } else {
-            float x_204 = tint_symbol.y;
-            if ((int(x_204) < 180)) {
-              int x_211 = data[5];
-              grey = (0.5f + (float(x_211) / 10.0f));
-            } else {
-              float x_216 = tint_symbol.y;
-              if ((int(x_216) < 210)) {
-                int x_223 = data[6];
-                grey = (0.5f + (float(x_223) / 10.0f));
-              } else {
-                float x_228 = tint_symbol.y;
-                if ((int(x_228) < 240)) {
-                  int x_235 = data[7];
-                  grey = (0.5f + (float(x_235) / 10.0f));
-                } else {
-                  float x_240 = tint_symbol.y;
-                  bool guard233 = true;
-                  if ((int(x_240) < 270)) {
-                    int x_247 = data[8];
-                    grey = (0.5f + (float(x_247) / 10.0f));
-                    guard233 = false;
-                  } else {
-                    if (guard233) {
-                      float x_252 = x_28.injectionSwitch.y;
-                      if (!((0.0f < x_252))) {
-                        guard233 = false;
-                      }
-                      if (guard233) {
-                        discard;
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_255 = grey;
-  vec3 x_256 = vec3(x_255, x_255, x_255);
-  x_GLF_color = vec4(x_256.x, x_256.y, x_256.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:33: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.glsl
deleted file mode 100644
index f92ed9e..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,380 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_255 = from;
-  k = x_255;
-  int x_256 = from;
-  i = x_256;
-  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;
-    float x_261 = x_28.injectionSwitch.x;
-    if ((1.0f >= x_261)) {
-    } else {
-      continue;
-    }
-    int x_266 = i;
-    int x_267 = mid;
-    int x_269 = j;
-    int x_270 = to;
-    if (((x_266 <= x_267) & (x_269 <= x_270))) {
-    } else {
-      break;
-    }
-    int x_276 = data[i];
-    int x_279 = data[j];
-    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;
-    }
-    int x_287 = x_287_phi;
-    int x_288 = (x_287 + 1);
-    if (x_280) {
-      k = x_288;
-      float x_293 = x_28.injectionSwitch.x;
-      if (!((1.0f <= x_293))) {
-      } else {
-        continue;
-      }
-    }
-    float x_297 = x_28.injectionSwitch.y;
-    if ((x_297 >= 0.0f)) {
-    } else {
-      continue;
-    }
-    int x_300 = 0;
-    if (x_280) {
-      x_305 = i;
-      x_307_phi = x_305;
-    } else {
-      x_306 = 0;
-      x_307_phi = x_306;
-    }
-    int x_309 = (x_280 ? x_307_phi : x_300);
-    if (x_280) {
-      i = (x_309 + 1);
-    }
-    int x_315 = 0;
-    if (x_280) {
-      x_320 = data[x_309];
-      float x_322 = x_28.injectionSwitch.y;
-      x_328_phi = x_320;
-      if (!((0.0f <= x_322))) {
-        continue;
-      }
-    } else {
-      x_324 = 0;
-      float x_326 = x_28.injectionSwitch.y;
-      x_328_phi = x_324;
-      if (!((x_326 < 0.0f))) {
-      } else {
-        continue;
-      }
-    }
-    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;
-    }
-    int x_340 = x_340_phi;
-    if (x_280) {
-    } else {
-      k = (x_340 + 1);
-    }
-    float 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 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;
-    }
-    int x_367 = x_367_phi;
-    if (x_280) {
-    } else {
-      temp[x_340] = x_367;
-    }
-  }
-  while (true) {
-    int x_376 = i;
-    int x_378 = i;
-    int x_379 = mid;
-    if (((x_376 < 10) & (x_378 <= x_379))) {
-    } else {
-      break;
-    }
-    int x_383 = k;
-    k = (x_383 + 1);
-    int x_385 = i;
-    i = (x_385 + 1);
-    int x_388 = data[x_385];
-    temp[x_383] = x_388;
-  }
-  int x_390 = from;
-  i_1 = x_390;
-  while (true) {
-    int x_395 = i_1;
-    int x_396 = to;
-    if ((x_395 <= x_396)) {
-    } else {
-      break;
-    }
-    int x_399 = i_1;
-    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;
-  float x_88 = x_28.injectionSwitch.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)) {
-      int x_137 = j_1;
-      int x_140 = data[j_1];
-      temp[x_137] = x_140;
-    }
-  }
-  mergeSort_();
-  float x_146 = tint_symbol.y;
-  if ((int(x_146) < 30)) {
-    int x_153 = data[0];
-    grey = (0.5f + (float(x_153) / 10.0f));
-  } else {
-    float x_158 = tint_symbol.y;
-    if ((int(x_158) < 60)) {
-      int x_165 = data[1];
-      grey = (0.5f + (float(x_165) / 10.0f));
-    } else {
-      float x_170 = tint_symbol.y;
-      if ((int(x_170) < 90)) {
-        int x_177 = data[2];
-        grey = (0.5f + (float(x_177) / 10.0f));
-      } else {
-        float x_182 = tint_symbol.y;
-        if ((int(x_182) < 120)) {
-          int x_189 = data[3];
-          grey = (0.5f + (float(x_189) / 10.0f));
-        } else {
-          float x_194 = tint_symbol.y;
-          if ((int(x_194) < 150)) {
-            discard;
-          } else {
-            float x_201 = tint_symbol.y;
-            if ((int(x_201) < 180)) {
-              int x_208 = data[5];
-              grey = (0.5f + (float(x_208) / 10.0f));
-            } else {
-              float x_213 = tint_symbol.y;
-              if ((int(x_213) < 210)) {
-                int x_220 = data[6];
-                grey = (0.5f + (float(x_220) / 10.0f));
-              } else {
-                float x_225 = tint_symbol.y;
-                if ((int(x_225) < 240)) {
-                  int x_232 = data[7];
-                  grey = (0.5f + (float(x_232) / 10.0f));
-                } else {
-                  float x_237 = tint_symbol.y;
-                  if ((int(x_237) < 270)) {
-                    int x_244 = data[8];
-                    grey = (0.5f + (float(x_244) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_248 = grey;
-  vec3 x_249 = vec3(x_248, x_248, x_248);
-  x_GLF_color = vec4(x_249.x, x_249.y, x_249.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:56: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:56: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.glsl
deleted file mode 100644
index 968c3c2..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-flatten-selection-dead-continues/2-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,379 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_255 = from;
-  k = x_255;
-  int x_256 = from;
-  i = x_256;
-  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;
-    }
-    int x_264 = i;
-    int x_265 = mid;
-    int x_267 = j;
-    int x_268 = to;
-    if (((x_264 <= x_265) & (x_267 <= x_268))) {
-    } else {
-      break;
-    }
-    int x_274 = data[i];
-    int x_277 = data[j];
-    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;
-    }
-    int x_285 = x_285_phi;
-    int x_286 = (x_285 + 1);
-    if (x_278) {
-      k = x_286;
-      float x_291 = x_28.injectionSwitch.x;
-      if (!((1.0f <= x_291))) {
-      } else {
-        continue;
-      }
-    }
-    float x_295 = x_28.injectionSwitch.y;
-    if ((x_295 >= 0.0f)) {
-    } else {
-      continue;
-    }
-    int x_298 = 0;
-    if (x_278) {
-      x_303 = i;
-      x_305_phi = x_303;
-    } else {
-      x_304 = 0;
-      x_305_phi = x_304;
-    }
-    int x_307 = (x_278 ? x_305_phi : x_298);
-    if (x_278) {
-      i = (x_307 + 1);
-    }
-    int x_313 = 0;
-    if (x_278) {
-      x_318 = data[x_307];
-      float x_320 = x_28.injectionSwitch.y;
-      x_326_phi = x_318;
-      if (!((0.0f <= x_320))) {
-        continue;
-      }
-    } else {
-      x_322 = 0;
-      float x_324 = x_28.injectionSwitch.y;
-      x_326_phi = x_322;
-      if (!((x_324 < 0.0f))) {
-      } else {
-        continue;
-      }
-    }
-    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;
-    }
-    int x_338 = x_338_phi;
-    if (x_278) {
-    } else {
-      k = (x_338 + 1);
-    }
-    float 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 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;
-    }
-    int x_365 = x_365_phi;
-    if (x_278) {
-    } else {
-      temp[x_338] = x_365;
-    }
-  }
-  while (true) {
-    int x_374 = i;
-    int x_376 = i;
-    int x_377 = mid;
-    if (((x_374 < 10) & (x_376 <= x_377))) {
-    } else {
-      break;
-    }
-    int x_381 = k;
-    k = (x_381 + 1);
-    int x_383 = i;
-    i = (x_383 + 1);
-    int x_386 = data[x_383];
-    temp[x_381] = x_386;
-  }
-  int x_388 = from;
-  i_1 = x_388;
-  while (true) {
-    int x_393 = i_1;
-    int x_394 = to;
-    if ((x_393 <= x_394)) {
-    } else {
-      break;
-    }
-    int x_397 = i_1;
-    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;
-  float x_88 = x_28.injectionSwitch.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)) {
-      int x_137 = j_1;
-      int x_140 = data[j_1];
-      temp[x_137] = x_140;
-    }
-  }
-  mergeSort_();
-  float x_146 = tint_symbol.y;
-  if ((int(x_146) < 30)) {
-    int x_153 = data[0];
-    grey = (0.5f + (float(x_153) / 10.0f));
-  } else {
-    float x_158 = tint_symbol.y;
-    if ((int(x_158) < 60)) {
-      int x_165 = data[1];
-      grey = (0.5f + (float(x_165) / 10.0f));
-    } else {
-      float x_170 = tint_symbol.y;
-      if ((int(x_170) < 90)) {
-        int x_177 = data[2];
-        grey = (0.5f + (float(x_177) / 10.0f));
-      } else {
-        float x_182 = tint_symbol.y;
-        if ((int(x_182) < 120)) {
-          int x_189 = data[3];
-          grey = (0.5f + (float(x_189) / 10.0f));
-        } else {
-          float x_194 = tint_symbol.y;
-          if ((int(x_194) < 150)) {
-            discard;
-          } else {
-            float x_201 = tint_symbol.y;
-            if ((int(x_201) < 180)) {
-              int x_208 = data[5];
-              grey = (0.5f + (float(x_208) / 10.0f));
-            } else {
-              float x_213 = tint_symbol.y;
-              if ((int(x_213) < 210)) {
-                int x_220 = data[6];
-                grey = (0.5f + (float(x_220) / 10.0f));
-              } else {
-                float x_225 = tint_symbol.y;
-                if ((int(x_225) < 240)) {
-                  int x_232 = data[7];
-                  grey = (0.5f + (float(x_232) / 10.0f));
-                } else {
-                  float x_237 = tint_symbol.y;
-                  if ((int(x_237) < 270)) {
-                    int x_244 = data[8];
-                    grey = (0.5f + (float(x_244) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_248 = grey;
-  vec3 x_249 = vec3(x_248, x_248, x_248);
-  x_GLF_color = vec4(x_249.x, x_249.y, x_249.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:55: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:55: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.glsl
deleted file mode 100644
index c74ad05..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,276 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_303 = from;
-  k = x_303;
-  int x_304 = from;
-  i = x_304;
-  int x_305 = mid;
-  j = (x_305 + 1);
-  while (true) {
-    int x_311 = i;
-    int x_312 = mid;
-    int x_314 = j;
-    int x_315 = to;
-    if (((x_311 <= x_312) & (x_314 <= x_315))) {
-    } else {
-      break;
-    }
-    int x_321 = data[i];
-    int x_324 = data[j];
-    if ((x_321 < x_324)) {
-      int x_329 = k;
-      k = (x_329 + 1);
-      int x_331 = i;
-      i = (x_331 + 1);
-      int x_334 = data[x_331];
-      temp[x_329] = x_334;
-    } else {
-      int x_336 = k;
-      k = (x_336 + 1);
-      int x_338 = j;
-      j = (x_338 + 1);
-      int x_341 = data[x_338];
-      temp[x_336] = x_341;
-    }
-  }
-  while (true) {
-    int x_347 = i;
-    int x_349 = i;
-    int x_350 = mid;
-    if (((x_347 < 10) & (x_349 <= x_350))) {
-    } else {
-      break;
-    }
-    int x_354 = k;
-    k = (x_354 + 1);
-    int x_356 = i;
-    i = (x_356 + 1);
-    int x_359 = data[x_356];
-    temp[x_354] = x_359;
-  }
-  int x_361 = from;
-  i_1 = x_361;
-  while (true) {
-    int x_366 = i_1;
-    int x_367 = to;
-    if ((x_366 <= x_367)) {
-    } else {
-      break;
-    }
-    int x_370 = i_1;
-    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;
-  float x_96 = x_28.injectionSwitch.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)) {
-      int x_145 = j_1;
-      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;
-          int x_170 = x_91;
-          int x_171 = x_92;
-          int x_173[10] = data;
-          int tint_symbol_3[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-          data = tint_symbol_3;
-          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);
-        }
-      }
-    }
-  }
-  float x_194 = tint_symbol.y;
-  if ((int(x_194) < 30)) {
-    int x_201 = data[0];
-    grey = (0.5f + (float(x_201) / 10.0f));
-  } else {
-    float x_206 = tint_symbol.y;
-    if ((int(x_206) < 60)) {
-      int x_213 = data[1];
-      grey = (0.5f + (float(x_213) / 10.0f));
-    } else {
-      float x_218 = tint_symbol.y;
-      if ((int(x_218) < 90)) {
-        int x_225 = data[2];
-        grey = (0.5f + (float(x_225) / 10.0f));
-      } else {
-        float x_230 = tint_symbol.y;
-        if ((int(x_230) < 120)) {
-          int x_237 = data[3];
-          grey = (0.5f + (float(x_237) / 10.0f));
-        } else {
-          float x_242 = tint_symbol.y;
-          if ((int(x_242) < 150)) {
-            discard;
-          } else {
-            float x_249 = tint_symbol.y;
-            if ((int(x_249) < 180)) {
-              int x_256 = data[5];
-              grey = (0.5f + (float(x_256) / 10.0f));
-            } else {
-              float x_261 = tint_symbol.y;
-              if ((int(x_261) < 210)) {
-                int x_268 = data[6];
-                grey = (0.5f + (float(x_268) / 10.0f));
-              } else {
-                float x_273 = tint_symbol.y;
-                if ((int(x_273) < 240)) {
-                  int x_280 = data[7];
-                  grey = (0.5f + (float(x_280) / 10.0f));
-                } else {
-                  float x_285 = tint_symbol.y;
-                  if ((int(x_285) < 270)) {
-                    int x_292 = data[8];
-                    grey = (0.5f + (float(x_292) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_296 = grey;
-  vec3 x_297 = vec3(x_296, x_296, x_296);
-  x_GLF_color = vec4(x_297.x, x_297.y, x_297.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_4 = main_out(x_GLF_color);
-  return tint_symbol_4;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:33: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.glsl
deleted file mode 100644
index c2fa1fd..0000000
--- a/test/vk-gl-cts/graphicsfuzz/spv-stable-mergesort-func-inline-mutate-var/2.spvasm.expected.glsl
+++ /dev/null
@@ -1,270 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_302 = from;
-  k = x_302;
-  int x_303 = from;
-  i = x_303;
-  int x_304 = mid;
-  j = (x_304 + 1);
-  while (true) {
-    int x_310 = i;
-    int x_311 = mid;
-    int x_313 = j;
-    int x_314 = to;
-    if (((x_310 <= x_311) & (x_313 <= x_314))) {
-    } else {
-      break;
-    }
-    int x_320 = data[i];
-    int x_323 = data[j];
-    if ((x_320 < x_323)) {
-      int x_328 = k;
-      k = (x_328 + 1);
-      int x_330 = i;
-      i = (x_330 + 1);
-      int x_333 = data[x_330];
-      temp[x_328] = x_333;
-    } else {
-      int x_335 = k;
-      k = (x_335 + 1);
-      int x_337 = j;
-      j = (x_337 + 1);
-      int x_340 = data[x_337];
-      temp[x_335] = x_340;
-    }
-  }
-  while (true) {
-    int x_346 = i;
-    int x_348 = i;
-    int x_349 = mid;
-    if (((x_346 < 10) & (x_348 <= x_349))) {
-    } else {
-      break;
-    }
-    int x_353 = k;
-    k = (x_353 + 1);
-    int x_355 = i;
-    i = (x_355 + 1);
-    int x_358 = data[x_355];
-    temp[x_353] = x_358;
-  }
-  int x_360 = from;
-  i_1 = x_360;
-  while (true) {
-    int x_365 = i_1;
-    int x_366 = to;
-    if ((x_365 <= x_366)) {
-    } else {
-      break;
-    }
-    int x_369 = i_1;
-    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;
-  float x_96 = x_28.injectionSwitch.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)) {
-      int x_145 = j_1;
-      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);
-        }
-      }
-    }
-  }
-  float x_193 = tint_symbol.y;
-  if ((int(x_193) < 30)) {
-    int x_200 = data[0];
-    grey = (0.5f + (float(x_200) / 10.0f));
-  } else {
-    float x_205 = tint_symbol.y;
-    if ((int(x_205) < 60)) {
-      int x_212 = data[1];
-      grey = (0.5f + (float(x_212) / 10.0f));
-    } else {
-      float x_217 = tint_symbol.y;
-      if ((int(x_217) < 90)) {
-        int x_224 = data[2];
-        grey = (0.5f + (float(x_224) / 10.0f));
-      } else {
-        float x_229 = tint_symbol.y;
-        if ((int(x_229) < 120)) {
-          int x_236 = data[3];
-          grey = (0.5f + (float(x_236) / 10.0f));
-        } else {
-          float x_241 = tint_symbol.y;
-          if ((int(x_241) < 150)) {
-            discard;
-          } else {
-            float x_248 = tint_symbol.y;
-            if ((int(x_248) < 180)) {
-              int x_255 = data[5];
-              grey = (0.5f + (float(x_255) / 10.0f));
-            } else {
-              float x_260 = tint_symbol.y;
-              if ((int(x_260) < 210)) {
-                int x_267 = data[6];
-                grey = (0.5f + (float(x_267) / 10.0f));
-              } else {
-                float x_272 = tint_symbol.y;
-                if ((int(x_272) < 240)) {
-                  int x_279 = data[7];
-                  grey = (0.5f + (float(x_279) / 10.0f));
-                } else {
-                  float x_284 = tint_symbol.y;
-                  if ((int(x_284) < 270)) {
-                    int x_291 = data[8];
-                    grey = (0.5f + (float(x_291) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_295 = grey;
-  vec3 x_296 = vec3(x_295, x_295, x_295);
-  x_GLF_color = vec4(x_296.x, x_296.y, x_296.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:33: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.glsl
deleted file mode 100644
index 09947df..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-clamped-conditional-bit-shift/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,309 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_34;
-
-vec4 x_GLF_color = vec4(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;
-  int x_260 = from;
-  k = x_260;
-  int x_261 = from;
-  i = x_261;
-  int x_262 = mid;
-  j = (x_262 + 1);
-  while (true) {
-    int x_268 = i;
-    int x_269 = mid;
-    int x_271 = j;
-    int x_272 = to;
-    if (((x_268 <= x_269) & (x_271 <= x_272))) {
-    } else {
-      break;
-    }
-    int x_278 = data[i];
-    int x_281 = data[j];
-    if ((x_278 < x_281)) {
-      int x_286 = k;
-      k = (x_286 + 1);
-      int x_288 = i;
-      i = (x_288 + 1);
-      int x_291 = data[x_288];
-      temp[x_286] = x_291;
-    } else {
-      int x_293 = k;
-      k = (x_293 + 1);
-      int x_295 = j;
-      j = (x_295 + 1);
-      int x_298 = data[x_295];
-      temp[x_293] = x_298;
-    }
-  }
-  while (true) {
-    int x_304 = i;
-    int x_306 = i;
-    int x_307 = mid;
-    if (((x_304 < 10) & (x_306 <= x_307))) {
-    } else {
-      break;
-    }
-    int x_311 = k;
-    k = (x_311 + 1);
-    int x_313 = i;
-    i = (x_313 + 1);
-    int x_316 = data[x_313];
-    temp[x_311] = x_316;
-  }
-  int x_318 = from;
-  i_1 = x_318;
-  while (true) {
-    int x_323 = i_1;
-    int x_324 = to;
-    if ((x_323 <= x_324)) {
-    } else {
-      break;
-    }
-    int x_327 = i_1;
-    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;
-  float x_338 = tint_symbol.x;
-  if ((x_338 >= 0.0f)) {
-    if (false) {
-      int x_346 = high;
-      x_336 = (x_346 << uint(0));
-    } else {
-      x_336 = 4;
-    }
-    x_335 = (1 << uint(x_336));
-  } else {
-    x_335 = 1;
-  }
-  x = x_335;
-  x = (x >> uint(4));
-  int x_353 = m;
-  int x_355 = m;
-  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;
-          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;
-  float x_93 = x_34.injectionSwitch.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)) {
-      int x_142 = j_1;
-      int x_145 = data[j_1];
-      temp[x_142] = x_145;
-    }
-  }
-  mergeSort_();
-  float x_151 = tint_symbol.y;
-  if ((int(x_151) < 30)) {
-    int x_158 = data[0];
-    grey = (0.5f + (float(x_158) / 10.0f));
-  } else {
-    float x_163 = tint_symbol.y;
-    if ((int(x_163) < 60)) {
-      int x_170 = data[1];
-      grey = (0.5f + (float(x_170) / 10.0f));
-    } else {
-      float x_175 = tint_symbol.y;
-      if ((int(x_175) < 90)) {
-        int x_182 = data[2];
-        grey = (0.5f + (float(x_182) / 10.0f));
-      } else {
-        float x_187 = tint_symbol.y;
-        if ((int(x_187) < 120)) {
-          int x_194 = data[3];
-          grey = (0.5f + (float(x_194) / 10.0f));
-        } else {
-          float x_199 = tint_symbol.y;
-          if ((int(x_199) < 150)) {
-            discard;
-          } else {
-            float x_206 = tint_symbol.y;
-            if ((int(x_206) < 180)) {
-              int x_213 = data[5];
-              grey = (0.5f + (float(x_213) / 10.0f));
-            } else {
-              float x_218 = tint_symbol.y;
-              if ((int(x_218) < 210)) {
-                int x_225 = data[6];
-                grey = (0.5f + (float(x_225) / 10.0f));
-              } else {
-                float x_230 = tint_symbol.y;
-                if ((int(x_230) < 240)) {
-                  int x_237 = data[7];
-                  grey = (0.5f + (float(x_237) / 10.0f));
-                } else {
-                  float x_242 = tint_symbol.y;
-                  if ((int(x_242) < 270)) {
-                    int x_249 = data[8];
-                    grey = (0.5f + (float(x_249) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_253 = grey;
-  vec3 x_254 = vec3(x_253, x_253, x_253);
-  x_GLF_color = vec4(x_254.x, x_254.y, x_254.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:33: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.glsl
deleted file mode 100644
index b261483..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-for-always-false-if-discard/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,364 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_8;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-  int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 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;
-  float x_62 = x_8.injectionSwitch.x;
-  int x_63 = int(x_62);
-  x_65_phi = x_63;
-  while (true) {
-    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;
-      }
-    }
-    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;
-    int x_93 = x_93_phi;
-    if ((x_93 < 10)) {
-    } else {
-      break;
-    }
-    {
-      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;
-    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;
-      int x_109 = x_109_phi;
-      if ((x_109 < 9)) {
-      } else {
-        break;
-      }
-      int x_115 = (x_109 + x_102);
-      int x_116 = (x_115 - 1);
-      int x_110 = (x_109 + (2 * x_102));
-      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;
-        int x_124 = x_124_phi;
-        x_126 = x_126_phi;
-        if (((x_126 <= x_116) & (x_124 <= x_119))) {
-        } else {
-          break;
-        }
-        int x_133_save = x_126;
-        int x_134 = data[x_133_save];
-        int x_135_save = x_124;
-        int x_136 = data[x_135_save];
-        int x_122 = (x_121 + 1);
-        if ((x_134 < x_136)) {
-          x_141 = (x_126 + 1);
-          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);
-          int x_145 = data[x_135_save];
-          temp[x_121] = x_145;
-          x_125_phi = x_144;
-          x_127_phi = x_126;
-        }
-        int x_125 = x_125_phi;
-        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;
-        int x_148 = x_148_phi;
-        int 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 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;
-        int x_161 = x_161_phi;
-        if ((x_161 <= x_119)) {
-        } else {
-          break;
-        }
-        {
-          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;
-  float x_170 = tint_symbol.y;
-  x_171 = int(x_170);
-  if ((x_171 < 30)) {
-    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)) {
-      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)) {
-        int x_195 = data[2];
-        x_198 = (0.5f + (float(x_195) * 0.100000001f));
-        x_278_phi = x_198;
-      } else {
-        if ((x_171 < 120)) {
-          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;
-          vec2 x_256_phi = vec2(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)) {
-              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)) {
-                int x_226 = data[6];
-                x_229 = (0.5f + (float(x_226) * 0.100000001f));
-                x_248_phi = x_229;
-              } else {
-                if ((x_171 < 240)) {
-                  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;
-                  }
-                  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;
-            float x_251 = x_8.injectionSwitch.y;
-            bool x_252 = (x_62 > x_251);
-            if (x_252) {
-              x_GLF_color = vec4(1.0f, 1.0f, 1.0f, 1.0f);
-            }
-            x_256_phi = vec2(1.0f, 1.0f);
-            x_259_phi = 0;
-            while (true) {
-              vec2 x_272 = vec2(0.0f, 0.0f);
-              int x_260 = 0;
-              vec2 x_273_phi = vec2(0.0f, 0.0f);
-              vec2 x_256 = x_256_phi;
-              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;
-              }
-              vec2 x_273 = x_273_phi;
-              vec2 x_257_1 = x_273;
-              x_257_1.x = (x_273.x + x_273.y);
-              vec2 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 x_280 = x_280_phi;
-  x_GLF_color = vec4(x_280, x_280, x_280, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:137: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:137: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.glsl
deleted file mode 100644
index 8bd4692..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-mergesort-reversed-for-loop/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,285 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-int data[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-int temp[10] = int[10](0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_28;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(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;
-  int x_262 = from;
-  k = x_262;
-  int x_263 = from;
-  i = x_263;
-  int x_264 = mid;
-  j = (x_264 + 1);
-  while (true) {
-    int x_270 = i;
-    int x_271 = mid;
-    int x_273 = j;
-    int x_274 = to;
-    if (((x_270 <= x_271) & (x_273 <= x_274))) {
-    } else {
-      break;
-    }
-    int x_280 = data[i];
-    int x_283 = data[j];
-    if ((x_280 < x_283)) {
-      int x_288 = k;
-      k = (x_288 + 1);
-      int x_290 = i;
-      i = (x_290 + 1);
-      int x_293 = data[x_290];
-      temp[x_288] = x_293;
-    } else {
-      int x_295 = k;
-      k = (x_295 + 1);
-      int x_297 = j;
-      j = (x_297 + 1);
-      int x_300 = data[x_297];
-      temp[x_295] = x_300;
-    }
-  }
-  while (true) {
-    int x_306 = i;
-    int x_308 = i;
-    int x_309 = mid;
-    if (((x_306 < 10) & (x_308 <= x_309))) {
-    } else {
-      break;
-    }
-    int x_313 = k;
-    k = (x_313 + 1);
-    int x_315 = i;
-    i = (x_315 + 1);
-    int x_318 = data[x_315];
-    temp[x_313] = x_318;
-  }
-  int x_320 = from;
-  i_1 = x_320;
-  while (true) {
-    int x_325 = i_1;
-    int x_326 = to;
-    if ((x_325 <= x_326)) {
-    } else {
-      break;
-    }
-    int x_329 = i_1;
-    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;
-  float x_85 = x_28.injectionSwitch.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)) {
-      int x_134 = j_1;
-      int x_137 = data[j_1];
-      temp[x_134] = x_137;
-    }
-  }
-  mergeSort_();
-  float x_143 = tint_symbol.y;
-  if ((int(x_143) < 30)) {
-    int x_150 = data[0];
-    grey = (0.5f + (float(x_150) / 10.0f));
-  } else {
-    float x_155 = tint_symbol.y;
-    if ((int(x_155) < 60)) {
-      int x_162 = data[1];
-      grey = (0.5f + (float(x_162) / 10.0f));
-    } else {
-      float x_167 = tint_symbol.y;
-      if ((int(x_167) < 90)) {
-        int x_174 = data[2];
-        grey = (0.5f + (float(x_174) / 10.0f));
-      } else {
-        float x_179 = tint_symbol.y;
-        if ((int(x_179) < 120)) {
-          int x_186 = data[3];
-          grey = (0.5f + (float(x_186) / 10.0f));
-        } else {
-          float x_191 = tint_symbol.y;
-          if ((int(x_191) < 150)) {
-            int_i = 1;
-            while (true) {
-              int x_201 = int_i;
-              float x_203 = x_28.injectionSwitch.x;
-              if ((x_201 > int(x_203))) {
-              } else {
-                break;
-              }
-              discard;
-            }
-          } else {
-            float x_208 = tint_symbol.y;
-            if ((int(x_208) < 180)) {
-              int x_215 = data[5];
-              grey = (0.5f + (float(x_215) / 10.0f));
-            } else {
-              float x_220 = tint_symbol.y;
-              if ((int(x_220) < 210)) {
-                int x_227 = data[6];
-                grey = (0.5f + (float(x_227) / 10.0f));
-              } else {
-                float x_232 = tint_symbol.y;
-                if ((int(x_232) < 240)) {
-                  int x_239 = data[7];
-                  grey = (0.5f + (float(x_239) / 10.0f));
-                } else {
-                  float x_244 = tint_symbol.y;
-                  if ((int(x_244) < 270)) {
-                    int x_251 = data[8];
-                    grey = (0.5f + (float(x_251) / 10.0f));
-                  } else {
-                    discard;
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  float x_255 = grey;
-  vec3 x_256 = vec3(x_255, x_255, x_255);
-  x_GLF_color = vec4(x_256.x, x_256.y, x_256.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:33: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:33: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.glsl
deleted file mode 100644
index b5b553c..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,158 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_24;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_79 = a.x;
-  float x_81 = b.y;
-  float x_84 = b.x;
-  float x_86 = a.y;
-  return ((x_79 * x_81) - (x_84 * x_86));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 c) {
-  bool x_90 = false;
-  int x_91 = 0;
-  float pab = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(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: {
-      float x_95 = p.x;
-      float x_97 = a_1.x;
-      float x_100 = p.y;
-      float x_102 = a_1.y;
-      float x_106 = b_1.x;
-      float x_107 = a_1.x;
-      float x_110 = b_1.y;
-      float x_111 = a_1.y;
-      param = vec2((x_95 - x_97), (x_100 - x_102));
-      param_1 = vec2((x_106 - x_107), (x_110 - x_111));
-      float x_114 = cross2d_vf2_vf2_(param, param_1);
-      pab = x_114;
-      float x_115 = p.x;
-      float x_116 = b_1.x;
-      float x_118 = p.y;
-      float x_119 = b_1.y;
-      float x_123 = c.x;
-      float x_124 = b_1.x;
-      float x_127 = c.y;
-      float x_128 = b_1.y;
-      param_2 = vec2((x_115 - x_116), (x_118 - x_119));
-      param_3 = vec2((x_123 - x_124), (x_127 - x_128));
-      float x_131 = cross2d_vf2_vf2_(param_2, param_3);
-      pbc = x_131;
-      bool 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;
-      }
-      if (!(x_141_phi)) {
-        x_90 = true;
-        x_91 = 0;
-        x_173_phi = 0;
-        break;
-      }
-      float x_145 = p.x;
-      float x_146 = c.x;
-      float x_148 = p.y;
-      float x_149 = c.y;
-      float x_152 = a_1.x;
-      float x_153 = c.x;
-      float x_155 = a_1.y;
-      float x_156 = c.y;
-      param_4 = vec2((x_145 - x_146), (x_148 - x_149));
-      param_5 = vec2((x_152 - x_153), (x_155 - x_156));
-      float x_159 = cross2d_vf2_vf2_(param_4, param_5);
-      pca = x_159;
-      bool 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;
-      }
-      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() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_67 = tint_symbol;
-  vec2 x_70 = x_24.resolution;
-  vec2 x_71 = (vec2(x_67.x, x_67.y) / x_70);
-  pos = x_71;
-  param_6 = x_71;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_72 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:66: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:66: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.glsl
deleted file mode 100644
index b5b553c..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-array-nested-loop/0-opt.wgsl.expected.glsl
+++ /dev/null
@@ -1,158 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_24;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_79 = a.x;
-  float x_81 = b.y;
-  float x_84 = b.x;
-  float x_86 = a.y;
-  return ((x_79 * x_81) - (x_84 * x_86));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 c) {
-  bool x_90 = false;
-  int x_91 = 0;
-  float pab = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(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: {
-      float x_95 = p.x;
-      float x_97 = a_1.x;
-      float x_100 = p.y;
-      float x_102 = a_1.y;
-      float x_106 = b_1.x;
-      float x_107 = a_1.x;
-      float x_110 = b_1.y;
-      float x_111 = a_1.y;
-      param = vec2((x_95 - x_97), (x_100 - x_102));
-      param_1 = vec2((x_106 - x_107), (x_110 - x_111));
-      float x_114 = cross2d_vf2_vf2_(param, param_1);
-      pab = x_114;
-      float x_115 = p.x;
-      float x_116 = b_1.x;
-      float x_118 = p.y;
-      float x_119 = b_1.y;
-      float x_123 = c.x;
-      float x_124 = b_1.x;
-      float x_127 = c.y;
-      float x_128 = b_1.y;
-      param_2 = vec2((x_115 - x_116), (x_118 - x_119));
-      param_3 = vec2((x_123 - x_124), (x_127 - x_128));
-      float x_131 = cross2d_vf2_vf2_(param_2, param_3);
-      pbc = x_131;
-      bool 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;
-      }
-      if (!(x_141_phi)) {
-        x_90 = true;
-        x_91 = 0;
-        x_173_phi = 0;
-        break;
-      }
-      float x_145 = p.x;
-      float x_146 = c.x;
-      float x_148 = p.y;
-      float x_149 = c.y;
-      float x_152 = a_1.x;
-      float x_153 = c.x;
-      float x_155 = a_1.y;
-      float x_156 = c.y;
-      param_4 = vec2((x_145 - x_146), (x_148 - x_149));
-      param_5 = vec2((x_152 - x_153), (x_155 - x_156));
-      float x_159 = cross2d_vf2_vf2_(param_4, param_5);
-      pca = x_159;
-      bool 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;
-      }
-      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() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_67 = tint_symbol;
-  vec2 x_70 = x_24.resolution;
-  vec2 x_71 = (vec2(x_67.x, x_67.y) / x_70);
-  pos = x_71;
-  param_6 = x_71;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_72 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:66: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:66: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.glsl
deleted file mode 100644
index 6a47168..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,140 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_24;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_76 = a.x;
-  float x_78 = b.y;
-  float x_81 = b.x;
-  float x_83 = a.y;
-  return ((x_76 * x_78) - (x_81 * x_83));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 c) {
-  float pab = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_137 = false;
-  bool x_169 = false;
-  bool x_138_phi = false;
-  bool x_170_phi = false;
-  float x_88 = p.x;
-  float x_90 = a_1.x;
-  float x_93 = p.y;
-  float x_95 = a_1.y;
-  float x_99 = b_1.x;
-  float x_100 = a_1.x;
-  float x_103 = b_1.y;
-  float x_104 = a_1.y;
-  param = vec2((x_88 - x_90), (x_93 - x_95));
-  param_1 = vec2((x_99 - x_100), (x_103 - x_104));
-  float x_107 = cross2d_vf2_vf2_(param, param_1);
-  pab = x_107;
-  float x_108 = p.x;
-  float x_109 = b_1.x;
-  float x_111 = p.y;
-  float x_112 = b_1.y;
-  float x_116 = c.x;
-  float x_117 = b_1.x;
-  float x_120 = c.y;
-  float x_121 = b_1.y;
-  param_2 = vec2((x_108 - x_109), (x_111 - x_112));
-  param_3 = vec2((x_116 - x_117), (x_120 - x_121));
-  float x_124 = cross2d_vf2_vf2_(param_2, param_3);
-  pbc = x_124;
-  bool x_129 = ((pab < 0.0f) & (pbc < 0.0f));
-  x_138_phi = x_129;
-  if (!(x_129)) {
-    x_137 = ((pab >= 0.0f) & (pbc >= 0.0f));
-    x_138_phi = x_137;
-  }
-  if (!(x_138_phi)) {
-    return 0;
-  }
-  float x_142 = p.x;
-  float x_143 = c.x;
-  float x_145 = p.y;
-  float x_146 = c.y;
-  float x_149 = a_1.x;
-  float x_150 = c.x;
-  float x_152 = a_1.y;
-  float x_153 = c.y;
-  param_4 = vec2((x_142 - x_143), (x_145 - x_146));
-  param_5 = vec2((x_149 - x_150), (x_152 - x_153));
-  float x_156 = cross2d_vf2_vf2_(param_4, param_5);
-  pca = x_156;
-  bool x_161 = ((pab < 0.0f) & (pca < 0.0f));
-  x_170_phi = x_161;
-  if (!(x_161)) {
-    x_169 = ((pab >= 0.0f) & (pca >= 0.0f));
-    x_170_phi = x_169;
-  }
-  if (!(x_170_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_63 = tint_symbol;
-  vec2 x_66 = x_24.resolution;
-  pos = (vec2(x_63.x, x_63.y) / x_66);
-  param_6 = pos;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_69 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:61: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:61: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.glsl
deleted file mode 100644
index 6a47168..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/0.wgsl.expected.glsl
+++ /dev/null
@@ -1,140 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_24;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_76 = a.x;
-  float x_78 = b.y;
-  float x_81 = b.x;
-  float x_83 = a.y;
-  return ((x_76 * x_78) - (x_81 * x_83));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 c) {
-  float pab = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_137 = false;
-  bool x_169 = false;
-  bool x_138_phi = false;
-  bool x_170_phi = false;
-  float x_88 = p.x;
-  float x_90 = a_1.x;
-  float x_93 = p.y;
-  float x_95 = a_1.y;
-  float x_99 = b_1.x;
-  float x_100 = a_1.x;
-  float x_103 = b_1.y;
-  float x_104 = a_1.y;
-  param = vec2((x_88 - x_90), (x_93 - x_95));
-  param_1 = vec2((x_99 - x_100), (x_103 - x_104));
-  float x_107 = cross2d_vf2_vf2_(param, param_1);
-  pab = x_107;
-  float x_108 = p.x;
-  float x_109 = b_1.x;
-  float x_111 = p.y;
-  float x_112 = b_1.y;
-  float x_116 = c.x;
-  float x_117 = b_1.x;
-  float x_120 = c.y;
-  float x_121 = b_1.y;
-  param_2 = vec2((x_108 - x_109), (x_111 - x_112));
-  param_3 = vec2((x_116 - x_117), (x_120 - x_121));
-  float x_124 = cross2d_vf2_vf2_(param_2, param_3);
-  pbc = x_124;
-  bool x_129 = ((pab < 0.0f) & (pbc < 0.0f));
-  x_138_phi = x_129;
-  if (!(x_129)) {
-    x_137 = ((pab >= 0.0f) & (pbc >= 0.0f));
-    x_138_phi = x_137;
-  }
-  if (!(x_138_phi)) {
-    return 0;
-  }
-  float x_142 = p.x;
-  float x_143 = c.x;
-  float x_145 = p.y;
-  float x_146 = c.y;
-  float x_149 = a_1.x;
-  float x_150 = c.x;
-  float x_152 = a_1.y;
-  float x_153 = c.y;
-  param_4 = vec2((x_142 - x_143), (x_145 - x_146));
-  param_5 = vec2((x_149 - x_150), (x_152 - x_153));
-  float x_156 = cross2d_vf2_vf2_(param_4, param_5);
-  pca = x_156;
-  bool x_161 = ((pab < 0.0f) & (pca < 0.0f));
-  x_170_phi = x_161;
-  if (!(x_161)) {
-    x_169 = ((pab >= 0.0f) & (pca >= 0.0f));
-    x_170_phi = x_169;
-  }
-  if (!(x_170_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_63 = tint_symbol;
-  vec2 x_66 = x_24.resolution;
-  pos = (vec2(x_63.x, x_63.y) / x_66);
-  param_6 = pos;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_69 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:61: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:61: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.glsl
deleted file mode 100644
index e9e375a..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,167 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_15;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_85 = a.x;
-  float x_87 = b.y;
-  float x_90 = b.x;
-  float x_92 = a.y;
-  return ((x_85 * x_87) - (x_90 * x_92));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 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;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_173 = false;
-  bool x_205 = false;
-  bool x_174_phi = false;
-  bool x_206_phi = false;
-  float x_99 = x_15.resolution.x;
-  float x_101 = x_15.resolution.y;
-  if ((x_99 == x_101)) {
-    float x_107 = c.y;
-    vec2 x_108 = vec2(0.0f, x_107);
-    if (true) {
-      float x_112 = c.y;
-      x_97 = x_112;
-    } else {
-      x_97 = 1.0f;
-    }
-    float x_113 = x_97;
-    float x_114 = c.y;
-    vec2 x_116 = vec2(1.0f, max(x_113, x_114));
-    vec2 x_117 = vec2(x_108.x, x_108.y);
-    x_96 = x_107;
-  } else {
-    x_96 = -1.0f;
-  }
-  var_y = x_96;
-  float x_120 = c.y;
-  float x_121 = c.y;
-  clamp_y = clamp(x_120, x_121, var_y);
-  float x_125 = p.x;
-  float x_127 = a_1.x;
-  float x_130 = p.y;
-  float x_132 = a_1.y;
-  float x_136 = b_1.x;
-  float x_137 = a_1.x;
-  float x_140 = b_1.y;
-  float x_141 = a_1.y;
-  param = vec2((x_125 - x_127), (x_130 - x_132));
-  param_1 = vec2((x_136 - x_137), (x_140 - x_141));
-  float x_144 = cross2d_vf2_vf2_(param, param_1);
-  pab = x_144;
-  float x_145 = p.x;
-  float x_146 = b_1.x;
-  float x_148 = p.y;
-  float x_149 = b_1.y;
-  float x_153 = c.x;
-  float x_154 = b_1.x;
-  float x_156 = clamp_y;
-  float x_157 = b_1.y;
-  param_2 = vec2((x_145 - x_146), (x_148 - x_149));
-  param_3 = vec2((x_153 - x_154), (x_156 - x_157));
-  float x_160 = cross2d_vf2_vf2_(param_2, param_3);
-  pbc = x_160;
-  bool x_165 = ((pab < 0.0f) & (pbc < 0.0f));
-  x_174_phi = x_165;
-  if (!(x_165)) {
-    x_173 = ((pab >= 0.0f) & (pbc >= 0.0f));
-    x_174_phi = x_173;
-  }
-  if (!(x_174_phi)) {
-    return 0;
-  }
-  float x_178 = p.x;
-  float x_179 = c.x;
-  float x_181 = p.y;
-  float x_182 = c.y;
-  float x_185 = a_1.x;
-  float x_186 = c.x;
-  float x_188 = a_1.y;
-  float x_189 = c.y;
-  param_4 = vec2((x_178 - x_179), (x_181 - x_182));
-  param_5 = vec2((x_185 - x_186), (x_188 - x_189));
-  float x_192 = cross2d_vf2_vf2_(param_4, param_5);
-  pca = x_192;
-  bool x_197 = ((pab < 0.0f) & (pca < 0.0f));
-  x_206_phi = x_197;
-  if (!(x_197)) {
-    x_205 = ((pab >= 0.0f) & (pca >= 0.0f));
-    x_206_phi = x_205;
-  }
-  if (!(x_206_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_72 = tint_symbol;
-  vec2 x_75 = x_15.resolution;
-  pos = (vec2(x_72.x, x_72.y) / x_75);
-  param_6 = pos;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_78 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:88: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:88: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.glsl
deleted file mode 100644
index e9e375a..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-clamp-conditional-mix/1.wgsl.expected.glsl
+++ /dev/null
@@ -1,167 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_15;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_85 = a.x;
-  float x_87 = b.y;
-  float x_90 = b.x;
-  float x_92 = a.y;
-  return ((x_85 * x_87) - (x_90 * x_92));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 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;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_173 = false;
-  bool x_205 = false;
-  bool x_174_phi = false;
-  bool x_206_phi = false;
-  float x_99 = x_15.resolution.x;
-  float x_101 = x_15.resolution.y;
-  if ((x_99 == x_101)) {
-    float x_107 = c.y;
-    vec2 x_108 = vec2(0.0f, x_107);
-    if (true) {
-      float x_112 = c.y;
-      x_97 = x_112;
-    } else {
-      x_97 = 1.0f;
-    }
-    float x_113 = x_97;
-    float x_114 = c.y;
-    vec2 x_116 = vec2(1.0f, max(x_113, x_114));
-    vec2 x_117 = vec2(x_108.x, x_108.y);
-    x_96 = x_107;
-  } else {
-    x_96 = -1.0f;
-  }
-  var_y = x_96;
-  float x_120 = c.y;
-  float x_121 = c.y;
-  clamp_y = clamp(x_120, x_121, var_y);
-  float x_125 = p.x;
-  float x_127 = a_1.x;
-  float x_130 = p.y;
-  float x_132 = a_1.y;
-  float x_136 = b_1.x;
-  float x_137 = a_1.x;
-  float x_140 = b_1.y;
-  float x_141 = a_1.y;
-  param = vec2((x_125 - x_127), (x_130 - x_132));
-  param_1 = vec2((x_136 - x_137), (x_140 - x_141));
-  float x_144 = cross2d_vf2_vf2_(param, param_1);
-  pab = x_144;
-  float x_145 = p.x;
-  float x_146 = b_1.x;
-  float x_148 = p.y;
-  float x_149 = b_1.y;
-  float x_153 = c.x;
-  float x_154 = b_1.x;
-  float x_156 = clamp_y;
-  float x_157 = b_1.y;
-  param_2 = vec2((x_145 - x_146), (x_148 - x_149));
-  param_3 = vec2((x_153 - x_154), (x_156 - x_157));
-  float x_160 = cross2d_vf2_vf2_(param_2, param_3);
-  pbc = x_160;
-  bool x_165 = ((pab < 0.0f) & (pbc < 0.0f));
-  x_174_phi = x_165;
-  if (!(x_165)) {
-    x_173 = ((pab >= 0.0f) & (pbc >= 0.0f));
-    x_174_phi = x_173;
-  }
-  if (!(x_174_phi)) {
-    return 0;
-  }
-  float x_178 = p.x;
-  float x_179 = c.x;
-  float x_181 = p.y;
-  float x_182 = c.y;
-  float x_185 = a_1.x;
-  float x_186 = c.x;
-  float x_188 = a_1.y;
-  float x_189 = c.y;
-  param_4 = vec2((x_178 - x_179), (x_181 - x_182));
-  param_5 = vec2((x_185 - x_186), (x_188 - x_189));
-  float x_192 = cross2d_vf2_vf2_(param_4, param_5);
-  pca = x_192;
-  bool x_197 = ((pab < 0.0f) & (pca < 0.0f));
-  x_206_phi = x_197;
-  if (!(x_197)) {
-    x_205 = ((pab >= 0.0f) & (pca >= 0.0f));
-    x_206_phi = x_205;
-  }
-  if (!(x_206_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_72 = tint_symbol;
-  vec2 x_75 = x_15.resolution;
-  pos = (vec2(x_72.x, x_72.y) / x_75);
-  param_6 = pos;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_78 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_78 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:88: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:88: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.glsl
deleted file mode 100644
index c1ad3ac..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-conditional-clamped-float/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,140 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_24;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-float cross2d_vf2_vf2_(inout vec2 a, inout vec2 b) {
-  float x_76 = a.x;
-  float x_78 = b.y;
-  float x_81 = b.x;
-  float x_83 = a.y;
-  return ((x_76 * x_78) - (x_81 * x_83));
-}
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a_1, inout vec2 b_1, inout vec2 c) {
-  float pab = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  float pbc = 0.0f;
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  float pca = 0.0f;
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_145 = false;
-  bool x_185 = false;
-  bool x_146_phi = false;
-  bool x_186_phi = false;
-  float x_88 = p.x;
-  float x_90 = a_1.x;
-  float x_93 = p.y;
-  float x_95 = a_1.y;
-  float x_99 = b_1.x;
-  float x_101 = a_1.x;
-  float x_104 = b_1.y;
-  float x_106 = a_1.y;
-  param = vec2((x_88 - x_90), (x_93 - x_95));
-  param_1 = vec2((x_99 - x_101), (x_104 - x_106));
-  float x_109 = cross2d_vf2_vf2_(param, param_1);
-  pab = x_109;
-  float x_111 = p.x;
-  float x_113 = b_1.x;
-  float x_116 = p.y;
-  float x_118 = b_1.y;
-  float x_122 = c.x;
-  float x_124 = b_1.x;
-  float x_127 = c.y;
-  float x_129 = b_1.y;
-  param_2 = vec2((x_111 - x_113), (x_116 - x_118));
-  param_3 = vec2((x_122 - x_124), (x_127 - x_129));
-  float x_132 = cross2d_vf2_vf2_(param_2, param_3);
-  pbc = x_132;
-  bool x_137 = ((pab < 0.0f) & (pbc < 0.0f));
-  x_146_phi = x_137;
-  if (!(x_137)) {
-    x_145 = ((pab >= 0.0f) & (pbc >= 0.0f));
-    x_146_phi = x_145;
-  }
-  if (!(x_146_phi)) {
-    return 0;
-  }
-  float x_151 = p.x;
-  float x_153 = c.x;
-  float x_156 = p.y;
-  float x_158 = c.y;
-  float x_162 = a_1.x;
-  float x_164 = c.x;
-  float x_167 = a_1.y;
-  float x_169 = c.y;
-  param_4 = vec2((x_151 - x_153), (x_156 - x_158));
-  param_5 = vec2((x_162 - x_164), (x_167 - x_169));
-  float x_172 = cross2d_vf2_vf2_(param_4, param_5);
-  pca = x_172;
-  bool x_177 = ((pab < 0.0f) & (pca < 0.0f));
-  x_186_phi = x_177;
-  if (!(x_177)) {
-    x_185 = ((pab >= 0.0f) & (pca >= 0.0f));
-    x_186_phi = x_185;
-  }
-  if (!(x_186_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 pos = vec2(0.0f, 0.0f);
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_63 = tint_symbol;
-  vec2 x_66 = x_24.resolution;
-  pos = (vec2(x_63.x, x_63.y) / x_66);
-  param_6 = pos;
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_69 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:61: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:61: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.glsl
deleted file mode 100644
index 4ba0f6f..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.spvasm.expected.glsl
+++ /dev/null
@@ -1,143 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_17;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a, inout vec2 b, inout vec2 c) {
-  float x_66 = 0.0f;
-  float x_67 = 0.0f;
-  float x_68 = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_135 = false;
-  bool x_172 = false;
-  bool x_136_phi = false;
-  bool x_173_phi = false;
-  float x_70 = p.x;
-  float x_72 = a.x;
-  float x_75 = p.y;
-  float x_77 = a.y;
-  float x_81 = b.x;
-  float x_82 = a.x;
-  float x_85 = b.y;
-  float x_86 = a.y;
-  param = vec2((x_70 - x_72), (x_75 - x_77));
-  param_1 = vec2((x_81 - x_82), (x_85 - x_86));
-  float x_90 = param.x;
-  float x_92 = param_1.y;
-  float x_95 = param_1.x;
-  float x_97 = param.y;
-  float x_99 = ((x_90 * x_92) - (x_95 * x_97));
-  x_68 = x_99;
-  float x_100 = p.x;
-  float x_101 = b.x;
-  float x_103 = p.y;
-  float x_104 = b.y;
-  float x_108 = c.x;
-  float x_109 = b.x;
-  float x_112 = c.y;
-  float x_113 = b.y;
-  param_2 = vec2((x_100 - x_101), (x_103 - x_104));
-  param_3 = vec2((x_108 - x_109), (x_112 - x_113));
-  float x_117 = param_2.x;
-  float x_119 = param_3.y;
-  float x_122 = param_3.x;
-  float x_124 = param_2.y;
-  float x_126 = ((x_117 * x_119) - (x_122 * x_124));
-  x_67 = x_126;
-  bool x_127 = (x_99 < 0.0f);
-  bool 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;
-  }
-  if (!(x_136_phi)) {
-    return 0;
-  }
-  float x_140 = p.x;
-  float x_141 = c.x;
-  float x_143 = p.y;
-  float x_144 = c.y;
-  float x_147 = a.x;
-  float x_148 = c.x;
-  float x_150 = a.y;
-  float x_151 = c.y;
-  param_4 = vec2((x_140 - x_141), (x_143 - x_144));
-  param_5 = vec2((x_147 - x_148), (x_150 - x_151));
-  float x_155 = param_4.x;
-  float x_157 = param_5.y;
-  float x_160 = param_5.x;
-  float x_162 = param_4.y;
-  float x_164 = ((x_155 * x_157) - (x_160 * x_162));
-  x_66 = x_164;
-  bool 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;
-  }
-  if (!(x_173_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_55 = tint_symbol;
-  vec2 x_58 = x_17.resolution;
-  param_6 = (vec2(x_55.x, x_55.y) / x_58);
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_60 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:62: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:62: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.glsl
deleted file mode 100644
index 4ba0f6f..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/0.wgsl.expected.glsl
+++ /dev/null
@@ -1,143 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  vec2 resolution;
-};
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_17;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a, inout vec2 b, inout vec2 c) {
-  float x_66 = 0.0f;
-  float x_67 = 0.0f;
-  float x_68 = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_135 = false;
-  bool x_172 = false;
-  bool x_136_phi = false;
-  bool x_173_phi = false;
-  float x_70 = p.x;
-  float x_72 = a.x;
-  float x_75 = p.y;
-  float x_77 = a.y;
-  float x_81 = b.x;
-  float x_82 = a.x;
-  float x_85 = b.y;
-  float x_86 = a.y;
-  param = vec2((x_70 - x_72), (x_75 - x_77));
-  param_1 = vec2((x_81 - x_82), (x_85 - x_86));
-  float x_90 = param.x;
-  float x_92 = param_1.y;
-  float x_95 = param_1.x;
-  float x_97 = param.y;
-  float x_99 = ((x_90 * x_92) - (x_95 * x_97));
-  x_68 = x_99;
-  float x_100 = p.x;
-  float x_101 = b.x;
-  float x_103 = p.y;
-  float x_104 = b.y;
-  float x_108 = c.x;
-  float x_109 = b.x;
-  float x_112 = c.y;
-  float x_113 = b.y;
-  param_2 = vec2((x_100 - x_101), (x_103 - x_104));
-  param_3 = vec2((x_108 - x_109), (x_112 - x_113));
-  float x_117 = param_2.x;
-  float x_119 = param_3.y;
-  float x_122 = param_3.x;
-  float x_124 = param_2.y;
-  float x_126 = ((x_117 * x_119) - (x_122 * x_124));
-  x_67 = x_126;
-  bool x_127 = (x_99 < 0.0f);
-  bool 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;
-  }
-  if (!(x_136_phi)) {
-    return 0;
-  }
-  float x_140 = p.x;
-  float x_141 = c.x;
-  float x_143 = p.y;
-  float x_144 = c.y;
-  float x_147 = a.x;
-  float x_148 = c.x;
-  float x_150 = a.y;
-  float x_151 = c.y;
-  param_4 = vec2((x_140 - x_141), (x_143 - x_144));
-  param_5 = vec2((x_147 - x_148), (x_150 - x_151));
-  float x_155 = param_4.x;
-  float x_157 = param_5.y;
-  float x_160 = param_5.x;
-  float x_162 = param_4.y;
-  float x_164 = ((x_155 * x_157) - (x_160 * x_162));
-  x_66 = x_164;
-  bool 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;
-  }
-  if (!(x_173_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_55 = tint_symbol;
-  vec2 x_58 = x_17.resolution;
-  param_6 = (vec2(x_55.x, x_55.y) / x_58);
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_60 == 1)) {
-    x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:62: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:62: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.glsl
deleted file mode 100644
index 8722064..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.spvasm.expected.glsl
+++ /dev/null
@@ -1,187 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf1 {
-  vec2 injectionSwitch;
-};
-
-struct buf0 {
-  vec2 resolution;
-};
-
-layout(binding = 1) uniform buf1_1 {
-  vec2 injectionSwitch;
-} x_11;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_19;
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a, inout vec2 b, inout vec2 c) {
-  float x_78 = 0.0f;
-  float x_79 = 0.0f;
-  float x_80 = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_147 = false;
-  bool x_203 = false;
-  bool x_148_phi = false;
-  bool x_204_phi = false;
-  float x_82 = p.x;
-  float x_84 = a.x;
-  float x_87 = p.y;
-  float x_89 = a.y;
-  float x_93 = b.x;
-  float x_94 = a.x;
-  float x_97 = b.y;
-  float x_98 = a.y;
-  param = vec2((x_82 - x_84), (x_87 - x_89));
-  param_1 = vec2((x_93 - x_94), (x_97 - x_98));
-  float x_102 = param.x;
-  float x_104 = param_1.y;
-  float x_107 = param_1.x;
-  float x_109 = param.y;
-  float x_111 = ((x_102 * x_104) - (x_107 * x_109));
-  x_80 = x_111;
-  float x_112 = p.x;
-  float x_113 = b.x;
-  float x_115 = p.y;
-  float x_116 = b.y;
-  float x_120 = c.x;
-  float x_121 = b.x;
-  float x_124 = c.y;
-  float x_125 = b.y;
-  param_2 = vec2((x_112 - x_113), (x_115 - x_116));
-  param_3 = vec2((x_120 - x_121), (x_124 - x_125));
-  float x_129 = param_2.x;
-  float x_131 = param_3.y;
-  float x_134 = param_3.x;
-  float x_136 = param_2.y;
-  float x_138 = ((x_129 * x_131) - (x_134 * x_136));
-  x_79 = x_138;
-  bool x_139 = (x_111 < 0.0f);
-  bool 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;
-  if (!(x_148_phi)) {
-    x_153_phi = 0;
-    while (true) {
-      int x_154 = 0;
-      int x_164_phi = 0;
-      int x_153 = x_153_phi;
-      float x_159 = x_11.injectionSwitch.y;
-      int x_160 = int(x_159);
-      if ((x_153 < x_160)) {
-      } else {
-        break;
-      }
-      x_GLF_color = vec4(1.0f, 1.0f, 1.0f, 1.0f);
-      x_164_phi = 0;
-      while (true) {
-        int x_165 = 0;
-        int x_164 = x_164_phi;
-        if ((x_164 < x_160)) {
-        } else {
-          break;
-        }
-        x_GLF_color = vec4(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 x_171 = p.x;
-  float x_172 = c.x;
-  float x_174 = p.y;
-  float x_175 = c.y;
-  float x_178 = a.x;
-  float x_179 = c.x;
-  float x_181 = a.y;
-  float x_182 = c.y;
-  param_4 = vec2((x_171 - x_172), (x_174 - x_175));
-  param_5 = vec2((x_178 - x_179), (x_181 - x_182));
-  float x_186 = param_4.x;
-  float x_188 = param_5.y;
-  float x_191 = param_5.x;
-  float x_193 = param_4.y;
-  float x_195 = ((x_186 * x_188) - (x_191 * x_193));
-  x_78 = x_195;
-  bool 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;
-  }
-  if (!(x_204_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_60 = tint_symbol;
-  vec2 x_63 = x_19.resolution;
-  param_6 = (vec2(x_60.x, x_60.y) / x_63);
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_65 == 1)) {
-    float x_71 = x_11.injectionSwitch.y;
-    float x_73 = x_11.injectionSwitch.x;
-    if ((x_71 >= x_73)) {
-      x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-    }
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:70: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:70: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.glsl b/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.glsl
deleted file mode 100644
index 8722064..0000000
--- a/test/vk-gl-cts/graphicsfuzz/stable-triangle-nested-for-loop-and-true-if/1.wgsl.expected.glsl
+++ /dev/null
@@ -1,187 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf1 {
-  vec2 injectionSwitch;
-};
-
-struct buf0 {
-  vec2 resolution;
-};
-
-layout(binding = 1) uniform buf1_1 {
-  vec2 injectionSwitch;
-} x_11;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-layout(binding = 0) uniform buf0_1 {
-  vec2 resolution;
-} x_19;
-
-int pointInTriangle_vf2_vf2_vf2_vf2_(inout vec2 p, inout vec2 a, inout vec2 b, inout vec2 c) {
-  float x_78 = 0.0f;
-  float x_79 = 0.0f;
-  float x_80 = 0.0f;
-  vec2 param = vec2(0.0f, 0.0f);
-  vec2 param_1 = vec2(0.0f, 0.0f);
-  vec2 param_2 = vec2(0.0f, 0.0f);
-  vec2 param_3 = vec2(0.0f, 0.0f);
-  vec2 param_4 = vec2(0.0f, 0.0f);
-  vec2 param_5 = vec2(0.0f, 0.0f);
-  bool x_147 = false;
-  bool x_203 = false;
-  bool x_148_phi = false;
-  bool x_204_phi = false;
-  float x_82 = p.x;
-  float x_84 = a.x;
-  float x_87 = p.y;
-  float x_89 = a.y;
-  float x_93 = b.x;
-  float x_94 = a.x;
-  float x_97 = b.y;
-  float x_98 = a.y;
-  param = vec2((x_82 - x_84), (x_87 - x_89));
-  param_1 = vec2((x_93 - x_94), (x_97 - x_98));
-  float x_102 = param.x;
-  float x_104 = param_1.y;
-  float x_107 = param_1.x;
-  float x_109 = param.y;
-  float x_111 = ((x_102 * x_104) - (x_107 * x_109));
-  x_80 = x_111;
-  float x_112 = p.x;
-  float x_113 = b.x;
-  float x_115 = p.y;
-  float x_116 = b.y;
-  float x_120 = c.x;
-  float x_121 = b.x;
-  float x_124 = c.y;
-  float x_125 = b.y;
-  param_2 = vec2((x_112 - x_113), (x_115 - x_116));
-  param_3 = vec2((x_120 - x_121), (x_124 - x_125));
-  float x_129 = param_2.x;
-  float x_131 = param_3.y;
-  float x_134 = param_3.x;
-  float x_136 = param_2.y;
-  float x_138 = ((x_129 * x_131) - (x_134 * x_136));
-  x_79 = x_138;
-  bool x_139 = (x_111 < 0.0f);
-  bool 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;
-  if (!(x_148_phi)) {
-    x_153_phi = 0;
-    while (true) {
-      int x_154 = 0;
-      int x_164_phi = 0;
-      int x_153 = x_153_phi;
-      float x_159 = x_11.injectionSwitch.y;
-      int x_160 = int(x_159);
-      if ((x_153 < x_160)) {
-      } else {
-        break;
-      }
-      x_GLF_color = vec4(1.0f, 1.0f, 1.0f, 1.0f);
-      x_164_phi = 0;
-      while (true) {
-        int x_165 = 0;
-        int x_164 = x_164_phi;
-        if ((x_164 < x_160)) {
-        } else {
-          break;
-        }
-        x_GLF_color = vec4(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 x_171 = p.x;
-  float x_172 = c.x;
-  float x_174 = p.y;
-  float x_175 = c.y;
-  float x_178 = a.x;
-  float x_179 = c.x;
-  float x_181 = a.y;
-  float x_182 = c.y;
-  param_4 = vec2((x_171 - x_172), (x_174 - x_175));
-  param_5 = vec2((x_178 - x_179), (x_181 - x_182));
-  float x_186 = param_4.x;
-  float x_188 = param_5.y;
-  float x_191 = param_5.x;
-  float x_193 = param_4.y;
-  float x_195 = ((x_186 * x_188) - (x_191 * x_193));
-  x_78 = x_195;
-  bool 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;
-  }
-  if (!(x_204_phi)) {
-    return 0;
-  }
-  return 1;
-}
-
-void main_1() {
-  vec2 param_6 = vec2(0.0f, 0.0f);
-  vec2 param_7 = vec2(0.0f, 0.0f);
-  vec2 param_8 = vec2(0.0f, 0.0f);
-  vec2 param_9 = vec2(0.0f, 0.0f);
-  vec4 x_60 = tint_symbol;
-  vec2 x_63 = x_19.resolution;
-  param_6 = (vec2(x_60.x, x_60.y) / x_63);
-  param_7 = vec2(0.699999988f, 0.300000012f);
-  param_8 = vec2(0.5f, 0.899999976f);
-  param_9 = vec2(0.100000001f, 0.400000006f);
-  int x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(param_6, param_7, param_8, param_9);
-  if ((x_65 == 1)) {
-    float x_71 = x_11.injectionSwitch.y;
-    float x_73 = x_11.injectionSwitch.x;
-    if ((x_71 >= x_73)) {
-      x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-    }
-  } else {
-    x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 1.0f);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:70: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:70: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 2d39782..0000000
--- a/test/vk-gl-cts/graphicsfuzz/write-before-break/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,94 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct buf0 {
-  int injected;
-};
-
-layout(binding = 0) uniform buf0_1 {
-  int injected;
-} x_9;
-
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  int idx = 0;
-  mat4x3 m43 = mat4x3(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;
-  mat4x3 tempm43 = mat4x3(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.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  idx = 0;
-  m43 = mat4x3(vec3(1.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), vec3(0.0f, 0.0f, 1.0f), vec3(0.0f, 0.0f, 0.0f));
-  ll_1 = 0;
-  GLF_live6rows = 2;
-  while (true) {
-    int x_18 = ll_1;
-    int x_19 = x_9.injected;
-    if ((x_18 >= x_19)) {
-      x_GLF_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
-      break;
-    }
-    ll_1 = (ll_1 + 1);
-    int x_22 = x_9.injected;
-    z = x_22;
-    ll_2 = 0;
-    ctr = 0;
-    {
-      for(; (ctr < 1); ctr = (ctr + 1)) {
-        int x_24 = ll_2;
-        int x_25 = x_9.injected;
-        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;
-            tempm43[(((c >= 0) & (c < 4)) ? c : 0)][(((d >= 0) & (d < 3)) ? d : 0)] = 1.0f;
-          }
-        }
-        int x_117 = (((idx >= 0) & (idx < 9)) ? idx : 0);
-        float x_119 = m43[ctr].y;
-        float x_121 = GLF_live6sums[x_117];
-        GLF_live6sums[x_117] = (x_121 + x_119);
-      }
-    }
-    idx = (idx + 1);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:57: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:57: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 62a404d..0000000
--- a/test/vk-gl-cts/graphicsfuzz/write-red-after-search/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,368 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-struct BST {
-  int data;
-  int leftIndex;
-  int rightIndex;
-};
-
-struct buf0 {
-  vec2 injectionSwitch;
-};
-
-struct Obj {
-  float odd_numbers[10];
-  float even_numbers[10];
-};
-
-BST tree_1[10] = BST[10](BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0), BST(0, 0, 0));
-layout(binding = 0) uniform buf0_1 {
-  vec2 injectionSwitch;
-} x_27;
-
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void makeTreeNode_struct_BST_i1_i1_i11_i1_(inout BST tree, inout int data) {
-  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, 0, 0);
-  int param_1 = 0;
-  BST param_2 = BST(0, 0, 0);
-  int param_3 = 0;
-  int GLF_live8i = 0;
-  float GLF_live8A[50] = float[50](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, 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, 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, 0.0f, 0.0f);
-  baseIndex = 0;
-  while (true) {
-    int x_75 = baseIndex;
-    int x_76 = treeIndex;
-    if ((x_75 <= x_76)) {
-    } else {
-      break;
-    }
-    int x_77 = data_1;
-    int x_79 = tree_1[baseIndex].data;
-    if ((x_77 <= x_79)) {
-      int x_81 = tree_1[baseIndex].leftIndex;
-      if ((x_81 == -1)) {
-        int x_82 = baseIndex;
-        int x_83 = treeIndex;
-        tree_1[x_82].leftIndex = x_83;
-        int x_84 = treeIndex;
-        BST x_350 = tree_1[x_84];
-        param = x_350;
-        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 {
-        int x_87 = tree_1[baseIndex].leftIndex;
-        baseIndex = x_87;
-        continue;
-      }
-    } else {
-      int x_89 = tree_1[baseIndex].rightIndex;
-      if ((x_89 == -1)) {
-        int x_90 = baseIndex;
-        int x_91 = treeIndex;
-        tree_1[x_90].rightIndex = x_91;
-        int x_92 = treeIndex;
-        BST x_362 = tree_1[x_92];
-        param_2 = x_362;
-        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;
-        int x_369 = (((GLF_live8i >= 0) & (GLF_live8i < 50)) ? GLF_live8i : 0);
-        float x_371 = GLF_live8A[0];
-        float x_373 = GLF_live8A[x_369];
-        GLF_live8A[x_369] = (x_373 + x_371);
-        while (true) {
-          int x_98 = tree_1[baseIndex].rightIndex;
-          baseIndex = x_98;
-          {
-            float x_382 = x_27.injectionSwitch.x;
-            float x_384 = x_27.injectionSwitch.y;
-            if ((x_382 > x_384)) {
-            } else {
-              break;
-            }
-          }
-        }
-        continue;
-      }
-    }
-  }
-  return;
-}
-
-int search_i1_(inout int target) {
-  int index = 0;
-  BST currentNode = BST(0, 0, 0);
-  int x_387 = 0;
-  index = 0;
-  while (true) {
-    if ((index != -1)) {
-    } else {
-      break;
-    }
-    BST x_395 = tree_1[index];
-    currentNode = x_395;
-    int x_101 = currentNode.data;
-    int x_102 = target;
-    if ((x_101 == x_102)) {
-      int x_103 = target;
-      return x_103;
-    }
-    int x_104 = target;
-    int x_105 = currentNode.data;
-    if ((x_104 > x_105)) {
-      int x_106 = currentNode.rightIndex;
-      x_387 = x_106;
-    } else {
-      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;
-  float x_418 = v;
-  v = (x_418 * 6.5f);
-  float x_420 = v;
-  if ((x_420 < 1.5f)) {
-    param_5 = 100;
-    int x_110 = search_i1_(param_5);
-    return float(x_110);
-  }
-  float x_425 = v;
-  if ((x_425 < 4.0f)) {
-    return 0.0f;
-  }
-  float x_429 = v;
-  param_6 = 6;
-  int x_111 = search_i1_(param_6);
-  if ((x_429 < float(x_111))) {
-    return 1.0f;
-  }
-  param_7 = 30;
-  int x_112 = search_i1_(param_7);
-  return (10.0f + float(x_112));
-}
-
-vec3 hueColor_f1_(inout float angle) {
-  float nodeData = 0.0f;
-  int param_4 = 0;
-  param_4 = 15;
-  int x_109 = search_i1_(param_4);
-  nodeData = float(x_109);
-  float x_409 = angle;
-  return ((vec3(30.0f, 30.0f, 30.0f) + (vec3(1.0f, 5.0f, nodeData) * x_409)) / vec3(50.0f, 50.0f, 50.0f));
-}
-
-void main_1() {
-  int treeIndex_1 = 0;
-  BST param_8 = BST(0, 0, 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(float[10](0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f), float[10](0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f));
-  int param_24 = 0;
-  int param_25 = 0;
-  int param_26 = 0;
-  int param_27 = 0;
-  vec2 z = vec2(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;
-  vec3 x_235 = vec3(0.0f, 0.0f, 0.0f);
-  float param_31 = 0.0f;
-  treeIndex_1 = 0;
-  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;
-      int x_144 = GLF_live4index;
-      int x_145 = GLF_live4index;
-      int x_146 = GLF_live4index;
-      float x_269 = GLF_live4obj.even_numbers[1];
-      GLF_live4obj.even_numbers[(((x_144 >= 0) & (x_145 < 10)) ? x_146 : 0)] = x_269;
-      GLF_live4obj.even_numbers[(((GLF_live4i >= 0) & (GLF_live4i < 10)) ? GLF_live4i : 0)] = 1.0f;
-    }
-  }
-  param_24 = treeIndex_1;
-  param_25 = 17;
-  insert_i1_i1_(param_24, param_25);
-  float x_278 = x_27.injectionSwitch.x;
-  float x_280 = x_27.injectionSwitch.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);
-  vec4 x_285 = tint_symbol;
-  z = (vec2(x_285.y, x_285.x) / vec2(256.0f, 256.0f));
-  float x_289 = z.x;
-  param_28 = x_289;
-  float x_290 = makeFrame_f1_(param_28);
-  x_1 = x_290;
-  float x_292 = z.y;
-  param_29 = x_292;
-  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;
-      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)));
-  float x_313 = x_27.injectionSwitch.x;
-  float x_315 = x_27.injectionSwitch.y;
-  if ((x_313 < x_315)) {
-    x_235 = vec3(1.0f, 0.0f, 0.0f);
-  } else {
-    param_31 = a;
-    vec3 x_321 = hueColor_f1_(param_31);
-    x_235 = x_321;
-  }
-  vec3 x_322 = x_235;
-  x_GLF_color = vec4(x_322.x, x_322.y, x_322.z, 1.0f);
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(x_GLF_color);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:88: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:88: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.glsl b/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.glsl
deleted file mode 100644
index 5a83706..0000000
--- a/test/vk-gl-cts/graphicsfuzz/write-red-in-loop-nest/0-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,83 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out vec4 x_GLF_color_1_1;
-vec4 x_GLF_color = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-void main_1() {
-  mat4x3 m43 = mat4x3(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;
-  mat4x3 tempm43 = mat4x3(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.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
-  int idx = 0;
-  m43 = mat4x3(vec3(1.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), vec3(0.0f, 0.0f, 1.0f), vec3(0.0f, 0.0f, 0.0f));
-  ll1 = 0;
-  rows = 2;
-  while (true) {
-    if (true) {
-    } else {
-      break;
-    }
-    x_GLF_color = vec4(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)) {
-            tempm43[(((d >= 0) & (d < 4)) ? d : 0)][(((r >= 0) & (r < 3)) ? r : 0)] = 1.0f;
-          }
-        }
-        int x_111 = (((idx >= 0) & (idx < 9)) ? idx : 0);
-        float x_113 = m43[c].y;
-        float x_115 = sums[x_111];
-        sums[x_111] = (x_115 + x_113);
-      }
-    }
-    idx = (idx + 1);
-  }
-  return;
-}
-
-struct main_out {
-  vec4 x_GLF_color_1;
-};
-
-main_out tint_symbol() {
-  main_1();
-  main_out tint_symbol_1 = main_out(x_GLF_color);
-  return tint_symbol_1;
-}
-
-void main() {
-  main_out inner_result = tint_symbol();
-  x_GLF_color_1_1 = inner_result.x_GLF_color_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:46: '&' :  wrong operand types: no operation '&' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:46: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
diff --git a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.glsl b/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.glsl
deleted file mode 100644
index ff8ea5c..0000000
--- a/test/vk-gl-cts/spirv_assembly/instruction/terminate_invocation/no_output_write/2-opt.spvasm.expected.glsl
+++ /dev/null
@@ -1,42 +0,0 @@
-SKIP: FAILED
-
-#version 310 es
-precision mediump float;
-
-layout(location = 0) out int out_data_1_1;
-vec4 tint_symbol = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-int out_data = 0;
-void main_1() {
-  bool x_is_odd = false;
-  bool y_is_odd = false;
-  float x_24 = tint_symbol.x;
-  x_is_odd = ((int(x_24) & 1) == 1);
-  float x_29 = tint_symbol.y;
-  y_is_odd = ((int(x_29) & 1) == 1);
-  out_data = ((x_is_odd | y_is_odd) ? 1 : 0);
-  return;
-}
-
-struct main_out {
-  int out_data_1;
-};
-
-main_out tint_symbol_1(vec4 tint_symbol_2) {
-  tint_symbol = tint_symbol_2;
-  main_1();
-  main_out tint_symbol_3 = main_out(out_data);
-  return tint_symbol_3;
-}
-
-void main() {
-  main_out inner_result = tint_symbol_1(gl_FragCoord);
-  out_data_1_1 = inner_result.out_data_1;
-  return;
-}
-Error parsing GLSL shader:
-ERROR: 0:14: '|' :  wrong operand types: no operation '|' exists that takes a left-hand operand of type ' temp bool' and a right operand of type ' temp bool' (or there is no acceptable conversion)
-ERROR: 0:14: '' : compilation terminated 
-ERROR: 2 compilation errors.  No code generated.
-
-
-
