# HG changeset patch # User Doug Simon # Date 1448058199 -3600 # Node ID 32b610195367f275272e8321766a7134c74ea1c0 # Parent 17e704e362b549c84f1863339e447ba001515195 a MonitorExit must operate on the same object as the related RawMonitorEnter diff -r 17e704e362b5 -r 32b610195367 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Fri Nov 20 11:51:06 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Fri Nov 20 23:23:19 2015 +0100 @@ -96,6 +96,7 @@ import com.oracle.graal.nodes.java.LoweredAtomicReadAndWriteNode; import com.oracle.graal.nodes.java.LoweredCompareAndSwapNode; import com.oracle.graal.nodes.java.MonitorEnterNode; +import com.oracle.graal.nodes.java.MonitorExitNode; import com.oracle.graal.nodes.java.MonitorIdNode; import com.oracle.graal.nodes.java.NewArrayNode; import com.oracle.graal.nodes.java.NewInstanceNode; @@ -390,14 +391,25 @@ protected void lowerMonitorEnterNode(MonitorEnterNode monitorEnter, LoweringTool tool, StructuredGraph graph) { ValueNode object = monitorEnter.object(); GuardingNode nullCheck = createNullCheck(object, monitorEnter, tool); + ValueNode nonNullObject; if (nullCheck != null) { - object = graph.unique(new PiNode(object, ((ObjectStamp) object.stamp()).improveWith(StampFactory.objectNonNull()), (ValueNode) nullCheck)); + nonNullObject = graph.unique(new PiNode(object, ((ObjectStamp) object.stamp()).improveWith(StampFactory.objectNonNull()), (ValueNode) nullCheck)); + } else { + nonNullObject = object; } - ValueNode hub = graph.addOrUnique(LoadHubNode.create(object, tool.getStampProvider(), tool.getMetaAccess())); - RawMonitorEnterNode rawMonitorEnter = graph.add(new RawMonitorEnterNode(object, hub, monitorEnter.getMonitorId())); + ValueNode hub = graph.addOrUnique(LoadHubNode.create(nonNullObject, tool.getStampProvider(), tool.getMetaAccess())); + MonitorIdNode monitor = monitorEnter.getMonitorId(); + RawMonitorEnterNode rawMonitorEnter = graph.add(new RawMonitorEnterNode(nonNullObject, hub, monitor)); rawMonitorEnter.setStateBefore(monitorEnter.stateBefore()); rawMonitorEnter.setStateAfter(monitorEnter.stateAfter()); graph.replaceFixedWithFixed(monitorEnter, rawMonitorEnter); + + // Monitor exit must operate on the same input to the monitor enter + if (object != nonNullObject) { + for (MonitorExitNode exit : monitor.usages().filter(MonitorExitNode.class)) { + exit.replaceFirstInput(object, nonNullObject); + } + } } protected void lowerCompareAndSwapNode(CompareAndSwapNode cas) {