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