writer/spirv: Add tests for automatic OpReturnValue

As requested at:
https://dawn-review.googlesource.com/c/tint/+/71604/5/src/writer/spirv/builder_if_test.cc#476

Bug: tint:1302
Change-Id: I661f877beb44f999e17f2769b4aa46b22180bbb9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/71682
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/spirv/builder_if_test.cc b/src/writer/spirv/builder_if_test.cc
index d47fe24..6273bee 100644
--- a/src/writer/spirv/builder_if_test.cc
+++ b/src/writer/spirv/builder_if_test.cc
@@ -503,6 +503,40 @@
 )");
 }
 
+TEST_F(BuilderTest, IfElse_BothReturn) {
+  // if (true) {
+  //   return true;
+  // } else {
+  //   return true;
+  // }
+
+  auto* fn = Func("f", {}, ty.bool_(),
+                  {
+                      If(true,                 //
+                         Block(Return(true)),  //
+                         Else(Block(Return(true)))),
+                  });
+
+  spirv::Builder& b = Build();
+
+  EXPECT_TRUE(b.GenerateFunction(fn)) << b.error();
+  EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
+%1 = OpTypeFunction %2
+%5 = OpConstantTrue %2
+%9 = OpConstantNull %2
+)");
+  EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
+            R"(OpSelectionMerge %6 None
+OpBranchConditional %5 %7 %8
+%7 = OpLabel
+OpReturnValue %5
+%8 = OpLabel
+OpReturnValue %5
+%6 = OpLabel
+OpReturnValue %9
+)");
+}
+
 TEST_F(BuilderTest, If_WithNestedBlockReturnValue) {
   // if (true) {
   //  {
diff --git a/src/writer/spirv/builder_switch_test.cc b/src/writer/spirv/builder_switch_test.cc
index 42d7de6..93e97a2 100644
--- a/src/writer/spirv/builder_switch_test.cc
+++ b/src/writer/spirv/builder_switch_test.cc
@@ -400,6 +400,52 @@
 )");
 }
 
+TEST_F(BuilderTest, Switch_AllReturn) {
+  // switch (1) {
+  //   case 1: {
+  //     return 1;
+  //   }
+  //   case 2: {
+  //     fallthrough;
+  //   }
+  //   default: {
+  //     return 3;
+  //   }
+  // }
+
+  auto* fn = Func("f", {}, ty.i32(),
+                  {
+                      Switch(1,                                    //
+                             Case(Expr(1), Block(Return(1))),      //
+                             Case(Expr(2), Block(Fallthrough())),  //
+                             DefaultCase(Block(Return(3)))),
+                  });
+
+  spirv::Builder& b = Build();
+
+  EXPECT_TRUE(b.GenerateFunction(fn)) << b.error();
+  EXPECT_EQ(DumpBuilder(b), R"(OpName %3 "f"
+%2 = OpTypeInt 32 1
+%1 = OpTypeFunction %2
+%6 = OpConstant %2 1
+%10 = OpConstant %2 3
+%11 = OpConstantNull %2
+%3 = OpFunction %2 None %1
+%4 = OpLabel
+OpSelectionMerge %5 None
+OpSwitch %6 %7 1 %8 2 %9
+%8 = OpLabel
+OpReturnValue %6
+%9 = OpLabel
+OpBranch %7
+%7 = OpLabel
+OpReturnValue %10
+%5 = OpLabel
+OpReturnValue %11
+OpFunctionEnd
+)");
+}
+
 }  // namespace
 }  // namespace spirv
 }  // namespace writer