use of org.graalvm.compiler.nodes.AbstractMergeNode in project graal by oracle.
the class PostOrderNodeIterator method nextQueuedNode.
private FixedNode nextQueuedNode() {
int maxIterations = nodeQueue.size();
while (maxIterations-- > 0) {
AbstractBeginNode node = nodeQueue.removeFirst();
if (node instanceof AbstractMergeNode) {
AbstractMergeNode merge = (AbstractMergeNode) node;
state = nodeStates.get(merge.forwardEndAt(0)).clone();
ArrayList<T> states = new ArrayList<>(merge.forwardEndCount() - 1);
for (int i = 1; i < merge.forwardEndCount(); i++) {
T other = nodeStates.get(merge.forwardEndAt(i));
assert other != null;
states.add(other);
}
boolean ready = state.merge(merge, states);
if (ready) {
return merge;
} else {
nodeQueue.addLast(merge);
}
} else {
assert node.predecessor() != null;
state = nodeStates.get((FixedNode) node.predecessor()).clone();
state.afterSplit(node);
return node;
}
}
return null;
}
use of org.graalvm.compiler.nodes.AbstractMergeNode in project graal by oracle.
the class ScopedPostOrderNodeIterator method processScope.
public void processScope() {
FixedNode current;
queue(currentScopeStart);
while ((current = nextQueuedNode()) != null) {
assert current.isAlive();
if (current instanceof Invoke) {
invoke((Invoke) current);
queueSuccessors(current);
} else if (current instanceof LoopBeginNode) {
queueLoopBeginSuccessors((LoopBeginNode) current);
} else if (current instanceof LoopExitNode) {
queueLoopExitSuccessors((LoopExitNode) current);
} else if (current instanceof LoopEndNode) {
// nothing todo
} else if (current instanceof AbstractMergeNode) {
queueSuccessors(current);
} else if (current instanceof FixedWithNextNode) {
queueSuccessors(current);
} else if (current instanceof EndNode) {
queueMerge((EndNode) current);
} else if (current instanceof ControlSinkNode) {
// nothing todo
} else if (current instanceof ControlSplitNode) {
queueSuccessors(current);
} else {
assert false : current;
}
}
}
use of org.graalvm.compiler.nodes.AbstractMergeNode in project graal by oracle.
the class SinglePassNodeIterator method apply.
/**
* Performs a single-pass iteration.
*
* <p>
* After this method has been invoked, the {@link SinglePassNodeIterator} instance can't be used
* again. This saves clearing up fields in {@link #finished()}, the assumption being that this
* instance will be garbage-collected soon afterwards.
* </p>
*/
public void apply() {
FixedNode current = start;
do {
if (current instanceof InvokeWithExceptionNode) {
invoke((Invoke) current);
queueSuccessors(current);
current = nextQueuedNode();
} else if (current instanceof LoopBeginNode) {
state.loopBegin((LoopBeginNode) current);
keepForLater(current, state);
state = state.clone();
loopBegin((LoopBeginNode) current);
current = ((LoopBeginNode) current).next();
assert current != null;
} else if (current instanceof LoopEndNode) {
loopEnd((LoopEndNode) current);
finishLoopEnds((LoopEndNode) current);
current = nextQueuedNode();
} else if (current instanceof AbstractMergeNode) {
merge((AbstractMergeNode) current);
current = ((AbstractMergeNode) current).next();
assert current != null;
} else if (current instanceof FixedWithNextNode) {
FixedNode next = ((FixedWithNextNode) current).next();
assert next != null : current;
node(current);
current = next;
} else if (current instanceof EndNode) {
end((EndNode) current);
queueMerge((EndNode) current);
current = nextQueuedNode();
} else if (current instanceof ControlSinkNode) {
node(current);
current = nextQueuedNode();
} else if (current instanceof ControlSplitNode) {
controlSplit((ControlSplitNode) current);
queueSuccessors(current);
current = nextQueuedNode();
} else {
assert false : current;
}
} while (current != null);
finished();
}
use of org.graalvm.compiler.nodes.AbstractMergeNode in project graal by oracle.
the class SinglePassNodeIterator method queueMerge.
/**
* Once all end-nodes for a given merge-node have been visited, that merge-node is added to the
* {@link #nodeQueue}
*
* <p>
* {@link #nextQueuedNode()} is in charge of pruning entries (held by {@link #nodeStates}) for
* the forward-ends inserted by this method.
* </p>
*/
private void queueMerge(EndNode end) {
assert !visitedEnds.isMarked(end);
visitedEnds.mark(end);
keepForLater(end, state);
AbstractMergeNode merge = end.merge();
boolean endsVisited = true;
for (int i = 0; i < merge.forwardEndCount(); i++) {
if (!visitedEnds.isMarked(merge.forwardEndAt(i))) {
endsVisited = false;
break;
}
}
if (endsVisited) {
nodeQueue.add(new PathStart<>(merge, null));
}
}
use of org.graalvm.compiler.nodes.AbstractMergeNode in project graal by oracle.
the class StatelessPostOrderNodeIterator method queueMerge.
private void queueMerge(EndNode end) {
assert !visitedEnds.isMarked(end);
visitedEnds.mark(end);
AbstractMergeNode merge = end.merge();
boolean endsVisited = true;
for (int i = 0; i < merge.forwardEndCount(); i++) {
if (!visitedEnds.isMarked(merge.forwardEndAt(i))) {
endsVisited = false;
break;
}
}
if (endsVisited) {
nodeQueue.add(merge);
}
}
Aggregations