changeset 9624:87eafaddf9d9

let ReentrantBlockIterator.processBlock return the next state
author Lukas Stadler <lukas.stadler@jku.at>
date Wed, 08 May 2013 18:05:57 +0200
parents 76c40c3f6bb7
children bce1c7759d9d
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java
diffstat 4 files changed, 50 insertions(+), 79 deletions(-) [+]
line wrap: on
line diff
--- 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<FrameState> {
 
-        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<FrameStateAssignmentState> {
-
-        @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<FrameState> states) {
+            if (merge.stateAfter() != null) {
+                return merge.stateAfter();
             }
+            return singleFrameState(merge, states);
         }
 
         @Override
-        protected FrameStateAssignmentState merge(Block mergeBlock, List<FrameStateAssignmentState> 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<FrameStateAssignmentState> processLoop(Loop loop, FrameStateAssignmentState initialState) {
-            return ReentrantBlockIterator.processLoop(this, loop, initialState).exitStates;
+        protected Map<LoopExitNode, FrameState> 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<FrameStateAssignmentState> states) {
+    private static FrameState singleFrameState(@SuppressWarnings("unused") MergeNode merge, List<FrameState> 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;
             }
--- 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<StateT> {
 
-        protected abstract void processBlock(Block block, StateT currentState);
+        protected abstract StateT processBlock(Block block, StateT currentState);
 
         protected abstract StateT merge(Block merge, List<StateT> 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;
             }
         }
     }
--- 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<HashSet<FloatingReadNode>> {
 
         @Override
-        protected void processBlock(Block block, HashSet<FloatingReadNode> currentState) {
+        protected HashSet<FloatingReadNode> processBlock(Block block, HashSet<FloatingReadNode> 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) {
--- 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<Node> applyEffects(final StructuredGraph graph) {
         final ArrayList<Node> obsoleteNodes = new ArrayList<>();
-        BlockIteratorClosure<Object> closure = new BlockIteratorClosure<Object>() {
+        BlockIteratorClosure<Void> closure = new BlockIteratorClosure<Void>() {
 
             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<Object> states) {
-                return new Object();
+            protected Void merge(Block merge, List<Void> states) {
+                return null;
             }
 
             @Override
-            protected Object cloneState(Object oldState) {
+            protected Void cloneState(Void oldState) {
                 return oldState;
             }
 
             @Override
-            protected List<Object> processLoop(Loop loop, Object initialState) {
-                LoopInfo<Object> info = ReentrantBlockIterator.processLoop(this, loop, initialState);
+            protected List<Void> processLoop(Loop loop, Void initialState) {
+                LoopInfo<Void> 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) {