changeset 23045:32b610195367

a MonitorExit must operate on the same object as the related RawMonitorEnter
author Doug Simon <doug.simon@oracle.com>
date Fri, 20 Nov 2015 23:23:19 +0100
parents 17e704e362b5
children 123324a0f36f
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java
diffstat 1 files changed, 15 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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) {