| // |
| // Copyright (c) 2017 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. |
| // |
| // RemoveEmptySwitchStatements.cpp: Remove switch statements that have an empty statement list. |
| |
| #include "compiler/translator/RemoveEmptySwitchStatements.h" |
| |
| #include "compiler/translator/IntermTraverse.h" |
| |
| namespace sh |
| { |
| |
| namespace |
| { |
| |
| class RemoveEmptySwitchStatementsTraverser : public TIntermTraverser |
| { |
| public: |
| RemoveEmptySwitchStatementsTraverser() : TIntermTraverser(true, false, false) {} |
| |
| bool visitSwitch(Visit visit, TIntermSwitch *node); |
| }; |
| |
| bool RemoveEmptySwitchStatementsTraverser::visitSwitch(Visit visit, TIntermSwitch *node) |
| { |
| if (node->getStatementList()->getSequence()->empty()) |
| { |
| // Just output the init statement. |
| if (node->getInit()->hasSideEffects()) |
| { |
| queueReplacement(node->getInit(), OriginalNode::IS_DROPPED); |
| } |
| else |
| { |
| TIntermSequence emptyReplacement; |
| ASSERT(getParentNode()->getAsBlock()); |
| mMultiReplacements.push_back(NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), |
| node, emptyReplacement)); |
| } |
| return false; // Nothing inside the child nodes to traverse. |
| } |
| return true; |
| } |
| |
| } // anonymous namespace |
| |
| void RemoveEmptySwitchStatements(TIntermBlock *root) |
| { |
| RemoveEmptySwitchStatementsTraverser traverser; |
| root->traverse(&traverser); |
| traverser.updateTree(); |
| } |
| |
| } // namespace sh |