Mercurial > hg > graal-compiler
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) {