changeset 21067:69d03eeb5eed

do not perform read elimination for deleted nodes
author Lukas Stadler <lukas.stadler@oracle.com>
date Tue, 21 Apr 2015 11:40:25 +0200
parents 82539241ff38
children 0eff75735b29
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/PartialEscapeClosure.java
diffstat 2 files changed, 21 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java	Tue Apr 21 11:54:50 2015 +0200
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java	Tue Apr 21 11:40:25 2015 +0200
@@ -32,6 +32,7 @@
 import com.oracle.graal.graph.iterators.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.cfg.*;
+import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.nodes.virtual.*;
 import com.oracle.graal.phases.graph.*;
@@ -158,11 +159,11 @@
                 if (node instanceof LoopExitNode) {
                     LoopExitNode loopExit = (LoopExitNode) node;
                     for (ProxyNode proxy : loopExit.proxies()) {
-                        changed |= processNode(proxy, state, effects, lastFixedNode);
+                        changed |= processNode(proxy, state, effects, lastFixedNode) && isSignificantNode(node);
                     }
                     processLoopExit(loopExit, loopEntryStates.get(loopExit.loopBegin()), state, blockEffects.get(block));
                 }
-                changed |= processNode(node, state, effects, lastFixedNode);
+                changed |= processNode(node, state, effects, lastFixedNode) && isSignificantNode(node);
                 if (node instanceof FixedWithNextNode) {
                     lastFixedNode = (FixedWithNextNode) node;
                 }
@@ -175,6 +176,15 @@
         return state;
     }
 
+    private static boolean isSignificantNode(Node node) {
+        return !(node instanceof CommitAllocationNode || node instanceof AllocatedObjectNode || node instanceof BoxNode);
+    }
+
+    /**
+     * Collects the effects of virtualizing the given node.
+     * 
+     * @return {@code true} if the effects include removing the node, {@code false} otherwise.
+     */
     protected abstract boolean processNode(Node node, BlockT state, GraphEffectList effects, FixedWithNextNode lastFixedNode);
 
     @Override
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Tue Apr 21 11:54:50 2015 +0200
+++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java	Tue Apr 21 11:40:25 2015 +0200
@@ -34,7 +34,6 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.VirtualState.NodeClosure;
 import com.oracle.graal.nodes.cfg.*;
-import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.spi.Virtualizable.EscapeState;
 import com.oracle.graal.nodes.virtual.*;
@@ -134,32 +133,30 @@
 
     private boolean processNodeInternal(Node node, BlockT state, GraphEffectList effects, FixedWithNextNode lastFixedNode) {
         FixedNode nextFixedNode = lastFixedNode == null ? null : lastFixedNode.next();
-        boolean significantChange = false;
         VirtualUtil.trace("%s", node);
 
         if (node instanceof VirtualizableAllocation) {
-            significantChange |= processVirtualizable((ValueNode) node, nextFixedNode, state, effects);
-            if (tool.isDeleted()) {
+            if (processVirtualizable((ValueNode) node, nextFixedNode, state, effects)) {
                 VirtualUtil.trace("deleted virtualizable allocation %s", node);
-                return significantChange;
+                return true;
             }
         }
-
         if (hasVirtualInputs.isMarked(node) && node instanceof ValueNode) {
             if (node instanceof Virtualizable) {
-                significantChange |= processVirtualizable((ValueNode) node, nextFixedNode, state, effects);
-                if (tool.isDeleted()) {
+                if (processVirtualizable((ValueNode) node, nextFixedNode, state, effects)) {
                     VirtualUtil.trace("deleted virtualizable node %s", node);
-                    return significantChange;
+                    return true;
                 }
             }
             processNodeInputs((ValueNode) node, nextFixedNode, state, effects);
         }
 
         if (hasScalarReplacedInputs(node) && node instanceof ValueNode) {
-            significantChange |= processNodeWithScalarReplacedInputs((ValueNode) node, nextFixedNode, state, effects);
+            if (processNodeWithScalarReplacedInputs((ValueNode) node, nextFixedNode, state, effects)) {
+                return true;
+            }
         }
-        return significantChange;
+        return false;
     }
 
     private boolean processNodeWithScalarReplacedInputs(ValueNode node, FixedNode insertBefore, BlockT state, GraphEffectList effects) {
@@ -268,10 +265,7 @@
     private boolean processVirtualizable(ValueNode node, FixedNode insertBefore, BlockT state, GraphEffectList effects) {
         tool.reset(state, node, insertBefore, effects);
         ((Virtualizable) node).virtualize(tool);
-        if (tool.isDeleted()) {
-            return !(node instanceof CommitAllocationNode || node instanceof AllocatedObjectNode || node instanceof BoxNode);
-        }
-        return false;
+        return tool.isDeleted();
     }
 
     private void processNodeWithState(NodeWithState nodeWithState, BlockT state, GraphEffectList effects) {