# HG changeset patch # User Lukas Stadler # Date 1370425513 -7200 # Node ID 2c55e8c4a591ca17b7b6bc95684e6cc7c51d2ee6 # Parent fb010fd0b384d0dea7e8121904247095b6d79633 make ReadNode and WriteNode virtualizable diff -r fb010fd0b384 -r 2c55e8c4a591 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Wed Jun 05 11:44:53 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Wed Jun 05 11:45:13 2013 +0200 @@ -27,11 +27,12 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.virtual.*; /** * Reads an {@linkplain AccessNode accessed} value. */ -public final class ReadNode extends FloatableAccessNode implements Node.IterableNodeType, LIRLowerable, Canonicalizable, PiPushable { +public final class ReadNode extends FloatableAccessNode implements Node.IterableNodeType, LIRLowerable, Canonicalizable, PiPushable, Virtualizable { public ReadNode(ValueNode object, ValueNode location, Stamp stamp, WriteBarrierType barrierType, boolean compress) { super(object, location, stamp, barrierType, compress); @@ -128,6 +129,21 @@ return false; } + @Override + public void virtualize(VirtualizerTool tool) { + if (location() instanceof ConstantLocationNode) { + ConstantLocationNode constantLocation = (ConstantLocationNode) location(); + State state = tool.getObjectState(object()); + if (state != null && state.getState() == EscapeState.Virtual) { + VirtualObjectNode virtual = state.getVirtualObject(); + int entryIndex = virtual.entryIndexForOffset(constantLocation.getDisplacement()); + if (entryIndex != -1 && virtual.entryKind(entryIndex) == constantLocation.getValueKind()) { + tool.replaceWith(state.getEntry(entryIndex)); + } + } + } + } + /** * Reads a value from memory. * diff -r fb010fd0b384 -r 2c55e8c4a591 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Wed Jun 05 11:44:53 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Wed Jun 05 11:45:13 2013 +0200 @@ -28,11 +28,12 @@ import com.oracle.graal.nodes.extended.LocationNode.Location; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.virtual.*; /** * Writes a given {@linkplain #value() value} a {@linkplain AccessNode memory location}. */ -public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint, Node.IterableNodeType { +public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable, MemoryCheckpoint, Node.IterableNodeType, Virtualizable { @Input private ValueNode value; @Input(notDataflow = true) private FrameState stateAfter; @@ -75,4 +76,20 @@ public LocationIdentity[] getLocationIdentities() { return new LocationIdentity[]{location().getLocationIdentity()}; } + + @Override + public void virtualize(VirtualizerTool tool) { + if (location() instanceof ConstantLocationNode) { + ConstantLocationNode constantLocation = (ConstantLocationNode) location(); + State state = tool.getObjectState(object()); + if (state != null && state.getState() == EscapeState.Virtual) { + VirtualObjectNode virtual = state.getVirtualObject(); + int entryIndex = virtual.entryIndexForOffset(constantLocation.getDisplacement()); + if (entryIndex != -1 && virtual.entryKind(entryIndex) == constantLocation.getValueKind()) { + tool.setVirtualEntry(state, entryIndex, value()); + tool.delete(); + } + } + } + } }