13c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill//
23c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
33c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill// Use of this source code is governed by a BSD-style license that can be
43c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill// found in the LICENSE file.
53c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill//
63c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill// NodeSearch.h: Utilities for searching translator node graphs
73c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill//
83c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
93c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill#ifndef TRANSLATOR_NODESEARCH_H_
103c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill#define TRANSLATOR_NODESEARCH_H_
113c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
12b1a85f48a6cb63c32e884a9dea86b1ca7275bf7cJamie Madill#include "compiler/translator/IntermNode.h"
13e53c98ba6cd85074d8f2dae76b34321c7786da3aJamie Madill
143c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madillnamespace sh
153c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill{
163c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
173c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madilltemplate <class Parent>
183c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madillclass NodeSearchTraverser : public TIntermTraverser
193c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill{
203c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill  public:
213c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    NodeSearchTraverser()
223c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        : mFound(false)
233c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    {}
243c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
253c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    bool found() const { return mFound; }
263c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
273c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    static bool search(TIntermNode *node)
283c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    {
293c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        Parent searchTraverser;
303c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        node->traverse(&searchTraverser);
313c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        return searchTraverser.found();
323c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    }
333c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
343c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill  protected:
353c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    bool mFound;
363c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill};
373c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
383c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madillclass FindDiscard : public NodeSearchTraverser<FindDiscard>
393c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill{
403c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill  public:
413c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    virtual bool visitBranch(Visit visit, TIntermBranch *node)
423c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    {
433c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        switch (node->getFlowOp())
443c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        {
453c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill          case EOpKill:
463c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill            mFound = true;
473c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill            break;
483c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
493c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill          default: break;
503c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        }
513c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
523c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        return !mFound;
533c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    }
543c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill};
553c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
563c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madillclass FindSideEffectRewriting : public NodeSearchTraverser<FindSideEffectRewriting>
573c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill{
583c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill  public:
593c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    virtual bool visitBinary(Visit visit, TIntermBinary *node)
603c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    {
613c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        switch (node->getOp())
623c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        {
633c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill          case EOpLogicalOr:
643c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill          case EOpLogicalAnd:
653c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill            if (node->getRight()->hasSideEffects())
663c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill            {
673c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill                mFound = true;
683c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill            }
693c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill            break;
703c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
713c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill          default: break;
723c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        }
733c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
743c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill        return !mFound;
753c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill    }
763c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill};
773c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
783c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill}
793c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill
803c9eeb979f4b2431e2303d4a74cd1498d474f6a3Jamie Madill#endif // TRANSLATOR_NODESEARCH_H_
81