changeset 11258:56f1aa40e13b

made LoadHubNode be floating
author Doug Simon <doug.simon@oracle.com>
date Wed, 07 Aug 2013 18:40:05 +0200
parents 4f1aa732e60f
children 3245779c0ce2
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java
diffstat 6 files changed, 42 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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);
             }
--- 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));
         }
--- 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;
         }
--- 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);
--- 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;