# HG changeset patch # User Thomas Wuerthinger # Date 1448366965 -3600 # Node ID de7e18a6e988b441cd9e613eab3a1f76273b2260 # Parent 0489858544169de67e7cbee246357ae53eb63f20# Parent deb6336662b6db815607f58f07ccf3e3c10b5696 Merge. diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Tue Nov 24 13:09:25 2015 +0100 @@ -101,6 +101,7 @@ import com.oracle.graal.nodes.Invoke; import com.oracle.graal.nodes.LoweredCallTargetNode; import com.oracle.graal.nodes.ParameterNode; +import com.oracle.graal.nodes.PiNode; import com.oracle.graal.nodes.SafepointNode; import com.oracle.graal.nodes.StartNode; import com.oracle.graal.nodes.StructuredGraph; @@ -362,10 +363,11 @@ MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget(); NodeInputList parameters = callTarget.arguments(); ValueNode receiver = parameters.size() <= 0 ? null : parameters.get(0); - GuardingNode receiverNullCheck = null; if (!callTarget.isStatic() && receiver.stamp() instanceof ObjectStamp && !StampTool.isPointerNonNull(receiver)) { - receiverNullCheck = createNullCheck(receiver, invoke.asNode(), tool); - invoke.setGuard(receiverNullCheck); + GuardingNode receiverNullCheck = createNullCheck(receiver, invoke.asNode(), tool); + PiNode nonNullReceiver = graph.unique(new PiNode(receiver, ((ObjectStamp) receiver.stamp()).join(StampFactory.objectNonNull()), (ValueNode) receiverNullCheck)); + parameters.set(0, nonNullReceiver); + receiver = nonNullReceiver; } JavaType[] signature = callTarget.targetMethod().getSignature().toParameterTypes(callTarget.isStatic() ? null : callTarget.targetMethod().getDeclaringClass()); @@ -375,7 +377,7 @@ ResolvedJavaType receiverType = invoke.getReceiverType(); if (hsMethod.isInVirtualMethodTable(receiverType)) { JavaKind wordKind = runtime.getTarget().wordJavaKind; - ValueNode hub = createReadHub(graph, receiver, receiverNullCheck, tool); + ValueNode hub = createReadHub(graph, receiver, tool); ReadNode metaspaceMethod = createReadVirtualMethod(graph, hub, hsMethod, receiverType); // We use LocationNode.ANY_LOCATION for the reads that access the @@ -584,9 +586,9 @@ } @Override - protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, GuardingNode guard, LoweringTool tool) { + protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, LoweringTool tool) { if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) { - return graph.unique(new LoadHubNode(tool.getStampProvider(), object, guard != null ? guard.asNode() : null)); + return graph.unique(new LoadHubNode(tool.getStampProvider(), object)); } assert !object.isConstant() || object.isNullConstant(); @@ -596,7 +598,7 @@ } AddressNode address = createOffsetAddress(graph, object, config().hubOffset); - FloatingReadNode memoryRead = graph.unique(new FloatingReadNode(address, HUB_LOCATION, null, hubStamp, guard, BarrierType.NONE)); + FloatingReadNode memoryRead = graph.unique(new FloatingReadNode(address, HUB_LOCATION, null, hubStamp, null, BarrierType.NONE)); if (config().useCompressedClassPointers) { return CompressionNode.uncompress(memoryRead, config().getKlassEncoding()); } else { diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java Tue Nov 24 13:09:25 2015 +0100 @@ -41,6 +41,7 @@ import com.oracle.graal.hotspot.nodes.SnippetAnchorNode; import com.oracle.graal.hotspot.word.KlassPointer; import com.oracle.graal.nodes.DeoptimizeNode; +import com.oracle.graal.nodes.PiNode; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.ValueNode; import com.oracle.graal.nodes.extended.GuardingNode; @@ -64,7 +65,7 @@ isNull.inc(); } else { GuardingNode anchorNode = SnippetAnchorNode.anchor(); - KlassPointer objectHub = loadHubIntrinsic(object, anchorNode); + KlassPointer objectHub = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); if (!checkUnknownSubType(hub, objectHub)) { DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); } diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java Tue Nov 24 13:09:25 2015 +0100 @@ -91,7 +91,7 @@ } if (clazz instanceof GetClassNode) { GetClassNode getClass = (GetClassNode) clazz; - return new LoadHubNode(KlassPointerStamp.klassNonNull(), getClass.getObject(), null); + return new LoadHubNode(KlassPointerStamp.klassNonNull(), getClass.getObject()); } if (clazz instanceof HubGetClassNode) { // replace _klass._java_mirror._klass -> _klass diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Tue Nov 24 13:09:25 2015 +0100 @@ -750,9 +750,6 @@ private static native KlassPointer loadKlassFromObjectIntrinsic(Object object, long offset, @ConstantNodeParameter JavaKind wordKind, @ConstantNodeParameter LocationIdentity locationIdentity); @NodeIntrinsic(value = LoadHubNode.class) - public static native KlassPointer loadHubIntrinsic(Object object, GuardingNode anchor); - - @NodeIntrinsic(value = LoadHubNode.class) public static native KlassPointer loadHubIntrinsic(Object object); @Fold diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Tue Nov 24 13:09:25 2015 +0100 @@ -60,6 +60,7 @@ import com.oracle.graal.hotspot.word.KlassPointer; import com.oracle.graal.nodes.ConstantNode; import com.oracle.graal.nodes.DeoptimizeNode; +import com.oracle.graal.nodes.PiNode; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.TypeCheckHints; import com.oracle.graal.nodes.ValueNode; @@ -106,7 +107,7 @@ return falseValue; } GuardingNode anchorNode = SnippetAnchorNode.anchor(); - KlassPointer objectHub = loadHubIntrinsic(object, anchorNode); + KlassPointer objectHub = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -136,7 +137,7 @@ return falseValue; } GuardingNode anchorNode = SnippetAnchorNode.anchor(); - KlassPointer objectHub = loadHubIntrinsic(object, anchorNode); + KlassPointer objectHub = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); if (probability(LIKELY_PROBABILITY, objectHub.notEqual(exactHub))) { exactMiss.inc(); return falseValue; @@ -155,7 +156,7 @@ return falseValue; } GuardingNode anchorNode = SnippetAnchorNode.anchor(); - KlassPointer objectHub = loadHubIntrinsic(object, anchorNode); + KlassPointer objectHub = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); if (probability(NOT_LIKELY_PROBABILITY, objectHub.readKlassPointer(superCheckOffset, PRIMARY_SUPERS_LOCATION).notEqual(hub))) { displayMiss.inc(); return falseValue; @@ -174,7 +175,7 @@ return falseValue; } GuardingNode anchorNode = SnippetAnchorNode.anchor(); - KlassPointer objectHub = loadHubIntrinsic(object, anchorNode); + KlassPointer objectHub = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -203,7 +204,7 @@ } GuardingNode anchorNode = SnippetAnchorNode.anchor(); KlassPointer hub = ClassGetHubNode.readClass(mirror, anchorNode); - KlassPointer objectHub = loadHubIntrinsic(object, anchorNode); + KlassPointer objectHub = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); if (hub.isNull() || !checkUnknownSubType(hub, objectHub)) { return falseValue; } diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java Tue Nov 24 13:09:25 2015 +0100 @@ -62,6 +62,7 @@ import com.oracle.graal.nodes.Invoke; import com.oracle.graal.nodes.InvokeNode; import com.oracle.graal.nodes.NamedLocationIdentity; +import com.oracle.graal.nodes.PiNode; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.ValueNode; import com.oracle.graal.nodes.extended.UnsafeLoadNode; @@ -173,8 +174,8 @@ public static void arraycopyPredictedObjectWork(Object nonNullSrc, int srcPos, Object nonNullDest, int destPos, int length, KlassPointer objectArrayKlass, @ConstantParameter SnippetCounter counter, @ConstantParameter SnippetCounter copiedCounter) { if (length > 0) { - KlassPointer srcHub = loadHub(nonNullSrc); - KlassPointer destHub = loadHub(nonNullDest); + KlassPointer srcHub = loadHub(PiNode.asNonNullObject(nonNullSrc)); + KlassPointer destHub = loadHub(PiNode.asNonNullObject(nonNullDest)); if (probability(FAST_PATH_PROBABILITY, srcHub == destHub || destHub == objectArrayKlass)) { counter.inc(); copiedCounter.add(length); diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/StubUtil.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/StubUtil.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/StubUtil.java Tue Nov 24 13:09:25 2015 +0100 @@ -47,6 +47,7 @@ import com.oracle.graal.hotspot.nodes.StubForeignCallNode; import com.oracle.graal.hotspot.nodes.VMErrorNode; import com.oracle.graal.hotspot.word.KlassPointer; +import com.oracle.graal.nodes.PiNode; import com.oracle.graal.nodes.extended.GuardingNode; import com.oracle.graal.replacements.Log; import com.oracle.graal.word.Pointer; @@ -241,7 +242,7 @@ fatal("oop not in heap: %p", oop.rawValue()); } - KlassPointer klass = loadHubIntrinsic(object, anchorNode); + KlassPointer klass = loadHubIntrinsic(PiNode.piCastNonNull(object, anchorNode)); if (klass.isNull()) { fatal("klass for oop %p is null", oop.rawValue()); } diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Tue Nov 24 13:09:25 2015 +0100 @@ -82,6 +82,10 @@ this.piStamp = stamp; } + public PiNode(ValueNode object, ValueNode anchor) { + this(object, object.stamp().join(StampFactory.objectNonNull()), anchor); + } + public PiNode(ValueNode object, ResolvedJavaType toType, boolean exactType, boolean nonNull) { this(object, StampFactory.object(toType, exactType, nonNull || StampTool.isPointerNonNull(object.stamp()), true)); } @@ -175,6 +179,13 @@ return asNonNullClassIntrinsic(object, Class.class, true, true); } + /** + * Casts an object to have an exact, non-null stamp representing {@link Class}. + */ + public static Class asNonNullObject(Object object) { + return asNonNullClassIntrinsic(object, Object.class, false, true); + } + @NodeIntrinsic(PiNode.class) private static native Class asNonNullClassIntrinsic(Object object, @ConstantNodeParameter Class toType, @ConstantNodeParameter boolean exactType, @ConstantNodeParameter boolean nonNull); @@ -185,13 +196,20 @@ public static native Object piCast(Object object, @ConstantNodeParameter Stamp stamp); /** - * Changes the stamp of an object and ensures the newly stamped value does float above a given - * anchor. + * Changes the stamp of an object and ensures the newly stamped value does not float above a + * given anchor. */ @NodeIntrinsic public static native Object piCast(Object object, @ConstantNodeParameter Stamp stamp, GuardingNode anchor); /** + * Changes the stamp of an object and ensures the newly stamped value is non-null and does not + * float above a given anchor. + */ + @NodeIntrinsic + public static native Object piCastNonNull(Object object, GuardingNode anchor); + + /** * Changes the stamp of an object to represent a given type and to indicate that the object is * not null. */ diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Tue Nov 24 13:09:25 2015 +0100 @@ -34,9 +34,9 @@ import com.oracle.graal.graph.spi.CanonicalizerTool; import com.oracle.graal.nodeinfo.NodeInfo; import com.oracle.graal.nodes.ConstantNode; -import com.oracle.graal.nodes.FloatingGuardedNode; import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.ValueNode; +import com.oracle.graal.nodes.calc.FloatingNode; import com.oracle.graal.nodes.spi.Lowerable; import com.oracle.graal.nodes.spi.LoweringTool; import com.oracle.graal.nodes.spi.StampProvider; @@ -47,7 +47,7 @@ * Loads an object's hub. The object is not null-checked by this operation. */ @NodeInfo -public final class LoadHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, Virtualizable { +public final class LoadHubNode extends FloatingNode implements Lowerable, Canonicalizable, Virtualizable { public static final NodeClass TYPE = NodeClass.create(LoadHubNode.class); @Input ValueNode value; @@ -67,20 +67,15 @@ if (synonym != null) { return synonym; } - return new LoadHubNode(stamp, value, null); + return new LoadHubNode(stamp, value); } public LoadHubNode(@InjectedNodeParameter StampProvider stampProvider, ValueNode value) { - this(stampProvider, value, null); + this(hubStamp(stampProvider, value), value); } - public LoadHubNode(@InjectedNodeParameter StampProvider stampProvider, ValueNode value, ValueNode guard) { - this(hubStamp(stampProvider, value), value, guard); - } - - public LoadHubNode(Stamp stamp, ValueNode value, ValueNode guard) { - super(TYPE, stamp, (GuardingNode) guard); - assert value != guard; + public LoadHubNode(Stamp stamp, ValueNode value) { + super(TYPE, stamp); this.value = value; } diff -r deb6336662b6 -r de7e18a6e988 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Tue Nov 24 09:15:09 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Tue Nov 24 13:09:25 2015 +0100 @@ -192,7 +192,7 @@ } private void lowerTypeCheckNode(TypeCheckNode n, LoweringTool tool, StructuredGraph graph) { - ValueNode hub = createReadHub(graph, n.getValue(), null, tool); + ValueNode hub = createReadHub(graph, n.getValue(), tool); ValueNode clazz = graph.unique(ConstantNode.forConstant(tool.getStampProvider().createHubStamp((ObjectStamp) n.getValue().stamp()), n.type().getObjectHub(), tool.getMetaAccess())); LogicNode objectEquals = graph.unique(PointerEqualsNode.create(hub, clazz)); n.replaceAndDelete(objectEquals); @@ -344,7 +344,7 @@ */ GuardingNode nullCheck = nullCheckReturn[0]; assert nullCheckReturn[0] != null || createNullCheck(array, storeIndexed, tool) == null; - ValueNode arrayClass = createReadHub(graph, array, nullCheck, tool); + ValueNode arrayClass = createReadHub(graph, graph.unique(new PiNode(array, (ValueNode) nullCheck)), tool); ValueNode componentHub = createReadArrayComponentHub(graph, arrayClass, storeIndexed); checkCastNode = graph.add(new CheckCastDynamicNode(componentHub, value, true)); graph.addBeforeFixed(storeIndexed, checkCastNode); @@ -383,7 +383,7 @@ if (graph.getGuardsStage().allowsFloatingGuards()) { return; } - ValueNode hub = createReadHub(graph, loadHub.getValue(), loadHub.getGuard(), tool); + ValueNode hub = createReadHub(graph, loadHub.getValue(), tool); graph.replaceFloating(loadHub, hub); } @@ -748,7 +748,7 @@ return value; } - protected abstract ValueNode createReadHub(StructuredGraph graph, ValueNode object, GuardingNode guard, LoweringTool tool); + protected abstract ValueNode createReadHub(StructuredGraph graph, ValueNode object, LoweringTool tool); protected abstract ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor);