summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/RewriteElseBlocks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/RewriteElseBlocks.cpp')
-rw-r--r--src/3rdparty/angle/src/compiler/translator/RewriteElseBlocks.cpp120
1 files changed, 0 insertions, 120 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/RewriteElseBlocks.cpp b/src/3rdparty/angle/src/compiler/translator/RewriteElseBlocks.cpp
deleted file mode 100644
index ed1bfad8a8..0000000000
--- a/src/3rdparty/angle/src/compiler/translator/RewriteElseBlocks.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-//
-// Copyright (c) 2014 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.
-//
-// RewriteElseBlocks.cpp: Implementation for tree transform to change
-// all if-else blocks to if-if blocks.
-//
-
-#include "compiler/translator/RewriteElseBlocks.h"
-
-#include "compiler/translator/IntermNode.h"
-#include "compiler/translator/IntermNode_util.h"
-#include "compiler/translator/NodeSearch.h"
-#include "compiler/translator/SymbolTable.h"
-
-namespace sh
-{
-
-namespace
-{
-
-class ElseBlockRewriter : public TIntermTraverser
-{
- public:
- ElseBlockRewriter(TSymbolTable *symbolTable);
-
- protected:
- bool visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *aggregate) override;
- bool visitBlock(Visit visit, TIntermBlock *block) override;
-
- private:
- TIntermNode *rewriteIfElse(TIntermIfElse *ifElse);
-
- const TType *mFunctionType;
-};
-
-ElseBlockRewriter::ElseBlockRewriter(TSymbolTable *symbolTable)
- : TIntermTraverser(true, false, true, symbolTable), mFunctionType(nullptr)
-{
-}
-
-bool ElseBlockRewriter::visitFunctionDefinition(Visit visit, TIntermFunctionDefinition *node)
-{
- // Store the current function context (see comment below)
- mFunctionType = ((visit == PreVisit) ? &node->getFunctionPrototype()->getType() : nullptr);
- return true;
-}
-
-bool ElseBlockRewriter::visitBlock(Visit visit, TIntermBlock *node)
-{
- if (visit == PostVisit)
- {
- for (size_t statementIndex = 0; statementIndex != node->getSequence()->size();
- statementIndex++)
- {
- TIntermNode *statement = (*node->getSequence())[statementIndex];
- TIntermIfElse *ifElse = statement->getAsIfElseNode();
- if (ifElse && ifElse->getFalseBlock() != nullptr)
- {
- (*node->getSequence())[statementIndex] = rewriteIfElse(ifElse);
- }
- }
- }
- return true;
-}
-
-TIntermNode *ElseBlockRewriter::rewriteIfElse(TIntermIfElse *ifElse)
-{
- ASSERT(ifElse != nullptr);
-
- nextTemporaryId();
-
- TIntermDeclaration *storeCondition = createTempInitDeclaration(ifElse->getCondition());
-
- TIntermBlock *falseBlock = nullptr;
-
- TType boolType(EbtBool, EbpUndefined, EvqTemporary);
-
- if (ifElse->getFalseBlock())
- {
- TIntermBlock *negatedElse = nullptr;
- // crbug.com/346463
- // D3D generates error messages claiming a function has no return value, when rewriting
- // an if-else clause that returns something non-void in a function. By appending dummy
- // returns (that are unreachable) we can silence this compile error.
- if (mFunctionType && mFunctionType->getBasicType() != EbtVoid)
- {
- TIntermNode *returnNode = new TIntermBranch(EOpReturn, CreateZeroNode(*mFunctionType));
- negatedElse = new TIntermBlock();
- negatedElse->appendStatement(returnNode);
- }
-
- TIntermSymbol *conditionSymbolElse = createTempSymbol(boolType);
- TIntermUnary *negatedCondition = new TIntermUnary(EOpLogicalNot, conditionSymbolElse);
- TIntermIfElse *falseIfElse =
- new TIntermIfElse(negatedCondition, ifElse->getFalseBlock(), negatedElse);
- falseBlock = EnsureBlock(falseIfElse);
- }
-
- TIntermSymbol *conditionSymbolSel = createTempSymbol(boolType);
- TIntermIfElse *newIfElse =
- new TIntermIfElse(conditionSymbolSel, ifElse->getTrueBlock(), falseBlock);
-
- TIntermBlock *block = new TIntermBlock();
- block->getSequence()->push_back(storeCondition);
- block->getSequence()->push_back(newIfElse);
-
- return block;
-}
-
-} // anonymous namespace
-
-void RewriteElseBlocks(TIntermNode *node, TSymbolTable *symbolTable)
-{
- ElseBlockRewriter rewriter(symbolTable);
- node->traverse(&rewriter);
-}
-
-} // namespace sh