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