changeset 6456:a20c8500770c

removed need for genTypeBranch() in XIR by replacing an IsTypeNode with an ObjectEqualsNode during lowering
author Doug Simon <doug.simon@oracle.com>
date Thu, 27 Sep 2012 20:29:17 +0200
parents c4d21bd7653b
children 03a1a0c5ee84
files graal/com.oracle.graal.compiler.phases/src/com/oracle/graal/compiler/util/InliningUtil.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/IsTypeNode.java
diffstat 3 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.phases/src/com/oracle/graal/compiler/util/InliningUtil.java	Thu Sep 27 16:58:01 2012 +0200
+++ b/graal/com.oracle.graal.compiler.phases/src/com/oracle/graal/compiler/util/InliningUtil.java	Thu Sep 27 20:29:17 2012 +0200
@@ -190,8 +190,8 @@
             // receiver null check must be before the type check
             InliningUtil.receiverNullCheck(invoke);
             ValueNode receiver = invoke.methodCallTarget().receiver();
-            ReadHubNode objectClass = graph.add(new ReadHubNode(receiver));
-            IsTypeNode isTypeNode = graph.unique(new IsTypeNode(objectClass, type));
+            ReadHubNode receiverHub = graph.add(new ReadHubNode(receiver));
+            IsTypeNode isTypeNode = graph.unique(new IsTypeNode(receiverHub, type));
             FixedGuardNode guard = graph.add(new FixedGuardNode(isTypeNode, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile, invoke.leafGraphId()));
             ValueAnchorNode anchor = graph.add(new ValueAnchorNode());
             assert invoke.predecessor() != null;
@@ -199,7 +199,7 @@
             ValueNode anchoredReceiver = createAnchoredReceiver(graph, anchor, type, receiver, true);
             invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver);
 
-            graph.addBeforeFixed(invoke.node(), objectClass);
+            graph.addBeforeFixed(invoke.node(), receiverHub);
             graph.addBeforeFixed(invoke.node(), guard);
             graph.addBeforeFixed(invoke.node(), anchor);
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Thu Sep 27 16:58:01 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Thu Sep 27 20:29:17 2012 +0200
@@ -418,6 +418,12 @@
             if (matches(graph, GraalOptions.HIRLowerInstanceOf)) {
                 instanceofSnippets.lower((InstanceOfNode) n, tool);
             }
+        } else if (n instanceof IsTypeNode) {
+            IsTypeNode isType = (IsTypeNode) n;
+            ValueNode objectHub = isType.objectClass();
+            ConstantNode hub = ConstantNode.forObject(new HotSpotKlassOop(isType.type()), this, graph);
+            ObjectEqualsNode typeCheck = graph.unique(new ObjectEqualsNode(objectHub, hub));
+            graph.replaceFloating(isType, typeCheck);
         } else if (n instanceof NewInstanceNode) {
             if (matches(graph, GraalOptions.HIRLowerNewInstance)) {
                 newObjectSnippets.lower((NewInstanceNode) n, tool);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/IsTypeNode.java	Thu Sep 27 16:58:01 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/IsTypeNode.java	Thu Sep 27 20:29:17 2012 +0200
@@ -29,7 +29,7 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
-public final class IsTypeNode extends BooleanNode implements Canonicalizable, LIRLowerable {
+public final class IsTypeNode extends BooleanNode implements Canonicalizable, Lowerable, LIRLowerable {
 
     @Input private ValueNode objectClass;
     private final ResolvedJavaType type;
@@ -56,6 +56,11 @@
     }
 
     @Override
+    public void lower(LoweringTool tool) {
+        tool.getRuntime().lower(this, tool);
+    }
+
+    @Override
     public void generate(LIRGeneratorTool gen) {
         // nothing to do
     }