# HG changeset patch # User Lukas Stadler # Date 1429609225 -7200 # Node ID 69d03eeb5eedc3c7df2d8906233841504dd791c4 # Parent 82539241ff38c3fed484f618195f2c9824defef7 do not perform read elimination for deleted nodes diff -r 82539241ff38 -r 69d03eeb5eed graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java --- 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 diff -r 82539241ff38 -r 69d03eeb5eed 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 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) {