Make use of CreateBoolNode in traversers
This is just refactoring to clean up some duplicate code. A new test
is added to make sure this doesn't break UnfoldShortCircuitAST.
BUG=angleproject:1490
TEST=angle_unittests
Change-Id: I108e646f71ba631cbd5dad2055b64e6a30159742
Reviewed-on: https://chromium-review.googlesource.com/894207
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/AddAndTrueToLoopCondition.cpp b/src/compiler/translator/AddAndTrueToLoopCondition.cpp
index 6a05104..27662f1 100644
--- a/src/compiler/translator/AddAndTrueToLoopCondition.cpp
+++ b/src/compiler/translator/AddAndTrueToLoopCondition.cpp
@@ -6,6 +6,7 @@
#include "compiler/translator/AddAndTrueToLoopCondition.h"
+#include "compiler/translator/IntermNode_util.h"
#include "compiler/translator/IntermTraverse.h"
namespace sh
@@ -36,9 +37,7 @@
}
// Constant true.
- TConstantUnion *trueConstant = new TConstantUnion();
- trueConstant->setBConst(true);
- TIntermTyped *trueValue = new TIntermConstantUnion(trueConstant, TType(EbtBool));
+ TIntermTyped *trueValue = CreateBoolNode(true);
// CONDITION && true.
TIntermBinary *andOp = new TIntermBinary(EOpLogicalAnd, loop->getCondition(), trueValue);
diff --git a/src/compiler/translator/Compiler.cpp b/src/compiler/translator/Compiler.cpp
index 030addf..a53e875 100644
--- a/src/compiler/translator/Compiler.cpp
+++ b/src/compiler/translator/Compiler.cpp
@@ -495,13 +495,11 @@
RewriteDoWhile(root, &symbolTable);
if (compileOptions & SH_ADD_AND_TRUE_TO_LOOP_CONDITION)
- sh::AddAndTrueToLoopCondition(root);
+ AddAndTrueToLoopCondition(root);
if (compileOptions & SH_UNFOLD_SHORT_CIRCUIT)
{
- UnfoldShortCircuitAST unfoldShortCircuit;
- root->traverse(&unfoldShortCircuit);
- unfoldShortCircuit.updateTree();
+ UnfoldShortCircuitAST(root);
}
if (compileOptions & SH_REMOVE_POW_WITH_CONSTANT_EXPONENT)
diff --git a/src/compiler/translator/UnfoldShortCircuitAST.cpp b/src/compiler/translator/UnfoldShortCircuitAST.cpp
index 4e4653b..3108bfe 100644
--- a/src/compiler/translator/UnfoldShortCircuitAST.cpp
+++ b/src/compiler/translator/UnfoldShortCircuitAST.cpp
@@ -6,6 +6,10 @@
#include "compiler/translator/UnfoldShortCircuitAST.h"
+#include "compiler/translator/IntermNode.h"
+#include "compiler/translator/IntermNode_util.h"
+#include "compiler/translator/IntermTraverse.h"
+
namespace sh
{
@@ -15,26 +19,28 @@
// "x || y" is equivalent to "x ? true : y".
TIntermTernary *UnfoldOR(TIntermTyped *x, TIntermTyped *y)
{
- TConstantUnion *u = new TConstantUnion;
- u->setBConst(true);
- TIntermConstantUnion *trueNode =
- new TIntermConstantUnion(u, TType(EbtBool, EbpUndefined, EvqConst, 1));
- return new TIntermTernary(x, trueNode, y);
+ return new TIntermTernary(x, CreateBoolNode(true), y);
}
// "x && y" is equivalent to "x ? y : false".
TIntermTernary *UnfoldAND(TIntermTyped *x, TIntermTyped *y)
{
- TConstantUnion *u = new TConstantUnion;
- u->setBConst(false);
- TIntermConstantUnion *falseNode =
- new TIntermConstantUnion(u, TType(EbtBool, EbpUndefined, EvqConst, 1));
- return new TIntermTernary(x, y, falseNode);
+ return new TIntermTernary(x, y, CreateBoolNode(false));
}
-} // namespace anonymous
+// This traverser identifies all the short circuit binary nodes that need to
+// be replaced, and creates the corresponding replacement nodes. However,
+// the actual replacements happen after the traverse through updateTree().
-bool UnfoldShortCircuitAST::visitBinary(Visit visit, TIntermBinary *node)
+class UnfoldShortCircuitASTTraverser : public TIntermTraverser
+{
+ public:
+ UnfoldShortCircuitASTTraverser() : TIntermTraverser(true, false, false) {}
+
+ bool visitBinary(Visit visit, TIntermBinary *) override;
+};
+
+bool UnfoldShortCircuitASTTraverser::visitBinary(Visit visit, TIntermBinary *node)
{
TIntermTernary *replacement = nullptr;
@@ -56,4 +62,13 @@
return true;
}
+} // anonymous namespace
+
+void UnfoldShortCircuitAST(TIntermBlock *root)
+{
+ UnfoldShortCircuitASTTraverser traverser;
+ root->traverse(&traverser);
+ traverser.updateTree();
+}
+
} // namespace sh
diff --git a/src/compiler/translator/UnfoldShortCircuitAST.h b/src/compiler/translator/UnfoldShortCircuitAST.h
index 7f377e6f..582df02 100644
--- a/src/compiler/translator/UnfoldShortCircuitAST.h
+++ b/src/compiler/translator/UnfoldShortCircuitAST.h
@@ -10,23 +10,12 @@
#ifndef COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUITAST_H_
#define COMPILER_TRANSLATOR_UNFOLDSHORTCIRCUITAST_H_
-#include "common/angleutils.h"
-#include "compiler/translator/IntermTraverse.h"
-
namespace sh
{
-// This traverser identifies all the short circuit binary nodes that need to
-// be replaced, and creates the corresponding replacement nodes. However,
-// the actual replacements happen after the traverse through updateTree().
+class TIntermBlock;
-class UnfoldShortCircuitAST : public TIntermTraverser
-{
- public:
- UnfoldShortCircuitAST() : TIntermTraverser(true, false, false) {}
-
- bool visitBinary(Visit visit, TIntermBinary *) override;
-};
+void UnfoldShortCircuitAST(TIntermBlock *root);
} // namespace sh