Remove fallthrough support from SPIRV-Reader.
This CL removes support for fallthrough from the SPIRV-Reader.
Bug: tint:1644
Change-Id: I80b63d627960a82ba90de83af407c539b0442080
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/109004
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/tint/reader/spirv/function.cc b/src/tint/reader/spirv/function.cc
index 07b5980..a71aa42 100644
--- a/src/tint/reader/spirv/function.cc
+++ b/src/tint/reader/spirv/function.cc
@@ -25,7 +25,6 @@
#include "src/tint/ast/call_statement.h"
#include "src/tint/ast/continue_statement.h"
#include "src/tint/ast/discard_statement.h"
-#include "src/tint/ast/fallthrough_statement.h"
#include "src/tint/ast/if_statement.h"
#include "src/tint/ast/loop_statement.h"
#include "src/tint/ast/return_statement.h"
@@ -2159,8 +2158,7 @@
// For each branch encountered, classify each edge (S,T) as:
// - a back-edge
// - a structured exit (specific ways of branching to enclosing construct)
- // - a normal (forward) edge, either natural control flow or a case
- // fallthrough
+ // - a normal (forward) edge, either natural control flow or a case fallthrough
//
// If more than one block is targeted by a normal edge, then S must be a
// structured header.
@@ -2194,11 +2192,10 @@
// There should only be one backedge per backedge block.
uint32_t num_backedges = 0;
- // Track destinations for normal forward edges, either kForward
- // or kCaseFallThrough. These count toward the need
- // to have a merge instruction. We also track kIfBreak edges
- // because when used with normal forward edges, we'll need
- // to generate a flow guard variable.
+ // Track destinations for normal forward edges, either kForward or kCaseFallThrough.
+ // These count toward the need to have a merge instruction. We also track kIfBreak edges
+ // because when used with normal forward edges, we'll need to generate a flow guard
+ // variable.
utils::Vector<uint32_t, 4> normal_forward_edges;
utils::Vector<uint32_t, 4> if_break_edges;
@@ -2376,6 +2373,12 @@
<< dest_construct.begin_id << " (dominance rule violated)";
}
}
+
+ // Error on the fallthrough at the end in order to allow the better error messages
+ // from the above checks to happen.
+ if (edge_kind == EdgeKind::kCaseFallThrough) {
+ return Fail() << "Fallthrough not permitted in WGSL";
+ }
} // end forward edge
} // end successor
@@ -3261,11 +3264,9 @@
// The fallthrough case is special because WGSL requires the fallthrough
// statement to be last in the case clause.
if (true_kind == EdgeKind::kCaseFallThrough) {
- return EmitConditionalCaseFallThrough(block_info, cond, false_kind, *false_info,
- true);
+ return Fail() << "Fallthrough not supported in WGSL";
} else if (false_kind == EdgeKind::kCaseFallThrough) {
- return EmitConditionalCaseFallThrough(block_info, cond, true_kind, *true_info,
- false);
+ return Fail() << "Fallthrough not supported in WGSL";
}
// At this point, at most one edge is kForward or kIfBreak.
@@ -3304,7 +3305,7 @@
const ast::Statement* FunctionEmitter::MakeBranchDetailed(const BlockInfo& src_info,
const BlockInfo& dest_info,
bool forced,
- std::string* flow_guard_name_ptr) const {
+ std::string* flow_guard_name_ptr) {
auto kind = src_info.succ_edge.find(dest_info.id)->second;
switch (kind) {
case EdgeKind::kBack:
@@ -3367,8 +3368,10 @@
// merge block is implicit.
break;
}
- case EdgeKind::kCaseFallThrough:
- return create<ast::FallthroughStatement>(Source{});
+ case EdgeKind::kCaseFallThrough: {
+ Fail() << "Fallthrough not supported in WGSL";
+ return nullptr;
+ }
case EdgeKind::kForward:
// Unconditional forward branch is implicit.
break;
@@ -3398,45 +3401,6 @@
return if_stmt;
}
-bool FunctionEmitter::EmitConditionalCaseFallThrough(const BlockInfo& src_info,
- const ast::Expression* cond,
- EdgeKind other_edge_kind,
- const BlockInfo& other_dest,
- bool fall_through_is_true_branch) {
- // In WGSL, the fallthrough statement must come last in the case clause.
- // So we'll emit an if statement for the other branch, and then emit
- // the fallthrough.
-
- // We have two distinct destinations. But we only get here if this
- // is a normal terminator; in particular the source block is *not* the
- // start of an if-selection. So at most one branch is a kForward or
- // kCaseFallThrough.
- if (other_edge_kind == EdgeKind::kForward) {
- return Fail() << "internal error: normal terminator OpBranchConditional has "
- "both forward and fallthrough edges";
- }
- if (other_edge_kind == EdgeKind::kIfBreak) {
- return Fail() << "internal error: normal terminator OpBranchConditional has "
- "both IfBreak and fallthrough edges. Violates nesting rule";
- }
- if (other_edge_kind == EdgeKind::kBack) {
- return Fail() << "internal error: normal terminator OpBranchConditional has "
- "both backedge and fallthrough edges. Violates nesting rule";
- }
- auto* other_branch = MakeForcedBranch(src_info, other_dest);
- if (other_branch == nullptr) {
- return Fail() << "internal error: expected a branch for edge-kind " << int(other_edge_kind);
- }
- if (fall_through_is_true_branch) {
- AddStatement(MakeSimpleIf(cond, nullptr, other_branch));
- } else {
- AddStatement(MakeSimpleIf(cond, other_branch, nullptr));
- }
- AddStatement(create<ast::FallthroughStatement>(Source{}));
-
- return success();
-}
-
bool FunctionEmitter::EmitStatementsInBasicBlock(const BlockInfo& block_info,
bool* already_emitted) {
if (*already_emitted) {
diff --git a/src/tint/reader/spirv/function.h b/src/tint/reader/spirv/function.h
index 8d06735..917b374 100644
--- a/src/tint/reader/spirv/function.h
+++ b/src/tint/reader/spirv/function.h
@@ -34,15 +34,13 @@
//
// The edge kinds are used in many ways.
//
-// For example, consider the edges leaving a basic block and going to distinct
-// targets. If the total number of kForward + kIfBreak + kCaseFallThrough edges
-// is more than 1, then the block must be a structured header, i.e. it needs
-// a merge instruction to declare the control flow divergence and associated
-// reconvergence point. Those those edge kinds count toward divergence
-// because SPIR-v is designed to easily map back to structured control flow
-// in GLSL (and C). In GLSL and C, those forward-flow edges don't have a
-// special statement to express them. The other forward edges: kSwitchBreak,
-// kLoopBreak, and kLoopContinue directly map to 'break', 'break', and
+// For example, consider the edges leaving a basic block and going to distinct targets. If the
+// total number of kForward + kIfBreak + kCaseFallThrough edges is more than 1, then the block must
+// be a structured header, i.e. it needs a merge instruction to declare the control flow divergence
+// and associated reconvergence point. Those those edge kinds count toward divergence because
+// SPIR-V is designed to easily map back to structured control flow in GLSL (and C). In GLSL and C,
+// those forward-flow edges don't have a special statement to express them. The other forward
+// edges: kSwitchBreak, kLoopBreak, and kLoopContinue directly map to 'break', 'break', and
// 'continue', respectively.
enum class EdgeKind {
// A back-edge: An edge from a node to one of its ancestors in a depth-first
@@ -64,7 +62,8 @@
// This can only occur for an "if" selection, i.e. where the selection
// header ends in OpBranchConditional.
kIfBreak,
- // An edge from one switch case to the next sibling switch case.
+ // An edge from one switch case to the next sibling switch case. Note, this is not valid in WGSL
+ // at the moment and will trigger an ICE if encountered. It is here for completeness.
kCaseFallThrough,
// None of the above.
kForward
@@ -708,8 +707,7 @@
/// Emits code for terminators, but that aren't part of entering or
/// resolving structured control flow. That is, if the basic block
- /// terminator calls for it, emit the fallthrough, break, continue, return,
- /// or kill commands.
+ /// terminator calls for it, emit the fallthrough break, continue, return, or kill commands.
/// @param block_info the block with the terminator to emit (if any)
/// @returns false if emission failed
bool EmitNormalTerminator(const BlockInfo& block_info);
@@ -722,7 +720,7 @@
/// @param src_info the source block
/// @param dest_info the destination block
/// @returns the new statement, or a null statement
- const ast::Statement* MakeBranch(const BlockInfo& src_info, const BlockInfo& dest_info) const {
+ const ast::Statement* MakeBranch(const BlockInfo& src_info, const BlockInfo& dest_info) {
return MakeBranchDetailed(src_info, dest_info, false, nullptr);
}
@@ -732,8 +730,7 @@
/// @param src_info the source block
/// @param dest_info the destination block
/// @returns the new statement, or a null statement
- const ast::Statement* MakeForcedBranch(const BlockInfo& src_info,
- const BlockInfo& dest_info) const {
+ const ast::Statement* MakeForcedBranch(const BlockInfo& src_info, const BlockInfo& dest_info) {
return MakeBranchDetailed(src_info, dest_info, true, nullptr);
}
@@ -754,7 +751,7 @@
const ast::Statement* MakeBranchDetailed(const BlockInfo& src_info,
const BlockInfo& dest_info,
bool forced,
- std::string* flow_guard_name_ptr) const;
+ std::string* flow_guard_name_ptr);
/// Returns a new if statement with the given statements as the then-clause
/// and the else-clause. Either or both clauses might be nullptr. If both
diff --git a/src/tint/reader/spirv/function_cfg_test.cc b/src/tint/reader/spirv/function_cfg_test.cc
index 538657b..88dc78e 100644
--- a/src/tint/reader/spirv/function_cfg_test.cc
+++ b/src/tint/reader/spirv/function_cfg_test.cc
@@ -1288,43 +1288,7 @@
EXPECT_THAT(fe.block_order(), ElementsAre(10, 40, 20, 30, 99));
}
-TEST_F(SpvParserCFGTest, ComputeBlockOrder_RespectSwitchCaseFallthrough) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- ; SPIR-V validation requires a fallthrough destination to immediately
- ; follow the source. So %20 -> %40, %30 -> %50
- OpSwitch %selector %99 20 %20 40 %40 30 %30 50 %50
-
- %50 = OpLabel
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- %40 = OpLabel
- OpBranch %99
-
- %30 = OpLabel
- OpBranch %50 ; fallthrough
-
- %20 = OpLabel
- OpBranch %40 ; fallthrough
-
- OpFunctionEnd
- )";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- fe.RegisterBasicBlocks();
- fe.ComputeBlockOrderAndPositions();
-
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 30, 50, 20, 40, 99)) << assembly;
-}
-
-TEST_F(SpvParserCFGTest, ComputeBlockOrder_RespectSwitchCaseFallthrough_FromDefault) {
+TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_IsError) {
auto assembly = CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -1352,122 +1316,9 @@
auto p = parser(test::Assemble(assembly));
ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
auto fe = p->function_emitter(100);
- fe.RegisterBasicBlocks();
- fe.ComputeBlockOrderAndPositions();
-
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 80, 30, 40, 99)) << assembly;
-}
-
-TEST_F(SpvParserCFGTest, ComputeBlockOrder_RespectSwitchCaseFallthrough_FromCaseToDefaultToCase) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %80 20 %20 30 %30
-
- %20 = OpLabel
- OpBranch %80 ; fallthrough to default
-
- %80 = OpLabel ; the default case
- OpBranch %30 ; fallthrough to 30
-
- %30 = OpLabel
- OpBranch %99
-
- %99 = OpLabel ; dominated by %30, so follow %30
- OpReturn
-
- OpFunctionEnd
- )";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- fe.RegisterBasicBlocks();
- fe.ComputeBlockOrderAndPositions();
-
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 80, 30, 99)) << assembly;
-}
-
-TEST_F(SpvParserCFGTest, ComputeBlockOrder_SwitchCasesFallthrough_OppositeDirections) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 30 %30 40 %40 50 %50
-
- %99 = OpLabel
- OpReturn
-
- %20 = OpLabel
- OpBranch %30 ; forward
-
- %40 = OpLabel
- OpBranch %99
-
- %30 = OpLabel
- OpBranch %99
-
- ; SPIR-V doesn't actually allow a fall-through that goes backward in the
- ; module. But the block ordering algorithm tolerates it.
- %50 = OpLabel
- OpBranch %40 ; backward
-
- OpFunctionEnd
- )";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- fe.RegisterBasicBlocks();
- fe.ComputeBlockOrderAndPositions();
-
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 50, 40, 20, 30, 99)) << assembly;
-
- // We're deliberately testing a case that SPIR-V doesn't allow.
- p->DeliberatelyInvalidSpirv();
-}
-
-TEST_F(SpvParserCFGTest, ComputeBlockOrder_RespectSwitchCaseFallthrough_Interleaved) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- ; SPIR-V validation requires a fallthrough destination to immediately
- ; follow the source. So %20 -> %40
- OpSwitch %selector %99 20 %20 40 %40 30 %30 50 %50
-
- %99 = OpLabel
- OpReturn
-
- %20 = OpLabel
- OpBranch %40
-
- %30 = OpLabel
- OpBranch %50
-
- %40 = OpLabel
- OpBranch %60
-
- %50 = OpLabel
- OpBranch %70
-
- %60 = OpLabel
- OpBranch %99
-
- %70 = OpLabel
- OpBranch %99
-
- OpFunctionEnd
- )";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- fe.RegisterBasicBlocks();
- fe.ComputeBlockOrderAndPositions();
-
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 30, 50, 70, 20, 40, 60, 99)) << assembly;
+ EXPECT_FALSE(FlowClassifyCFGEdges(&fe)) << p->error();
+ // Some further processing
+ EXPECT_THAT(p->error(), Eq("Fallthrough not permitted in WGSL"));
}
TEST_F(SpvParserCFGTest, ComputeBlockOrder_Nest_If_Contains_If) {
@@ -1566,54 +1417,6 @@
EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 30, 40, 49, 50, 60, 70, 79, 99)) << assembly;
}
-TEST_F(SpvParserCFGTest, ComputeBlockOrder_Nest_IfFallthrough_In_SwitchCase) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %50 20 %20 50 %50
-
- %99 = OpLabel
- OpReturn
-
- %20 = OpLabel
- OpSelectionMerge %49 None
- OpBranchConditional %cond %30 %40
-
- %49 = OpLabel
- OpBranchConditional %cond %99 %50 ; fallthrough
-
- %30 = OpLabel
- OpBranch %49
-
- %40 = OpLabel
- OpBranch %49
-
- %50 = OpLabel
- OpSelectionMerge %79 None
- OpBranchConditional %cond %60 %70
-
- %79 = OpLabel
- OpBranch %99
-
- %60 = OpLabel
- OpBranch %79
-
- %70 = OpLabel
- OpBranch %79
-
- OpFunctionEnd
- )";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- fe.RegisterBasicBlocks();
- fe.ComputeBlockOrderAndPositions();
-
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 30, 40, 49, 50, 60, 70, 79, 99)) << assembly;
-}
-
TEST_F(SpvParserCFGTest, ComputeBlockOrder_Nest_IfBreak_In_SwitchCase) {
auto assembly = CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -3904,7 +3707,7 @@
OpSwitch %selector %80 60 %60
%60 = OpLabel
- OpBranch %89 ; fallthrough
+ OpBranch %89
%80 = OpLabel ; default for both switches
OpBranch %89
@@ -4974,8 +4777,6 @@
}
TEST_F(SpvParserCFGTest, ClassifyCFGEdges_IfBreak_EscapeSwitchCase_IsError) {
- // Code generation assumes that you can't have kCaseFallThrough and kIfBreak
- // from the same OpBranchConditional.
// This checks one direction of that, where the IfBreak is shown it can't
// escape a switch case.
auto assembly = CommonTypes() + R"(
@@ -5936,440 +5737,6 @@
"starting at block 30; branch bypasses merge block 59"));
}
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_CaseTailToCase) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 40 %40
-
- %20 = OpLabel ; case 20
- OpBranch %30
-
- %30 = OpLabel
- OpBranch %40 ; fallthrough
-
- %40 = OpLabel ; case 40
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
-
- auto* bi = fe.GetBlockInfo(30);
- ASSERT_NE(bi, nullptr);
- EXPECT_EQ(bi->succ_edge.count(40), 1u);
- EXPECT_EQ(bi->succ_edge[40], EdgeKind::kCaseFallThrough);
-}
-
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_CaseTailToDefaultNotMerge) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %40 20 %20
-
- %20 = OpLabel ; case 20
- OpBranch %30
-
- %30 = OpLabel
- OpBranch %40 ; fallthrough
-
- %40 = OpLabel ; case 40
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
-
- auto* bi = fe.GetBlockInfo(30);
- ASSERT_NE(bi, nullptr);
- EXPECT_EQ(bi->succ_edge.count(40), 1u);
- EXPECT_EQ(bi->succ_edge[40], EdgeKind::kCaseFallThrough);
-}
-
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_DefaultToCase) {
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %20 40 %40
-
- %20 = OpLabel ; default
- OpBranch %30
-
- %30 = OpLabel
- OpBranch %40 ; fallthrough
-
- %40 = OpLabel ; case 40
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(FlowClassifyCFGEdges(&fe));
-
- auto* bi = fe.GetBlockInfo(30);
- ASSERT_NE(bi, nullptr);
- EXPECT_EQ(bi->succ_edge.count(40), 1u);
- EXPECT_EQ(bi->succ_edge[40], EdgeKind::kCaseFallThrough);
-}
-
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_BranchConditionalWith_IfBreak_IsError) {
- // Code generation assumes OpBranchConditional can't have kCaseFallThrough
- // with kIfBreak.
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None ; Set up if-break to %99
- OpBranchConditional %cond %20 %99
-
- %20 = OpLabel
- OpSelectionMerge %80 None ; switch-selection
- OpSwitch %selector %80 30 %30 40 %40
-
- %30 = OpLabel ; first case
- ; branch to %99 would be an if-break, but it bypasess the switch merge
- ; Also has case fall-through
- OpBranchConditional %cond2 %99 %40
-
- %40 = OpLabel ; second case
- OpBranch %80
-
- %80 = OpLabel ; switch-selection's merge
- OpBranch %99
-
- %99 = OpLabel ; if-selection's merge
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(p->error(), Eq("Branch from block 30 to block 99 is an invalid exit from "
- "construct starting at block 20; branch bypasses merge block 80"));
-}
-
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_BranchConditionalWith_Forward_IsError) {
- // Code generation assumes OpBranchConditional can't have kCaseFallThrough
- // with kForward.
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None ; switch-selection
- OpSwitch %selector %99 20 %20 30 %30
-
- ; Try to make branch to 35 a kForward branch
- %20 = OpLabel ; first case
- OpBranchConditional %cond2 %25 %30
-
- %25 = OpLabel
- OpBranch %99
-
- %30 = OpLabel ; second case
- OpBranch %99
-
- %99 = OpLabel ; if-selection's merge
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(p->error(), Eq("Control flow diverges at block 20 (to 25, 30) but it is not "
- "a structured header (it has no merge instruction)"));
-}
-
-TEST_F(SpvParserCFGTest,
- ClassifyCFGEdges_Fallthrough_BranchConditionalWith_Back_LoopOnOutside_IsError) { // NOLINT
- // Code generation assumes OpBranchConditional can't have kCaseFallThrough
- // with kBack.
- //
- // This test has the loop on the outside. The backedge coming from a case
- // clause means the switch is inside the continue construct, and the nesting
- // of the switch's merge means the backedge is coming from a block that is not
- // at the end of the continue construct.
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpBranch %20
-
- %20 = OpLabel
- OpLoopMerge %99 %30 None
- OpBranch %30
-
- %30 = OpLabel ; continue target and
- OpSelectionMerge %80 None ; switch-selection
- OpSwitch %selector %80 40 %40 50 %50
-
- ; try to make a back edge with a fallthrough
- %40 = OpLabel ; first case
- OpBranchConditional %cond2 %20 %50
-
- %50 = OpLabel ; second case
- OpBranch %80
-
- %80 = OpLabel ; switch merge
- OpBranch %20 ; also backedge
-
- %99 = OpLabel ; loop merge
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(p->error(), Eq("Invalid exit (40->20) from continue construct: 40 is not the "
- "last block in the continue construct starting at 30 "
- "(violates post-dominance rule)"));
-}
-
-TEST_F(
- SpvParserCFGTest,
- FindSwitchCaseSelectionHeaders_Fallthrough_BranchConditionalWith_Back_LoopOnInside_FallthroughIsMerge_IsError) { // NOLINT
- // Code generation assumes OpBranchConditional can't have kCaseFallThrough
- // with kBack.
- //
- // This test has the loop on the inside. The merge block is also the
- // fallthrough target.
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel ; continue target and
- OpSelectionMerge %99 None ; switch-selection
- OpSwitch %selector %99 20 %20 50 %50
-
- %20 = OpLabel ; first case, and loop header
- OpLoopMerge %50 %40 None
- OpBranch %40
-
- ; try to make a back edge with a fallthrough
- %40 = OpLabel
- OpBranchConditional %cond2 %20 %50
-
- %50 = OpLabel ; second case. also the loop merge ; header must dominate its merge block !
- OpBranch %99
-
- %99 = OpLabel ; switch merge
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowFindSwitchCaseHeaders(&fe));
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 40, 50, 99));
- EXPECT_THAT(p->error(), Eq("Block 50 is a case block for switch-selection header 10 and "
- "also the merge block for 20 (violates dominance rule)"));
-}
-
-TEST_F(
- SpvParserCFGTest,
- ClassifyCFGEdges_Fallthrough_BranchConditionalWith_Back_LoopOnInside_FallthroughIsNotMerge_IsError) { // NOLINT
- // Code generation assumes OpBranchConditional can't have kCaseFallThrough
- // with kBack.
- //
- // This test has the loop on the inside. The merge block is not the merge
- // target But the block order gets messed up because of the weird
- // connectivity.
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel ; continue target and
- OpSelectionMerge %99 None ; switch-selection
- OpSwitch %selector %99 20 %20 50 %50
-
- %20 = OpLabel ; first case, and loop header
- OpLoopMerge %45 %40 None ; move the merge to an unreachable block
- OpBranch %40
-
- ; try to make a back edge with a fallthrough
- %40 = OpLabel
- OpBranchConditional %cond2 %20 %50
-
- %45 = OpLabel ; merge for the loop
- OpUnreachable
-
- %50 = OpLabel ; second case. target of fallthrough
- OpBranch %99
-
- %99 = OpLabel ; switch merge
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(p->error(), Eq("Branch from 10 to 50 bypasses continue target 40 "
- "(dominance rule violated)"));
-}
-
-TEST_F(
- SpvParserCFGTest,
- ClassifyCFGEdges_Fallthrough_BranchConditionalWith_Back_LoopOnInside_NestedMerge_IsError) { // NOLINT
- // Code generation assumes OpBranchConditional can't have kCaseFallThrough
- // with kBack.
- //
- // This test has the loop on the inside. The fallthrough is an invalid exit
- // from the loop. However, the block order gets all messed up because going
- // from 40 to 50 ends up pulling in 99
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel ; continue target and
- OpSelectionMerge %99 None ; switch-selection
- OpSwitch %selector %99 20 %20 50 %50
-
- %20 = OpLabel ; first case, and loop header
- OpLoopMerge %49 %40 None
- OpBranch %40
-
- ; try to make a back edge with a fallthrough
- %40 = OpLabel
- OpBranchConditional %cond2 %20 %50
-
- %49 = OpLabel ; loop merge
- OpBranch %99
-
- %50 = OpLabel ; second case
- OpBranch %99
-
- %99 = OpLabel ; switch merge
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 40, 50, 49, 99));
- EXPECT_THAT(p->error(), Eq("Branch from 10 to 50 bypasses continue target 40 "
- "(dominance rule violated)"));
-}
-
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_CaseNonTailToCase_TrueBranch) {
- // This is an unusual one, and is an error. Structurally it looks like this:
- // switch (val) {
- // case 0: {
- // if (cond) {
- // fallthrough;
- // }
- // something = 1;
- // }
- // case 1: { }
- // }
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 50 %50
-
- %20 = OpLabel
- OpSelectionMerge %49 None
- OpBranchConditional %cond %30 %49
-
- %30 = OpLabel
- OpBranch %50 ; attempt to fallthrough
-
- %49 = OpLabel
- OpBranch %99
-
- %50 = OpLabel
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(p->error(),
- Eq("Branch from 10 to 50 bypasses header 20 (dominance rule violated)"));
-}
-
-TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Fallthrough_CaseNonTailToCase_FalseBranch) {
- // Like previous test, but taking the false branch.
-
- // This is an unusual one, and is an error. Structurally it looks like this:
- // switch (val) {
- // case 0: {
- // if (cond) {
- // fallthrough;
- // }
- // something = 1;
- // }
- // case 1: { }
- // }
- auto assembly = CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 50 %50
-
- %20 = OpLabel
- OpSelectionMerge %49 None
- OpBranchConditional %cond %49 %30 ;; this is the difference
-
- %30 = OpLabel
- OpBranch %50 ; attempt to fallthrough
-
- %49 = OpLabel
- OpBranch %99
-
- %50 = OpLabel
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- OpFunctionEnd
-)";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(FlowClassifyCFGEdges(&fe));
- EXPECT_THAT(p->error(),
- Eq("Branch from 10 to 50 bypasses header 20 (dominance rule violated)"));
-}
-
TEST_F(SpvParserCFGTest, ClassifyCFGEdges_Forward_IfToThen) {
auto assembly = CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -9120,7 +8487,7 @@
ASSERT_EQ(expect, got);
}
-// First do no special control flow: no fallthroughs, breaks, continues.
+// First do no special control flow: no breaks, continues.
TEST_F(SpvParserCFGTest, EmitBody_Switch_DefaultIsMerge_OneCase) {
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -9307,8 +8674,7 @@
TEST_F(SpvParserCFGTest, EmitBody_Switch_DefaultIsCase_WithDupCase) {
// The default block is not the merge block and is the same as a case.
- // We emit the default case separately, but just before the labeled
- // case, and with a fallthrough.
+ // We emit the default case as part of the labeled case.
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -10423,53 +9789,6 @@
ASSERT_EQ(expect, got);
}
-TEST_F(SpvParserCFGTest, EmitBody_Branch_Fallthrough) {
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_1
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 30 %30
-
- %20 = OpLabel
- OpStore %var %uint_20
- OpBranch %30 ; uncondtional fallthrough
-
- %30 = OpLabel
- OpStore %var %uint_30
- OpBranch %99
-
- %99 = OpLabel
- OpStore %var %uint_7
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
-
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var_1 = 1u;
-switch(42u) {
- case 20u: {
- var_1 = 20u;
- fallthrough;
- }
- case 30u: {
- var_1 = 30u;
- }
- default: {
- }
-}
-var_1 = 7u;
-return;
-)";
- ASSERT_EQ(expect, got);
-}
-
TEST_F(SpvParserCFGTest, EmitBody_Branch_Forward) {
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -10507,7 +9826,6 @@
// If continue is forward, then it's a continue from a
// continue which is also invalid.
// kIfBreak: invalid: loop and if must have distinct merge blocks
-// kCaseFallThrough: invalid: loop header must dominate its merge
// kForward: impossible; would be a loop break
//
// kSwitchBreak with:
@@ -10516,7 +9834,6 @@
// kLoopBreak: invalid; only one kind of break allowed
// kLoopContinue: TESTED
// kIfBreak: invalid: switch and if must have distinct merge blocks
-// kCaseFallThrough: TESTED
// kForward: TESTED
//
// kLoopBreak with:
@@ -10525,7 +9842,6 @@
// kLoopBreak: dup general case
// kLoopContinue: TESTED
// kIfBreak: invalid: switch and if must have distinct merge blocks
-// kCaseFallThrough: not possible, because switch break conflicts with loop
// break kForward: TESTED
//
// kLoopContinue with:
@@ -10534,7 +9850,6 @@
// kLoopBreak: symmetry
// kLoopContinue: dup general case
// kIfBreak: TESTED
-// kCaseFallThrough: TESTED
// kForward: TESTED
//
// kIfBreak with:
@@ -10543,25 +9858,14 @@
// kLoopBreak: symmetry
// kLoopContinue: symmetry
// kIfBreak: dup general case
-// kCaseFallThrough: invalid; violates nesting or unique merges
// kForward: invalid: needs a merge instruction
//
-// kCaseFallThrough with:
-// kBack : symmetry
-// kSwitchBreak: symmetry
-// kLoopBreak: symmetry
-// kLoopContinue: symmetry
-// kIfBreak: symmetry
-// kCaseFallThrough: dup general case
-// kForward: invalid (tested)
-//
// kForward with:
// kBack : symmetry
// kSwitchBreak: symmetry
// kLoopBreak: symmetry
// kLoopContinue: symmetry
// kIfBreak: symmetry
-// kCaseFallThrough: symmetry
// kForward: dup general case
TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Back_SingleBlock_Back) {
@@ -11085,107 +10389,6 @@
ASSERT_EQ(expect, got);
}
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnTrue) {
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_1
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 30 %30
-
- %20 = OpLabel
- OpStore %var %uint_20
- OpBranchConditional %cond %30 %99; fallthrough on true
-
- %30 = OpLabel
- OpStore %var %uint_30
- OpBranch %99
-
- %99 = OpLabel
- OpStore %var %uint_7
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
-
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var_1 = 1u;
-switch(42u) {
- case 20u: {
- var_1 = 20u;
- if (false) {
- } else {
- break;
- }
- fallthrough;
- }
- case 30u: {
- var_1 = 30u;
- }
- default: {
- }
-}
-var_1 = 7u;
-return;
-)";
- ASSERT_EQ(expect, got);
-}
-
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnFalse) {
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_1
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 30 %30
-
- %20 = OpLabel
- OpStore %var %uint_20
- OpBranchConditional %cond %99 %30; fallthrough on false
-
- %30 = OpLabel
- OpStore %var %uint_30
- OpBranch %99
-
- %99 = OpLabel
- OpStore %var %uint_7
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
-
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var_1 = 1u;
-switch(42u) {
- case 20u: {
- var_1 = 20u;
- if (false) {
- break;
- }
- fallthrough;
- }
- case 30u: {
- var_1 = 30u;
- }
- default: {
- }
-}
-var_1 = 7u;
-return;
-)";
- ASSERT_EQ(expect, got);
-}
-
TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_LoopBreak_SingleBlock_LoopBreak) {
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -11411,53 +10614,6 @@
ASSERT_EQ(expect, got);
}
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_LoopBreak_Fallthrough_IsError) {
- // It's an error because switch break conflicts with loop break.
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_0
- OpBranch %20
-
- %20 = OpLabel
- OpStore %var %uint_1
- OpLoopMerge %99 %80 None
- OpBranch %30
-
- %30 = OpLabel
- OpSelectionMerge %79 None
- OpSwitch %selector %79 40 %40 50 %50
-
- %40 = OpLabel
- OpStore %var %uint_40
- ; error: branch to 99 bypasses switch's merge
- OpBranchConditional %cond %99 %50 ; loop break; fall through
-
- %50 = OpLabel
- OpStore %var %uint_50
- OpBranch %79
-
- %79 = OpLabel ; switch merge
- OpBranch %80
-
- %80 = OpLabel ; continue target
- OpStore %var %uint_4
- OpBranch %20
-
- %99 = OpLabel
- OpStore %var %uint_5
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(fe.EmitBody()) << p->error();
- EXPECT_THAT(p->error(), Eq("Branch from block 40 to block 99 is an invalid exit from construct "
- "starting at block 30; branch bypasses merge block 79"));
-}
-
TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_LoopBreak_Forward_OnTrue) {
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -11662,7 +10818,6 @@
TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Continue_Continue_AfterHeader_Conditional) {
// Create an intervening block so we actually require a "continue" statement
- // instead of just an adjacent fallthrough to the continue target.
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -11977,157 +11132,6 @@
ASSERT_EQ(expect, got);
}
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Continue_Fallthrough_OnTrue) {
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_0
- OpBranch %20
-
- %20 = OpLabel
- OpStore %var %uint_1
- OpLoopMerge %99 %80 None
- OpBranch %30
-
- %30 = OpLabel
- OpStore %var %uint_2
- OpSelectionMerge %79 None
- OpSwitch %selector %79 40 %40 50 %50
-
- %40 = OpLabel
- OpStore %var %uint_40
- OpBranchConditional %cond %50 %80 ; loop continue; fall through on true
-
- %50 = OpLabel
- OpStore %var %uint_50
- OpBranch %79
-
- %79 = OpLabel ; switch merge
- OpStore %var %uint_3
- OpBranch %80
-
- %80 = OpLabel ; continue target
- OpStore %var %uint_4
- OpBranch %20
-
- %99 = OpLabel
- OpStore %var %uint_5
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var_1 = 0u;
-loop {
- var_1 = 1u;
- var_1 = 2u;
- switch(42u) {
- case 40u: {
- var_1 = 40u;
- if (false) {
- } else {
- continue;
- }
- fallthrough;
- }
- case 50u: {
- var_1 = 50u;
- }
- default: {
- }
- }
- var_1 = 3u;
-
- continuing {
- var_1 = 4u;
- }
-}
-var_1 = 5u;
-return;
-)";
- ASSERT_EQ(expect, got);
-}
-
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Continue_Fallthrough_OnFalse) {
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_0
- OpBranch %20
-
- %20 = OpLabel
- OpStore %var %uint_1
- OpLoopMerge %99 %80 None
- OpBranch %30
-
- %30 = OpLabel
- OpStore %var %uint_2
- OpSelectionMerge %79 None
- OpSwitch %selector %79 40 %40 50 %50
-
- %40 = OpLabel
- OpStore %var %uint_40
- OpBranchConditional %cond %80 %50 ; loop continue; fall through on false
-
- %50 = OpLabel
- OpStore %var %uint_50
- OpBranch %79
-
- %79 = OpLabel ; switch merge
- OpStore %var %uint_3
- OpBranch %80
-
- %80 = OpLabel ; continue target
- OpStore %var %uint_4
- OpBranch %20
-
- %99 = OpLabel
- OpStore %var %uint_5
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var_1 = 0u;
-loop {
- var_1 = 1u;
- var_1 = 2u;
- switch(42u) {
- case 40u: {
- var_1 = 40u;
- if (false) {
- continue;
- }
- fallthrough;
- }
- case 50u: {
- var_1 = 50u;
- }
- default: {
- }
- }
- var_1 = 3u;
-
- continuing {
- var_1 = 4u;
- }
-}
-var_1 = 5u;
-return;
-)";
- ASSERT_EQ(expect, got);
-}
-
TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Continue_Forward_OnTrue) {
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
@@ -12308,91 +11312,6 @@
"starting at block 20; branch bypasses merge block 89"));
}
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Fallthrough_Fallthrough_Same) {
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpStore %var %uint_1
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 30 %30
-
- %20 = OpLabel
- OpStore %var %uint_20
- OpBranchConditional %cond %30 %30 ; fallthrough fallthrough
-
- %30 = OpLabel
- OpStore %var %uint_30
- OpBranch %99
-
- %99 = OpLabel
- OpStore %var %uint_7
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
-
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var_1 = 1u;
-switch(42u) {
- case 20u: {
- var_1 = 20u;
- fallthrough;
- }
- case 30u: {
- var_1 = 30u;
- }
- default: {
- }
-}
-var_1 = 7u;
-return;
-)";
- ASSERT_EQ(expect, got);
-}
-
-TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Fallthrough_NotLastInCase_IsError) {
- // See also
- // ClassifyCFGEdges_Fallthrough_BranchConditionalWith_Forward_IsError.
- auto p = parser(test::Assemble(CommonTypes() + R"(
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %selector %99 20 %20 40 %40
-
- %20 = OpLabel ; case 30
- OpSelectionMerge %39 None
- OpBranchConditional %cond %40 %30 ; fallthrough and forward
-
- %30 = OpLabel
- OpBranch %39
-
- %39 = OpLabel
- OpBranch %99
-
- %40 = OpLabel ; case 40
- OpBranch %99
-
- %99 = OpLabel
- OpReturn
-
- OpFunctionEnd
- )"));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << p->error();
- auto fe = p->function_emitter(100);
- EXPECT_FALSE(fe.EmitBody());
- // The weird forward branch pulls in 40 as part of the selection rather than
- // as a case.
- EXPECT_THAT(fe.block_order(), ElementsAre(10, 20, 40, 30, 39, 99));
- EXPECT_THAT(p->error(),
- Eq("Branch from 10 to 40 bypasses header 20 (dominance rule violated)"));
-}
-
TEST_F(SpvParserCFGTest, EmitBody_BranchConditional_Forward_Forward_Same) {
auto p = parser(test::Assemble(CommonTypes() + R"(
%100 = OpFunction %void None %voidfn
diff --git a/src/tint/reader/spirv/function_var_test.cc b/src/tint/reader/spirv/function_var_test.cc
index e3d2acf..5b83105 100644
--- a/src/tint/reader/spirv/function_var_test.cc
+++ b/src/tint/reader/spirv/function_var_test.cc
@@ -1344,73 +1344,6 @@
EXPECT_EQ(expect, got) << got;
}
-TEST_F(SpvParserFunctionVarTest, EmitStatement_Phi_InMerge_PredecessorsDominatdByNestedSwitchCase) {
- // This is the essence of the bug report from crbug.com/tint/495
- auto assembly = Preamble() + R"(
- %cond = OpConstantTrue %bool
- %pty = OpTypePointer Private %uint
- %1 = OpVariable %pty Private
- %boolpty = OpTypePointer Private %bool
- %7 = OpVariable %boolpty Private
- %8 = OpVariable %boolpty Private
-
- %100 = OpFunction %void None %voidfn
-
- %10 = OpLabel
- OpSelectionMerge %99 None
- OpSwitch %uint_1 %20 0 %20 1 %30
-
- %20 = OpLabel ; case 0
- OpBranch %30 ;; fall through
-
- %30 = OpLabel ; case 1
- OpSelectionMerge %50 None
- OpBranchConditional %true %40 %45
-
- %40 = OpLabel
- OpBranch %50
-
- %45 = OpLabel
- OpBranch %99 ; break
-
- %50 = OpLabel ; end the case
- OpBranch %99
-
- %99 = OpLabel
- ; predecessors are all dominated by case construct head at %30
- %41 = OpPhi %uint %uint_0 %45 %uint_1 %50
- %101 = OpCopyObject %uint %41 ; give it a use so it's emitted
- OpReturn
-
- OpFunctionEnd
- )";
- auto p = parser(test::Assemble(assembly));
- ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) << assembly;
- auto fe = p->function_emitter(100);
- EXPECT_TRUE(fe.EmitBody()) << p->error();
-
- auto ast_body = fe.ast_body();
- auto got = test::ToString(p->program(), ast_body);
- auto* expect = R"(var x_41 : u32;
-switch(1u) {
- case 0u, default: {
- fallthrough;
- }
- case 1u: {
- if (true) {
- } else {
- x_41 = 0u;
- break;
- }
- x_41 = 1u;
- }
-}
-let x_101 : u32 = x_41;
-return;
-)";
- EXPECT_EQ(expect, got) << got << assembly;
-}
-
TEST_F(SpvParserFunctionVarTest, EmitStatement_Phi_UseInPhiCountsAsUse) {
// From crbug.com/215
// If the only use of a combinatorially computed ID is as the value
diff --git a/test/tint/statements/switch/fallthrough.wgsl b/test/tint/statements/switch/fallthrough.wgsl
deleted file mode 100644
index 667a8f2..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl
+++ /dev/null
@@ -1,12 +0,0 @@
-@compute @workgroup_size(1)
-fn f() {
- var i : i32;
- switch(i) {
- case 0: {
- fallthrough;
- }
- default: {
- break;
- }
- }
-}
diff --git a/test/tint/statements/switch/fallthrough.wgsl.expected.dxc.hlsl b/test/tint/statements/switch/fallthrough.wgsl.expected.dxc.hlsl
deleted file mode 100644
index de066b7..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,20 +0,0 @@
-statements/switch/fallthrough.wgsl:6:13 warning: use of deprecated language feature: fallthrough is set to be removed from WGSL. Case can accept multiple selectors if the existing case bodies are empty. (e.g. `case 1, 2, 3:`) `default` is a valid case selector value. (e.g. `case 1, default:`)
- fallthrough;
- ^^^^^^^^^^^
-
-[numthreads(1, 1, 1)]
-void f() {
- int i = 0;
- switch(i) {
- case 0: {
- /* fallthrough */
- {
- break;
- }
- }
- default: {
- break;
- }
- }
- return;
-}
diff --git a/test/tint/statements/switch/fallthrough.wgsl.expected.fxc.hlsl b/test/tint/statements/switch/fallthrough.wgsl.expected.fxc.hlsl
deleted file mode 100644
index de066b7..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl.expected.fxc.hlsl
+++ /dev/null
@@ -1,20 +0,0 @@
-statements/switch/fallthrough.wgsl:6:13 warning: use of deprecated language feature: fallthrough is set to be removed from WGSL. Case can accept multiple selectors if the existing case bodies are empty. (e.g. `case 1, 2, 3:`) `default` is a valid case selector value. (e.g. `case 1, default:`)
- fallthrough;
- ^^^^^^^^^^^
-
-[numthreads(1, 1, 1)]
-void f() {
- int i = 0;
- switch(i) {
- case 0: {
- /* fallthrough */
- {
- break;
- }
- }
- default: {
- break;
- }
- }
- return;
-}
diff --git a/test/tint/statements/switch/fallthrough.wgsl.expected.glsl b/test/tint/statements/switch/fallthrough.wgsl.expected.glsl
deleted file mode 100644
index 6ca3be4..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl.expected.glsl
+++ /dev/null
@@ -1,23 +0,0 @@
-statements/switch/fallthrough.wgsl:6:13 warning: use of deprecated language feature: fallthrough is set to be removed from WGSL. Case can accept multiple selectors if the existing case bodies are empty. (e.g. `case 1, 2, 3:`) `default` is a valid case selector value. (e.g. `case 1, default:`)
- fallthrough;
- ^^^^^^^^^^^
-
-#version 310 es
-
-void f() {
- int i = 0;
- switch(i) {
- case 0: {
- /* fallthrough */
- }
- default: {
- break;
- }
- }
-}
-
-layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-void main() {
- f();
- return;
-}
diff --git a/test/tint/statements/switch/fallthrough.wgsl.expected.msl b/test/tint/statements/switch/fallthrough.wgsl.expected.msl
deleted file mode 100644
index d2cd679..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl.expected.msl
+++ /dev/null
@@ -1,20 +0,0 @@
-statements/switch/fallthrough.wgsl:6:13 warning: use of deprecated language feature: fallthrough is set to be removed from WGSL. Case can accept multiple selectors if the existing case bodies are empty. (e.g. `case 1, 2, 3:`) `default` is a valid case selector value. (e.g. `case 1, default:`)
- fallthrough;
- ^^^^^^^^^^^
-
-#include <metal_stdlib>
-
-using namespace metal;
-kernel void f() {
- int i = 0;
- switch(i) {
- case 0: {
- /* fallthrough */
- }
- default: {
- break;
- }
- }
- return;
-}
-
diff --git a/test/tint/statements/switch/fallthrough.wgsl.expected.spvasm b/test/tint/statements/switch/fallthrough.wgsl.expected.spvasm
deleted file mode 100644
index dc8c063..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl.expected.spvasm
+++ /dev/null
@@ -1,33 +0,0 @@
-statements/switch/fallthrough.wgsl:6:13 warning: use of deprecated language feature: fallthrough is set to be removed from WGSL. Case can accept multiple selectors if the existing case bodies are empty. (e.g. `case 1, 2, 3:`) `default` is a valid case selector value. (e.g. `case 1, default:`)
- fallthrough;
- ^^^^^^^^^^^
-
-; SPIR-V
-; Version: 1.3
-; Generator: Google Tint Compiler; 0
-; Bound: 13
-; Schema: 0
- OpCapability Shader
- OpMemoryModel Logical GLSL450
- OpEntryPoint GLCompute %f "f"
- OpExecutionMode %f LocalSize 1 1 1
- OpName %f "f"
- OpName %i "i"
- %void = OpTypeVoid
- %1 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %8 = OpConstantNull %int
- %f = OpFunction %void None %1
- %4 = OpLabel
- %i = OpVariable %_ptr_Function_int Function %8
- %10 = OpLoad %int %i
- OpSelectionMerge %9 None
- OpSwitch %10 %11 0 %12
- %12 = OpLabel
- OpBranch %11
- %11 = OpLabel
- OpBranch %9
- %9 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/statements/switch/fallthrough.wgsl.expected.wgsl b/test/tint/statements/switch/fallthrough.wgsl.expected.wgsl
deleted file mode 100644
index 50254ab..0000000
--- a/test/tint/statements/switch/fallthrough.wgsl.expected.wgsl
+++ /dev/null
@@ -1,16 +0,0 @@
-statements/switch/fallthrough.wgsl:6:13 warning: use of deprecated language feature: fallthrough is set to be removed from WGSL. Case can accept multiple selectors if the existing case bodies are empty. (e.g. `case 1, 2, 3:`) `default` is a valid case selector value. (e.g. `case 1, default:`)
- fallthrough;
- ^^^^^^^^^^^
-
-@compute @workgroup_size(1)
-fn f() {
- var i : i32;
- switch(i) {
- case 0: {
- fallthrough;
- }
- default: {
- break;
- }
- }
-}
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToCase.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToCase.spvasm
deleted file mode 100644
index bf5da38..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToCase.spvasm
+++ /dev/null
@@ -1,55 +0,0 @@
-; Test: SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToCase.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 40 %40
-%20 = OpLabel
-OpBranch %30
-%30 = OpLabel
-OpBranch %40
-%40 = OpLabel
-OpBranch %99
-%99 = OpLabel
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToDefaultNotMerge.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToDefaultNotMerge.spvasm
deleted file mode 100644
index e3f3d8d..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToDefaultNotMerge.spvasm
+++ /dev/null
@@ -1,55 +0,0 @@
-; Test: SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_CaseTailToDefaultNotMerge.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %40 20 %20
-%20 = OpLabel
-OpBranch %30
-%30 = OpLabel
-OpBranch %40
-%40 = OpLabel
-OpBranch %99
-%99 = OpLabel
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_DefaultToCase.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_DefaultToCase.spvasm
deleted file mode 100644
index 5ab7265..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_DefaultToCase.spvasm
+++ /dev/null
@@ -1,55 +0,0 @@
-; Test: SpvParserCFGTest_ClassifyCFGEdges_Fallthrough_DefaultToCase.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %20 40 %40
-%20 = OpLabel
-OpBranch %30
-%30 = OpLabel
-OpBranch %40
-%40 = OpLabel
-OpBranch %99
-%99 = OpLabel
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_Nest_IfFallthrough_In_SwitchCase.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_Nest_IfFallthrough_In_SwitchCase.spvasm
deleted file mode 100644
index 87bdbc8..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_Nest_IfFallthrough_In_SwitchCase.spvasm
+++ /dev/null
@@ -1,67 +0,0 @@
-; Test: SpvParserCFGTest_ComputeBlockOrder_Nest_IfFallthrough_In_SwitchCase.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %50 20 %20 50 %50
-%99 = OpLabel
-OpReturn
-%20 = OpLabel
-OpSelectionMerge %49 None
-OpBranchConditional %5 %30 %40
-%49 = OpLabel
-OpBranchConditional %5 %99 %50
-%30 = OpLabel
-OpBranch %49
-%40 = OpLabel
-OpBranch %49
-%50 = OpLabel
-OpSelectionMerge %79 None
-OpBranchConditional %5 %60 %70
-%79 = OpLabel
-OpBranch %99
-%60 = OpLabel
-OpBranch %79
-%70 = OpLabel
-OpBranch %79
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough.spvasm
deleted file mode 100644
index 92feaa3..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough.spvasm
+++ /dev/null
@@ -1,57 +0,0 @@
-; Test: SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 40 %40 30 %30 50 %50
-%50 = OpLabel
-OpBranch %99
-%99 = OpLabel
-OpReturn
-%40 = OpLabel
-OpBranch %99
-%30 = OpLabel
-OpBranch %50
-%20 = OpLabel
-OpBranch %40
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromCaseToDefaultToCase.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromCaseToDefaultToCase.spvasm
deleted file mode 100644
index a74bcc1..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromCaseToDefaultToCase.spvasm
+++ /dev/null
@@ -1,55 +0,0 @@
-; Test: SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromCaseToDefaultToCase.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %80 20 %20 30 %30
-%20 = OpLabel
-OpBranch %80
-%80 = OpLabel
-OpBranch %30
-%30 = OpLabel
-OpBranch %99
-%99 = OpLabel
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromDefault.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromDefault.spvasm
deleted file mode 100644
index d6e1cb3..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromDefault.spvasm
+++ /dev/null
@@ -1,57 +0,0 @@
-; Test: SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_FromDefault.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %80 20 %20 30 %30 40 %40
-%80 = OpLabel
-OpBranch %30
-%99 = OpLabel
-OpReturn
-%40 = OpLabel
-OpBranch %99
-%30 = OpLabel
-OpBranch %40
-%20 = OpLabel
-OpBranch %99
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_Interleaved.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_Interleaved.spvasm
deleted file mode 100644
index 3f26450..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_Interleaved.spvasm
+++ /dev/null
@@ -1,61 +0,0 @@
-; Test: SpvParserCFGTest_ComputeBlockOrder_RespectSwitchCaseFallthrough_Interleaved.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 40 %40 30 %30 50 %50
-%99 = OpLabel
-OpReturn
-%20 = OpLabel
-OpBranch %40
-%30 = OpLabel
-OpBranch %50
-%40 = OpLabel
-OpBranch %60
-%50 = OpLabel
-OpBranch %70
-%60 = OpLabel
-OpBranch %99
-%70 = OpLabel
-OpBranch %99
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Fallthrough_Fallthrough_Same.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Fallthrough_Fallthrough_Same.spvasm
deleted file mode 100644
index 0560ea2..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_Fallthrough_Fallthrough_Same.spvasm
+++ /dev/null
@@ -1,57 +0,0 @@
-; Test: SpvParserCFGTest_EmitBody_BranchConditional_Fallthrough_Fallthrough_Same.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpStore %var %uint_1
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 30 %30
-%20 = OpLabel
-OpStore %var %uint_20
-OpBranchConditional %5 %30 %30
-%30 = OpLabel
-OpStore %var %uint_30
-OpBranch %99
-%99 = OpLabel
-OpStore %var %uint_7
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnFalse.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnFalse.spvasm
deleted file mode 100644
index 7f1d386..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnFalse.spvasm
+++ /dev/null
@@ -1,57 +0,0 @@
-; Test: SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnFalse.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpStore %var %uint_1
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 30 %30
-%20 = OpLabel
-OpStore %var %uint_20
-OpBranchConditional %5 %99 %30
-%30 = OpLabel
-OpStore %var %uint_30
-OpBranch %99
-%99 = OpLabel
-OpStore %var %uint_7
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnTrue.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnTrue.spvasm
deleted file mode 100644
index 5991963..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnTrue.spvasm
+++ /dev/null
@@ -1,57 +0,0 @@
-; Test: SpvParserCFGTest_EmitBody_BranchConditional_SwitchBreak_Fallthrough_OnTrue.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpStore %var %uint_1
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 30 %30
-%20 = OpLabel
-OpStore %var %uint_20
-OpBranchConditional %5 %30 %99
-%30 = OpLabel
-OpStore %var %uint_30
-OpBranch %99
-%99 = OpLabel
-OpStore %var %uint_7
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_Fallthrough.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_Fallthrough.spvasm
deleted file mode 100644
index 6e9d1eb..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_EmitBody_Branch_Fallthrough.spvasm
+++ /dev/null
@@ -1,57 +0,0 @@
-; Test: SpvParserCFGTest_EmitBody_Branch_Fallthrough.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpStore %var %uint_1
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %99 20 %20 30 %30
-%20 = OpLabel
-OpStore %var %uint_20
-OpBranch %30
-%30 = OpLabel
-OpStore %var %uint_30
-OpBranch %99
-%99 = OpLabel
-OpStore %var %uint_7
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserCFGTest_TerminatorsAreValid_Switch.spvasm b/test/tint/unittest/reader/spirv/SpvParserCFGTest_TerminatorsAreValid_Switch.spvasm
deleted file mode 100644
index 4269988..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserCFGTest_TerminatorsAreValid_Switch.spvasm
+++ /dev/null
@@ -1,55 +0,0 @@
-; Test: SpvParserCFGTest_TerminatorsAreValid_Switch.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 1000
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-OpName %var "var"
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%5 = OpConstantNull %bool
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%uint_42 = OpConstant %uint 42
-%int_42 = OpConstant %int 42
-%13 = OpTypeFunction %uint
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%uint_6 = OpConstant %uint 6
-%uint_7 = OpConstant %uint 7
-%uint_8 = OpConstant %uint 8
-%uint_10 = OpConstant %uint 10
-%uint_20 = OpConstant %uint 20
-%uint_30 = OpConstant %uint 30
-%uint_40 = OpConstant %uint 40
-%uint_50 = OpConstant %uint 50
-%uint_90 = OpConstant %uint 90
-%uint_99 = OpConstant %uint 99
-%_ptr_Private_uint = OpTypePointer Private %uint
-%var = OpVariable %_ptr_Private_uint Private
-%uint_999 = OpConstant %uint 999
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_42 %80 20 %20 30 %30
-%20 = OpLabel
-OpBranch %30
-%30 = OpLabel
-OpBranch %99
-%80 = OpLabel
-OpBranch %99
-%99 = OpLabel
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_InMerge_PredecessorsDominatdByNestedSwitchCase.spvasm b/test/tint/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_InMerge_PredecessorsDominatdByNestedSwitchCase.spvasm
deleted file mode 100644
index 83d008f..0000000
--- a/test/tint/unittest/reader/spirv/SpvParserFunctionVarTest_EmitStatement_Phi_InMerge_PredecessorsDominatdByNestedSwitchCase.spvasm
+++ /dev/null
@@ -1,66 +0,0 @@
-; Test: SpvParserFunctionVarTest_EmitStatement_Phi_InMerge_PredecessorsDominatdByNestedSwitchCase.spvasm
-; SPIR-V
-; Version: 1.0
-; Generator: Khronos SPIR-V Tools Assembler; 0
-; Bound: 101
-; Schema: 0
-OpCapability Shader
-OpMemoryModel Logical Simple
-OpEntryPoint Fragment %100 "main"
-OpExecutionMode %100 OriginUpperLeft
-%void = OpTypeVoid
-%3 = OpTypeFunction %void
-%bool = OpTypeBool
-%float = OpTypeFloat 32
-%uint = OpTypeInt 32 0
-%int = OpTypeInt 32 1
-%_ptr_Function_bool = OpTypePointer Function %bool
-%_ptr_Function_float = OpTypePointer Function %float
-%_ptr_Function_uint = OpTypePointer Function %uint
-%_ptr_Function_int = OpTypePointer Function %int
-%true = OpConstantTrue %bool
-%false = OpConstantFalse %bool
-%float_0 = OpConstant %float 0
-%float_1_5 = OpConstant %float 1.5
-%uint_0 = OpConstant %uint 0
-%uint_1 = OpConstant %uint 1
-%int_n1 = OpConstant %int -1
-%int_0 = OpConstant %int 0
-%int_1 = OpConstant %int 1
-%int_3 = OpConstant %int 3
-%uint_2 = OpConstant %uint 2
-%uint_3 = OpConstant %uint 3
-%uint_4 = OpConstant %uint 4
-%uint_5 = OpConstant %uint 5
-%v2int = OpTypeVector %int 2
-%v2float = OpTypeVector %float 2
-%mat3v2float = OpTypeMatrix %v2float 3
-%34 = OpConstantNull %v2int
-%_arr_uint_uint_2 = OpTypeArray %uint %uint_2
-%_struct_36 = OpTypeStruct %uint %float %_arr_uint_uint_2
-%true_0 = OpConstantTrue %bool
-%_ptr_Private_uint = OpTypePointer Private %uint
-%1 = OpVariable %_ptr_Private_uint Private
-%_ptr_Private_bool = OpTypePointer Private %bool
-%7 = OpVariable %_ptr_Private_bool Private
-%8 = OpVariable %_ptr_Private_bool Private
-%100 = OpFunction %void None %3
-%10 = OpLabel
-OpSelectionMerge %99 None
-OpSwitch %uint_1 %20 0 %20 1 %30
-%20 = OpLabel
-OpBranch %30
-%30 = OpLabel
-OpSelectionMerge %50 None
-OpBranchConditional %true %40 %45
-%40 = OpLabel
-OpBranch %50
-%45 = OpLabel
-OpBranch %99
-%50 = OpLabel
-OpBranch %99
-%99 = OpLabel
-%41 = OpPhi %uint %uint_0 %45 %uint_1 %50
-OpReturn
-OpFunctionEnd
-
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm
deleted file mode 100644
index 07f5e01..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.spvasm
+++ /dev/null
@@ -1,93 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %data "data"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "injectionSwitch"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpDecorate %data RelaxedPrecision
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- OpDecorate %7 RelaxedPrecision
- OpDecorate %8 RelaxedPrecision
- OpDecorate %9 RelaxedPrecision
- OpDecorate %10 RelaxedPrecision
- OpDecorate %11 RelaxedPrecision
- %void = OpTypeVoid
- %13 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %int_1 = OpConstant %int 1
- %uint = OpTypeInt 32 0
- %uint_10 = OpConstant %uint 10
-%_arr_int_uint_10 = OpTypeArray %int %uint_10
- %bool = OpTypeBool
- %int_3 = OpConstant %int 3
- %float = OpTypeFloat 32
- %v2float = OpTypeVector %float 2
- %buf0 = OpTypeStruct %v2float
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %int_0 = OpConstant %int 0
- %uint_0 = OpConstant %uint 0
-%_ptr_Uniform_float = OpTypePointer Uniform %float
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %float_1 = OpConstant %float 1
- %31 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
- %float_0 = OpConstant %float 0
- %33 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
-%_ptr_Function__arr_int_uint_10 = OpTypePointer Function %_arr_int_uint_10
- %int_2 = OpConstant %int 2
- %main = OpFunction %void None %13
- %36 = OpLabel
- %data = OpVariable %_ptr_Function__arr_int_uint_10 Function
- %37 = OpAccessChain %_ptr_Function_int %data %int_1
- %7 = OpLoad %int %37
- %38 = OpSLessThan %bool %int_1 %7
- %10 = OpSelect %int %38 %int_2 %int_1
- OpBranch %39
- %39 = OpLabel
- %40 = OpPhi %int %int_1 %36 %41 %42
- %11 = OpPhi %int %10 %36 %8 %42
- %43 = OpSLessThan %bool %11 %int_3
- OpLoopMerge %44 %42 None
- OpBranchConditional %43 %45 %44
- %45 = OpLabel
- %8 = OpIAdd %int %11 %int_1
- %46 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
- %47 = OpLoad %float %46
- %48 = OpConvertFToS %int %47
- OpSelectionMerge %49 None
- OpSwitch %48 %50 19 %51 38 %52 23 %52 78 %53
- %50 = OpLabel
- OpBranch %42
- %51 = OpLabel
- %9 = OpIAdd %int %40 %int_1
- OpBranch %52
- %52 = OpLabel
- %54 = OpPhi %int %40 %45 %9 %51
- OpBranch %42
- %53 = OpLabel
- OpStore %_GLF_color %31
- OpBranch %50
- %49 = OpLabel
- OpBranch %42
- %42 = OpLabel
- %41 = OpPhi %int %40 %50 %54 %52 %int_0 %49
- OpBranch %39
- %44 = OpLabel
- %55 = OpAccessChain %_ptr_Function_int %data %40
- OpStore %55 %int_1
- OpStore %_GLF_color %33
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
deleted file mode 100644
index 00cdb63..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/call-if-while-switch/0-opt.wgsl
+++ /dev/null
@@ -1,72 +0,0 @@
-struct buf0 {
- injectionSwitch : vec2<f32>,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var data : array<i32, 10u>;
- var x_40 : i32;
- var x_40_phi : i32;
- var x_11_phi : i32;
- let x_7 : i32 = data[1];
- let x_10 : i32 = select(1, 2, (1 < x_7));
- x_40_phi = 1;
- x_11_phi = x_10;
- loop {
- var x_54 : i32;
- var x_41 : i32;
- var x_41_phi : i32;
- x_40 = x_40_phi;
- let x_11 : i32 = x_11_phi;
- if ((x_11 < 3)) {
- } else {
- break;
- }
- var x_54_phi : i32;
- let x_8 : i32 = (x_11 + 1);
- let x_47 : f32 = x_6.injectionSwitch.x;
- x_54_phi = x_40;
- switch(i32(x_47)) {
- case 78: {
- x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
- fallthrough;
- }
- case 19: {
- x_54_phi = bitcast<i32>((x_40 + bitcast<i32>(1)));
- fallthrough;
- }
- case 23, 38: {
- x_54 = x_54_phi;
- x_41_phi = x_54;
- continue;
- }
- default: {
- x_41_phi = x_40;
- continue;
- }
- }
-
- continuing {
- x_41 = x_41_phi;
- x_40_phi = x_41;
- x_11_phi = x_8;
- }
- }
- data[x_40] = 1;
- x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm
deleted file mode 100644
index 3ccb8a9..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm
+++ /dev/null
@@ -1,154 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %gl_FragCoord %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %q "q"
- OpName %i "i"
- OpName %gl_FragCoord "gl_FragCoord"
- OpName %c "c"
- OpName %array0 "array0"
- OpName %array1 "array1"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "injectionSwitch"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpDecorate %q RelaxedPrecision
- OpDecorate %i RelaxedPrecision
- OpDecorate %gl_FragCoord BuiltIn FragCoord
- OpDecorate %12 RelaxedPrecision
- OpDecorate %13 RelaxedPrecision
- OpDecorate %c RelaxedPrecision
- OpDecorate %14 RelaxedPrecision
- OpDecorate %15 RelaxedPrecision
- OpDecorate %16 RelaxedPrecision
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %17 RelaxedPrecision
- OpDecorate %18 RelaxedPrecision
- OpDecorate %19 RelaxedPrecision
- OpDecorate %20 RelaxedPrecision
- OpDecorate %21 RelaxedPrecision
- OpDecorate %22 RelaxedPrecision
- OpDecorate %23 RelaxedPrecision
- OpDecorate %_GLF_color Location 0
- OpDecorate %24 RelaxedPrecision
- OpDecorate %25 RelaxedPrecision
- OpDecorate %26 RelaxedPrecision
- %void = OpTypeVoid
- %28 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %int_0 = OpConstant %int 0
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
-%_ptr_Input_float = OpTypePointer Input %float
- %int_3 = OpConstant %int 3
- %bool = OpTypeBool
- %uint_3 = OpConstant %uint 3
-%_arr_float_uint_3 = OpTypeArray %float %uint_3
-%_ptr_Private__arr_float_uint_3 = OpTypePointer Private %_arr_float_uint_3
- %array0 = OpVariable %_ptr_Private__arr_float_uint_3 Private
- %float_0 = OpConstant %float 0
-%_ptr_Private_float = OpTypePointer Private %float
- %array1 = OpVariable %_ptr_Private__arr_float_uint_3 Private
- %v2float = OpTypeVector %float 2
- %buf0 = OpTypeStruct %v2float
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
-%_ptr_Uniform_float = OpTypePointer Uniform %float
- %int_61 = OpConstant %int 61
- %true = OpConstantTrue %bool
- %float_1 = OpConstant %float 1
- %int_1 = OpConstant %int 1
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %main = OpFunction %void None %28
- %53 = OpLabel
- %q = OpVariable %_ptr_Function_int Function
- %i = OpVariable %_ptr_Function_int Function
- %c = OpVariable %_ptr_Function_int Function
- OpStore %q %int_0
- %54 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_0
- %55 = OpLoad %float %54
- %12 = OpConvertFToS %int %55
- %13 = OpSMod %int %12 %int_3
- OpStore %i %13
- OpStore %c %int_0
- OpBranch %56
- %56 = OpLabel
- OpLoopMerge %57 %58 None
- OpBranch %59
- %59 = OpLabel
- %14 = OpLoad %int %c
- %60 = OpSLessThan %bool %14 %int_3
- OpBranchConditional %60 %61 %57
- %61 = OpLabel
- %15 = OpLoad %int %c
- %62 = OpAccessChain %_ptr_Private_float %array0 %15
- OpStore %62 %float_0
- %16 = OpLoad %int %c
- %63 = OpAccessChain %_ptr_Private_float %array1 %16
- OpStore %63 %float_0
- %64 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
- %65 = OpLoad %float %64
- %17 = OpConvertFToS %int %65
- %18 = OpLoad %int %q
- %19 = OpIAdd %int %17 %18
- OpSelectionMerge %66 None
- OpSwitch %19 %66 0 %67 51 %68 61 %69
- %67 = OpLabel
- OpStore %q %int_61
- OpBranch %66
- %68 = OpLabel
- OpBranch %70
- %70 = OpLabel
- OpLoopMerge %71 %72 None
- OpBranch %73
- %73 = OpLabel
- OpBranchConditional %true %74 %71
- %74 = OpLabel
- OpBranch %72
- %72 = OpLabel
- OpBranch %70
- %71 = OpLabel
- %20 = OpLoad %int %c
- %75 = OpAccessChain %_ptr_Private_float %array0 %20
- OpStore %75 %float_1
- OpBranch %69
- %69 = OpLabel
- %76 = OpAccessChain %_ptr_Private_float %array1 %int_0
- OpStore %76 %float_1
- %21 = OpLoad %int %c
- %77 = OpAccessChain %_ptr_Private_float %array1 %21
- OpStore %77 %float_1
- OpBranch %66
- %66 = OpLabel
- OpBranch %58
- %58 = OpLabel
- %22 = OpLoad %int %c
- %23 = OpIAdd %int %22 %int_1
- OpStore %c %23
- OpBranch %56
- %57 = OpLabel
- %24 = OpLoad %int %i
- %78 = OpAccessChain %_ptr_Private_float %array1 %24
- %79 = OpLoad %float %78
- %25 = OpLoad %int %i
- %80 = OpAccessChain %_ptr_Private_float %array0 %25
- %81 = OpLoad %float %80
- %26 = OpLoad %int %i
- %82 = OpAccessChain %_ptr_Private_float %array0 %26
- %83 = OpLoad %float %82
- %84 = OpCompositeConstruct %v4float %79 %81 %83 %float_1
- OpStore %_GLF_color %84
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.dxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.dxc.hlsl
deleted file mode 100755
index 2e7ba76..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.spvasm.expected.dxc.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-SKIP: FAILED
-
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float array0[3] = (float[3])0;
-static float array1[3] = (float[3])0;
-cbuffer cbuffer_x_11 : register(b0, space0) {
- uint4 x_11[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
- int q = 0;
- int i = 0;
- int c = 0;
- q = 0;
- const float x_55 = gl_FragCoord.x;
- i = (int(x_55) % 3);
- c = 0;
- {
- for(; (c < 3); c = (c + 1)) {
- array0[c] = 0.0f;
- array1[c] = 0.0f;
- const float x_65 = asfloat(x_11[0].x);
- switch((int(x_65) + q)) {
- case 51: {
- while (true) {
- if (true) {
- } else {
- break;
- }
- }
- array0[c] = 1.0f;
- /* fallthrough */
- {
- array1[0] = 1.0f;
- array1[c] = 1.0f;
- }
- break;
- }
- case 61: {
- array1[0] = 1.0f;
- array1[c] = 1.0f;
- break;
- }
- case 0: {
- q = 61;
- break;
- }
- default: {
- break;
- }
- }
- }
- }
- const float x_79 = array1[i];
- const float x_81 = array0[i];
- const float x_83 = array0[i];
- x_GLF_color = float4(x_79, x_81, x_83, 1.0f);
- return;
-}
-
-struct main_out {
- float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
- float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
- float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
- gl_FragCoord = gl_FragCoord_param;
- main_1();
- const main_out tint_symbol_4 = {x_GLF_color};
- return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
- const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
- tint_symbol_2 wrapper_result = (tint_symbol_2)0;
- wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
- return wrapper_result;
-}
-DXC validation failure:
-warning: DXIL.dll not found. Resulting DXIL will not be signed for use in release environments.
-
-error: validation errors
-shader.hlsl:77: error: Loop must have break.
-Validation failed.
-
-
-
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
deleted file mode 100644
index 6042980..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl
+++ /dev/null
@@ -1,84 +0,0 @@
-struct buf0 {
- injectionSwitch : vec2<f32>,
-}
-
-var<private> gl_FragCoord : vec4<f32>;
-
-var<private> array0 : array<f32, 3u>;
-
-var<private> array1 : array<f32, 3u>;
-
-@group(0) @binding(0) var<uniform> x_11 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var q : i32;
- var i : i32;
- var c : i32;
- q = 0;
- let x_55 : f32 = gl_FragCoord.x;
- i = (i32(x_55) % 3);
- c = 0;
- loop {
- let x_14 : i32 = c;
- if ((x_14 < 3)) {
- } else {
- break;
- }
- let x_15 : i32 = c;
- array0[x_15] = 0.0;
- let x_16 : i32 = c;
- array1[x_16] = 0.0;
- let x_65 : f32 = x_11.injectionSwitch.x;
- let x_18 : i32 = q;
- switch((i32(x_65) + x_18)) {
- case 51: {
- loop {
- if (true) {
- } else {
- break;
- }
- }
- let x_20 : i32 = c;
- array0[x_20] = 1.0;
- fallthrough;
- }
- case 61: {
- array1[0] = 1.0;
- let x_21 : i32 = c;
- array1[x_21] = 1.0;
- }
- case 0: {
- q = 61;
- }
- default: {
- }
- }
-
- continuing {
- let x_22 : i32 = c;
- c = (x_22 + 1);
- }
- }
- let x_24 : i32 = i;
- let x_79 : f32 = array1[x_24];
- let x_25 : i32 = i;
- let x_81 : f32 = array0[x_25];
- let x_26 : i32 = i;
- let x_83 : f32 = array0[x_26];
- x_GLF_color = vec4<f32>(x_79, x_81, x_83, 1.0);
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
- gl_FragCoord = gl_FragCoord_param;
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.dxc.hlsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.dxc.hlsl
deleted file mode 100755
index 2e7ba76..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-dead-code-unreachable-merge/0-opt.wgsl.expected.dxc.hlsl
+++ /dev/null
@@ -1,93 +0,0 @@
-SKIP: FAILED
-
-static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
-static float array0[3] = (float[3])0;
-static float array1[3] = (float[3])0;
-cbuffer cbuffer_x_11 : register(b0, space0) {
- uint4 x_11[1];
-};
-static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
-
-void main_1() {
- int q = 0;
- int i = 0;
- int c = 0;
- q = 0;
- const float x_55 = gl_FragCoord.x;
- i = (int(x_55) % 3);
- c = 0;
- {
- for(; (c < 3); c = (c + 1)) {
- array0[c] = 0.0f;
- array1[c] = 0.0f;
- const float x_65 = asfloat(x_11[0].x);
- switch((int(x_65) + q)) {
- case 51: {
- while (true) {
- if (true) {
- } else {
- break;
- }
- }
- array0[c] = 1.0f;
- /* fallthrough */
- {
- array1[0] = 1.0f;
- array1[c] = 1.0f;
- }
- break;
- }
- case 61: {
- array1[0] = 1.0f;
- array1[c] = 1.0f;
- break;
- }
- case 0: {
- q = 61;
- break;
- }
- default: {
- break;
- }
- }
- }
- }
- const float x_79 = array1[i];
- const float x_81 = array0[i];
- const float x_83 = array0[i];
- x_GLF_color = float4(x_79, x_81, x_83, 1.0f);
- return;
-}
-
-struct main_out {
- float4 x_GLF_color_1;
-};
-struct tint_symbol_1 {
- float4 gl_FragCoord_param : SV_Position;
-};
-struct tint_symbol_2 {
- float4 x_GLF_color_1 : SV_Target0;
-};
-
-main_out main_inner(float4 gl_FragCoord_param) {
- gl_FragCoord = gl_FragCoord_param;
- main_1();
- const main_out tint_symbol_4 = {x_GLF_color};
- return tint_symbol_4;
-}
-
-tint_symbol_2 main(tint_symbol_1 tint_symbol) {
- const main_out inner_result = main_inner(tint_symbol.gl_FragCoord_param);
- tint_symbol_2 wrapper_result = (tint_symbol_2)0;
- wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
- return wrapper_result;
-}
-DXC validation failure:
-warning: DXIL.dll not found. Resulting DXIL will not be signed for use in release environments.
-
-error: validation errors
-shader.hlsl:77: error: Loop must have break.
-Validation failed.
-
-
-
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm
deleted file mode 100644
index 07cab15..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.spvasm
+++ /dev/null
@@ -1,133 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %count0 "count0"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "_GLF_uniform_int_values"
- OpName %_ ""
- OpName %count1 "count1"
- OpName %i "i"
- OpName %_GLF_color "_GLF_color"
- OpDecorate %_arr_int_uint_5 ArrayStride 16
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %11 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %uint = OpTypeInt 32 0
- %uint_5 = OpConstant %uint 5
-%_arr_int_uint_5 = OpTypeArray %int %uint_5
- %buf0 = OpTypeStruct %_arr_int_uint_5
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
-%_ptr_Uniform_int = OpTypePointer Uniform %int
- %int_4 = OpConstant %int 4
- %bool = OpTypeBool
- %int_1 = OpConstant %int 1
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %int_3 = OpConstant %int 3
- %main = OpFunction %void None %11
- %27 = OpLabel
- %count0 = OpVariable %_ptr_Function_int Function
- %count1 = OpVariable %_ptr_Function_int Function
- %i = OpVariable %_ptr_Function_int Function
- %28 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %29 = OpLoad %int %28
- OpStore %count0 %29
- %30 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %31 = OpLoad %int %30
- OpStore %count1 %31
- %32 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %33 = OpLoad %int %32
- OpStore %i %33
- OpBranch %34
- %34 = OpLabel
- OpLoopMerge %35 %36 None
- OpBranch %37
- %37 = OpLabel
- %38 = OpLoad %int %i
- %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_4
- %40 = OpLoad %int %39
- %41 = OpSLessThan %bool %38 %40
- OpBranchConditional %41 %42 %35
- %42 = OpLabel
- %43 = OpLoad %int %i
- OpSelectionMerge %44 None
- OpSwitch %43 %44 0 %45 1 %45 3 %46 2 %46
- %45 = OpLabel
- %47 = OpLoad %int %count0
- %48 = OpIAdd %int %47 %int_1
- OpStore %count0 %48
- OpBranch %46
- %46 = OpLabel
- %49 = OpLoad %int %count1
- %50 = OpIAdd %int %49 %int_1
- OpStore %count1 %50
- OpBranch %44
- %44 = OpLabel
- OpBranch %36
- %36 = OpLabel
- %51 = OpLoad %int %i
- %52 = OpIAdd %int %51 %int_1
- OpStore %i %52
- OpBranch %34
- %35 = OpLabel
- %53 = OpLoad %int %count1
- %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
- %55 = OpLoad %int %54
- %56 = OpIEqual %bool %53 %55
- OpSelectionMerge %57 None
- OpBranchConditional %56 %58 %59
- %58 = OpLabel
- %60 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
- %61 = OpLoad %int %60
- %62 = OpConvertSToF %float %61
- %63 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %64 = OpLoad %int %63
- %65 = OpConvertSToF %float %64
- %66 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %67 = OpLoad %int %66
- %68 = OpConvertSToF %float %67
- %69 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_3
- %70 = OpLoad %int %69
- %71 = OpConvertSToF %float %70
- %72 = OpCompositeConstruct %v4float %62 %65 %68 %71
- OpStore %_GLF_color %72
- OpBranch %57
- %59 = OpLabel
- %73 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %74 = OpLoad %int %73
- %75 = OpConvertSToF %float %74
- %76 = OpCompositeConstruct %v4float %75 %75 %75 %75
- OpStore %_GLF_color %76
- OpBranch %57
- %57 = OpLabel
- %77 = OpLoad %int %count0
- %78 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
- %79 = OpLoad %int %78
- %80 = OpINotEqual %bool %77 %79
- OpSelectionMerge %81 None
- OpBranchConditional %80 %82 %81
- %82 = OpLabel
- %83 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_2
- %84 = OpLoad %int %83
- %85 = OpConvertSToF %float %84
- %86 = OpCompositeConstruct %v4float %85 %85 %85 %85
- OpStore %_GLF_color %86
- OpBranch %81
- %81 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
deleted file mode 100644
index 5256543..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-inst-combine-and-or-xor-switch/0-opt.wgsl
+++ /dev/null
@@ -1,85 +0,0 @@
-struct strided_arr {
- @size(16)
- el : i32,
-}
-
-type Arr = array<strided_arr, 5u>;
-
-struct buf0 {
- x_GLF_uniform_int_values : Arr,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var count0 : i32;
- var count1 : i32;
- var i : i32;
- let x_29 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- count0 = x_29;
- let x_31 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- count1 = x_31;
- let x_33 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- i = x_33;
- loop {
- let x_38 : i32 = i;
- let x_40 : i32 = x_6.x_GLF_uniform_int_values[4].el;
- if ((x_38 < x_40)) {
- } else {
- break;
- }
- let x_43 : i32 = i;
- switch(x_43) {
- case 0, 1: {
- let x_47 : i32 = count0;
- count0 = (x_47 + 1);
- fallthrough;
- }
- case 2, 3: {
- let x_49 : i32 = count1;
- count1 = (x_49 + 1);
- }
- default: {
- }
- }
-
- continuing {
- let x_51 : i32 = i;
- i = (x_51 + 1);
- }
- }
- let x_53 : i32 = count1;
- let x_55 : i32 = x_6.x_GLF_uniform_int_values[0].el;
- if ((x_53 == x_55)) {
- let x_61 : i32 = x_6.x_GLF_uniform_int_values[3].el;
- let x_64 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- let x_67 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- let x_70 : i32 = x_6.x_GLF_uniform_int_values[3].el;
- x_GLF_color = vec4<f32>(f32(x_61), f32(x_64), f32(x_67), f32(x_70));
- } else {
- let x_74 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- let x_75 : f32 = f32(x_74);
- x_GLF_color = vec4<f32>(x_75, x_75, x_75, x_75);
- }
- let x_77 : i32 = count0;
- let x_79 : i32 = x_6.x_GLF_uniform_int_values[1].el;
- if ((x_77 != x_79)) {
- let x_84 : i32 = x_6.x_GLF_uniform_int_values[2].el;
- let x_85 : f32 = f32(x_84);
- x_GLF_color = vec4<f32>(x_85, x_85, x_85, x_85);
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm
deleted file mode 100644
index 97d3744..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.spvasm
+++ /dev/null
@@ -1,117 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 320
- OpName %main "main"
- OpName %_GLF_global_loop_count "_GLF_global_loop_count"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "_GLF_uniform_int_values"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpDecorate %_arr_int_uint_2 ArrayStride 16
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %9 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Private_int = OpTypePointer Private %int
-%_GLF_global_loop_count = OpVariable %_ptr_Private_int Private
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_2 = OpConstant %uint 2
-%_arr_int_uint_2 = OpTypeArray %int %uint_2
- %buf0 = OpTypeStruct %_arr_int_uint_2
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
-%_ptr_Uniform_int = OpTypePointer Uniform %int
- %bool = OpTypeBool
- %true = OpConstantTrue %bool
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %int_1 = OpConstant %int 1
- %false = OpConstantFalse %bool
- %int_100 = OpConstant %int 100
- %main = OpFunction %void None %9
- %25 = OpLabel
- OpStore %_GLF_global_loop_count %int_0
- %26 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
- %27 = OpLoad %int %26
- OpSelectionMerge %28 None
- OpSwitch %27 %28 0 %29 1 %30
- %29 = OpLabel
- OpSelectionMerge %31 None
- OpBranchConditional %true %32 %31
- %32 = OpLabel
- %33 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
- %34 = OpLoad %int %33
- %35 = OpConvertSToF %float %34
- %36 = OpCompositeConstruct %v4float %35 %35 %35 %35
- OpStore %_GLF_color %36
- OpReturn
- %31 = OpLabel
- OpBranch %30
- %30 = OpLabel
- OpSelectionMerge %37 None
- OpBranchConditional %true %38 %37
- %38 = OpLabel
- %39 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
- %40 = OpLoad %int %39
- %41 = OpConvertSToF %float %40
- %42 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
- %43 = OpLoad %int %42
- %44 = OpConvertSToF %float %43
- %45 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_1
- %46 = OpLoad %int %45
- %47 = OpConvertSToF %float %46
- %48 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
- %49 = OpLoad %int %48
- %50 = OpConvertSToF %float %49
- %51 = OpCompositeConstruct %v4float %41 %44 %47 %50
- OpStore %_GLF_color %51
- OpSelectionMerge %52 None
- OpBranchConditional %false %53 %52
- %53 = OpLabel
- %54 = OpAccessChain %_ptr_Uniform_int %_ %int_0 %int_0
- %55 = OpLoad %int %54
- %56 = OpConvertSToF %float %55
- %57 = OpCompositeConstruct %v4float %56 %56 %56 %56
- OpStore %_GLF_color %57
- OpBranch %58
- %58 = OpLabel
- OpLoopMerge %59 %60 None
- OpBranch %61
- %61 = OpLabel
- %62 = OpLoad %int %_GLF_global_loop_count
- %63 = OpIAdd %int %62 %int_1
- OpStore %_GLF_global_loop_count %63
- OpSelectionMerge %64 None
- OpBranchConditional %false %65 %64
- %65 = OpLabel
- OpReturn
- %64 = OpLabel
- OpSelectionMerge %66 None
- OpBranchConditional %true %67 %66
- %67 = OpLabel
- OpReturn
- %66 = OpLabel
- OpBranch %60
- %60 = OpLabel
- %68 = OpLoad %int %_GLF_global_loop_count
- %69 = OpSLessThan %bool %68 %int_100
- OpBranchConditional %69 %58 %59
- %59 = OpLabel
- OpBranch %52
- %52 = OpLabel
- OpBranch %37
- %37 = OpLabel
- OpBranch %28
- %28 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
deleted file mode 100644
index 7254319..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-loop-returns-behind-true-and-false/0-opt.wgsl
+++ /dev/null
@@ -1,78 +0,0 @@
-struct strided_arr {
- @size(16)
- el : i32,
-}
-
-type Arr = array<strided_arr, 2u>;
-
-struct buf0 {
- x_GLF_uniform_int_values : Arr,
-}
-
-var<private> x_GLF_global_loop_count : i32;
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- x_GLF_global_loop_count = 0;
- let x_27 : i32 = x_6.x_GLF_uniform_int_values[0].el;
- switch(x_27) {
- case 0: {
- if (true) {
- let x_34 : i32 = x_6.x_GLF_uniform_int_values[1].el;
- let x_35 : f32 = f32(x_34);
- x_GLF_color = vec4<f32>(x_35, x_35, x_35, x_35);
- return;
- }
- fallthrough;
- }
- case 1: {
- if (true) {
- let x_40 : i32 = x_6.x_GLF_uniform_int_values[0].el;
- let x_43 : i32 = x_6.x_GLF_uniform_int_values[1].el;
- let x_46 : i32 = x_6.x_GLF_uniform_int_values[1].el;
- let x_49 : i32 = x_6.x_GLF_uniform_int_values[0].el;
- x_GLF_color = vec4<f32>(f32(x_40), f32(x_43), f32(x_46), f32(x_49));
- if (false) {
- let x_55 : i32 = x_6.x_GLF_uniform_int_values[0].el;
- let x_56 : f32 = f32(x_55);
- x_GLF_color = vec4<f32>(x_56, x_56, x_56, x_56);
- loop {
- let x_62 : i32 = x_GLF_global_loop_count;
- x_GLF_global_loop_count = (x_62 + 1);
- if (false) {
- return;
- }
- if (true) {
- return;
- }
-
- continuing {
- let x_68 : i32 = x_GLF_global_loop_count;
- if ((x_68 < 100)) {
- } else {
- break;
- }
- }
- }
- }
- }
- }
- default: {
- }
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm
deleted file mode 100644
index 5ef5478..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.spvasm
+++ /dev/null
@@ -1,92 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %func_ "func("
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "one"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpName %i "i"
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %9 = OpTypeFunction %void
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
- %12 = OpTypeFunction %v4float
- %int = OpTypeInt 32 1
- %buf0 = OpTypeStruct %int
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %int_0 = OpConstant %int 0
-%_ptr_Uniform_int = OpTypePointer Uniform %int
- %int_1 = OpConstant %int 1
- %bool = OpTypeBool
- %float_1 = OpConstant %float 1
- %float_0 = OpConstant %float 0
- %21 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
- %22 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
-%_ptr_Function_int = OpTypePointer Function %int
- %uint = OpTypeInt 32 0
- %uint_1 = OpConstant %uint 1
-%_ptr_Output_float = OpTypePointer Output %float
- %main = OpFunction %void None %9
- %28 = OpLabel
- %i = OpVariable %_ptr_Function_int Function
- OpStore %_GLF_color %22
- OpStore %i %int_0
- OpBranch %29
- %29 = OpLabel
- OpLoopMerge %30 %31 None
- OpBranch %32
- %32 = OpLabel
- %33 = OpLoad %int %i
- %34 = OpAccessChain %_ptr_Uniform_int %_ %int_0
- %35 = OpLoad %int %34
- %36 = OpSLessThanEqual %bool %33 %35
- OpBranchConditional %36 %37 %30
- %37 = OpLabel
- %38 = OpLoad %int %i
- OpSelectionMerge %39 None
- OpSwitch %38 %40 1 %41 0 %40
- %40 = OpLabel
- %42 = OpAccessChain %_ptr_Output_float %_GLF_color %uint_1
- OpStore %42 %float_0
- OpBranch %39
- %41 = OpLabel
- %43 = OpFunctionCall %v4float %func_
- OpStore %_GLF_color %43
- OpBranch %40
- %39 = OpLabel
- OpBranch %31
- %31 = OpLabel
- %44 = OpLoad %int %i
- %45 = OpIAdd %int %44 %int_1
- OpStore %i %45
- OpBranch %29
- %30 = OpLabel
- OpReturn
- OpFunctionEnd
- %func_ = OpFunction %v4float None %12
- %46 = OpLabel
- %47 = OpAccessChain %_ptr_Uniform_int %_ %int_0
- %48 = OpLoad %int %47
- %49 = OpIEqual %bool %48 %int_1
- OpSelectionMerge %50 None
- OpBranchConditional %49 %51 %52
- %51 = OpLabel
- OpReturnValue %21
- %52 = OpLabel
- OpReturnValue %22
- %50 = OpLabel
- OpUnreachable
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
deleted file mode 100644
index 0cbcc97..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-ssa-rewrite-case-with-default/0-opt.wgsl
+++ /dev/null
@@ -1,61 +0,0 @@
-struct buf0 {
- one : i32,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn func_() -> vec4<f32> {
- let x_48 : i32 = x_6.one;
- if ((x_48 == 1)) {
- return vec4<f32>(1.0, 0.0, 0.0, 1.0);
- } else {
- return vec4<f32>(0.0, 0.0, 0.0, 0.0);
- }
-}
-
-fn main_1() {
- var i : i32;
- x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
- i = 0;
- loop {
- let x_33 : i32 = i;
- let x_35 : i32 = x_6.one;
- if ((x_33 <= x_35)) {
- } else {
- break;
- }
- let x_38 : i32 = i;
- switch(x_38) {
- case 1: {
- let x_43 : vec4<f32> = func_();
- x_GLF_color = x_43;
- fallthrough;
- }
- default: {
- fallthrough;
- }
- case 0: {
- x_GLF_color.y = 0.0;
- }
- }
-
- continuing {
- let x_44 : i32 = i;
- i = (x_44 + 1);
- }
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm
deleted file mode 100644
index 5591664..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.spvasm
+++ /dev/null
@@ -1,67 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %a "a"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "one"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %8 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %int_0 = OpConstant %int 0
- %buf0 = OpTypeStruct %int
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
-%_ptr_Uniform_int = OpTypePointer Uniform %int
- %int_1 = OpConstant %int 1
- %int_2 = OpConstant %int 2
- %bool = OpTypeBool
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %float_1 = OpConstant %float 1
- %float_0 = OpConstant %float 0
- %22 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
- %23 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
- %main = OpFunction %void None %8
- %24 = OpLabel
- %a = OpVariable %_ptr_Function_int Function
- OpStore %a %int_0
- %25 = OpAccessChain %_ptr_Uniform_int %_ %int_0
- %26 = OpLoad %int %25
- OpSelectionMerge %27 None
- OpSwitch %26 %28 2 %29 3 %29 4 %30
- %28 = OpLabel
- OpStore %a %int_2
- OpBranch %27
- %29 = OpLabel
- OpStore %a %int_1
- OpBranch %30
- %30 = OpLabel
- OpBranch %27
- %27 = OpLabel
- %31 = OpLoad %int %a
- %32 = OpIEqual %bool %31 %int_2
- OpSelectionMerge %33 None
- OpBranchConditional %32 %34 %35
- %34 = OpLabel
- OpStore %_GLF_color %22
- OpBranch %33
- %35 = OpLabel
- OpStore %_GLF_color %23
- OpBranch %33
- %33 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
deleted file mode 100644
index e58d17e..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/cov-val-cfg-case-fallthrough/0-opt.wgsl
+++ /dev/null
@@ -1,42 +0,0 @@
-struct buf0 {
- one : i32,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var a : i32;
- a = 0;
- let x_26 : i32 = x_6.one;
- switch(x_26) {
- case 2, 3: {
- a = 1;
- fallthrough;
- }
- case 4: {
- }
- default: {
- a = 2;
- }
- }
- let x_31 : i32 = a;
- if ((x_31 == 2)) {
- x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
- } else {
- x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm
deleted file mode 100644
index 28e20bd..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/if-and-switch/0.spvasm
+++ /dev/null
@@ -1,74 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %data "data"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "injectionSwitch"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %8 = OpTypeFunction %void
- %float = OpTypeFloat 32
- %uint = OpTypeInt 32 0
- %uint_2 = OpConstant %uint 2
-%_arr_float_uint_2 = OpTypeArray %float %uint_2
-%_ptr_Function__arr_float_uint_2 = OpTypePointer Function %_arr_float_uint_2
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %v2float = OpTypeVector %float 2
- %buf0 = OpTypeStruct %v2float
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %uint_0 = OpConstant %uint 0
-%_ptr_Uniform_float = OpTypePointer Uniform %float
-%_ptr_Function_float = OpTypePointer Function %float
- %int_1 = OpConstant %int 1
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %float_1 = OpConstant %float 1
- %float_0 = OpConstant %float 0
- %26 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
- %bool = OpTypeBool
- %28 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
- %29 = OpUndef %float
- %main = OpFunction %void None %8
- %30 = OpLabel
- %data = OpVariable %_ptr_Function__arr_float_uint_2 Function
- %31 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
- %32 = OpLoad %float %31
- %33 = OpAccessChain %_ptr_Function_float %data %int_0
- OpStore %33 %32
- %34 = OpAccessChain %_ptr_Function_float %data %int_1
- OpStore %34 %32
- OpStore %_GLF_color %26
- %35 = OpLoad %float %34
- %36 = OpFOrdGreaterThan %bool %35 %float_1
- OpSelectionMerge %37 None
- OpBranchConditional %36 %38 %37
- %38 = OpLabel
- %39 = OpConvertFToS %int %32
- OpSelectionMerge %40 None
- OpSwitch %39 %40 0 %41 1 %42
- %40 = OpLabel
- OpBranch %37
- %41 = OpLabel
- OpBranch %42
- %42 = OpLabel
- %43 = OpPhi %float %29 %38 %float_1 %41
- %44 = OpAccessChain %_ptr_Function_float %data %39
- OpStore %44 %43
- OpStore %_GLF_color %28
- OpBranch %40
- %37 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
deleted file mode 100644
index d9cf1c7..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/if-and-switch/0.wgsl
+++ /dev/null
@@ -1,47 +0,0 @@
-struct buf0 {
- injectionSwitch : vec2<f32>,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var data : array<f32, 2u>;
- var x_32 : f32;
- x_32 = x_6.injectionSwitch.x;
- data[0] = x_32;
- data[1] = x_32;
- x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
- let x_35 : f32 = data[1];
- if ((x_35 > 1.0)) {
- var x_43_phi : f32;
- let x_39 : i32 = i32(x_32);
- x_43_phi = 0.0;
- switch(x_39) {
- case 0: {
- x_43_phi = 1.0;
- fallthrough;
- }
- case 1: {
- let x_43 : f32 = x_43_phi;
- data[x_39] = x_43;
- x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
- }
- default: {
- }
- }
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm
deleted file mode 100644
index 7a18a05..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.spvasm
+++ /dev/null
@@ -1,72 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color %gl_FragCoord
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %_GLF_color "_GLF_color"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "injectionSwitch"
- OpName %_ ""
- OpName %gl_FragCoord "gl_FragCoord"
- OpDecorate %_GLF_color Location 0
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %gl_FragCoord BuiltIn FragCoord
- %void = OpTypeVoid
- %8 = OpTypeFunction %void
- %float = OpTypeFloat 32
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %float_0 = OpConstant %float 0
- %float_1 = OpConstant %float 1
- %14 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
- %v2float = OpTypeVector %float 2
- %buf0 = OpTypeStruct %v2float
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %int = OpTypeInt 32 1
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
-%_ptr_Uniform_float = OpTypePointer Uniform %float
- %int_1 = OpConstant %int 1
-%_ptr_Input_v4float = OpTypePointer Input %v4float
-%gl_FragCoord = OpVariable %_ptr_Input_v4float Input
- %uint_1 = OpConstant %uint 1
-%_ptr_Input_float = OpTypePointer Input %float
- %bool = OpTypeBool
- %27 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
- %main = OpFunction %void None %8
- %28 = OpLabel
- OpStore %_GLF_color %14
- %29 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
- %30 = OpLoad %float %29
- %31 = OpConvertFToS %int %30
- OpSelectionMerge %32 None
- OpSwitch %31 %32 0 %33 42 %34
- %33 = OpLabel
- OpSelectionMerge %35 None
- OpSwitch %int_1 %35 1 %36
- %36 = OpLabel
- %37 = OpAccessChain %_ptr_Input_float %gl_FragCoord %uint_1
- %38 = OpLoad %float %37
- %39 = OpFOrdGreaterThanEqual %bool %38 %float_0
- OpSelectionMerge %40 None
- OpBranchConditional %39 %41 %40
- %41 = OpLabel
- OpStore %_GLF_color %27
- OpBranch %35
- %40 = OpLabel
- OpKill
- %35 = OpLabel
- OpBranch %34
- %34 = OpLabel
- OpBranch %32
- %32 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
deleted file mode 100644
index f932ed9..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/nested-switch-break-discard/0-opt.wgsl
+++ /dev/null
@@ -1,48 +0,0 @@
-struct buf0 {
- injectionSwitch : vec2<f32>,
-}
-
-var<private> x_GLF_color : vec4<f32>;
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> gl_FragCoord : vec4<f32>;
-
-fn main_1() {
- x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
- let x_30 : f32 = x_6.injectionSwitch.x;
- switch(i32(x_30)) {
- case 0: {
- switch(1) {
- case 1: {
- let x_38 : f32 = gl_FragCoord.y;
- if ((x_38 >= 0.0)) {
- x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
- break;
- }
- discard;
- }
- default: {
- }
- }
- fallthrough;
- }
- case 42: {
- }
- default: {
- }
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main(@builtin(position) gl_FragCoord_param : vec4<f32>) -> main_out {
- gl_FragCoord = gl_FragCoord_param;
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm
deleted file mode 100644
index 099b620..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.spvasm
+++ /dev/null
@@ -1,134 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %i "i"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "injectionSwitch"
- OpName %_ ""
- OpName %_GLF_color "_GLF_color"
- OpDecorate %i RelaxedPrecision
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %7 RelaxedPrecision
- OpDecorate %8 RelaxedPrecision
- OpDecorate %9 RelaxedPrecision
- OpDecorate %10 RelaxedPrecision
- OpDecorate %11 RelaxedPrecision
- OpDecorate %12 RelaxedPrecision
- OpDecorate %13 RelaxedPrecision
- OpDecorate %14 RelaxedPrecision
- OpDecorate %15 RelaxedPrecision
- OpDecorate %16 RelaxedPrecision
- OpDecorate %17 RelaxedPrecision
- OpDecorate %18 RelaxedPrecision
- OpDecorate %19 RelaxedPrecision
- OpDecorate %20 RelaxedPrecision
- OpDecorate %21 RelaxedPrecision
- OpDecorate %22 RelaxedPrecision
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %24 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %float = OpTypeFloat 32
- %v2float = OpTypeVector %float 2
- %buf0 = OpTypeStruct %v2float
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %int_0 = OpConstant %int 0
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
-%_ptr_Uniform_float = OpTypePointer Uniform %float
- %int_1 = OpConstant %int 1
- %int_5 = OpConstant %int 5
- %int_7 = OpConstant %int 7
- %int_200 = OpConstant %int 200
- %bool = OpTypeBool
- %int_100 = OpConstant %int 100
- %int_2 = OpConstant %int 2
- %int_3 = OpConstant %int 3
- %int_n2 = OpConstant %int -2
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %float_1 = OpConstant %float 1
- %float_0 = OpConstant %float 0
- %47 = OpConstantComposite %v4float %float_1 %float_0 %float_0 %float_1
- %48 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_1
- %main = OpFunction %void None %24
- %49 = OpLabel
- %i = OpVariable %_ptr_Function_int Function
- %50 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
- %51 = OpLoad %float %50
- %7 = OpConvertFToS %int %51
- OpStore %i %7
- %8 = OpLoad %int %i
- OpSelectionMerge %52 None
- OpSwitch %8 %53 0 %54
- %53 = OpLabel
- %20 = OpLoad %int %i
- %21 = OpISub %int %20 %int_3
- OpStore %i %21
- OpBranch %52
- %54 = OpLabel
- OpBranch %55
- %55 = OpLabel
- OpLoopMerge %56 %57 None
- OpBranch %58
- %58 = OpLabel
- %9 = OpLoad %int %i
- %10 = OpIAdd %int %9 %int_1
- OpStore %i %10
- %11 = OpLoad %int %i
- OpSelectionMerge %59 None
- OpSwitch %11 %60 1 %61 2 %62
- %60 = OpLabel
- %14 = OpLoad %int %i
- %15 = OpIAdd %int %14 %int_7
- OpStore %i %15
- OpBranch %59
- %61 = OpLabel
- OpBranch %57
- %62 = OpLabel
- %12 = OpLoad %int %i
- %13 = OpIAdd %int %12 %int_5
- OpStore %i %13
- OpBranch %59
- %59 = OpLabel
- OpBranch %57
- %57 = OpLabel
- %16 = OpLoad %int %i
- %63 = OpSGreaterThan %bool %16 %int_200
- OpBranchConditional %63 %55 %56
- %56 = OpLabel
- %17 = OpLoad %int %i
- %64 = OpSGreaterThan %bool %17 %int_100
- OpSelectionMerge %65 None
- OpBranchConditional %64 %66 %65
- %66 = OpLabel
- %18 = OpLoad %int %i
- %19 = OpISub %int %18 %int_2
- OpStore %i %19
- OpBranch %52
- %65 = OpLabel
- OpBranch %53
- %52 = OpLabel
- %22 = OpLoad %int %i
- %67 = OpIEqual %bool %22 %int_n2
- OpSelectionMerge %68 None
- OpBranchConditional %67 %69 %70
- %69 = OpLabel
- OpStore %_GLF_color %47
- OpBranch %68
- %70 = OpLabel
- OpStore %_GLF_color %48
- OpBranch %68
- %68 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
deleted file mode 100644
index 41e5cfe..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/switch-loop-switch-if/0-opt.wgsl
+++ /dev/null
@@ -1,73 +0,0 @@
-struct buf0 {
- injectionSwitch : vec2<f32>,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var i : i32;
- let x_51 : f32 = x_6.injectionSwitch.x;
- i = i32(x_51);
- let x_8 : i32 = i;
- switch(x_8) {
- case 0: {
- loop {
- let x_9 : i32 = i;
- i = (x_9 + 1);
- let x_11 : i32 = i;
- switch(x_11) {
- case 2: {
- let x_12 : i32 = i;
- i = (x_12 + 5);
- }
- case 1: {
- continue;
- }
- default: {
- let x_14 : i32 = i;
- i = (x_14 + 7);
- }
- }
-
- continuing {
- let x_16 : i32 = i;
- if ((x_16 > 200)) {
- } else {
- break;
- }
- }
- }
- let x_17 : i32 = i;
- if ((x_17 > 100)) {
- let x_18 : i32 = i;
- i = (x_18 - 2);
- break;
- }
- fallthrough;
- }
- default: {
- let x_20 : i32 = i;
- i = (x_20 - 3);
- }
- }
- let x_22 : i32 = i;
- if ((x_22 == -2)) {
- x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
- } else {
- x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm b/test/tint/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm
deleted file mode 100644
index 20a942d..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.spvasm
+++ /dev/null
@@ -1,96 +0,0 @@
- OpCapability Shader
- %1 = OpExtInstImport "GLSL.std.450"
- OpMemoryModel Logical GLSL450
- OpEntryPoint Fragment %main "main" %_GLF_color
- OpExecutionMode %main OriginUpperLeft
- OpSource ESSL 310
- OpName %main "main"
- OpName %i "i"
- OpName %buf0 "buf0"
- OpMemberName %buf0 0 "injectionSwitch"
- OpName %_ ""
- OpName %value "value"
- OpName %y "y"
- OpName %_GLF_color "_GLF_color"
- OpMemberDecorate %buf0 0 Offset 0
- OpDecorate %buf0 Block
- OpDecorate %_ DescriptorSet 0
- OpDecorate %_ Binding 0
- OpDecorate %_GLF_color Location 0
- %void = OpTypeVoid
- %10 = OpTypeFunction %void
- %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
- %int_0 = OpConstant %int 0
- %int_2 = OpConstant %int 2
- %float = OpTypeFloat 32
- %v2float = OpTypeVector %float 2
- %buf0 = OpTypeStruct %v2float
-%_ptr_Uniform_buf0 = OpTypePointer Uniform %buf0
- %_ = OpVariable %_ptr_Uniform_buf0 Uniform
- %uint = OpTypeInt 32 0
- %uint_0 = OpConstant %uint 0
-%_ptr_Uniform_float = OpTypePointer Uniform %float
- %bool = OpTypeBool
-%_ptr_Function_float = OpTypePointer Function %float
- %float_0_5 = OpConstant %float 0.5
- %float_1 = OpConstant %float 1
- %v4float = OpTypeVector %float 4
-%_ptr_Output_v4float = OpTypePointer Output %v4float
- %_GLF_color = OpVariable %_ptr_Output_v4float Output
- %int_1 = OpConstant %int 1
- %float_0 = OpConstant %float 0
- %main = OpFunction %void None %10
- %29 = OpLabel
- %i = OpVariable %_ptr_Function_int Function
- %value = OpVariable %_ptr_Function_int Function
- %y = OpVariable %_ptr_Function_float Function
- OpStore %i %int_0
- OpBranch %30
- %30 = OpLabel
- %31 = OpPhi %int %int_0 %29 %32 %33
- OpLoopMerge %34 %33 None
- OpBranch %35
- %35 = OpLabel
- %36 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %uint_0
- %37 = OpLoad %float %36
- %38 = OpConvertFToS %int %37
- %39 = OpIAdd %int %int_2 %38
- %40 = OpSLessThan %bool %31 %39
- OpBranchConditional %40 %41 %34
- %41 = OpLabel
- OpStore %value %31
- OpStore %y %float_0_5
- OpSelectionMerge %42 None
- OpSwitch %31 %43 0 %44 1 %45 2 %43
- %43 = OpLabel
- %46 = OpPhi %float %float_0_5 %41 %47 %45
- %48 = OpFOrdEqual %bool %46 %float_1
- OpSelectionMerge %49 None
- OpBranchConditional %48 %50 %49
- %50 = OpLabel
- %51 = OpIAdd %int %31 %int_1
- %52 = OpConvertSToF %float %51
- %53 = OpCompositeConstruct %v4float %52 %float_0 %float_0 %float_1
- OpStore %_GLF_color %53
- OpReturn
- %49 = OpLabel
- OpBranch %42
- %44 = OpLabel
- %54 = OpFAdd %float %float_0_5 %float_0_5
- OpStore %y %54
- OpBranch %45
- %45 = OpLabel
- %55 = OpPhi %float %float_0_5 %41 %54 %44
- %47 = OpExtInst %float %1 FClamp %float_1 %float_0_5 %55
- OpStore %y %47
- OpBranch %43
- %42 = OpLabel
- OpBranch %33
- %33 = OpLabel
- %32 = OpIAdd %int %31 %int_1
- OpStore %i %32
- OpBranch %30
- %34 = OpLabel
- OpReturn
- OpFunctionEnd
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
deleted file mode 100644
index 44c1c31..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/switch-with-fall-through-cases/0-opt.wgsl
+++ /dev/null
@@ -1,73 +0,0 @@
-struct buf0 {
- injectionSwitch : vec2<f32>,
-}
-
-@group(0) @binding(0) var<uniform> x_6 : buf0;
-
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var i : i32;
- var value : i32;
- var y : f32;
- var x_31_phi : i32;
- i = 0;
- x_31_phi = 0;
- loop {
- let x_31 : i32 = x_31_phi;
- let x_37 : f32 = x_6.injectionSwitch.x;
- if ((x_31 < (2 + i32(x_37)))) {
- } else {
- break;
- }
- var x_55_phi : f32;
- var x_46_phi : f32;
- value = x_31;
- y = 0.5;
- x_55_phi = 0.5;
- x_46_phi = 0.5;
- switch(x_31) {
- case 0: {
- let x_54 : f32 = (0.5 + 0.5);
- y = x_54;
- x_55_phi = x_54;
- fallthrough;
- }
- case 1: {
- let x_55 : f32 = x_55_phi;
- let x_47 : f32 = clamp(1.0, 0.5, x_55);
- y = x_47;
- x_46_phi = x_47;
- fallthrough;
- }
- default: {
- fallthrough;
- }
- case 2: {
- let x_46 : f32 = x_46_phi;
- if ((x_46 == 1.0)) {
- x_GLF_color = vec4<f32>(f32((x_31 + 1)), 0.0, 0.0, 1.0);
- return;
- }
- }
- }
-
- continuing {
- let x_32 : i32 = (x_31 + 1);
- i = x_32;
- x_31_phi = x_32;
- }
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-}
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}
diff --git a/test/tint/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl b/test/tint/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
deleted file mode 100644
index 5b160e1..0000000
--- a/test/tint/vk-gl-cts/graphicsfuzz/unreachable-loops-in-switch/0.wgsl
+++ /dev/null
@@ -1,63 +0,0 @@
-var<private> x_GLF_color : vec4<f32>;
-
-fn main_1() {
- var i : i32;
- var data : array<f32, 1>;
- x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
- i = 0;
- loop {
- let x_6 : i32 = i;
- if ((x_6 < 1)) {
- } else {
- break;
- }
- let x_7 : i32 = i;
- let x_40 : f32 = data[x_7];
- let x_42 : f32 = data[0];
- if ((x_40 < x_42)) {
- if (false) {
- let x_8 : i32 = i;
- if ((f32(x_8) >= 1.0)) {
- }
- }
- switch(0) {
- case 1: {
- loop {
- if (true) {
- } else {
- break;
- }
- }
- loop {
- break;
- }
- fallthrough;
- }
- case 0: {
- data[0] = 2.0;
- }
- default: {
- }
- }
-
- break;
- }
-
- continuing {
- let x_9 : i32 = i;
- i = (x_9 + 1);
- }
- }
- return;
-}
-
-struct main_out {
- @location(0)
- x_GLF_color_1 : vec4<f32>,
-};
-
-@fragment
-fn main() -> main_out {
- main_1();
- return main_out(x_GLF_color);
-}