Hash :
ea39a223
Author :
Date :
2017-07-06T12:47:59
Simplify queueReplacement AST transform helper queueReplacement is always called to replace the node that's currently being visited in the traverser. The currently visited node can be fetched automatically from the traversal path so it can be removed from parameters of queueReplacement. BUG=angleproject:2100 TEST=angle_unittests Change-Id: I62ab6d1cd9c0d2b4c260af9f7c85bc156fb3f349 Reviewed-on: https://chromium-review.googlesource.com/562336 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
//
// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#include "compiler/translator/RewriteUnaryMinusOperatorFloat.h"
#include "compiler/translator/IntermTraverse.h"
namespace sh
{
namespace
{
class Traverser : public TIntermTraverser
{
public:
static void Apply(TIntermNode *root);
private:
Traverser();
bool visitUnary(Visit visit, TIntermUnary *node) override;
void nextIteration();
bool mFound = false;
};
// static
void Traverser::Apply(TIntermNode *root)
{
Traverser traverser;
do
{
traverser.nextIteration();
root->traverse(&traverser);
if (traverser.mFound)
{
traverser.updateTree();
}
} while (traverser.mFound);
}
Traverser::Traverser() : TIntermTraverser(true, false, false)
{
}
void Traverser::nextIteration()
{
mFound = false;
}
bool Traverser::visitUnary(Visit visit, TIntermUnary *node)
{
if (mFound)
{
return false;
}
// Detect if the current operator is unary minus operator.
if (node->getOp() != EOpNegative)
{
return true;
}
// Detect if the current operand is a float variable.
TIntermTyped *fValue = node->getOperand();
if (!fValue->getType().isScalarFloat())
{
return true;
}
// 0.0 - float
TIntermTyped *zero = TIntermTyped::CreateZero(fValue->getType());
zero->setLine(fValue->getLine());
TIntermBinary *sub = new TIntermBinary(EOpSub, zero, fValue);
sub->setLine(fValue->getLine());
queueReplacement(sub, OriginalNode::IS_DROPPED);
mFound = true;
return false;
}
} // anonymous namespace
void RewriteUnaryMinusOperatorFloat(TIntermNode *root)
{
Traverser::Apply(root);
}
} // namespace sh