# HG changeset patch # User Doug Simon # Date 1352814522 -3600 # Node ID 536dbb4dd21213fe09e16ccc0e7c534ac7398d0e # Parent f1cb5a0ddb51fb25e2113bd31b12f45c29c6aa4a removed null check from UnsafeLoadNode, UnsafeStoreNode, ReadNode and WriteNode as it violates the sun.misc.Unsafe API diff -r f1cb5a0ddb51 -r 536dbb4dd212 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Nov 12 21:13:19 2012 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Tue Nov 13 14:48:42 2012 +0100 @@ -511,9 +511,6 @@ assert load.kind() != Kind.Illegal; IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, load.loadKind(), load.displacement(), load.offset(), graph, false); ReadNode memoryRead = graph.add(new ReadNode(load.object(), location, load.stamp())); - if (load.object().kind().isObject()) { - memoryRead.dependencies().add(tool.createNullCheckGuard(load.object(), StructuredGraph.INVALID_GRAPH_ID)); - } graph.replaceFixedWithFixed(load, memoryRead); } else if (n instanceof UnsafeStoreNode) { UnsafeStoreNode store = (UnsafeStoreNode) n; diff -r f1cb5a0ddb51 -r 536dbb4dd212 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/MonitorSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/MonitorSnippets.java Mon Nov 12 21:13:19 2012 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/MonitorSnippets.java Tue Nov 13 14:48:42 2012 +0100 @@ -74,9 +74,13 @@ public static final boolean CHECK_BALANCED_MONITORS = Boolean.getBoolean("graal.monitors.checkBalanced"); @Snippet - public static void monitorenter(@Parameter("object") Object object, @ConstantParameter("trace") boolean trace) { + public static void monitorenter(@Parameter("object") Object object, @ConstantParameter("checkNull") boolean checkNull, @ConstantParameter("trace") boolean trace) { verifyOop(object); + if (checkNull && object == null) { + DeoptimizeNode.deopt(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException); + } + // Load the mark word - this includes a null-check on object final Word mark = loadWordFromObject(object, markOffset()); @@ -397,7 +401,7 @@ public Templates(CodeCacheProvider runtime, boolean useFastLocking) { super(runtime, MonitorSnippets.class); - monitorenter = snippet("monitorenter", Object.class, boolean.class); + monitorenter = snippet("monitorenter", Object.class, boolean.class, boolean.class); monitorexit = snippet("monitorexit", Object.class, boolean.class); monitorenterStub = snippet("monitorenterStub", Object.class, boolean.class, boolean.class); monitorexitStub = snippet("monitorexitStub", Object.class, boolean.class); @@ -418,7 +422,7 @@ ResolvedJavaMethod method = eliminated ? monitorenterEliminated : useFastLocking ? monitorenter : monitorenterStub; boolean checkNull = !monitorenterNode.object().stamp().nonNull(); Key key = new Key(method); - if (method == monitorenterStub) { + if (method != monitorenterEliminated) { key.add("checkNull", checkNull); } if (!eliminated) { diff -r f1cb5a0ddb51 -r 536dbb4dd212 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Mon Nov 12 21:13:19 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Tue Nov 13 14:48:42 2012 +0100 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -32,7 +31,7 @@ /** * Reads an {@linkplain AccessNode accessed} value. */ -public final class ReadNode extends AccessNode implements Node.IterableNodeType, LIRLowerable, Simplifiable/*, Canonicalizable*/ { +public final class ReadNode extends AccessNode implements Node.IterableNodeType, LIRLowerable /*, Canonicalizable*/ { public ReadNode(ValueNode object, ValueNode location, Stamp stamp) { super(object, location, stamp); @@ -66,18 +65,6 @@ return (ValueNode) read; } - @Override - public void simplify(SimplifierTool tool) { - if (object().isConstant() && object().asConstant().isNull()) { - FixedNode successor = next(); - tool.deleteBranch(successor); - if (isAlive()) { - replaceAtPredecessor(graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException))); - safeDelete(); - } - } - } - private ReadNode(ValueNode object, ValueNode location) { this(object, location, StampFactory.forNodeIntrinsic()); } diff -r f1cb5a0ddb51 -r 536dbb4dd212 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Mon Nov 12 21:13:19 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Tue Nov 13 14:48:42 2012 +0100 @@ -29,6 +29,7 @@ /** * Load of a value from a location specified as an offset relative to an object. + * No null check is performed before the load. */ public class UnsafeLoadNode extends FixedWithNextNode implements Lowerable { diff -r f1cb5a0ddb51 -r 536dbb4dd212 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Mon Nov 12 21:13:19 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeStoreNode.java Tue Nov 13 14:48:42 2012 +0100 @@ -29,6 +29,7 @@ /** * Store of a value at a location specified as an offset relative to an object. + * No null check is performed before the store. */ public class UnsafeStoreNode extends FixedWithNextNode implements StateSplit, Lowerable { diff -r f1cb5a0ddb51 -r 536dbb4dd212 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Mon Nov 12 21:13:19 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/WriteNode.java Tue Nov 13 14:48:42 2012 +0100 @@ -22,8 +22,6 @@ */ package com.oracle.graal.nodes.extended; -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @@ -32,7 +30,7 @@ /** * Writes a given {@linkplain #value() value} a {@linkplain AccessNode memory location}. */ -public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable, Simplifiable { +public final class WriteNode extends AccessNode implements StateSplit, LIRLowerable { @Input private ValueNode value; @Input(notDataflow = true) private FrameState stateAfter; @@ -64,18 +62,6 @@ gen.emitStore(gen.makeAddress(location(), object()), gen.operand(value()), getNullCheck()); } - @Override - public void simplify(SimplifierTool tool) { - if (object().isConstant() && object().asConstant().isNull()) { - FixedNode successor = next(); - tool.deleteBranch(successor); - if (isAlive()) { - replaceAtPredecessor(graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.NullCheckException))); - safeDelete(); - } - } - } - @NodeIntrinsic public static native void writeMemory(Object object, Object value, Object location); }