changeset 16190:3e40052d3b91

made CollapseFrameForSingleSideEffectPhase clean up dead nodes
author Doug Simon <doug.simon@oracle.com>
date Thu, 19 Jun 2014 12:07:02 +0200
parents 7230e2f425f6
children 3e3578bc8f9b
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/CollapseFrameForSingleSideEffectPhase.java
diffstat 1 files changed, 31 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/CollapseFrameForSingleSideEffectPhase.java	Thu Jun 19 12:06:18 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/CollapseFrameForSingleSideEffectPhase.java	Thu Jun 19 12:07:02 2014 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.replacements;
 
+import static com.oracle.graal.api.code.BytecodeFrame.*;
+
 import java.util.*;
 
 import com.oracle.graal.api.code.*;
@@ -129,15 +131,15 @@
                 FrameState frameState = stateSplit.stateAfter();
                 if (frameState != null) {
                     if (stateSplit.hasSideEffect()) {
-                        stateSplit.setStateAfter(createInvalidFrameState(node));
+                        setStateAfter(node.graph(), stateSplit, INVALID_FRAMESTATE_BCI, false);
                         state = state.addSideEffect(stateSplit);
                     } else if (currentState.invalid) {
-                        stateSplit.setStateAfter(createInvalidFrameState(node));
+                        setStateAfter(node.graph(), stateSplit, INVALID_FRAMESTATE_BCI, false);
                     } else {
                         stateSplit.setStateAfter(null);
-                    }
-                    if (frameState.usages().isEmpty()) {
-                        GraphUtil.killWithUnusedFloatingInputs(frameState);
+                        if (frameState.usages().isEmpty()) {
+                            GraphUtil.killWithUnusedFloatingInputs(frameState);
+                        }
                     }
                 }
             }
@@ -176,18 +178,14 @@
             for (Node returnSideEffect : returnSideEffects) {
                 if (!unwindSideEffects.contains(returnSideEffect) && !maskedSideEffects.contains(returnSideEffect)) {
                     StateSplit split = (StateSplit) returnSideEffect;
-                    if (split.stateAfter() != null) {
-                        split.setStateAfter(graph.add(new FrameState(BytecodeFrame.AFTER_BCI)));
-                    }
+                    setStateAfter(graph, split, AFTER_BCI, true);
                 }
             }
 
             for (Node unwindSideEffect : unwindSideEffects) {
                 if (!returnSideEffects.contains(unwindSideEffect) && !maskedSideEffects.contains(unwindSideEffect)) {
                     StateSplit split = (StateSplit) unwindSideEffect;
-                    if (split.stateAfter() != null) {
-                        split.setStateAfter(graph.add(new FrameState(BytecodeFrame.AFTER_EXCEPTION_BCI)));
-                    }
+                    setStateAfter(graph, split, AFTER_EXCEPTION_BCI, true);
                 }
             }
         }
@@ -207,15 +205,34 @@
             }
 
             if (isNowInvalid) {
-                loop.setStateAfter(createInvalidFrameState(loop));
+                setStateAfter(loop.graph(), loop, INVALID_FRAMESTATE_BCI, false);
             }
 
             IterationState endState = IterationState.merge(loop, info.endStates.values(), isNowInvalid);
             return ReentrantNodeIterator.processLoop(this, loop, endState).exitStates;
         }
 
-        private static FrameState createInvalidFrameState(FixedNode node) {
-            return node.graph().add(new FrameState(BytecodeFrame.INVALID_FRAMESTATE_BCI));
+        /**
+         * Creates and sets a special frame state for a node. If the existing frame state is
+         * non-null and has no other usages, it is deleted via
+         * {@link GraphUtil#killWithUnusedFloatingInputs(Node)}.
+         *
+         * @param graph the graph context
+         * @param node the node whose frame state is updated
+         * @param bci {@link BytecodeFrame#AFTER_BCI}, {@link BytecodeFrame#AFTER_EXCEPTION_BCI} or
+         *            {@link BytecodeFrame#INVALID_FRAMESTATE_BCI}
+         * @param replaceOnly only perform the update if the node currently has a non-null frame
+         *            state
+         */
+        private static void setStateAfter(StructuredGraph graph, StateSplit node, int bci, boolean replaceOnly) {
+            assert bci == AFTER_BCI || bci == AFTER_EXCEPTION_BCI || bci == INVALID_FRAMESTATE_BCI;
+            FrameState currentStateAfter = node.stateAfter();
+            if (currentStateAfter != null || !replaceOnly) {
+                node.setStateAfter(graph.add(new FrameState(bci)));
+                if (currentStateAfter != null && currentStateAfter.usages().isEmpty()) {
+                    GraphUtil.killWithUnusedFloatingInputs(currentStateAfter);
+                }
+            }
         }
     }
 }