tint: const eval of logical AND and OR

Bug: tint:1581
Change-Id: I3921041613cb1c9fa3365d4cb1fc8c81bab92003
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/113101
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/intrinsics.def b/src/tint/intrinsics.def
index d9188ed..787da9d 100644
--- a/src/tint/intrinsics.def
+++ b/src/tint/intrinsics.def
@@ -51,7 +51,7 @@
   chromium_disable_uniformity_analysis
   // A Chromium-specific extension for push constants
   chromium_experimental_push_constant
-  // A Chromium-specific extension that enables passing of uniform, storage and workgroup 
+  // A Chromium-specific extension that enables passing of uniform, storage and workgroup
   // address-spaced pointers as parameters, as well as pointers into sub-objects.
   chromium_experimental_full_ptr_parameters
 }
@@ -969,8 +969,8 @@
 @const op | <T: ia_iu32>(T, T) -> T
 @const op | <T: ia_iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
 
-op && (bool, bool) -> bool
-op || (bool, bool) -> bool
+@const op && (bool, bool) -> bool
+@const op || (bool, bool) -> bool
 
 @const op == <T: scalar>(T, T) -> bool
 @const op == <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
diff --git a/src/tint/resolver/const_eval.cc b/src/tint/resolver/const_eval.cc
index ce38b1d..548ea62 100644
--- a/src/tint/resolver/const_eval.cc
+++ b/src/tint/resolver/const_eval.cc
@@ -1810,6 +1810,18 @@
     return TransformElements(builder, ty, transform, args[0], args[1]);
 }
 
+ConstEval::Result ConstEval::OpLogicalAnd(const sem::Type* ty,
+                                          utils::VectorRef<const sem::Constant*> args,
+                                          const Source& source) {
+    return CreateElement(builder, source, ty, args[0]->As<bool>() && args[1]->As<bool>());
+}
+
+ConstEval::Result ConstEval::OpLogicalOr(const sem::Type* ty,
+                                         utils::VectorRef<const sem::Constant*> args,
+                                         const Source& source) {
+    return CreateElement(builder, source, ty, args[0]->As<bool>() || args[1]->As<bool>());
+}
+
 ConstEval::Result ConstEval::OpAnd(const sem::Type* ty,
                                    utils::VectorRef<const sem::Constant*> args,
                                    const Source& source) {
diff --git a/src/tint/resolver/const_eval.h b/src/tint/resolver/const_eval.h
index 3e6c626..ed8b6b1 100644
--- a/src/tint/resolver/const_eval.h
+++ b/src/tint/resolver/const_eval.h
@@ -346,6 +346,24 @@
                               utils::VectorRef<const sem::Constant*> args,
                               const Source& source);
 
+    /// Logical and operator '&&'
+    /// @param ty the expression type
+    /// @param args the input arguments
+    /// @param source the source location
+    /// @return the result value, or null if the value cannot be calculated
+    Result OpLogicalAnd(const sem::Type* ty,
+                        utils::VectorRef<const sem::Constant*> args,
+                        const Source& source);
+
+    /// Logical or operator '||'
+    /// @param ty the expression type
+    /// @param args the input arguments
+    /// @param source the source location
+    /// @return the result value, or null if the value cannot be calculated
+    Result OpLogicalOr(const sem::Type* ty,
+                       utils::VectorRef<const sem::Constant*> args,
+                       const Source& source);
+
     /// Bitwise and operator '&'
     /// @param ty the expression type
     /// @param args the input arguments
diff --git a/src/tint/resolver/const_eval_binary_op_test.cc b/src/tint/resolver/const_eval_binary_op_test.cc
index a370285..e5a19ff 100644
--- a/src/tint/resolver/const_eval_binary_op_test.cc
+++ b/src/tint/resolver/const_eval_binary_op_test.cc
@@ -749,6 +749,34 @@
                                  OpGreaterThanCases<f32, false>(),
                                  OpGreaterThanCases<f16, false>()))));
 
+static std::vector<Case> OpLogicalAndCases() {
+    return {
+        C(true, true, true),
+        C(true, false, false),
+        C(false, true, false),
+        C(false, false, false),
+    };
+}
+INSTANTIATE_TEST_SUITE_P(LogicalAnd,
+                         ResolverConstEvalBinaryOpTest,
+                         testing::Combine(  //
+                             testing::Values(ast::BinaryOp::kLogicalAnd),
+                             testing::ValuesIn(OpLogicalAndCases())));
+
+static std::vector<Case> OpLogicalOrCases() {
+    return {
+        C(true, true, true),
+        C(true, false, true),
+        C(false, true, true),
+        C(false, false, false),
+    };
+}
+INSTANTIATE_TEST_SUITE_P(LogicalOr,
+                         ResolverConstEvalBinaryOpTest,
+                         testing::Combine(  //
+                             testing::Values(ast::BinaryOp::kLogicalOr),
+                             testing::ValuesIn(OpLogicalOrCases())));
+
 static std::vector<Case> OpAndBoolCases() {
     return {
         C(true, true, true),
diff --git a/src/tint/resolver/intrinsic_table.inl b/src/tint/resolver/intrinsic_table.inl
index 3fedcd0..9debb9b 100644
--- a/src/tint/resolver/intrinsic_table.inl
+++ b/src/tint/resolver/intrinsic_table.inl
@@ -13918,7 +13918,7 @@
     /* parameters */ &kParameters[746],
     /* return matcher indices */ &kMatcherIndices[35],
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* const eval */ nullptr,
+    /* const eval */ &ConstEval::OpLogicalAnd,
   },
   {
     /* [469] */
@@ -13930,7 +13930,7 @@
     /* parameters */ &kParameters[748],
     /* return matcher indices */ &kMatcherIndices[35],
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* const eval */ nullptr,
+    /* const eval */ &ConstEval::OpLogicalOr,
   },
 };
 
diff --git a/src/tint/writer/glsl/generator_impl_loop_test.cc b/src/tint/writer/glsl/generator_impl_loop_test.cc
index 639107b..53e26f6 100644
--- a/src/tint/writer/glsl/generator_impl_loop_test.cc
+++ b/src/tint/writer/glsl/generator_impl_loop_test.cc
@@ -212,14 +212,15 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
-    // for(var b = true && false; ; ) {
+    // let t = true;
+    // for(var b = t && false; ; ) {
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
     auto* f = For(Decl(Var("b", multi_stmt)), nullptr, nullptr, Block(Return()));
-    WrapInFunction(f);
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -227,7 +228,7 @@
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  {
-    bool tint_tmp = true;
+    bool tint_tmp = t;
     if (tint_tmp) {
       tint_tmp = false;
     }
@@ -263,16 +264,16 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
-    // for(; true && false; ) {
+    // let t = true;
+    // for(; t && false; ) {
     //   return;
     // }
 
     Func("a_statement", {}, ty.void_(), {});
-
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
     auto* f = For(nullptr, multi_stmt, nullptr, Block(CallStmt(Call("a_statement"))));
-    WrapInFunction(f);
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -281,7 +282,7 @@
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  {
     while (true) {
-      bool tint_tmp = true;
+      bool tint_tmp = t;
       if (tint_tmp) {
         tint_tmp = false;
       }
@@ -316,16 +317,17 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
-    // for(; ; i = true && false) {
+    // let t = true;
+    // for(; ; i = t && false) {
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
     auto* v = Decl(Var("i", ty.bool_()));
     auto* f = For(nullptr, nullptr, Assign("i", multi_stmt),  //
                   Block(Return()));
-    WrapInFunction(v, f);
+    WrapInFunction(t, v, f);
 
     GeneratorImpl& gen = Build();
 
@@ -335,7 +337,7 @@
     EXPECT_EQ(gen.result(), R"(  {
     while (true) {
       return;
-      bool tint_tmp = true;
+      bool tint_tmp = t;
       if (tint_tmp) {
         tint_tmp = false;
       }
@@ -367,20 +369,19 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
-    // for(var i = true && false; true && false; i = true && false) {
+    // let t = true;
+    // for(var i = t && false; t && false; i = t && false) {
     //   return;
     // }
 
-    auto* multi_stmt_a =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
-    auto* multi_stmt_b =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
-    auto* multi_stmt_c =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt_a = LogicalAnd(t, false);
+    auto* multi_stmt_b = LogicalAnd(t, false);
+    auto* multi_stmt_c = LogicalAnd(t, false);
 
     auto* f = For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c),  //
                   Block(Return()));
-    WrapInFunction(f);
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -388,19 +389,19 @@
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  {
-    bool tint_tmp = true;
+    bool tint_tmp = t;
     if (tint_tmp) {
       tint_tmp = false;
     }
     bool i = (tint_tmp);
     while (true) {
-      bool tint_tmp_1 = true;
+      bool tint_tmp_1 = t;
       if (tint_tmp_1) {
         tint_tmp_1 = false;
       }
       if (!((tint_tmp_1))) { break; }
       return;
-      bool tint_tmp_2 = true;
+      bool tint_tmp_2 = t;
       if (tint_tmp_2) {
         tint_tmp_2 = false;
       }
@@ -449,16 +450,17 @@
 }
 
 TEST_F(GlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
-    // while(true && false) {
+    // let t = true;
+    // while(t && false) {
     //   return;
     // }
 
     Func("a_statement", {}, ty.void_(), {});
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
     auto* f = While(multi_stmt, Block(CallStmt(Call("a_statement"))));
-    WrapInFunction(f);
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -466,7 +468,7 @@
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  while (true) {
-    bool tint_tmp = true;
+    bool tint_tmp = t;
     if (tint_tmp) {
       tint_tmp = false;
     }
diff --git a/src/tint/writer/hlsl/generator_impl_loop_test.cc b/src/tint/writer/hlsl/generator_impl_loop_test.cc
index 9d2a4de..4249f1e 100644
--- a/src/tint/writer/hlsl/generator_impl_loop_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_loop_test.cc
@@ -211,14 +211,15 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
-    // for(var b = true && false; ; ) {
+    // let t = true;
+    // for(var b = t && false; ; ) {
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
     auto* f = For(Decl(Var("b", multi_stmt)), nullptr, nullptr, Block(Return()));
-    WrapInFunction(f);
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -226,7 +227,7 @@
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  {
-    bool tint_tmp = true;
+    bool tint_tmp = t;
     if (tint_tmp) {
       tint_tmp = false;
     }
@@ -260,14 +261,16 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
-    // for(; true && false; ) {
+    // let t = true;
+    // for(; t && false; ) {
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
-    auto* f = For(nullptr, multi_stmt, nullptr, Block(Return()));
-    WrapInFunction(f);
+    Func("a_statement", {}, ty.void_(), {});
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
+    auto* f = For(nullptr, multi_stmt, nullptr, Block(CallStmt(Call("a_statement"))));
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -276,12 +279,12 @@
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  {
     while (true) {
-      bool tint_tmp = true;
+      bool tint_tmp = t;
       if (tint_tmp) {
         tint_tmp = false;
       }
       if (!((tint_tmp))) { break; }
-      return;
+      a_statement();
     }
   }
 )");
@@ -310,15 +313,17 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
-    // for(; ; i = true && false) {
+    // let t = true;
+    // for(; ; i = t && false) {
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
     auto* v = Decl(Var("i", ty.bool_()));
-    auto* f = For(nullptr, nullptr, Assign("i", multi_stmt), Block(Return()));
-    WrapInFunction(v, f);
+    auto* f = For(nullptr, nullptr, Assign("i", multi_stmt),  //
+                  Block(Return()));
+    WrapInFunction(t, v, f);
 
     GeneratorImpl& gen = Build();
 
@@ -328,7 +333,7 @@
     EXPECT_EQ(gen.result(), R"(  {
     while (true) {
       return;
-      bool tint_tmp = true;
+      bool tint_tmp = t;
       if (tint_tmp) {
         tint_tmp = false;
       }
@@ -360,20 +365,19 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
-    // for(var i = true && false; true && false; i = true && false) {
+    // let t = true;
+    // for(var i = t && false; t && false; i = t && false) {
     //   return;
     // }
 
-    auto* multi_stmt_a =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
-    auto* multi_stmt_b =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
-    auto* multi_stmt_c =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt_a = LogicalAnd(t, false);
+    auto* multi_stmt_b = LogicalAnd(t, false);
+    auto* multi_stmt_c = LogicalAnd(t, false);
 
-    auto* f =
-        For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c), Block(Return()));
-    WrapInFunction(f);
+    auto* f = For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c),  //
+                  Block(Return()));
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -381,19 +385,19 @@
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  {
-    bool tint_tmp = true;
+    bool tint_tmp = t;
     if (tint_tmp) {
       tint_tmp = false;
     }
     bool i = (tint_tmp);
     while (true) {
-      bool tint_tmp_1 = true;
+      bool tint_tmp_1 = t;
       if (tint_tmp_1) {
         tint_tmp_1 = false;
       }
       if (!((tint_tmp_1))) { break; }
       return;
-      bool tint_tmp_2 = true;
+      bool tint_tmp_2 = t;
       if (tint_tmp_2) {
         tint_tmp_2 = false;
       }
@@ -442,14 +446,17 @@
 }
 
 TEST_F(HlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
-    // while(true && false) {
+    // let t = true;
+    // while(t && false) {
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
-    auto* f = While(multi_stmt, Block(Return()));
-    WrapInFunction(f);
+    Func("a_statement", {}, ty.void_(), {});
+
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
+    auto* f = While(multi_stmt, Block(CallStmt(Call("a_statement"))));
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
@@ -457,12 +464,12 @@
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
     EXPECT_EQ(gen.result(), R"(  while (true) {
-    bool tint_tmp = true;
+    bool tint_tmp = t;
     if (tint_tmp) {
       tint_tmp = false;
     }
     if (!((tint_tmp))) { break; }
-    return;
+    a_statement();
   }
 )");
 }
diff --git a/src/tint/writer/msl/generator_impl_loop_test.cc b/src/tint/writer/msl/generator_impl_loop_test.cc
index 89009e0..8926f2a 100644
--- a/src/tint/writer/msl/generator_impl_loop_test.cc
+++ b/src/tint/writer/msl/generator_impl_loop_test.cc
@@ -419,17 +419,18 @@
     //   return;
     // }
 
-    auto* multi_stmt =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+    auto* t = Let("t", Expr(true));
+    auto* multi_stmt = LogicalAnd(t, false);
+    // create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(t), Expr(false));
     auto* f = While(multi_stmt, Block(Return()));
-    WrapInFunction(f);
+    WrapInFunction(t, f);
 
     GeneratorImpl& gen = Build();
 
     gen.increment_indent();
 
     ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
-    EXPECT_EQ(gen.result(), R"(  while((true && false)) {
+    EXPECT_EQ(gen.result(), R"(  while((t && false)) {
     return;
   }
 )");
diff --git a/src/tint/writer/spirv/builder_binary_expression_test.cc b/src/tint/writer/spirv/builder_binary_expression_test.cc
index e7237fa..f0a5639 100644
--- a/src/tint/writer/spirv/builder_binary_expression_test.cc
+++ b/src/tint/writer/spirv/builder_binary_expression_test.cc
@@ -1071,38 +1071,43 @@
     //    a || (b && c)
     // From: crbug.com/tint/355
 
+    auto* t = Let("t", Expr(true));
+    auto* f = Let("f", Expr(false));
+
     auto* logical_and_expr =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
+        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(t), Expr(f));
 
     auto* expr =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(true), logical_and_expr);
+        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(t), logical_and_expr);
 
-    WrapInFunction(expr);
+    WrapInFunction(t, f, expr);
 
     spirv::Builder& b = Build();
 
     b.push_function(Function{});
+    ASSERT_TRUE(b.GenerateFunctionVariable(t)) << b.error();
+    ASSERT_TRUE(b.GenerateFunctionVariable(f)) << b.error();
     b.GenerateLabel(b.next_id());
 
     EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
-    EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
-%3 = OpConstantTrue %2
-%8 = OpConstantNull %2
+    EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
+%2 = OpConstantTrue %1
+%3 = OpConstantNull %1
 )");
     EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
-              R"(%1 = OpLabel
-OpSelectionMerge %4 None
-OpBranchConditional %3 %4 %5
-%5 = OpLabel
-OpSelectionMerge %6 None
-OpBranchConditional %3 %7 %6
-%7 = OpLabel
-OpBranch %6
+              R"(%4 = OpLabel
+OpSelectionMerge %5 None
+OpBranchConditional %2 %5 %6
 %6 = OpLabel
-%9 = OpPhi %2 %3 %5 %8 %7
-OpBranch %4
-%4 = OpLabel
-%10 = OpPhi %2 %3 %1 %9 %6
+OpSelectionMerge %7 None
+OpBranchConditional %2 %8 %7
+%8 = OpLabel
+OpBranch %7
+%7 = OpLabel
+%9 = OpPhi %1 %2 %6 %3 %8
+OpBranch %5
+%5 = OpLabel
+%10 = OpPhi %1 %2 %4 %9 %7
 )");
 }
 
@@ -1111,38 +1116,43 @@
     //    a && (b || c)
     // From: crbug.com/tint/355
 
+    auto* t = Let("t", Expr(true));
+    auto* f = Let("f", Expr(false));
+
     auto* logical_or_expr =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(true), Expr(false));
+        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(t), Expr(f));
 
     auto* expr =
-        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), logical_or_expr);
+        create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(t), logical_or_expr);
 
-    WrapInFunction(expr);
+    WrapInFunction(t, f, expr);
 
     spirv::Builder& b = Build();
 
     b.push_function(Function{});
+    ASSERT_TRUE(b.GenerateFunctionVariable(t)) << b.error();
+    ASSERT_TRUE(b.GenerateFunctionVariable(f)) << b.error();
     b.GenerateLabel(b.next_id());
 
     EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
-    EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
-%3 = OpConstantTrue %2
-%8 = OpConstantNull %2
+    EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
+%2 = OpConstantTrue %1
+%3 = OpConstantNull %1
 )");
     EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
-              R"(%1 = OpLabel
-OpSelectionMerge %4 None
-OpBranchConditional %3 %5 %4
-%5 = OpLabel
-OpSelectionMerge %6 None
-OpBranchConditional %3 %6 %7
-%7 = OpLabel
-OpBranch %6
+              R"(%4 = OpLabel
+OpSelectionMerge %5 None
+OpBranchConditional %2 %6 %5
 %6 = OpLabel
-%9 = OpPhi %2 %3 %5 %8 %7
-OpBranch %4
-%4 = OpLabel
-%10 = OpPhi %2 %3 %1 %9 %6
+OpSelectionMerge %7 None
+OpBranchConditional %2 %7 %8
+%8 = OpLabel
+OpBranch %7
+%7 = OpLabel
+%9 = OpPhi %1 %2 %6 %3 %8
+OpBranch %5
+%5 = OpLabel
+%10 = OpPhi %1 %2 %4 %9 %7
 )");
 }
 
diff --git a/test/tint/expressions/splat/expression/bool.wgsl.expected.dxc.hlsl b/test/tint/expressions/splat/expression/bool.wgsl.expected.dxc.hlsl
index 544f39d..5ee7041 100644
--- a/test/tint/expressions/splat/expression/bool.wgsl.expected.dxc.hlsl
+++ b/test/tint/expressions/splat/expression/bool.wgsl.expected.dxc.hlsl
@@ -4,19 +4,7 @@
 }
 
 void f() {
-  bool tint_tmp = true;
-  if (!tint_tmp) {
-    tint_tmp = false;
-  }
-  bool2 v2 = bool2(((tint_tmp)).xx);
-  bool tint_tmp_1 = true;
-  if (!tint_tmp_1) {
-    tint_tmp_1 = false;
-  }
-  bool3 v3 = bool3(((tint_tmp_1)).xxx);
-  bool tint_tmp_2 = true;
-  if (!tint_tmp_2) {
-    tint_tmp_2 = false;
-  }
-  bool4 v4 = bool4(((tint_tmp_2)).xxxx);
+  bool2 v2 = (true).xx;
+  bool3 v3 = (true).xxx;
+  bool4 v4 = (true).xxxx;
 }
diff --git a/test/tint/expressions/splat/expression/bool.wgsl.expected.fxc.hlsl b/test/tint/expressions/splat/expression/bool.wgsl.expected.fxc.hlsl
index 544f39d..5ee7041 100644
--- a/test/tint/expressions/splat/expression/bool.wgsl.expected.fxc.hlsl
+++ b/test/tint/expressions/splat/expression/bool.wgsl.expected.fxc.hlsl
@@ -4,19 +4,7 @@
 }
 
 void f() {
-  bool tint_tmp = true;
-  if (!tint_tmp) {
-    tint_tmp = false;
-  }
-  bool2 v2 = bool2(((tint_tmp)).xx);
-  bool tint_tmp_1 = true;
-  if (!tint_tmp_1) {
-    tint_tmp_1 = false;
-  }
-  bool3 v3 = bool3(((tint_tmp_1)).xxx);
-  bool tint_tmp_2 = true;
-  if (!tint_tmp_2) {
-    tint_tmp_2 = false;
-  }
-  bool4 v4 = bool4(((tint_tmp_2)).xxxx);
+  bool2 v2 = (true).xx;
+  bool3 v3 = (true).xxx;
+  bool4 v4 = (true).xxxx;
 }
diff --git a/test/tint/expressions/splat/expression/bool.wgsl.expected.glsl b/test/tint/expressions/splat/expression/bool.wgsl.expected.glsl
index 6f0cd4c..d295feb 100644
--- a/test/tint/expressions/splat/expression/bool.wgsl.expected.glsl
+++ b/test/tint/expressions/splat/expression/bool.wgsl.expected.glsl
@@ -5,20 +5,8 @@
   return;
 }
 void f() {
-  bool tint_tmp = true;
-  if (!tint_tmp) {
-    tint_tmp = false;
-  }
-  bvec2 v2 = bvec2((tint_tmp));
-  bool tint_tmp_1 = true;
-  if (!tint_tmp_1) {
-    tint_tmp_1 = false;
-  }
-  bvec3 v3 = bvec3((tint_tmp_1));
-  bool tint_tmp_2 = true;
-  if (!tint_tmp_2) {
-    tint_tmp_2 = false;
-  }
-  bvec4 v4 = bvec4((tint_tmp_2));
+  bvec2 v2 = bvec2(true);
+  bvec3 v3 = bvec3(true);
+  bvec4 v4 = bvec4(true);
 }
 
diff --git a/test/tint/expressions/splat/expression/bool.wgsl.expected.msl b/test/tint/expressions/splat/expression/bool.wgsl.expected.msl
index 354bab1..f4cb400 100644
--- a/test/tint/expressions/splat/expression/bool.wgsl.expected.msl
+++ b/test/tint/expressions/splat/expression/bool.wgsl.expected.msl
@@ -2,8 +2,8 @@
 
 using namespace metal;
 void f() {
-  bool2 v2 = bool2((true || false));
-  bool3 v3 = bool3((true || false));
-  bool4 v4 = bool4((true || false));
+  bool2 v2 = bool2(true);
+  bool3 v3 = bool3(true);
+  bool4 v4 = bool4(true);
 }
 
diff --git a/test/tint/expressions/splat/expression/bool.wgsl.expected.spvasm b/test/tint/expressions/splat/expression/bool.wgsl.expected.spvasm
index 8bf9fa1..703affa 100644
--- a/test/tint/expressions/splat/expression/bool.wgsl.expected.spvasm
+++ b/test/tint/expressions/splat/expression/bool.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 34
+; Bound: 24
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,47 +17,28 @@
        %bool = OpTypeBool
      %v2bool = OpTypeVector %bool 2
        %true = OpConstantTrue %bool
-         %12 = OpConstantNull %bool
+         %10 = OpConstantComposite %v2bool %true %true
 %_ptr_Function_v2bool = OpTypePointer Function %v2bool
-         %17 = OpConstantNull %v2bool
+         %13 = OpConstantNull %v2bool
      %v3bool = OpTypeVector %bool 3
+         %15 = OpConstantComposite %v3bool %true %true %true
 %_ptr_Function_v3bool = OpTypePointer Function %v3bool
-         %25 = OpConstantNull %v3bool
+         %18 = OpConstantNull %v3bool
      %v4bool = OpTypeVector %bool 4
+         %20 = OpConstantComposite %v4bool %true %true %true %true
 %_ptr_Function_v4bool = OpTypePointer Function %v4bool
-         %33 = OpConstantNull %v4bool
+         %23 = OpConstantNull %v4bool
 %unused_entry_point = OpFunction %void None %1
           %4 = OpLabel
                OpReturn
                OpFunctionEnd
           %f = OpFunction %void None %1
           %6 = OpLabel
-         %v2 = OpVariable %_ptr_Function_v2bool Function %17
-         %v3 = OpVariable %_ptr_Function_v3bool Function %25
-         %v4 = OpVariable %_ptr_Function_v4bool Function %33
-               OpSelectionMerge %10 None
-               OpBranchConditional %true %10 %11
-         %11 = OpLabel
-               OpBranch %10
-         %10 = OpLabel
-         %13 = OpPhi %bool %true %6 %12 %11
-         %14 = OpCompositeConstruct %v2bool %13 %13
-               OpStore %v2 %14
-               OpSelectionMerge %19 None
-               OpBranchConditional %true %19 %20
-         %20 = OpLabel
-               OpBranch %19
-         %19 = OpLabel
-         %21 = OpPhi %bool %true %10 %12 %20
-         %22 = OpCompositeConstruct %v3bool %21 %21 %21
-               OpStore %v3 %22
-               OpSelectionMerge %27 None
-               OpBranchConditional %true %27 %28
-         %28 = OpLabel
-               OpBranch %27
-         %27 = OpLabel
-         %29 = OpPhi %bool %true %19 %12 %28
-         %30 = OpCompositeConstruct %v4bool %29 %29 %29 %29
-               OpStore %v4 %30
+         %v2 = OpVariable %_ptr_Function_v2bool Function %13
+         %v3 = OpVariable %_ptr_Function_v3bool Function %18
+         %v4 = OpVariable %_ptr_Function_v4bool Function %23
+               OpStore %v2 %10
+               OpStore %v3 %15
+               OpStore %v4 %20
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/expressions/splat/var/bool.wgsl.expected.dxc.hlsl b/test/tint/expressions/splat/var/bool.wgsl.expected.dxc.hlsl
index 76b97e2..de9a95f 100644
--- a/test/tint/expressions/splat/var/bool.wgsl.expected.dxc.hlsl
+++ b/test/tint/expressions/splat/var/bool.wgsl.expected.dxc.hlsl
@@ -4,11 +4,7 @@
 }
 
 void f() {
-  bool tint_tmp = true;
-  if (!tint_tmp) {
-    tint_tmp = false;
-  }
-  bool v = (tint_tmp);
+  bool v = true;
   bool2 v2 = bool2((v).xx);
   bool3 v3 = bool3((v).xxx);
   bool4 v4 = bool4((v).xxxx);
diff --git a/test/tint/expressions/splat/var/bool.wgsl.expected.fxc.hlsl b/test/tint/expressions/splat/var/bool.wgsl.expected.fxc.hlsl
index 76b97e2..de9a95f 100644
--- a/test/tint/expressions/splat/var/bool.wgsl.expected.fxc.hlsl
+++ b/test/tint/expressions/splat/var/bool.wgsl.expected.fxc.hlsl
@@ -4,11 +4,7 @@
 }
 
 void f() {
-  bool tint_tmp = true;
-  if (!tint_tmp) {
-    tint_tmp = false;
-  }
-  bool v = (tint_tmp);
+  bool v = true;
   bool2 v2 = bool2((v).xx);
   bool3 v3 = bool3((v).xxx);
   bool4 v4 = bool4((v).xxxx);
diff --git a/test/tint/expressions/splat/var/bool.wgsl.expected.glsl b/test/tint/expressions/splat/var/bool.wgsl.expected.glsl
index 35abbf2..7a98e70 100644
--- a/test/tint/expressions/splat/var/bool.wgsl.expected.glsl
+++ b/test/tint/expressions/splat/var/bool.wgsl.expected.glsl
@@ -5,11 +5,7 @@
   return;
 }
 void f() {
-  bool tint_tmp = true;
-  if (!tint_tmp) {
-    tint_tmp = false;
-  }
-  bool v = (tint_tmp);
+  bool v = true;
   bvec2 v2 = bvec2(v);
   bvec3 v3 = bvec3(v);
   bvec4 v4 = bvec4(v);
diff --git a/test/tint/expressions/splat/var/bool.wgsl.expected.msl b/test/tint/expressions/splat/var/bool.wgsl.expected.msl
index 968f6c6..b5861e8 100644
--- a/test/tint/expressions/splat/var/bool.wgsl.expected.msl
+++ b/test/tint/expressions/splat/var/bool.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 void f() {
-  bool v = (true || false);
+  bool v = true;
   bool2 v2 = bool2(v);
   bool3 v3 = bool3(v);
   bool4 v4 = bool4(v);
diff --git a/test/tint/expressions/splat/var/bool.wgsl.expected.spvasm b/test/tint/expressions/splat/var/bool.wgsl.expected.spvasm
index 7eee754..2c36421 100644
--- a/test/tint/expressions/splat/var/bool.wgsl.expected.spvasm
+++ b/test/tint/expressions/splat/var/bool.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 33
+; Bound: 30
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -17,17 +17,17 @@
           %1 = OpTypeFunction %void
        %bool = OpTypeBool
        %true = OpConstantTrue %bool
-         %11 = OpConstantNull %bool
 %_ptr_Function_bool = OpTypePointer Function %bool
+         %11 = OpConstantNull %bool
      %v2bool = OpTypeVector %bool 2
 %_ptr_Function_v2bool = OpTypePointer Function %v2bool
-         %20 = OpConstantNull %v2bool
+         %17 = OpConstantNull %v2bool
      %v3bool = OpTypeVector %bool 3
 %_ptr_Function_v3bool = OpTypePointer Function %v3bool
-         %26 = OpConstantNull %v3bool
+         %23 = OpConstantNull %v3bool
      %v4bool = OpTypeVector %bool 4
 %_ptr_Function_v4bool = OpTypePointer Function %v4bool
-         %32 = OpConstantNull %v4bool
+         %29 = OpConstantNull %v4bool
 %unused_entry_point = OpFunction %void None %1
           %4 = OpLabel
                OpReturn
@@ -35,24 +35,18 @@
           %f = OpFunction %void None %1
           %6 = OpLabel
           %v = OpVariable %_ptr_Function_bool Function %11
-         %v2 = OpVariable %_ptr_Function_v2bool Function %20
-         %v3 = OpVariable %_ptr_Function_v3bool Function %26
-         %v4 = OpVariable %_ptr_Function_v4bool Function %32
-               OpSelectionMerge %9 None
-               OpBranchConditional %true %9 %10
-         %10 = OpLabel
-               OpBranch %9
-          %9 = OpLabel
-         %12 = OpPhi %bool %true %6 %11 %10
-               OpStore %v %12
-         %16 = OpLoad %bool %v
-         %17 = OpCompositeConstruct %v2bool %16 %16
-               OpStore %v2 %17
-         %22 = OpLoad %bool %v
-         %23 = OpCompositeConstruct %v3bool %22 %22 %22
-               OpStore %v3 %23
-         %28 = OpLoad %bool %v
-         %29 = OpCompositeConstruct %v4bool %28 %28 %28 %28
-               OpStore %v4 %29
+         %v2 = OpVariable %_ptr_Function_v2bool Function %17
+         %v3 = OpVariable %_ptr_Function_v3bool Function %23
+         %v4 = OpVariable %_ptr_Function_v4bool Function %29
+               OpStore %v %true
+         %13 = OpLoad %bool %v
+         %14 = OpCompositeConstruct %v2bool %13 %13
+               OpStore %v2 %14
+         %19 = OpLoad %bool %v
+         %20 = OpCompositeConstruct %v3bool %19 %19 %19
+               OpStore %v3 %20
+         %25 = OpLoad %bool %v
+         %26 = OpCompositeConstruct %v4bool %25 %25 %25 %25
+               OpStore %v4 %26
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/var/override/named/no_init/bool.wgsl.expected.dxc.hlsl b/test/tint/var/override/named/no_init/bool.wgsl.expected.dxc.hlsl
index fba945b..af95aed 100644
--- a/test/tint/var/override/named/no_init/bool.wgsl.expected.dxc.hlsl
+++ b/test/tint/var/override/named/no_init/bool.wgsl.expected.dxc.hlsl
@@ -1,10 +1,6 @@
 [numthreads(1, 1, 1)]
 void main() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/no_init/bool.wgsl.expected.fxc.hlsl b/test/tint/var/override/named/no_init/bool.wgsl.expected.fxc.hlsl
index fba945b..af95aed 100644
--- a/test/tint/var/override/named/no_init/bool.wgsl.expected.fxc.hlsl
+++ b/test/tint/var/override/named/no_init/bool.wgsl.expected.fxc.hlsl
@@ -1,10 +1,6 @@
 [numthreads(1, 1, 1)]
 void main() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/no_init/bool.wgsl.expected.glsl b/test/tint/var/override/named/no_init/bool.wgsl.expected.glsl
index 677dd8d..94d2bb4 100644
--- a/test/tint/var/override/named/no_init/bool.wgsl.expected.glsl
+++ b/test/tint/var/override/named/no_init/bool.wgsl.expected.glsl
@@ -1,11 +1,7 @@
 #version 310 es
 
 void tint_symbol() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
 }
 
diff --git a/test/tint/var/override/named/no_init/bool.wgsl.expected.msl b/test/tint/var/override/named/no_init/bool.wgsl.expected.msl
index c502139..6fa26c2 100644
--- a/test/tint/var/override/named/no_init/bool.wgsl.expected.msl
+++ b/test/tint/var/override/named/no_init/bool.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 kernel void tint_symbol() {
-  if ((false && true)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/no_init/bool.wgsl.expected.spvasm b/test/tint/var/override/named/no_init/bool.wgsl.expected.spvasm
index 3c8eb1b..14d2a40 100644
--- a/test/tint/var/override/named/no_init/bool.wgsl.expected.spvasm
+++ b/test/tint/var/override/named/no_init/bool.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 13
+; Bound: 9
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -12,7 +12,6 @@
           %1 = OpTypeFunction %void
        %bool = OpTypeBool
           %6 = OpConstantNull %bool
-       %true = OpConstantTrue %bool
        %main = OpFunction %void None %1
           %4 = OpLabel
                OpSelectionMerge %7 None
@@ -20,11 +19,5 @@
           %8 = OpLabel
                OpBranch %7
           %7 = OpLabel
-         %10 = OpPhi %bool %6 %4 %true %8
-               OpSelectionMerge %11 None
-               OpBranchConditional %10 %12 %11
-         %12 = OpLabel
-               OpBranch %11
-         %11 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/var/override/named/val_init/bool.wgsl.expected.dxc.hlsl b/test/tint/var/override/named/val_init/bool.wgsl.expected.dxc.hlsl
index fba945b..af95aed 100644
--- a/test/tint/var/override/named/val_init/bool.wgsl.expected.dxc.hlsl
+++ b/test/tint/var/override/named/val_init/bool.wgsl.expected.dxc.hlsl
@@ -1,10 +1,6 @@
 [numthreads(1, 1, 1)]
 void main() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/val_init/bool.wgsl.expected.fxc.hlsl b/test/tint/var/override/named/val_init/bool.wgsl.expected.fxc.hlsl
index fba945b..af95aed 100644
--- a/test/tint/var/override/named/val_init/bool.wgsl.expected.fxc.hlsl
+++ b/test/tint/var/override/named/val_init/bool.wgsl.expected.fxc.hlsl
@@ -1,10 +1,6 @@
 [numthreads(1, 1, 1)]
 void main() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/val_init/bool.wgsl.expected.glsl b/test/tint/var/override/named/val_init/bool.wgsl.expected.glsl
index 677dd8d..94d2bb4 100644
--- a/test/tint/var/override/named/val_init/bool.wgsl.expected.glsl
+++ b/test/tint/var/override/named/val_init/bool.wgsl.expected.glsl
@@ -1,11 +1,7 @@
 #version 310 es
 
 void tint_symbol() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
 }
 
diff --git a/test/tint/var/override/named/val_init/bool.wgsl.expected.msl b/test/tint/var/override/named/val_init/bool.wgsl.expected.msl
index c502139..6fa26c2 100644
--- a/test/tint/var/override/named/val_init/bool.wgsl.expected.msl
+++ b/test/tint/var/override/named/val_init/bool.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 kernel void tint_symbol() {
-  if ((false && true)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/val_init/bool.wgsl.expected.spvasm b/test/tint/var/override/named/val_init/bool.wgsl.expected.spvasm
index 3c8eb1b..14d2a40 100644
--- a/test/tint/var/override/named/val_init/bool.wgsl.expected.spvasm
+++ b/test/tint/var/override/named/val_init/bool.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 13
+; Bound: 9
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -12,7 +12,6 @@
           %1 = OpTypeFunction %void
        %bool = OpTypeBool
           %6 = OpConstantNull %bool
-       %true = OpConstantTrue %bool
        %main = OpFunction %void None %1
           %4 = OpLabel
                OpSelectionMerge %7 None
@@ -20,11 +19,5 @@
           %8 = OpLabel
                OpBranch %7
           %7 = OpLabel
-         %10 = OpPhi %bool %6 %4 %true %8
-               OpSelectionMerge %11 None
-               OpBranchConditional %10 %12 %11
-         %12 = OpLabel
-               OpBranch %11
-         %11 = OpLabel
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/var/override/named/zero_init/bool.wgsl.expected.dxc.hlsl b/test/tint/var/override/named/zero_init/bool.wgsl.expected.dxc.hlsl
index fba945b..af95aed 100644
--- a/test/tint/var/override/named/zero_init/bool.wgsl.expected.dxc.hlsl
+++ b/test/tint/var/override/named/zero_init/bool.wgsl.expected.dxc.hlsl
@@ -1,10 +1,6 @@
 [numthreads(1, 1, 1)]
 void main() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/zero_init/bool.wgsl.expected.fxc.hlsl b/test/tint/var/override/named/zero_init/bool.wgsl.expected.fxc.hlsl
index fba945b..af95aed 100644
--- a/test/tint/var/override/named/zero_init/bool.wgsl.expected.fxc.hlsl
+++ b/test/tint/var/override/named/zero_init/bool.wgsl.expected.fxc.hlsl
@@ -1,10 +1,6 @@
 [numthreads(1, 1, 1)]
 void main() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/zero_init/bool.wgsl.expected.glsl b/test/tint/var/override/named/zero_init/bool.wgsl.expected.glsl
index 677dd8d..94d2bb4 100644
--- a/test/tint/var/override/named/zero_init/bool.wgsl.expected.glsl
+++ b/test/tint/var/override/named/zero_init/bool.wgsl.expected.glsl
@@ -1,11 +1,7 @@
 #version 310 es
 
 void tint_symbol() {
-  bool tint_tmp = false;
-  if (tint_tmp) {
-    tint_tmp = true;
-  }
-  if ((tint_tmp)) {
+  if (false) {
   }
 }
 
diff --git a/test/tint/var/override/named/zero_init/bool.wgsl.expected.msl b/test/tint/var/override/named/zero_init/bool.wgsl.expected.msl
index c502139..6fa26c2 100644
--- a/test/tint/var/override/named/zero_init/bool.wgsl.expected.msl
+++ b/test/tint/var/override/named/zero_init/bool.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 kernel void tint_symbol() {
-  if ((false && true)) {
+  if (false) {
   }
   return;
 }
diff --git a/test/tint/var/override/named/zero_init/bool.wgsl.expected.spvasm b/test/tint/var/override/named/zero_init/bool.wgsl.expected.spvasm
index 3c8eb1b..14d2a40 100644
--- a/test/tint/var/override/named/zero_init/bool.wgsl.expected.spvasm
+++ b/test/tint/var/override/named/zero_init/bool.wgsl.expected.spvasm
@@ -1,7 +1,7 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 13
+; Bound: 9
 ; Schema: 0
                OpCapability Shader
                OpMemoryModel Logical GLSL450
@@ -12,7 +12,6 @@
           %1 = OpTypeFunction %void
        %bool = OpTypeBool
           %6 = OpConstantNull %bool
-       %true = OpConstantTrue %bool
        %main = OpFunction %void None %1
           %4 = OpLabel
                OpSelectionMerge %7 None
@@ -20,11 +19,5 @@
           %8 = OpLabel
                OpBranch %7
           %7 = OpLabel
-         %10 = OpPhi %bool %6 %4 %true %8
-               OpSelectionMerge %11 None
-               OpBranchConditional %10 %12 %11
-         %12 = OpLabel
-               OpBranch %11
-         %11 = OpLabel
                OpReturn
                OpFunctionEnd