# HG changeset patch # User Doug Simon # Date 1375893605 -7200 # Node ID 56f1aa40e13b9386bc427b617ff6899092360b7c # Parent 4f1aa732e60f00cb1071c271e1b1f079899e8b4e made LoadHubNode be floating diff -r 4f1aa732e60f -r 56f1aa40e13b 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 Wed Aug 07 16:45:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed Aug 07 18:40:05 2013 +0200 @@ -526,11 +526,7 @@ if (hsMethod.isInVirtualMethodTable()) { int vtableEntryOffset = hsMethod.vtableEntryOffset(); assert vtableEntryOffset > 0; - ReadNode hub = createReadHub(graph, wordKind, receiver); - - if (receiverNullCheck != null) { - hub.setGuard(receiverNullCheck); - } + FloatingReadNode hub = createReadHub(graph, wordKind, receiver, receiverNullCheck); ReadNode metaspaceMethod = createReadVirtualMethod(graph, wordKind, hub, hsMethod); // We use LocationNode.ANY_LOCATION for the reads that access the @@ -542,8 +538,7 @@ loweredCallTarget = graph.add(new HotSpotIndirectCallTargetNode(metaspaceMethod, compiledEntry, parameters, invoke.asNode().stamp(), signature, callTarget.targetMethod(), CallingConvention.Type.JavaCall)); - graph.addBeforeFixed(invoke.asNode(), hub); - graph.addAfterFixed(hub, metaspaceMethod); + graph.addBeforeFixed(invoke.asNode(), metaspaceMethod); graph.addAfterFixed(metaspaceMethod, compiledEntry); } } @@ -624,7 +619,7 @@ value = checkcast; } } else { - LoadHubNode arrayClass = graph.add(new LoadHubNode(array, wordKind)); + LoadHubNode arrayClass = graph.add(new LoadHubNode(array, wordKind, boundsCheck.asNode())); LocationNode location = ConstantLocationNode.create(FINAL_LOCATION, wordKind, config.arrayClassElementOffset, graph); /* * Anchor the read of the element klass to the cfg, because it is only valid @@ -634,7 +629,6 @@ FloatingReadNode arrayElementKlass = graph.unique(new FloatingReadNode(arrayClass, location, BeginNode.prevBegin(storeIndexed), StampFactory.forKind(wordKind()))); CheckCastDynamicNode checkcast = graph.add(new CheckCastDynamicNode(arrayElementKlass, value, true)); graph.addBeforeFixed(storeIndexed, checkcast); - graph.addBeforeFixed(checkcast, arrayClass); value = checkcast; } } @@ -672,11 +666,14 @@ LoadHubNode loadHub = (LoadHubNode) n; assert loadHub.kind() == wordKind; ValueNode object = loadHub.object(); - ReadNode hub = createReadHub(graph, wordKind, object); + GuardingNode guard = loadHub.getGuard(); // A hub read must not float outside its block otherwise // it may float above an explicit null check on its object. - hub.setGuard(AbstractBeginNode.prevBegin(loadHub)); - graph.replaceFixed(loadHub, hub); + if (guard == null) { + guard = AbstractBeginNode.prevBegin(tool.lastFixedNode()); + } + FloatingReadNode hub = createReadHub(graph, wordKind, object, guard); + graph.replaceFloating(loadHub, hub); } else if (n instanceof LoadMethodNode) { LoadMethodNode loadMethodNode = (LoadMethodNode) n; ResolvedJavaMethod method = loadMethodNode.getMethod(); @@ -874,10 +871,10 @@ return metaspaceMethod; } - private ReadNode createReadHub(StructuredGraph graph, Kind wordKind, ValueNode object) { + private FloatingReadNode createReadHub(StructuredGraph graph, Kind wordKind, ValueNode object, GuardingNode guard) { LocationNode location = ConstantLocationNode.create(FINAL_LOCATION, wordKind, config.hubOffset, graph); assert !object.isConstant() || object.asConstant().isNull(); - return graph.add(new ReadNode(object, location, StampFactory.forKind(wordKind()), BarrierType.NONE, config.useCompressedKlassPointers)); + return graph.add(new FloatingReadNode(object, location, null, StampFactory.forKind(wordKind()), guard, BarrierType.NONE, config.useCompressedKlassPointers)); } private WriteNode createWriteHub(StructuredGraph graph, Kind wordKind, ValueNode object, ValueNode value) { diff -r 4f1aa732e60f -r 56f1aa40e13b 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 Wed Aug 07 16:45:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java Wed Aug 07 18:40:05 2013 +0200 @@ -53,7 +53,8 @@ if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { isNull.inc(); } else { - Word objectHub = loadHub(object); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + Word objectHub = loadHubIntrinsic(object, getWordKind(), anchorNode); if (!checkUnknownSubType(hub, objectHub)) { DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); } diff -r 4f1aa732e60f -r 56f1aa40e13b 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 Wed Aug 07 16:45:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Wed Aug 07 18:40:05 2013 +0200 @@ -452,7 +452,7 @@ * Loads the hub of an object (without null checking it first). */ public static Word loadHub(Object object) { - return loadHubIntrinsic(object, getWordKind()); + return loadHubIntrinsic(object, getWordKind(), null); } public static Object verifyOop(Object object) { @@ -495,7 +495,7 @@ @SuppressWarnings("unused") @NodeIntrinsic(value = LoadHubNode.class, setStampFromReturnType = true) - static Word loadHubIntrinsic(Object object, @ConstantNodeParameter Kind word) { + static Word loadHubIntrinsic(Object object, @ConstantNodeParameter Kind word, GuardingNode anchor) { if (wordKind() == Kind.Int) { return Word.box((int) unsafeReadKlassPointer(object)); } diff -r 4f1aa732e60f -r 56f1aa40e13b 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 Wed Aug 07 16:45:23 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Wed Aug 07 18:40:05 2013 +0200 @@ -89,7 +89,8 @@ } return falseValue; } - Word objectHub = loadHub(object); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + Word objectHub = loadHubIntrinsic(object, getWordKind(), anchorNode); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -117,7 +118,8 @@ isNull.inc(); return falseValue; } - Word objectHub = loadHub(object); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + Word objectHub = loadHubIntrinsic(object, getWordKind(), anchorNode); if (probability(LIKELY_PROBABILITY, objectHub.notEqual(exactHub))) { exactMiss.inc(); return falseValue; @@ -135,7 +137,8 @@ isNull.inc(); return falseValue; } - Word objectHub = loadHub(object); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + Word objectHub = loadHubIntrinsic(object, getWordKind(), anchorNode); if (probability(NOT_LIKELY_PROBABILITY, objectHub.readWord(superCheckOffset, LocationIdentity.FINAL_LOCATION).notEqual(hub))) { displayMiss.inc(); return falseValue; @@ -154,7 +157,8 @@ isNull.inc(); return falseValue; } - Word objectHub = loadHub(object); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + Word objectHub = loadHubIntrinsic(object, getWordKind(), anchorNode); // if we get an exact match: succeed immediately ExplodeLoopNode.explodeLoop(); for (int i = 0; i < hints.length; i++) { @@ -182,7 +186,8 @@ } Word hub = loadWordFromObject(mirror, klassOffset()); - Word objectHub = loadHub(object); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + Word objectHub = loadHubIntrinsic(object, getWordKind(), anchorNode); if (!checkUnknownSubType(hub, objectHub)) { return falseValue; } diff -r 4f1aa732e60f -r 56f1aa40e13b 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 Wed Aug 07 16:45:23 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Wed Aug 07 18:40:05 2013 +0200 @@ -32,7 +32,7 @@ * Loads an object's {@linkplain Representation#ObjectHub hub}. The object is not null-checked by * this operation. */ -public final class LoadHubNode extends FixedWithNextNode implements Lowerable, Canonicalizable, Virtualizable { +public final class LoadHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, Virtualizable { @Input private ValueNode object; @@ -40,11 +40,23 @@ return object; } - public LoadHubNode(ValueNode object, Kind kind) { - super(kind == Kind.Object ? StampFactory.objectNonNull() : StampFactory.forKind(kind)); + public LoadHubNode(ValueNode object, Kind kind, ValueNode guard) { + super(getKind(kind), asGuard(guard)); + assert object != guard; this.object = object; } + private static Stamp getKind(Kind kind) { + return kind == Kind.Object ? StampFactory.objectNonNull() : StampFactory.forKind(kind); + } + + private static GuardingNode asGuard(ValueNode guard) { + if (guard instanceof GuardingNode) { + return (GuardingNode) guard; + } + return null; + } + @Override public void lower(LoweringTool tool, LoweringType loweringType) { tool.getRuntime().lower(this, tool); diff -r 4f1aa732e60f -r 56f1aa40e13b graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Wed Aug 07 16:45:23 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Wed Aug 07 18:40:05 2013 +0200 @@ -478,7 +478,7 @@ private void createGuard(StructuredGraph graph, MetaAccessProvider runtime) { ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke); ConstantNode typeHub = ConstantNode.forConstant(type.getEncoding(Representation.ObjectHub), runtime, graph); - LoadHubNode receiverHub = graph.add(new LoadHubNode(nonNullReceiver, typeHub.kind())); + LoadHubNode receiverHub = graph.add(new LoadHubNode(nonNullReceiver, typeHub.kind(), null)); CompareNode typeCheck = CompareNode.createCompareNode(Condition.EQ, receiverHub, typeHub); FixedGuardNode guard = graph.add(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile)); @@ -487,7 +487,6 @@ ValueNode anchoredReceiver = createAnchoredReceiver(graph, guard, type, nonNullReceiver, true); invoke.callTarget().replaceFirstInput(nonNullReceiver, anchoredReceiver); - graph.addBeforeFixed(invoke.asNode(), receiverHub); graph.addBeforeFixed(invoke.asNode(), guard); } @@ -764,8 +763,7 @@ assert ptypes.size() >= 1; ValueNode nonNullReceiver = nonNullReceiver(invoke); Kind hubKind = ((MethodCallTargetNode) invoke.callTarget()).targetMethod().getDeclaringClass().getEncoding(Representation.ObjectHub).getKind(); - LoadHubNode hub = graph.add(new LoadHubNode(nonNullReceiver, hubKind)); - graph.addBeforeFixed(invoke.asNode(), hub); + LoadHubNode hub = graph.add(new LoadHubNode(nonNullReceiver, hubKind, null)); if (!invokeIsOnlySuccessor && chooseMethodDispatch()) { assert successors.length == concretes.size() + 1;