--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java Sat Aug 05 03:05:06 2017 +0200
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java Fri Aug 04 19:59:33 2017 -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);
+ }
}
/**