changeset 16222:7a0035cbf808

let ClassCastNode, CheckCastDynamicNode and LoadHubNode implement Canonicalizable.Unary/Binary
author Lukas Stadler <lukas.stadler@oracle.com>
date Wed, 25 Jun 2014 16:55:01 +0200
parents 8e82823712ba
children 1434b835f0d3
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java
diffstat 3 files changed, 48 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java	Wed Jun 25 16:55:01 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassCastNode.java	Wed Jun 25 16:55:01 2014 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,6 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
-import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
@@ -32,10 +31,10 @@
 
 /**
  * {@link MacroNode Macro node} for {@link Class#cast(Object)}.
- * 
+ *
  * @see ClassSubstitutions#cast(Class, Object)
  */
-public class ClassCastNode extends MacroNode implements Canonicalizable {
+public class ClassCastNode extends MacroNode implements Canonicalizable.Binary<ValueNode> {
 
     public ClassCastNode(Invoke invoke) {
         super(invoke);
@@ -49,16 +48,21 @@
         return arguments.get(1);
     }
 
+    public ValueNode getX() {
+        return getJavaClass();
+    }
+
+    public ValueNode getY() {
+        return getObject();
+    }
+
     @Override
-    public Node canonical(CanonicalizerTool tool) {
-        ValueNode javaClass = getJavaClass();
-        if (javaClass.isConstant()) {
-            ValueNode object = getObject();
-            Class<?> c = (Class<?>) HotSpotObjectConstant.asObject(javaClass.asConstant());
+    public ValueNode canonical(CanonicalizerTool tool, ValueNode forJavaClass, ValueNode forObject) {
+        if (forJavaClass.isConstant()) {
+            Class<?> c = (Class<?>) HotSpotObjectConstant.asObject(forJavaClass.asConstant());
             if (c != null && !c.isPrimitive()) {
                 HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) HotSpotResolvedObjectType.fromClass(c);
-                CheckCastNode checkcast = graph().add(new CheckCastNode(type, object, null, false));
-                return checkcast;
+                return new CheckCastNode(type, forObject, null, false);
             }
         }
         return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Wed Jun 25 16:55:01 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java	Wed Jun 25 16:55:01 2014 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.api.meta.ResolvedJavaType.Representation;
 import com.oracle.graal.compiler.common.type.*;
-import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
@@ -34,7 +33,7 @@
  * Loads an object's {@linkplain Representation#ObjectHub hub}. The object is not null-checked by
  * this operation.
  */
-public final class LoadHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, Virtualizable {
+public final class LoadHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable.Unary<ValueNode>, Virtualizable {
 
     @Input private ValueNode value;
 
@@ -63,10 +62,10 @@
     }
 
     @Override
-    public Node canonical(CanonicalizerTool tool) {
+    public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) {
         MetaAccessProvider metaAccess = tool.getMetaAccess();
-        if (metaAccess != null && value.stamp() instanceof ObjectStamp) {
-            ObjectStamp stamp = (ObjectStamp) value.stamp();
+        if (metaAccess != null && forObject.stamp() instanceof ObjectStamp) {
+            ObjectStamp stamp = (ObjectStamp) forObject.stamp();
 
             ResolvedJavaType exactType;
             if (stamp.isExactType()) {
@@ -81,7 +80,7 @@
             }
 
             if (exactType != null) {
-                return ConstantNode.forConstant(exactType.getEncoding(Representation.ObjectHub), metaAccess, graph());
+                return ConstantNode.forConstant(exactType.getEncoding(Representation.ObjectHub), metaAccess);
             }
         }
         return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java	Wed Jun 25 16:55:01 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java	Wed Jun 25 16:55:01 2014 +0200
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,6 @@
 package com.oracle.graal.nodes.java;
 
 import com.oracle.graal.api.meta.*;
-import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
@@ -33,7 +32,7 @@
  * Implements a type check where the type being checked is loaded at runtime. This is used, for
  * instance, to implement an object array store check.
  */
-public final class CheckCastDynamicNode extends FixedWithNextNode implements Canonicalizable, Lowerable {
+public final class CheckCastDynamicNode extends FixedWithNextNode implements Canonicalizable.Binary<ValueNode>, Lowerable {
 
     @Input private ValueNode object;
     @Input private ValueNode hub;
@@ -55,6 +54,25 @@
         this.forStoreCheck = forStoreCheck;
     }
 
+    public ValueNode object() {
+        return object;
+    }
+
+    /**
+     * Gets the runtime-loaded type being cast to.
+     */
+    public ValueNode hub() {
+        return hub;
+    }
+
+    public ValueNode getX() {
+        return object;
+    }
+
+    public ValueNode getY() {
+        return hub;
+    }
+
     public boolean isForStoreCheck() {
         return forStoreCheck;
     }
@@ -70,32 +88,19 @@
     }
 
     @Override
-    public Node canonical(CanonicalizerTool tool) {
-        assert object() != null : this;
-
-        if (StampTool.isObjectAlwaysNull(object())) {
-            return object();
+    public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject, ValueNode forHub) {
+        if (StampTool.isObjectAlwaysNull(forObject)) {
+            return forObject;
         }
-        if (hub.isConstant()) {
-            ResolvedJavaType t = tool.getConstantReflection().asJavaType(hub.asConstant());
+        if (forHub.isConstant()) {
+            ResolvedJavaType t = tool.getConstantReflection().asJavaType(forHub.asConstant());
             if (t != null) {
-                return graph().add(new CheckCastNode(t, object(), null, forStoreCheck));
+                return graph().add(new CheckCastNode(t, forObject, null, forStoreCheck));
             }
         }
         return this;
     }
 
-    public ValueNode object() {
-        return object;
-    }
-
-    /**
-     * Gets the runtime-loaded type being cast to.
-     */
-    public ValueNode hub() {
-        return hub;
-    }
-
     @NodeIntrinsic
     public static native <T> T checkCastDynamic(Class<T> type, Object object, @ConstantNodeParameter boolean forStoreCheck);
 }