17 switch (intermAggregate->
getOp()) {
18 case EOpFunction: visitFunctionDefinition(intermAggregate);
break;
20 default: visitAggregateChildren(intermAggregate);
break;
26 void TDependencyGraphBuilder::visitFunctionDefinition(
TIntermAggregate* intermAggregate)
29 if (intermAggregate->
getName() !=
"main(")
32 visitAggregateChildren(intermAggregate);
37 void TDependencyGraphBuilder::visitFunctionCall(
TIntermAggregate* intermFunctionCall)
42 int argumentNumber = 0;
44 for (TIntermSequence::const_iterator iter = intermArguments.begin();
45 iter != intermArguments.end();
46 ++iter, ++argumentNumber)
48 TNodeSetMaintainer nodeSetMaintainer(
this);
53 if (TParentNodeSet* argumentNodes = mNodeSets.getTopSet()) {
55 connectMultipleNodesToSingleNode(argumentNodes, argument);
66 mNodeSets.insertIntoTopSet(functionCall);
69 void TDependencyGraphBuilder::visitAggregateChildren(
TIntermAggregate* intermAggregate)
72 for(TIntermSequence::const_iterator iter = sequence.begin(); iter != sequence.end(); ++iter)
84 mNodeSets.insertIntoTopSet(symbol);
88 if (!mLeftmostSymbols.empty() && mLeftmostSymbols.top() != &mRightSubtree) {
89 mLeftmostSymbols.pop();
90 mLeftmostSymbols.push(symbol);
98 visitAssignment(intermBinary);
100 visitLogicalOp(intermBinary);
102 visitBinaryChildren(intermBinary);
107 void TDependencyGraphBuilder::visitAssignment(
TIntermBinary* intermAssignment)
116 TNodeSetMaintainer nodeSetMaintainer(
this);
119 TLeftmostSymbolMaintainer leftmostSymbolMaintainer(
this, mLeftSubtree);
121 leftmostSymbol = mLeftmostSymbols.top();
125 ASSERT(leftmostSymbol != &mLeftSubtree);
126 ASSERT(leftmostSymbol != &mRightSubtree);
130 TLeftmostSymbolMaintainer leftmostSymbolMaintainer(
this, mRightSubtree);
131 intermRight->traverse(
this);
134 if (TParentNodeSet* assignmentNodes = mNodeSets.getTopSet())
135 connectMultipleNodesToSingleNode(assignmentNodes, leftmostSymbol);
144 mNodeSets.insertIntoTopSet(leftmostSymbol);
147 void TDependencyGraphBuilder::visitLogicalOp(
TIntermBinary* intermLogicalOp)
150 TNodeSetPropagatingMaintainer nodeSetMaintainer(
this);
153 if (TParentNodeSet* leftNodes = mNodeSets.getTopSet()) {
155 connectMultipleNodesToSingleNode(leftNodes, logicalOp);
160 TLeftmostSymbolMaintainer leftmostSymbolMaintainer(
this, mRightSubtree);
161 intermRight->traverse(
this);
165 void TDependencyGraphBuilder::visitBinaryChildren(
TIntermBinary* intermBinary)
171 TLeftmostSymbolMaintainer leftmostSymbolMaintainer(
this, mRightSubtree);
172 intermRight->traverse(
this);
179 TNodeSetMaintainer nodeSetMaintainer(
this);
181 intermCondition->traverse(
this);
182 if (TParentNodeSet* conditionNodes = mNodeSets.getTopSet()) {
184 connectMultipleNodesToSingleNode(conditionNodes, selection);
189 intermTrueBlock->traverse(
this);
192 intermFalseBlock->traverse(
this);
200 TNodeSetMaintainer nodeSetMaintainer(
this);
202 intermCondition->traverse(
this);
203 if (TParentNodeSet* conditionNodes = mNodeSets.getTopSet()) {
205 connectMultipleNodesToSingleNode(conditionNodes, loop);
210 intermBody->traverse(
this);
213 intermExpression->traverse(
this);
219 void TDependencyGraphBuilder::connectMultipleNodesToSingleNode(TParentNodeSet* nodes,
222 for (TParentNodeSet::const_iterator iter = nodes->begin(); iter != nodes->end(); ++iter)
virtual bool visitLoop(Visit visit, TIntermLoop *)
TIntermSequence & getSequence()
TIntermNode * getTrueBlock() const
TIntermTyped * getCondition()
TIntermTyped * getLeft() const
virtual bool visitBinary(Visit visit, TIntermBinary *)
TIntermNode * getFalseBlock() const
TIntermTyped * getRight() const
TGraphSymbol * getOrCreateSymbol(TIntermSymbol *intermSymbol)
void addDependentNode(TGraphNode *node)
TGraphArgument * createArgument(TIntermAggregate *intermFunctionCall, int argumentNumber)
virtual bool visitAggregate(Visit visit, TIntermAggregate *)
#define ASSERT(expression)
virtual void traverse(TIntermTraverser *)=0
TIntermNode * getCondition() const
const TString & getName() const
TGraphLoop * createLoop(TIntermLoop *intermLoop)
TIntermTyped * getExpression()
TGraphFunctionCall * createFunctionCall(TIntermAggregate *intermFunctionCall)
TGraphSelection * createSelection(TIntermSelection *intermSelection)
static void build(TIntermNode *node, TDependencyGraph *graph)
virtual void visitSymbol(TIntermSymbol *)
virtual bool visitSelection(Visit visit, TIntermSelection *)
bool modifiesState() const
TGraphLogicalOp * createLogicalOp(TIntermBinary *intermLogicalOp)