changeset 19537:9d5003af91f5

Make dead code elimination during partial escape analysis optional.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 22 Feb 2015 17:15:55 +0100
parents 2c3ea61e8b65
children fac54d234f30
files graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java
diffstat 7 files changed, 23 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java	Sun Feb 22 17:15:55 2015 +0100
@@ -32,6 +32,7 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.cfg.*;
+import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.nodes.virtual.*;
 import com.oracle.graal.phases.graph.*;
 import com.oracle.graal.phases.graph.ReentrantBlockIterator.BlockIteratorClosure;
@@ -111,6 +112,12 @@
         };
         ReentrantBlockIterator.apply(closure, cfg.getStartBlock());
         assert VirtualUtil.assertNonReachable(graph, obsoleteNodes);
+        for (Node fixed : obsoleteNodes) {
+            if (fixed.isAlive()) {
+                fixed.replaceAtUsages(null);
+                GraphUtil.killWithUnusedFloatingInputs(fixed);
+            }
+        }
     }
 
     @Override
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsPhase.java	Sun Feb 22 17:15:55 2015 +0100
@@ -101,7 +101,7 @@
                     Debug.dump(graph, "after " + getName() + " iteration");
                 }
 
-                new DeadCodeEliminationPhase(Required).apply(graph);
+                new DeadCodeEliminationPhase(Optional).apply(graph);
 
                 Set<Node> changedNodes = listener.getNodes();
                 for (Node node : graph.getNodes()) {
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/GraphEffectList.java	Sun Feb 22 17:15:55 2015 +0100
@@ -130,23 +130,16 @@
      *
      * @param node The fixed node that should be deleted.
      */
-    public void deleteFixedNode(final FixedWithNextNode node) {
+    public void deleteNode(final Node node) {
         add("delete fixed node", (graph, obsoleteNodes) -> {
-            GraphUtil.unlinkFixedNode(node);
-            assert obsoleteNodes.add(node);
+            if (node instanceof FixedWithNextNode) {
+                GraphUtil.unlinkFixedNode((FixedWithNextNode) node);
+            }
+            obsoleteNodes.add(node);
         });
     }
 
     /**
-     * Removes the given fixed node from the control flow.
-     *
-     * @param node The fixed node that should be deleted.
-     */
-    public void unlinkFixedNode(final FixedWithNextNode node) {
-        add("unlink fixed node", graph -> GraphUtil.unlinkFixedNode(node));
-    }
-
-    /**
      * Replaces the given node at its usages without deleting it. If the current node is a fixed
      * node it will be disconnected from the control flow, so that it will be deleted by a
      * subsequent {@link DeadCodeEliminationPhase}
@@ -165,11 +158,9 @@
             }
             node.replaceAtUsages(replacement);
             if (node instanceof FixedWithNextNode) {
-                FixedNode next = ((FixedWithNextNode) node).next();
-                ((FixedWithNextNode) node).setNext(null);
-                node.replaceAtPredecessor(next);
-                assert obsoleteNodes.add(node);
+                GraphUtil.unlinkFixedNode((FixedWithNextNode) node);
             }
+            GraphUtil.killWithUnusedFloatingInputs(node);
         });
     }
 
@@ -194,13 +185,4 @@
             }
         });
     }
-
-    /**
-     * Performs a custom action.
-     *
-     * @param action The action that should be performed when the effects are applied.
-     */
-    public void customAction(final Runnable action) {
-        add("customAction", graph -> action.run());
-    }
 }
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java	Sun Feb 22 17:15:55 2015 +0100
@@ -94,7 +94,7 @@
             ValueNode value = getScalarAlias(store.value());
             boolean result = false;
             if (GraphUtil.unproxify(value) == GraphUtil.unproxify(cachedValue)) {
-                effects.deleteFixedNode(store);
+                effects.deleteNode(store);
                 result = true;
             }
             state.killReadCache(store.field());
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationClosure.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/ReadEliminationClosure.java	Sun Feb 22 17:15:55 2015 +0100
@@ -75,7 +75,7 @@
                     StoreFieldNode store = (StoreFieldNode) node;
                     ValueNode value = getScalarAlias(store.value());
                     if (GraphUtil.unproxify(value) == GraphUtil.unproxify(cachedValue)) {
-                        effects.deleteFixedNode(store);
+                        effects.deleteNode(store);
                         deleted = true;
                     }
                     state.killReadCache(store.field());
@@ -108,7 +108,7 @@
 
                 ValueNode value = getScalarAlias(write.value());
                 if (GraphUtil.unproxify(value) == GraphUtil.unproxify(cachedValue)) {
-                    effects.deleteFixedNode(write);
+                    effects.deleteNode(write);
                     deleted = true;
                 }
                 processIdentity(state, write.location().getLocationIdentity());
@@ -141,7 +141,7 @@
 
                     ValueNode value = getScalarAlias(write.value());
                     if (GraphUtil.unproxify(value) == GraphUtil.unproxify(cachedValue)) {
-                        effects.deleteFixedNode(write);
+                        effects.deleteNode(write);
                         deleted = true;
                     }
                     processIdentity(state, write.getLocationIdentity());
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualUtil.java	Sun Feb 22 17:15:55 2015 +0100
@@ -62,7 +62,7 @@
         }
 
         for (Node node : obsoleteNodes) {
-            if (node instanceof FixedNode) {
+            if (node instanceof FixedNode && !node.isDeleted()) {
                 assert !flood.isMarked(node) : node;
             }
         }
@@ -87,7 +87,7 @@
         }
         boolean success = true;
         for (Node node : obsoleteNodes) {
-            if (flood.isMarked(node)) {
+            if (!node.isDeleted() && flood.isMarked(node)) {
                 TTY.println("offending node path:");
                 Node current = node;
                 TTY.print(current.toString());
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java	Sun Feb 22 15:37:46 2015 +0100
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/VirtualizerToolImpl.java	Sun Feb 22 17:15:55 2015 +0100
@@ -117,9 +117,7 @@
     @Override
     public void replaceWithVirtual(VirtualObjectNode virtual) {
         closure.addAndMarkAlias(virtual, current);
-        if (current instanceof FixedWithNextNode) {
-            effects.deleteFixedNode((FixedWithNextNode) current);
-        }
+        effects.deleteNode(current);
         deleted = true;
     }
 
@@ -132,7 +130,7 @@
 
     @Override
     public void delete() {
-        effects.deleteFixedNode((FixedWithNextNode) current);
+        effects.deleteNode(current);
         deleted = true;
     }