summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/compiler/translator/SeparateExpressionsReturningArrays.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/compiler/translator/SeparateExpressionsReturningArrays.cpp')
-rw-r--r--src/3rdparty/angle/src/compiler/translator/SeparateExpressionsReturningArrays.cpp126
1 files changed, 0 insertions, 126 deletions
diff --git a/src/3rdparty/angle/src/compiler/translator/SeparateExpressionsReturningArrays.cpp b/src/3rdparty/angle/src/compiler/translator/SeparateExpressionsReturningArrays.cpp
deleted file mode 100644
index 01d627937c..0000000000
--- a/src/3rdparty/angle/src/compiler/translator/SeparateExpressionsReturningArrays.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-//
-// Copyright (c) 2002-2015 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.
-//
-// SeparateExpressionsReturningArrays splits array-returning expressions that are not array names
-// from more complex expressions, assigning them to a temporary variable a#.
-// Examples where a, b and c are all arrays:
-// (a = b) == (a = c) is split into a = b; type[n] a1 = a; a = c; type[n] a2 = a; a1 == a2;
-// type d = type[n](...)[i]; is split into type[n] a1 = type[n](...); type d = a1[i];
-
-#include "compiler/translator/SeparateExpressionsReturningArrays.h"
-
-#include "compiler/translator/IntermNodePatternMatcher.h"
-#include "compiler/translator/IntermTraverse.h"
-
-namespace sh
-{
-
-namespace
-{
-
-// Traverser that separates one array expression into a statement at a time.
-class SeparateExpressionsTraverser : public TIntermTraverser
-{
- public:
- SeparateExpressionsTraverser(TSymbolTable *symbolTable);
-
- bool visitBinary(Visit visit, TIntermBinary *node) override;
- bool visitAggregate(Visit visit, TIntermAggregate *node) override;
-
- void nextIteration();
- bool foundArrayExpression() const { return mFoundArrayExpression; }
-
- protected:
- // Marked to true once an operation that needs to be hoisted out of the expression has been
- // found. After that, no more AST updates are performed on that traversal.
- bool mFoundArrayExpression;
-
- IntermNodePatternMatcher mPatternToSeparateMatcher;
-};
-
-SeparateExpressionsTraverser::SeparateExpressionsTraverser(TSymbolTable *symbolTable)
- : TIntermTraverser(true, false, false, symbolTable),
- mFoundArrayExpression(false),
- mPatternToSeparateMatcher(IntermNodePatternMatcher::kExpressionReturningArray)
-{
-}
-
-// Performs a shallow copy of an assignment node.
-// These shallow copies are useful when a node gets inserted into an aggregate node
-// and also needs to be replaced in its original location by a different node.
-TIntermBinary *CopyAssignmentNode(TIntermBinary *node)
-{
- return new TIntermBinary(node->getOp(), node->getLeft(), node->getRight());
-}
-
-bool SeparateExpressionsTraverser::visitBinary(Visit visit, TIntermBinary *node)
-{
- if (mFoundArrayExpression)
- return false;
-
- // Return if the expression is not an array or if we're not inside a complex expression.
- if (!mPatternToSeparateMatcher.match(node, getParentNode()))
- return true;
-
- ASSERT(node->getOp() == EOpAssign);
-
- mFoundArrayExpression = true;
-
- TIntermSequence insertions;
- insertions.push_back(CopyAssignmentNode(node));
- // TODO(oetuaho): In some cases it would be more optimal to not add the temporary node, but just
- // use the original target of the assignment. Care must be taken so that this doesn't happen
- // when the same array symbol is a target of assignment more than once in one expression.
- insertions.push_back(createTempInitDeclaration(node->getLeft()));
- insertStatementsInParentBlock(insertions);
-
- queueReplacement(createTempSymbol(node->getType()), OriginalNode::IS_DROPPED);
-
- return false;
-}
-
-bool SeparateExpressionsTraverser::visitAggregate(Visit visit, TIntermAggregate *node)
-{
- if (mFoundArrayExpression)
- return false; // No need to traverse further
-
- if (!mPatternToSeparateMatcher.match(node, getParentNode()))
- return true;
-
- ASSERT(node->isConstructor() || node->getOp() == EOpCallFunctionInAST);
-
- mFoundArrayExpression = true;
-
- TIntermSequence insertions;
- insertions.push_back(createTempInitDeclaration(node->shallowCopy()));
- insertStatementsInParentBlock(insertions);
-
- queueReplacement(createTempSymbol(node->getType()), OriginalNode::IS_DROPPED);
-
- return false;
-}
-
-void SeparateExpressionsTraverser::nextIteration()
-{
- mFoundArrayExpression = false;
- nextTemporaryId();
-}
-
-} // namespace
-
-void SeparateExpressionsReturningArrays(TIntermNode *root, TSymbolTable *symbolTable)
-{
- SeparateExpressionsTraverser traverser(symbolTable);
- // Separate one expression at a time, and reset the traverser between iterations.
- do
- {
- traverser.nextIteration();
- root->traverse(&traverser);
- if (traverser.foundArrayExpression())
- traverser.updateTree();
- } while (traverser.foundArrayExpression());
-}
-
-} // namespace sh