[hlsl-writer] Simplify generated logical and/or expressions.

This Cl simplifes the generated code for logical and/or expressions to
assign the LHS and RHS directly instead of using if statements.

Bug: tint:192
Change-Id: I358e07007510cf8df151a100fda678c1c299cf4f
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/28040
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 2b15907..43270f9 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -311,39 +311,25 @@
 
     auto name = generate_name(kTempNamePrefix);
     make_indent(pre);
-    pre << "bool " << name << " = false;" << std::endl;
+    pre << "bool " << name << " = " << lhs_out.str() << ";" << std::endl;
+
     make_indent(pre);
-    pre << "if (" << lhs_out.str() << ") {" << std::endl;
-    {
-      increment_indent();
-
-      if (expr->op() == ast::BinaryOp::kLogicalOr) {
-        make_indent(pre);
-        pre << name << " = true;" << std::endl;
-
-        decrement_indent();
-        make_indent(pre);
-        pre << "} else {" << std::endl;
-        increment_indent();
-      }
-
-      std::ostringstream rhs_out;
-      if (!EmitExpression(pre, rhs_out, expr->rhs())) {
-        return false;
-      }
-      make_indent(pre);
-      pre << "if (" << rhs_out.str() << ") {" << std::endl;
-      {
-        increment_indent();
-        make_indent(pre);
-        pre << name << " = true;" << std::endl;
-        decrement_indent();
-      }
-
-      make_indent(pre);
-      pre << "}" << std::endl;
-      decrement_indent();
+    pre << "if (";
+    if (expr->op() == ast::BinaryOp::kLogicalOr) {
+      pre << "!";
     }
+    pre << name << ") {" << std::endl;
+    increment_indent();
+
+    std::ostringstream rhs_out;
+    if (!EmitExpression(pre, rhs_out, expr->rhs())) {
+      return false;
+    }
+
+    make_indent(pre);
+    pre << name << " = " << rhs_out.str() << ";" << std::endl;
+
+    decrement_indent();
     make_indent(pre);
     pre << "}" << std::endl;
 
diff --git a/src/writer/hlsl/generator_impl_binary_test.cc b/src/writer/hlsl/generator_impl_binary_test.cc
index e6617f9..e6c515f 100644
--- a/src/writer/hlsl/generator_impl_binary_test.cc
+++ b/src/writer/hlsl/generator_impl_binary_test.cc
@@ -92,11 +92,9 @@
 
   ASSERT_TRUE(gen().EmitExpression(pre(), out(), &expr)) << gen().error();
   EXPECT_EQ(result(), "(_tint_tmp)");
-  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = false;
-if (left) {
-  if (right) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = left;
+if (_tint_tmp) {
+  _tint_tmp = right;
 }
 )");
 }
@@ -117,27 +115,17 @@
 
   ASSERT_TRUE(gen().EmitExpression(pre(), out(), &expr)) << gen().error();
   EXPECT_EQ(result(), "(_tint_tmp_0)");
-  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = false;
-if (a) {
-  if (b) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = a;
+if (_tint_tmp) {
+  _tint_tmp = b;
 }
-bool _tint_tmp_0 = false;
-if ((_tint_tmp)) {
-  _tint_tmp_0 = true;
-} else {
-  bool _tint_tmp_1 = false;
-  if (c) {
-    _tint_tmp_1 = true;
-  } else {
-    if (d) {
-      _tint_tmp_1 = true;
-    }
+bool _tint_tmp_0 = (_tint_tmp);
+if (!_tint_tmp_0) {
+  bool _tint_tmp_1 = c;
+  if (!_tint_tmp_1) {
+    _tint_tmp_1 = d;
   }
-  if ((_tint_tmp_1)) {
-    _tint_tmp_0 = true;
-  }
+  _tint_tmp_0 = (_tint_tmp_1);
 }
 )");
 }
@@ -151,13 +139,9 @@
 
   ASSERT_TRUE(gen().EmitExpression(pre(), out(), &expr)) << gen().error();
   EXPECT_EQ(result(), "(_tint_tmp)");
-  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = false;
-if (left) {
-  _tint_tmp = true;
-} else {
-  if (right) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = left;
+if (!_tint_tmp) {
+  _tint_tmp = right;
 }
 )");
 }
@@ -207,22 +191,16 @@
   expr.set_else_statements(std::move(else_stmts));
 
   ASSERT_TRUE(gen().EmitStatement(out(), &expr)) << gen().error();
-  EXPECT_EQ(result(), R"(bool _tint_tmp = false;
-if (a) {
-  if (b) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(result(), R"(bool _tint_tmp = a;
+if (_tint_tmp) {
+  _tint_tmp = b;
 }
 if ((_tint_tmp)) {
   return 1;
 } else {
-  bool _tint_tmp_0 = false;
-  if (b) {
-    _tint_tmp_0 = true;
-  } else {
-    if (c) {
-      _tint_tmp_0 = true;
-    }
+  bool _tint_tmp_0 = b;
+  if (!_tint_tmp_0) {
+    _tint_tmp_0 = c;
   }
   if ((_tint_tmp_0)) {
     return 2;
@@ -246,19 +224,13 @@
       std::move(c)));
 
   ASSERT_TRUE(gen().EmitStatement(out(), &expr)) << gen().error();
-  EXPECT_EQ(result(), R"(bool _tint_tmp = false;
-if (a) {
-  if (b) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(result(), R"(bool _tint_tmp = a;
+if (_tint_tmp) {
+  _tint_tmp = b;
 }
-bool _tint_tmp_0 = false;
-if ((_tint_tmp)) {
-  _tint_tmp_0 = true;
-} else {
-  if (c) {
-    _tint_tmp_0 = true;
-  }
+bool _tint_tmp_0 = (_tint_tmp);
+if (!_tint_tmp_0) {
+  _tint_tmp_0 = c;
 }
 return (_tint_tmp_0);
 )");
@@ -280,19 +252,13 @@
           std::move(d)));
 
   ASSERT_TRUE(gen().EmitStatement(out(), &expr)) << gen().error();
-  EXPECT_EQ(result(), R"(bool _tint_tmp = false;
-if (b) {
-  _tint_tmp = true;
-} else {
-  if (c) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(result(), R"(bool _tint_tmp = b;
+if (!_tint_tmp) {
+  _tint_tmp = c;
 }
-bool _tint_tmp_0 = false;
-if ((_tint_tmp)) {
-  if (d) {
-    _tint_tmp_0 = true;
-  }
+bool _tint_tmp_0 = (_tint_tmp);
+if (_tint_tmp_0) {
+  _tint_tmp_0 = d;
 }
 a = (_tint_tmp_0);
 )");
@@ -317,19 +283,13 @@
   ast::VariableDeclStatement expr(std::move(var));
 
   ASSERT_TRUE(gen().EmitStatement(out(), &expr)) << gen().error();
-  EXPECT_EQ(result(), R"(bool _tint_tmp = false;
-if (b) {
-  if (c) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(result(), R"(bool _tint_tmp = b;
+if (_tint_tmp) {
+  _tint_tmp = c;
 }
-bool _tint_tmp_0 = false;
-if ((_tint_tmp)) {
-  _tint_tmp_0 = true;
-} else {
-  if (d) {
-    _tint_tmp_0 = true;
-  }
+bool _tint_tmp_0 = (_tint_tmp);
+if (!_tint_tmp_0) {
+  _tint_tmp_0 = d;
 }
 bool a = (_tint_tmp_0);
 )");
@@ -350,19 +310,13 @@
                     ast::BinaryOp::kLogicalOr, std::move(b), std::move(c))));
 
   ASSERT_TRUE(gen().EmitExpression(pre(), out(), &expr)) << gen().error();
-  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = false;
-if (a) {
-  bool _tint_tmp_0 = false;
-  if (b) {
-    _tint_tmp_0 = true;
-  } else {
-    if (c) {
-      _tint_tmp_0 = true;
-    }
+  EXPECT_EQ(pre_result(), R"(bool _tint_tmp = a;
+if (_tint_tmp) {
+  bool _tint_tmp_0 = b;
+  if (!_tint_tmp_0) {
+    _tint_tmp_0 = c;
   }
-  if ((_tint_tmp_0)) {
-    _tint_tmp = true;
-  }
+  _tint_tmp = (_tint_tmp_0);
 }
 )");
   EXPECT_EQ(result(), R"(asint((_tint_tmp)))");
@@ -401,41 +355,25 @@
       std::make_unique<ast::IdentifierExpression>("foo"), std::move(params)));
 
   ASSERT_TRUE(gen().EmitStatement(out(), &expr)) << gen().error();
-  EXPECT_EQ(result(), R"(bool _tint_tmp = false;
-if (a) {
-  if (b) {
-    _tint_tmp = true;
-  }
+  EXPECT_EQ(result(), R"(bool _tint_tmp = a;
+if (_tint_tmp) {
+  _tint_tmp = b;
 }
-bool _tint_tmp_0 = false;
-if (c) {
-  _tint_tmp_0 = true;
-} else {
-  if (d) {
-    _tint_tmp_0 = true;
-  }
+bool _tint_tmp_0 = c;
+if (!_tint_tmp_0) {
+  _tint_tmp_0 = d;
 }
-bool _tint_tmp_1 = false;
-if (a) {
-  _tint_tmp_1 = true;
-} else {
-  if (c) {
-    _tint_tmp_1 = true;
-  }
+bool _tint_tmp_1 = a;
+if (!_tint_tmp_1) {
+  _tint_tmp_1 = c;
 }
-bool _tint_tmp_2 = false;
-if ((_tint_tmp_1)) {
-  bool _tint_tmp_3 = false;
-  if (b) {
-    _tint_tmp_3 = true;
-  } else {
-    if (d) {
-      _tint_tmp_3 = true;
-    }
+bool _tint_tmp_2 = (_tint_tmp_1);
+if (_tint_tmp_2) {
+  bool _tint_tmp_3 = b;
+  if (!_tint_tmp_3) {
+    _tint_tmp_3 = d;
   }
-  if ((_tint_tmp_3)) {
-    _tint_tmp_2 = true;
-  }
+  _tint_tmp_2 = (_tint_tmp_3);
 }
 foo((_tint_tmp), (_tint_tmp_0), (_tint_tmp_2));
 )");