1 // 2 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // NodeSearch.h: Utilities for searching translator node graphs 7 // 8 9 #ifndef TRANSLATOR_NODESEARCH_H_ 10 #define TRANSLATOR_NODESEARCH_H_ 11 12 #include "compiler/translator/intermediate.h" 13 14 namespace sh 15 { 16 17 template <class Parent> 18 class NodeSearchTraverser : public TIntermTraverser 19 { 20 public: 21 NodeSearchTraverser() 22 : mFound(false) 23 {} 24 25 bool found() const { return mFound; } 26 27 static bool search(TIntermNode *node) 28 { 29 Parent searchTraverser; 30 node->traverse(&searchTraverser); 31 return searchTraverser.found(); 32 } 33 34 protected: 35 bool mFound; 36 }; 37 38 class FindDiscard : public NodeSearchTraverser<FindDiscard> 39 { 40 public: 41 virtual bool visitBranch(Visit visit, TIntermBranch *node) 42 { 43 switch (node->getFlowOp()) 44 { 45 case EOpKill: 46 mFound = true; 47 break; 48 49 default: break; 50 } 51 52 return !mFound; 53 } 54 }; 55 56 class FindSideEffectRewriting : public NodeSearchTraverser<FindSideEffectRewriting> 57 { 58 public: 59 virtual bool visitBinary(Visit visit, TIntermBinary *node) 60 { 61 switch (node->getOp()) 62 { 63 case EOpLogicalOr: 64 case EOpLogicalAnd: 65 if (node->getRight()->hasSideEffects()) 66 { 67 mFound = true; 68 } 69 break; 70 71 default: break; 72 } 73 74 return !mFound; 75 } 76 }; 77 78 } 79 80 #endif // TRANSLATOR_NODESEARCH_H_ 81