# HG changeset patch # User Lukas Stadler # Date 1363775417 -3600 # Node ID 7aefc149c471cfacb63a769fba00ff280086abf0 # Parent e53b31b29aa42b715add0f248c4684770af1cb04 allow multiple identities in MemoryCheckpoint interface diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/BeginLockScopeNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -52,8 +52,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/DirectCompareAndSwapNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -70,8 +70,8 @@ } @Override - public Object getLocationIdentity() { - return locationIdentity; + public Object[] getLocationIdentities() { + return new Object[]{locationIdentity}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/EndLockScopeNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -44,8 +44,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -109,8 +109,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -162,8 +162,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } public FrameState stateDuring() { diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StartNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -30,7 +30,7 @@ public class StartNode extends BeginStateSplitNode implements MemoryCheckpoint { @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } } diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MembarNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -43,8 +43,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/MemoryCheckpoint.java Wed Mar 20 11:30:17 2013 +0100 @@ -26,8 +26,8 @@ /** * This interface marks is used for subclasses of {@link FixedNode} that kill a set of memory - * locations represented by a location identity (i.e. change a value at one or more locations that - * belong to this location identity). + * locations represented by location identities (i.e. change a value at one or more locations that + * belong to these location identities). */ public interface MemoryCheckpoint { @@ -35,8 +35,8 @@ * This method is used to determine which set of memory locations is killed by this node. * Returning the special value {@link LocationNode#ANY_LOCATION} will kill all memory locations. * - * @return the identity of the location killed by this node. + * @return the identities of all locations killed by this node. */ - Object getLocationIdentity(); + Object[] getLocationIdentities(); } diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -49,8 +49,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -72,8 +72,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteMemoryCheckpointNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -37,8 +37,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 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 Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -66,7 +66,7 @@ public static native void writeMemory(Object object, Object value, Object location); @Override - public Object getLocationIdentity() { - return location().locationIdentity(); + public Object[] getLocationIdentities() { + return new Object[]{location().locationIdentity()}; } } diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -71,8 +71,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ExceptionObjectNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -42,8 +42,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } @Override diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorEnterNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -41,8 +41,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } public void lower(LoweringTool tool) { diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MonitorExitNode.java Wed Mar 20 11:30:17 2013 +0100 @@ -42,8 +42,8 @@ } @Override - public Object getLocationIdentity() { - return LocationNode.ANY_LOCATION; + public Object[] getLocationIdentities() { + return new Object[]{LocationNode.ANY_LOCATION}; } public void lower(LoweringTool tool) { diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Wed Mar 20 11:30:17 2013 +0100 @@ -84,7 +84,9 @@ @Override protected void processNode(FixedNode node, Set currentState) { if (node instanceof MemoryCheckpoint) { - currentState.add(((MemoryCheckpoint) node).getLocationIdentity()); + for (Object identity : ((MemoryCheckpoint) node).getLocationIdentities()) { + currentState.add(identity); + } } } @@ -132,10 +134,12 @@ } private void processCheckpoint(MemoryCheckpoint checkpoint, MemoryMap state) { - if (checkpoint.getLocationIdentity() == LocationNode.ANY_LOCATION) { - state.lastMemorySnapshot.clear(); + for (Object identity : checkpoint.getLocationIdentities()) { + if (identity == LocationNode.ANY_LOCATION) { + state.lastMemorySnapshot.clear(); + } + state.lastMemorySnapshot.put(identity, (ValueNode) checkpoint); } - state.lastMemorySnapshot.put(checkpoint.getLocationIdentity(), (ValueNode) checkpoint); } private void processRead(ReadNode readNode, MemoryMap state) { @@ -210,7 +214,9 @@ * needs to choose by putting in the location identity on both successors. */ InvokeWithExceptionNode checkpoint = (InvokeWithExceptionNode) node.predecessor(); - result.lastMemorySnapshot.put(checkpoint.getLocationIdentity(), node); + for (Object identity : checkpoint.getLocationIdentities()) { + result.lastMemorySnapshot.put(identity, node); + } } return result; } diff -r e53b31b29aa4 -r 7aefc149c471 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue Mar 19 17:03:13 2013 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Mar 20 11:30:17 2013 +0100 @@ -64,12 +64,13 @@ if (node instanceof FloatingReadNode) { currentState.add((FloatingReadNode) node); } else if (node instanceof MemoryCheckpoint) { - Object identity = ((MemoryCheckpoint) node).getLocationIdentity(); - for (Iterator iter = currentState.iterator(); iter.hasNext();) { - FloatingReadNode read = iter.next(); - FixedNode fixed = (FixedNode) node; - if (identity == LocationNode.ANY_LOCATION || read.location().locationIdentity() == identity) { - addPhantomReference(read, fixed); + for (Object identity : ((MemoryCheckpoint) node).getLocationIdentities()) { + for (Iterator iter = currentState.iterator(); iter.hasNext();) { + FloatingReadNode read = iter.next(); + FixedNode fixed = (FixedNode) node; + if (identity == LocationNode.ANY_LOCATION || read.location().locationIdentity() == identity) { + addPhantomReference(read, fixed); + } } } }