# HG changeset patch # User Lukas Stadler # Date 1368029157 -7200 # Node ID 87eafaddf9d9db1a7929535cfad836ac04ba73d7 # Parent 76c40c3f6bb791f0c70aa0cc614de0f7a9684e49 let ReentrantBlockIterator.processBlock return the next state diff -r 76c40c3f6bb7 -r 87eafaddf9d9 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java Wed May 08 15:30:06 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java Wed May 08 18:05:57 2013 +0200 @@ -27,84 +27,53 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.nodes.util.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.graph.*; -import com.oracle.graal.phases.graph.ReentrantBlockIterator.BlockIteratorClosure; +import com.oracle.graal.phases.graph.ReentrantNodeIterator.NodeIteratorClosure; public class FrameStateAssignmentPhase extends Phase { - private static class FrameStateAssignmentState { - - private FrameState framestate; + private static class FrameStateAssignementClosure extends NodeIteratorClosure { - public FrameStateAssignmentState(FrameState framestate) { - this.framestate = framestate; - } + @Override + protected FrameState processNode(FixedNode node, FrameState currentState) { + if (node instanceof DeoptimizingNode) { + DeoptimizingNode deopt = (DeoptimizingNode) node; + if (deopt.canDeoptimize() && deopt.getDeoptimizationState() == null) { + deopt.setDeoptimizationState(currentState); + } + } - public FrameState getFramestate() { - return framestate; - } - - public void setFramestate(FrameState framestate) { - assert framestate != null; - this.framestate = framestate; + if (node instanceof StateSplit) { + StateSplit stateSplit = (StateSplit) node; + if (stateSplit.stateAfter() != null) { + try { + return stateSplit.stateAfter(); + } finally { + stateSplit.setStateAfter(null); + } + } + } + return currentState; } @Override - public String toString() { - return "FrameStateAssignementState: " + framestate; - } - } - - private static class FrameStateAssignementClosure extends BlockIteratorClosure { - - @Override - protected void processBlock(Block block, FrameStateAssignmentState currentState) { - FixedNode node = block.getBeginNode(); - while (node != null) { - if (node instanceof DeoptimizingNode) { - DeoptimizingNode deopt = (DeoptimizingNode) node; - if (deopt.canDeoptimize() && deopt.getDeoptimizationState() == null) { - FrameState state = currentState.getFramestate(); - deopt.setDeoptimizationState(state); - } - } - - if (node instanceof StateSplit) { - StateSplit stateSplit = (StateSplit) node; - if (stateSplit.stateAfter() != null) { - currentState.setFramestate(stateSplit.stateAfter()); - stateSplit.setStateAfter(null); - } - } - - if (node instanceof FixedWithNextNode) { - node = ((FixedWithNextNode) node).next(); - } else { - node = null; - } + protected FrameState merge(MergeNode merge, List states) { + if (merge.stateAfter() != null) { + return merge.stateAfter(); } + return singleFrameState(merge, states); } @Override - protected FrameStateAssignmentState merge(Block mergeBlock, List states) { - MergeNode merge = (MergeNode) mergeBlock.getBeginNode(); - if (merge.stateAfter() != null) { - return new FrameStateAssignmentState(merge.stateAfter()); - } - return new FrameStateAssignmentState(singleFrameState(merge, states)); + protected FrameState afterSplit(AbstractBeginNode node, FrameState oldState) { + return oldState; } @Override - protected FrameStateAssignmentState cloneState(FrameStateAssignmentState oldState) { - return new FrameStateAssignmentState(oldState.getFramestate()); - } - - @Override - protected List processLoop(Loop loop, FrameStateAssignmentState initialState) { - return ReentrantBlockIterator.processLoop(this, loop, initialState).exitStates; + protected Map processLoop(LoopBeginNode loop, FrameState initialState) { + return ReentrantNodeIterator.processLoop(this, loop, initialState).exitStates; } } @@ -112,8 +81,7 @@ @Override protected void run(StructuredGraph graph) { assert checkFixedDeopts(graph); - ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, false, false); - ReentrantBlockIterator.apply(new FrameStateAssignementClosure(), cfg.getStartBlock(), new FrameStateAssignmentState(null), null); + ReentrantNodeIterator.apply(new FrameStateAssignementClosure(), graph.start(), null, null); } private static boolean checkFixedDeopts(StructuredGraph graph) { @@ -126,18 +94,18 @@ return true; } - private static FrameState singleFrameState(@SuppressWarnings("unused") MergeNode merge, List states) { + private static FrameState singleFrameState(@SuppressWarnings("unused") MergeNode merge, List states) { if (states.size() == 0) { return null; } - FrameState firstState = states.get(0).getFramestate(); + FrameState firstState = states.get(0); FrameState singleState = firstState; if (singleState == null) { return null; } int singleBci = singleState.bci; for (int i = 1; i < states.size(); ++i) { - FrameState cur = states.get(i).getFramestate(); + FrameState cur = states.get(i); if (cur == null) { return null; } diff -r 76c40c3f6bb7 -r 87eafaddf9d9 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Wed May 08 15:30:06 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Wed May 08 18:05:57 2013 +0200 @@ -37,7 +37,7 @@ public abstract static class BlockIteratorClosure { - protected abstract void processBlock(Block block, StateT currentState); + protected abstract StateT processBlock(Block block, StateT currentState); protected abstract StateT merge(Block merge, List states); @@ -62,8 +62,8 @@ } for (Block loopExit : loop.exits) { assert loopExit.getPredecessorCount() == 1; + assert blockEndStates.containsKey(loopExit.getBeginNode()); StateT exitState = blockEndStates.get(loopExit.getBeginNode()); - assert exitState != null; // make sure all exit states are unique objects info.exitStates.add(closure.cloneState(exitState)); } @@ -82,7 +82,7 @@ while (true) { if (boundary == null || boundary.contains(current)) { - closure.processBlock(current, state); + state = closure.processBlock(current, state); if (current.getSuccessors().isEmpty()) { // nothing to do... @@ -156,6 +156,7 @@ } else { current = blockQueue.removeFirst(); if (current.getPredecessors().size() == 1) { + assert states.containsKey(current.getBeginNode()); state = states.get(current.getBeginNode()); } else { assert current.getPredecessors().size() > 1; @@ -167,7 +168,6 @@ } state = closure.merge(current, mergedStates); } - assert state != null; } } } diff -r 76c40c3f6bb7 -r 87eafaddf9d9 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed May 08 15:30:06 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed May 08 18:05:57 2013 +0200 @@ -84,7 +84,7 @@ private class MemoryScheduleClosure extends BlockIteratorClosure> { @Override - protected void processBlock(Block block, HashSet currentState) { + protected HashSet processBlock(Block block, HashSet currentState) { for (Node node : getBlockToNodesMap().get(block)) { if (node instanceof FloatingReadNode) { currentState.add((FloatingReadNode) node); @@ -100,6 +100,7 @@ } } } + return currentState; } public void addPhantomReference(FloatingReadNode read, FixedNode fixed) { diff -r 76c40c3f6bb7 -r 87eafaddf9d9 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Wed May 08 15:30:06 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Wed May 08 18:05:57 2013 +0200 @@ -92,7 +92,7 @@ public List applyEffects(final StructuredGraph graph) { final ArrayList obsoleteNodes = new ArrayList<>(); - BlockIteratorClosure closure = new BlockIteratorClosure() { + BlockIteratorClosure closure = new BlockIteratorClosure() { private void apply(GraphEffectList effects, Object context) { if (!effects.isEmpty()) { @@ -107,28 +107,29 @@ } @Override - protected void processBlock(Block block, Object currentState) { + protected Void processBlock(Block block, Void currentState) { apply(blockEffects.get(block), block); + return currentState; } @Override - protected Object merge(Block merge, List states) { - return new Object(); + protected Void merge(Block merge, List states) { + return null; } @Override - protected Object cloneState(Object oldState) { + protected Void cloneState(Void oldState) { return oldState; } @Override - protected List processLoop(Loop loop, Object initialState) { - LoopInfo info = ReentrantBlockIterator.processLoop(this, loop, initialState); + protected List processLoop(Loop loop, Void initialState) { + LoopInfo info = ReentrantBlockIterator.processLoop(this, loop, initialState); apply(loopMergeEffects.get(loop), loop); return info.exitStates; } }; - ReentrantBlockIterator.apply(closure, schedule.getCFG().getStartBlock(), new Object(), null); + ReentrantBlockIterator.apply(closure, schedule.getCFG().getStartBlock(), null, null); return obsoleteNodes; } @@ -137,7 +138,7 @@ } @Override - protected void processBlock(Block block, BlockState state) { + protected BlockState processBlock(Block block, BlockState state) { GraphEffectList effects = blockEffects.get(block); tool.setEffects(effects); @@ -194,6 +195,7 @@ } } trace(")\n end state: %s\n", state); + return state; } private boolean processNode(final ValueNode node, FixedNode insertBefore, final BlockState state, final GraphEffectList effects) {