--- old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java 2017-08-03 22:42:44.578152159 -0700 +++ new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java 2017-08-03 22:42:44.480147766 -0700 @@ -371,6 +371,7 @@ import org.graalvm.compiler.nodes.extended.LoadHubNode; import org.graalvm.compiler.nodes.extended.LoadMethodNode; import org.graalvm.compiler.nodes.extended.MembarNode; +import org.graalvm.compiler.nodes.extended.StateSplitProxyNode; import org.graalvm.compiler.nodes.extended.ValueAnchorNode; import org.graalvm.compiler.nodes.graphbuilderconf.ClassInitializationPlugin; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration; @@ -1236,6 +1237,10 @@ } } + protected StateSplitProxyNode genVolatileFieldReadProxy(ValueNode fieldRead) { + return new StateSplitProxyNode(fieldRead); + } + protected ValueNode emitExplicitNullCheck(ValueNode receiver) { if (StampTool.isPointerNonNull(receiver.stamp())) { return receiver; @@ -1429,7 +1434,7 @@ createNonInlinedInvoke(withExceptionEdge, bci(), callTarget, resultType); } - private Invoke appendInvoke(InvokeKind initialInvokeKind, ResolvedJavaMethod initialTargetMethod, ValueNode[] args) { + protected Invoke appendInvoke(InvokeKind initialInvokeKind, ResolvedJavaMethod initialTargetMethod, ValueNode[] args) { ResolvedJavaMethod targetMethod = initialTargetMethod; InvokeKind invokeKind = initialInvokeKind; if (initialInvokeKind.isIndirect()) { @@ -1676,7 +1681,7 @@ final Mark mark; InvocationPluginAssertions(InvocationPlugin plugin, ValueNode[] args, ResolvedJavaMethod targetMethod, JavaKind resultType) { - guarantee(Assertions.ENABLED, "%s should only be loaded and instantiated if assertions are enabled", getClass().getSimpleName()); + guarantee(Assertions.assertionsEnabled(), "%s should only be loaded and instantiated if assertions are enabled", getClass().getSimpleName()); this.plugin = plugin; this.targetMethod = targetMethod; this.args = args; @@ -1908,7 +1913,7 @@ } } - InvocationPluginAssertions assertions = Assertions.ENABLED ? new InvocationPluginAssertions(plugin, args, targetMethod, resultType) : null; + InvocationPluginAssertions assertions = Assertions.assertionsEnabled() ? new InvocationPluginAssertions(plugin, args, targetMethod, resultType) : null; if (plugin.execute(this, targetMethod, pluginReceiver, args)) { afterInvocationPluginExecution(true, assertions, intrinsicGuard, invokeKind, args, targetMethod, resultType, returnType); return true; @@ -3788,11 +3793,22 @@ } } - frameState.push(resolvedField.getJavaKind(), append(genLoadField(receiver, resolvedField))); + ValueNode fieldRead = append(genLoadField(receiver, resolvedField)); + if (resolvedField.getDeclaringClass().getName().equals("Ljava/lang/ref/Reference;") && resolvedField.getName().equals("referent")) { LocationIdentity referentIdentity = new FieldLocationIdentity(resolvedField); append(new MembarNode(0, referentIdentity)); } + + JavaKind fieldKind = resolvedField.getJavaKind(); + + if (resolvedField.isVolatile() && fieldRead instanceof LoadFieldNode) { + StateSplitProxyNode readProxy = append(genVolatileFieldReadProxy(fieldRead)); + frameState.push(fieldKind, readProxy); + readProxy.setStateAfter(frameState.create(stream.nextBCI(), readProxy)); + } else { + frameState.push(fieldKind, fieldRead); + } } /**