[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));
)");