# HG changeset patch # User Doug Simon # Date 1348838862 -7200 # Node ID a938e15e3bd7b5cd0ff3af7260244987c8ea942e # Parent fb66841a099497a7ac726cce129c8a22b46bcd53 made ReadHubNode floating diff -r fb66841a0994 -r a938e15e3bd7 graal/com.oracle.graal.compiler.phases/src/com/oracle/graal/compiler/util/InliningUtil.java --- a/graal/com.oracle.graal.compiler.phases/src/com/oracle/graal/compiler/util/InliningUtil.java Fri Sep 28 11:50:37 2012 +0200 +++ b/graal/com.oracle.graal.compiler.phases/src/com/oracle/graal/compiler/util/InliningUtil.java Fri Sep 28 15:27:42 2012 +0200 @@ -191,7 +191,7 @@ // receiver null check must be before the type check InliningUtil.receiverNullCheck(invoke); ValueNode receiver = invoke.methodCallTarget().receiver(); - ReadHubNode receiverHub = graph.add(new ReadHubNode(receiver)); + ReadHubNode receiverHub = graph.unique(new ReadHubNode(receiver)); ConstantNode typeHub = ConstantNode.forConstant(type.getEncoding(Representation.ObjectHub), runtime, graph); ObjectEqualsNode typeCheck = graph.unique(new ObjectEqualsNode(receiverHub, typeHub)); FixedGuardNode guard = graph.add(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile, invoke.leafGraphId())); @@ -201,7 +201,6 @@ ValueNode anchoredReceiver = createAnchoredReceiver(graph, anchor, type, receiver, true); invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); - graph.addBeforeFixed(invoke.node(), receiverHub); graph.addBeforeFixed(invoke.node(), guard); graph.addBeforeFixed(invoke.node(), anchor); @@ -335,9 +334,8 @@ } // replace the invoke with a switch on the type of the actual receiver - ReadHubNode objectClassNode = graph.add(new ReadHubNode(invoke.methodCallTarget().receiver())); - graph.addBeforeFixed(invoke.node(), objectClassNode); - FixedNode dispatchOnType = createDispatchOnType(graph, objectClassNode, calleeEntryNodes, unknownTypeNode); + ReadHubNode receiverHub = graph.unique(new ReadHubNode(invoke.methodCallTarget().receiver())); + FixedNode dispatchOnType = createDispatchOnType(graph, receiverHub, calleeEntryNodes, unknownTypeNode); assert invoke.next() == continuation; invoke.setNext(null); @@ -421,11 +419,10 @@ MergeNode calleeEntryNode = graph.add(new MergeNode()); calleeEntryNode.setProbability(invoke.probability()); - ReadHubNode objectClassNode = graph.add(new ReadHubNode(invoke.methodCallTarget().receiver())); - graph.addBeforeFixed(invoke.node(), objectClassNode); + ReadHubNode receiverHub = graph.unique(new ReadHubNode(invoke.methodCallTarget().receiver())); FixedNode unknownTypeNode = graph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.TypeCheckedInliningViolated, invoke.leafGraphId())); - FixedNode dispatchOnType = createDispatchOnType(graph, objectClassNode, new BeginNode[] {calleeEntryNode}, unknownTypeNode); + FixedNode dispatchOnType = createDispatchOnType(graph, receiverHub, new BeginNode[] {calleeEntryNode}, unknownTypeNode); FixedWithNextNode pred = (FixedWithNextNode) invoke.node().predecessor(); pred.setNext(dispatchOnType); diff -r fb66841a0994 -r a938e15e3bd7 graal/com.oracle.graal.compiler.virtual/src/com/oracle/graal/compiler/phases/ea/PartialEscapeAnalysisPhase.java --- a/graal/com.oracle.graal.compiler.virtual/src/com/oracle/graal/compiler/phases/ea/PartialEscapeAnalysisPhase.java Fri Sep 28 11:50:37 2012 +0200 +++ b/graal/com.oracle.graal.compiler.virtual/src/com/oracle/graal/compiler/phases/ea/PartialEscapeAnalysisPhase.java Fri Sep 28 15:27:42 2012 +0200 @@ -638,7 +638,7 @@ assert obj != null : x; if (changeGraph) { ConstantNode hub = ConstantNode.forConstant(obj.virtual.type().getEncoding(Representation.ObjectHub), runtime, graph); - graph.replaceFixedWithFloating(x, hub); + graph.replaceFloating(x, hub); metricOtherRemoved.increment(); } changed = true; diff -r fb66841a0994 -r a938e15e3bd7 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 Fri Sep 28 11:50:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Fri Sep 28 15:27:42 2012 +0200 @@ -257,7 +257,9 @@ // as HotSpot does not guarantee they are final values. int vtableEntryOffset = hsMethod.vtableEntryOffset(); assert vtableEntryOffset > 0; - SafeReadNode hub = safeReadHub(graph, receiver, StructuredGraph.INVALID_GRAPH_ID); + // Cannot use 'unique' here as we don't want to common out with a hub load that is scheduled + // below the invoke we are lowering. + ReadHubNode hub = graph.add(new ReadHubNode(receiver)); Kind wordKind = graalRuntime.getTarget().wordKind; Stamp nonNullWordStamp = StampFactory.forWord(wordKind, true); ReadNode methodOop = graph.add(new ReadNode(hub, LocationNode.create(LocationNode.ANY_LOCATION, wordKind, vtableEntryOffset, graph), nonNullWordStamp)); @@ -265,8 +267,7 @@ loweredCallTarget = graph.add(new HotSpotIndirectCallTargetNode(methodOop, compiledEntry, parameters, invoke.node().stamp(), signature, callTarget.targetMethod(), CallingConvention.Type.JavaCall)); - graph.addBeforeFixed(invoke.node(), hub); - graph.addAfterFixed(hub, methodOop); + graph.addBeforeFixed(invoke.node(), methodOop); graph.addAfterFixed(methodOop, compiledEntry); } } @@ -358,9 +359,7 @@ assert elementType.name().equals("Ljava/lang/Object;") : elementType.name(); } } else { - ValueNode guard = tool.createNullCheckGuard(array, StructuredGraph.INVALID_GRAPH_ID); - FloatingReadNode arrayClass = graph.unique(new FloatingReadNode(array, LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Object, config.hubOffset, graph), null, StampFactory.objectNonNull())); - arrayClass.dependencies().add(guard); + ReadHubNode arrayClass = graph.add(new ReadHubNode(array)); FloatingReadNode arrayElementKlass = graph.unique(new FloatingReadNode(arrayClass, LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Object, config.arrayClassElementOffset, graph), null, StampFactory.objectNonNull())); checkcast = graph.add(new CheckCastNode(arrayElementKlass, null, value)); graph.addBeforeFixed(storeIndexed, checkcast); @@ -405,11 +404,11 @@ graph.addAfterFixed(write, writeBarrier); } } else if (n instanceof ReadHubNode) { - ReadHubNode objectClassNode = (ReadHubNode) n; - LocationNode location = LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Object, config.hubOffset, graph); - ReadNode memoryRead = graph.add(new ReadNode(objectClassNode.object(), location, StampFactory.objectNonNull())); - memoryRead.dependencies().add(tool.createNullCheckGuard(objectClassNode.object(), StructuredGraph.INVALID_GRAPH_ID)); - graph.replaceFixed(objectClassNode, memoryRead); + ReadHubNode readHub = (ReadHubNode) n; + ValueNode object = readHub.object(); + ValueNode guard = tool.createNullCheckGuard(object, StructuredGraph.INVALID_GRAPH_ID); + FloatingReadNode hub = graph.add(new FloatingReadNode(object, LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Object, config.hubOffset, graph), null, StampFactory.objectNonNull(), guard)); + graph.replaceFloating(readHub, hub); } else if (n instanceof CheckCastNode) { if (matches(graph, GraalOptions.HIRLowerCheckcast)) { checkcastSnippets.lower((CheckCastNode) n, tool); @@ -495,12 +494,11 @@ } StructuredGraph graph = new StructuredGraph(); LocalNode receiver = graph.unique(new LocalNode(0, StampFactory.objectNonNull())); - SafeReadNode klassOop = safeReadHub(graph, receiver, StructuredGraph.INVALID_GRAPH_ID); + ReadHubNode hub = graph.add(new ReadHubNode(receiver)); Stamp resultStamp = StampFactory.declaredNonNull(getResolvedJavaType(Class.class)); - FloatingReadNode result = graph.unique(new FloatingReadNode(klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Object, config.classMirrorOffset, graph), null, resultStamp)); + FloatingReadNode result = graph.unique(new FloatingReadNode(hub, LocationNode.create(LocationNode.FINAL_LOCATION, Kind.Object, config.classMirrorOffset, graph), null, resultStamp)); ReturnNode ret = graph.add(new ReturnNode(result)); - graph.start().setNext(klassOop); - klassOop.setNext(ret); + graph.start().setNext(ret); return graph; } } else if (holderName.equals("Ljava/lang/Class;")) { @@ -526,10 +524,6 @@ return null; } - private SafeReadNode safeReadHub(Graph graph, ValueNode value, long leafGraphId) { - return safeRead(graph, Kind.Object, value, config.hubOffset, StampFactory.objectNonNull(), leafGraphId); - } - private static SafeReadNode safeRead(Graph graph, Kind kind, ValueNode value, int offset, Stamp stamp, long leafGraphId) { return graph.add(new SafeReadNode(value, LocationNode.create(LocationNode.FINAL_LOCATION, kind, offset, graph), stamp, leafGraphId)); } diff -r fb66841a0994 -r a938e15e3bd7 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java Fri Sep 28 11:50:37 2012 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/HotSpotSnippetUtils.java Fri Sep 28 15:27:42 2012 +0200 @@ -193,7 +193,7 @@ * Loads the hub from a object, null checking it first. */ static Object loadHub(Object object) { - return UnsafeLoadNode.loadObject(object, 0, hubOffset(), true); + return ReadHubNode.loadHub(object); } @@ -208,14 +208,14 @@ * Gets the value of the stack pointer register as a Word. */ static Word stackPointer() { - return HotSpotSnippetUtils.registerAsWord(stackPointerRegister()/*, wordKind()*/); + return HotSpotSnippetUtils.registerAsWord(stackPointerRegister()); } /** * Gets the value of the thread register as a Word. */ static Word thread() { - return HotSpotSnippetUtils.registerAsWord(threadRegister()/*, wordKind()*/); + return HotSpotSnippetUtils.registerAsWord(threadRegister()); } static Word loadWordFromWord(Word address, int offset) { diff -r fb66841a0994 -r a938e15e3bd7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadHubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadHubNode.java Fri Sep 28 11:50:37 2012 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadHubNode.java Fri Sep 28 15:27:42 2012 +0200 @@ -25,11 +25,14 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.api.meta.JavaType.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -// TODO (chaeubl) this should be a FloatingNode but Lowering is not possible in that case -public final class ReadHubNode extends FixedWithNextNode implements Lowerable, Canonicalizable { +/** + * Loads an object's {@linkplain Representation#ObjectHub hub}, null-checking the object first. + */ +public final class ReadHubNode extends FloatingNode implements Lowerable, Canonicalizable { @Input private ValueNode object; public ValueNode object() { @@ -70,4 +73,7 @@ } return this; } + + @NodeIntrinsic + public static native Object loadHub(Object object); }