changeset 18291:5415422cb32f

Merge.
author Doug Simon <doug.simon@oracle.com>
date Thu, 06 Nov 2014 20:14:47 +0100
parents e7d219e9d01f (diff) f1a988d9213f (current diff)
children 463722cb77f8
files
diffstat 31 files changed, 333 insertions(+), 170 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Remote.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Remote.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,9 +22,19 @@
  */
 package com.oracle.graal.api.meta;
 
+import java.lang.annotation.*;
+
 /**
  * Marker interface for classes whose values are proxied during replay compilation capture or remote
  * compilation.
  */
 public interface Remote {
+
+    /**
+     * Denotes a method whose return value is determined solely by its parameter values.
+     */
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.METHOD)
+    public @interface PureFunction {
+    }
 }
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotCompare.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotCompare.java	Thu Nov 06 20:14:47 2014 +0100
@@ -55,7 +55,8 @@
                 // compressed null
                 masm.testl(asRegister(x), asRegister(x));
             } else if (y instanceof HotSpotObjectConstant) {
-                if (HotSpotObjectConstantImpl.isCompressed(y)) {
+                HotSpotObjectConstant yConst = (HotSpotObjectConstant) y;
+                if (yConst.isCompressed()) {
                     // compressed oop
                     crb.recordInlineDataInCode(y);
                     masm.cmpl(asRegister(x), 0xDEADDEAD);
@@ -96,7 +97,8 @@
                 // compressed null
                 masm.cmpl(address.toAddress(), 0);
             } else if (y instanceof HotSpotObjectConstant) {
-                if (HotSpotObjectConstantImpl.isCompressed(y) && crb.target.inlineObjects) {
+                HotSpotObjectConstant yConst = (HotSpotObjectConstant) y;
+                if (yConst.isCompressed() && crb.target.inlineObjects) {
                     // compressed oop
                     crb.recordInlineDataInCode(y);
                     masm.cmpl(address.toAddress(), 0xDEADDEAD);
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Thu Nov 06 20:14:47 2014 +0100
@@ -604,7 +604,7 @@
         if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) {
             return true;
         } else if (c instanceof HotSpotObjectConstant) {
-            return HotSpotObjectConstantImpl.isCompressed(c);
+            return ((HotSpotObjectConstant) c).isCompressed();
         } else {
             return super.canInlineConstant(c);
         }
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotMove.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotMove.java	Thu Nov 06 20:14:47 2014 +0100
@@ -62,7 +62,7 @@
                     masm.movl((AMD64Address) crb.asAddress(result), 0);
                 }
             } else if (input instanceof HotSpotObjectConstant) {
-                boolean compressed = HotSpotObjectConstantImpl.isCompressed(input);
+                boolean compressed = ((HotSpotObjectConstant) input).isCompressed();
                 if (crb.target.inlineObjects) {
                     crb.recordInlineDataInCode(input);
                     if (isRegister(result)) {
@@ -135,7 +135,8 @@
                 // compressed null
                 masm.movl(address.toAddress(), 0);
             } else if (input instanceof HotSpotObjectConstant) {
-                if (HotSpotObjectConstantImpl.isCompressed(input) && crb.target.inlineObjects) {
+                HotSpotObjectConstant c = (HotSpotObjectConstant) input;
+                if (c.isCompressed() && crb.target.inlineObjects) {
                     // compressed oop
                     crb.recordInlineDataInCode(input);
                     masm.movl(address.toAddress(), 0xDEADDEAD);
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotAssembler.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotAssembler.java	Thu Nov 06 20:14:47 2014 +0100
@@ -28,6 +28,7 @@
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.asm.hsail.*;
+import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.hotspot.meta.*;
 
 /**
@@ -39,6 +40,22 @@
         super(target);
     }
 
+    // This means the HSAIL backend cannot (currently) be executed
+    // in remote/replay compilation mode.
+    private static Field objectField;
+
+    private static Object getObject(JavaConstant src) {
+        try {
+            if (objectField == null) {
+                objectField = HotSpotObjectConstantImpl.class.getDeclaredField("object");
+            }
+            return objectField.get(src);
+        } catch (Exception e) {
+            throw new GraalInternalError(e);
+        }
+
+    }
+
     @Override
     public final void mov(Register a, JavaConstant src) {
         String regName = "$d" + a.encoding();
@@ -46,7 +63,8 @@
         if (src.isNull()) {
             emitString("mov_b64 " + regName + ", 0x0;  // null object");
         } else {
-            Object obj = HotSpotObjectConstantImpl.asObject(src);
+            assert src instanceof HotSpotObjectConstantImpl;
+            Object obj = getObject(src);
             // Get a JNI reference handle to the object.
             long refHandle = OkraUtil.getRefHandle(obj);
             // Get the clasname of the object for emitting a comment.
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java	Thu Nov 06 20:14:47 2014 +0100
@@ -235,7 +235,7 @@
     protected HSAILLIRInstruction createMove(AllocatableValue dst, Value src) {
         if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(src)) {
             return new MoveToRegOp(Kind.Int, dst, JavaConstant.INT_0);
-        } else if (src instanceof HotSpotObjectConstant && HotSpotObjectConstantImpl.isCompressed((JavaConstant) src)) {
+        } else if (src instanceof HotSpotObjectConstant && ((HotSpotObjectConstant) src).isCompressed()) {
             Variable uncompressed = newVariable(LIRKind.reference(Kind.Object));
             append(new MoveToRegOp(Kind.Object, uncompressed, src));
             CompressEncoding oopEncoding = config.getOopEncoding();
--- a/graal/com.oracle.graal.hotspot.server/src/com/oracle/graal/hotspot/server/ReplacingStreams.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.server/src/com/oracle/graal/hotspot/server/ReplacingStreams.java	Thu Nov 06 20:14:47 2014 +0100
@@ -30,7 +30,6 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.hotspot.logging.*;
-import com.oracle.graal.hotspot.meta.*;
 
 public class ReplacingStreams {
 
@@ -147,7 +146,7 @@
     }
 
     /**
-     * Replaces certain cir objects that cannot easily be made Serializable.
+     * Replaces certain objects that cannot easily be made Serializable.
      */
     public class ReplacingOutputStream extends ObjectOutputStream {
 
@@ -169,29 +168,9 @@
                 return createRemoteCallPlaceholder(obj);
             }
 
-            // is the object a constant of object type?
-            if (obj.getClass() == JavaConstant.class) {
-                JavaConstant constant = (JavaConstant) obj;
-                if (constant.getKind() != Kind.Object) {
-                    return obj;
-                }
-                Object contents = HotSpotObjectConstantImpl.asObject(constant);
-                if (contents == null) {
-                    return obj;
-                }
-                // don't replace if the object already is a placeholder
-                if (contents instanceof Placeholder || contents instanceof Long) {
-                    return obj;
-                }
-                placeholder = objectMap.get(contents);
-                if (placeholder != null) {
-                    return HotSpotObjectConstantImpl.forObject(placeholder);
-                }
-                if (contents instanceof Remote) {
-                    return HotSpotObjectConstantImpl.forObject(createRemoteCallPlaceholder(contents));
-                }
-                return HotSpotObjectConstantImpl.forObject(createDummyPlaceholder(contents));
-            }
+            // Remote object constants must implement Remote
+            assert !(obj instanceof JavaConstant) || ((JavaConstant) obj).getKind() != Kind.Object;
+
             return obj;
         }
     }
@@ -203,10 +182,4 @@
         objectList.add(obj);
         return new NewRemoteCallPlaceholder(ProxyUtil.getAllInterfaces(obj.getClass()));
     }
-
-    public Object createDummyPlaceholder(Object obj) {
-        objectMap.put(obj, new Placeholder(objectList.size()));
-        objectList.add(obj);
-        return new NewDummyPlaceholder();
-    }
 }
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java	Thu Nov 06 20:14:47 2014 +0100
@@ -104,9 +104,9 @@
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
         assertDeepEquals(1, filter.count());
-        Object mirror = HotSpotObjectConstantImpl.asObject(filter.first().asJavaConstant());
-        assertDeepEquals(Class.class, mirror.getClass());
-        assertDeepEquals(AheadOfTimeCompilationTest.class, mirror);
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) filter.first().asJavaConstant();
+        Assert.assertEquals(Class.class, c.getObjectClass());
+        Assert.assertTrue(c.isEqualTo(AheadOfTimeCompilationTest.class));
 
         assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
         assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
@@ -132,9 +132,9 @@
         StructuredGraph result = compile("getPrimitiveClassObject", false);
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
         assertDeepEquals(1, filter.count());
-        Object mirror = HotSpotObjectConstantImpl.asObject(filter.first().asJavaConstant());
-        assertDeepEquals(Class.class, mirror.getClass());
-        assertDeepEquals(Integer.TYPE, mirror);
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) filter.first().asJavaConstant();
+        Assert.assertEquals(Class.class, c.getObjectClass());
+        Assert.assertTrue(c.isEqualTo(Integer.TYPE));
 
         assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
         assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
@@ -160,9 +160,9 @@
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
         assertDeepEquals(1, filter.count());
-        Object mirror = HotSpotObjectConstantImpl.asObject(filter.first().asJavaConstant());
-        assertDeepEquals(String.class, mirror.getClass());
-        assertDeepEquals("test string", mirror);
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) filter.first().asJavaConstant();
+        Assert.assertEquals(String.class, c.getObjectClass());
+        Assert.assertTrue(c.isEqualTo("test string"));
 
         assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
         assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
@@ -193,7 +193,9 @@
         assertDeepEquals(1, getConstantNodes(result).count());
         ConstantNode constant = getConstantNodes(result).first();
         assertDeepEquals(Kind.Object, constant.getKind());
-        assertDeepEquals(Boolean.TRUE, HotSpotObjectConstantImpl.asObject(constant.asJavaConstant()));
+
+        HotSpotObjectConstantImpl c = (HotSpotObjectConstantImpl) constant.asJavaConstant();
+        Assert.assertTrue(c.isEqualTo(Boolean.TRUE));
     }
 
     private StructuredGraph compile(String test, boolean compileAOT) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.hotspot.meta;
 
+import static com.oracle.graal.hotspot.meta.HotSpotCompressedNullConstant.*;
+
 import java.lang.reflect.*;
 import java.util.*;
 
@@ -264,7 +266,8 @@
             boolean compressed;
             long raw;
             if (constant instanceof HotSpotObjectConstant) {
-                compressed = HotSpotObjectConstantImpl.isCompressed(constant);
+                HotSpotObjectConstant c = (HotSpotObjectConstant) vmConstant;
+                compressed = c.isCompressed();
                 raw = 0xDEADDEADDEADDEADL;
             } else if (constant instanceof HotSpotMetaspaceConstant) {
                 HotSpotMetaspaceConstantImpl meta = (HotSpotMetaspaceConstantImpl) constant;
@@ -288,7 +291,7 @@
                 };
             }
         } else if (JavaConstant.isNull(constant)) {
-            boolean compressed = HotSpotObjectConstantImpl.isCompressed(constant);
+            boolean compressed = COMPRESSED_NULL.equals(constant);
             size = target.getSizeInBytes(compressed ? Kind.Int : target.wordKind);
             builder = DataBuilder.zero(size);
         } else if (constant instanceof PrimitiveConstant) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Thu Nov 06 20:14:47 2014 +0100
@@ -53,7 +53,7 @@
             return null;
         }
 
-        Object arrayObject = HotSpotObjectConstantImpl.asObject(array);
+        Object arrayObject = ((HotSpotObjectConstantImpl) array).object();
         if (!arrayObject.getClass().isArray()) {
             return null;
         }
@@ -65,7 +65,7 @@
         Object base;
         long displacement;
         if (baseConstant.getKind() == Kind.Object) {
-            base = HotSpotObjectConstantImpl.asObject(baseConstant);
+            base = ((HotSpotObjectConstantImpl) baseConstant).object();
             displacement = initialDisplacement;
             if (base == null) {
                 return null;
@@ -132,7 +132,7 @@
         Object base;
         long displacement;
         if (baseConstant.getKind() == Kind.Object) {
-            base = HotSpotObjectConstantImpl.asObject(baseConstant);
+            base = ((HotSpotObjectConstantImpl) baseConstant).object();
             displacement = initialDisplacement;
             if (base == null) {
                 return null;
@@ -197,7 +197,7 @@
         if (array.getKind() != Kind.Object || array.isNull()) {
             return null;
         }
-        Object a = HotSpotObjectConstantImpl.asObject(array);
+        Object a = ((HotSpotObjectConstantImpl) array).object();
 
         if (index < 0 || index >= Array.getLength(a)) {
             return null;
@@ -223,13 +223,13 @@
         if (!source.getKind().isObject()) {
             return null;
         }
-        return JavaConstant.forBoxedPrimitive(HotSpotObjectConstantImpl.asObject(source));
+        return JavaConstant.forBoxedPrimitive(((HotSpotObjectConstantImpl) source).object());
     }
 
     @Override
     public ResolvedJavaType asJavaType(JavaConstant constant) {
         if (constant instanceof HotSpotObjectConstant) {
-            Object obj = HotSpotObjectConstantImpl.asObject(constant);
+            Object obj = ((HotSpotObjectConstantImpl) constant).object();
             if (obj instanceof Class) {
                 return runtime.getHostProviders().getMetaAccess().lookupJavaType((Class<?>) obj);
             }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMetaAccessProvider.java	Thu Nov 06 20:14:47 2014 +0100
@@ -62,7 +62,7 @@
         if (constant.isNull() || !(constant instanceof HotSpotObjectConstant)) {
             return null;
         }
-        Object o = HotSpotObjectConstantImpl.asObject(constant);
+        Object o = ((HotSpotObjectConstantImpl) constant).object();
         return fromObjectClass(o.getClass());
     }
 
@@ -308,7 +308,7 @@
             } else {
                 if (lookupJavaType.isArray()) {
                     // TODO(tw): Add compressed pointer support.
-                    int length = Array.getLength(HotSpotObjectConstantImpl.asObject(constant));
+                    int length = Array.getLength(((HotSpotObjectConstantImpl) constant).object());
                     ResolvedJavaType elementType = lookupJavaType.getComponentType();
                     Kind elementKind = elementType.getKind();
                     final int headerSize = HotSpotGraalRuntime.getArrayBaseOffset(elementKind);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstant.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstant.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,7 +22,12 @@
  */
 package com.oracle.graal.hotspot.meta;
 
+import java.lang.invoke.*;
+
+import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.graph.*;
+import com.oracle.graal.lir.*;
 
 /**
  * Represents a constant non-{@code null} object reference, within the compiler and across the
@@ -34,4 +39,68 @@
 
     JavaConstant uncompress();
 
+    boolean isCompressed();
+
+    /**
+     * Gets the result of {@link Class#getClassLoader()} for the {@link Class} object represented by
+     * this constant.
+     *
+     * @return {@code null} if this constant does not represent a {@link Class} object
+     */
+    @PureFunction
+    JavaConstant getClassLoader();
+
+    /**
+     * Gets the {@linkplain System#identityHashCode(Object) identity} has code for the object
+     * represented by this constant.
+     */
+    @PureFunction
+    int getIdentityHashCode();
+
+    /**
+     * Gets the result of {@link NodeClass#get(Class)} for the {@link Class} object represented by
+     * this constant.
+     *
+     * @return {@code null} if this constant does not represent a {@link Class} object
+     */
+    JavaConstant getNodeClass();
+
+    /**
+     * Gets the result of {@link Class#getComponentType()} for the {@link Class} object represented
+     * by this constant.
+     *
+     * @return {@code null} if this constant does not represent a {@link Class} object
+     */
+    JavaConstant getComponentType();
+
+    /**
+     * Gets the result of {@link Class#getSuperclass()} for the {@link Class} object represented by
+     * this constant.
+     *
+     * @return {@code null} if this constant does not represent a {@link Class} object
+     */
+    JavaConstant getSuperclass();
+
+    /**
+     * Gets the result of {@link CallSite#getTarget()} for the {@link CallSite} object represented
+     * by this constant.
+     *
+     * @param assumptions used to register an assumption that the {@link CallSite}'s target does not
+     *            change
+     * @return {@code null} if this constant does not represent a {@link CallSite} object
+     */
+    JavaConstant getCallSiteTarget(Assumptions assumptions);
+
+    /**
+     * Gets the result of {@link CompositeValueClass#get(Class)} for the {@link Class} object
+     * represented by this constant.
+     *
+     * @return {@code null} if this constant does not represent a {@link Class} object
+     */
+    JavaConstant getCompositeValueClass();
+
+    /**
+     * Determines if this constant represents an {@linkplain String#intern() interned} string.
+     */
+    boolean isInternedString();
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,7 +22,14 @@
  */
 package com.oracle.graal.hotspot.meta;
 
+import java.lang.invoke.*;
+
+import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.graph.*;
+import com.oracle.graal.lir.*;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Represents a constant non-{@code null} object reference, within the compiler and across the
@@ -48,14 +55,6 @@
         }
     }
 
-    public static Object asObject(Constant constant) {
-        if (JavaConstant.isNull(constant)) {
-            return null;
-        } else {
-            return ((HotSpotObjectConstantImpl) constant).object;
-        }
-    }
-
     public static Object asBoxedValue(Constant constant) {
         if (JavaConstant.isNull(constant)) {
             return null;
@@ -66,14 +65,6 @@
         }
     }
 
-    public static boolean isCompressed(Constant constant) {
-        if (JavaConstant.isNull(constant)) {
-            return HotSpotCompressedNullConstant.NULL_OBJECT.equals(constant);
-        } else {
-            return ((HotSpotObjectConstantImpl) constant).compressed;
-        }
-    }
-
     private final Object object;
     private final boolean compressed;
 
@@ -84,6 +75,32 @@
         assert object != null;
     }
 
+    /**
+     * Package-private accessor for the object represented by this constant.
+     */
+    Object object() {
+        return object;
+    }
+
+    /**
+     * Determines if the object represented by this constant is {@link Object#equals(Object) equal}
+     * to a given object.
+     */
+    public boolean isEqualTo(Object obj) {
+        return object.equals(obj);
+    }
+
+    /**
+     * Gets the class of the object represented by this constant.
+     */
+    public Class<?> getObjectClass() {
+        return object.getClass();
+    }
+
+    public boolean isCompressed() {
+        return compressed;
+    }
+
     public JavaConstant compress() {
         assert !compressed;
         return new HotSpotObjectConstantImpl(object, true);
@@ -94,6 +111,76 @@
         return new HotSpotObjectConstantImpl(object, false);
     }
 
+    public JavaConstant getClassLoader() {
+        if (object instanceof Class) {
+            /*
+             * This is an intrinsic for getClassLoader0, which occurs after any security checks. We
+             * can't call that directly so just call getClassLoader.
+             */
+            return HotSpotObjectConstantImpl.forObject(((Class<?>) object).getClassLoader());
+        }
+        return null;
+    }
+
+    public int getIdentityHashCode() {
+        return System.identityHashCode(object);
+    }
+
+    public JavaConstant getNodeClass() {
+        if (object instanceof Class) {
+            return HotSpotObjectConstantImpl.forObject(NodeClass.get((Class<?>) object));
+        }
+        return null;
+    }
+
+    public JavaConstant getComponentType() {
+        if (object instanceof Class) {
+            return HotSpotObjectConstantImpl.forObject(((Class<?>) object).getComponentType());
+        }
+        return null;
+    }
+
+    public JavaConstant getSuperclass() {
+        if (object instanceof Class) {
+            return HotSpotObjectConstantImpl.forObject(((Class<?>) object).getSuperclass());
+        }
+        return null;
+    }
+
+    public JavaConstant getCallSiteTarget(Assumptions assumptions) {
+        if (object instanceof CallSite) {
+            CallSite callSite = (CallSite) object;
+            MethodHandle target = callSite.getTarget();
+            if (!(callSite instanceof ConstantCallSite)) {
+                if (assumptions == null || !assumptions.useOptimisticAssumptions()) {
+                    return null;
+                }
+                assumptions.record(new Assumptions.CallSiteTargetValue(callSite, target));
+            }
+            return HotSpotObjectConstantImpl.forObject(target);
+        }
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    public JavaConstant getCompositeValueClass() {
+        if (object instanceof Class) {
+            Class<? extends CompositeValue> c = (Class<? extends CompositeValue>) object;
+            assert CompositeValueClass.class.isAssignableFrom(c);
+            return HotSpotObjectConstantImpl.forObject(CompositeValueClass.get(c));
+        }
+        return null;
+    }
+
+    @SuppressFBWarnings(value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "reference equality is what we want")
+    public boolean isInternedString() {
+        if (object instanceof String) {
+            String s = (String) object;
+            return s.intern() == s;
+        }
+        return false;
+    }
+
     @Override
     public boolean isNull() {
         return false;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaFieldImpl.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaFieldImpl.java	Thu Nov 06 20:14:47 2014 +0100
@@ -210,7 +210,7 @@
              * have a non-default value.
              */
             assert !isStatic();
-            Object object = HotSpotObjectConstantImpl.asObject(receiver);
+            Object object = ((HotSpotObjectConstantImpl) receiver).object();
 
             // Canonicalization may attempt to process an unsafe read before
             // processing a guard (e.g. a null check or a type check) for this read
@@ -268,7 +268,7 @@
             return null;
         } else {
             assert !isStatic();
-            assert receiver.isNonNull() && isInObject(HotSpotObjectConstantImpl.asObject(receiver));
+            assert receiver.isNonNull() && isInObject(((HotSpotObjectConstantImpl) receiver).object());
             return runtime().getHostProviders().getConstantReflection().readUnsafeConstant(getKind(), receiver, offset);
         }
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethodImpl.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethodImpl.java	Thu Nov 06 20:14:47 2014 +0100
@@ -711,7 +711,7 @@
         for (int i = 0; i < arguments.length; i++) {
             objArguments[i] = HotSpotObjectConstantImpl.asBoxedValue(arguments[i]);
         }
-        Object objReceiver = receiver != null ? HotSpotObjectConstantImpl.asObject(receiver) : null;
+        Object objReceiver = receiver != null ? ((HotSpotObjectConstantImpl) receiver).object() : null;
 
         try {
             Object objResult = javaMethod.invoke(objReceiver, objArguments);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectTypeImpl.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedObjectTypeImpl.java	Thu Nov 06 20:14:47 2014 +0100
@@ -343,7 +343,7 @@
     @Override
     public boolean isInstance(JavaConstant obj) {
         if (obj.getKind() == Kind.Object && !obj.isNull()) {
-            return mirror().isInstance(HotSpotObjectConstantImpl.asObject(obj));
+            return mirror().isInstance(((HotSpotObjectConstantImpl) obj).object());
         }
         return false;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSnippetReflectionProvider.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotSnippetReflectionProvider.java	Thu Nov 06 20:14:47 2014 +0100
@@ -34,7 +34,7 @@
 
     @Override
     public Object asObject(JavaConstant constant) {
-        return HotSpotObjectConstantImpl.asObject(constant);
+        return ((HotSpotObjectConstantImpl) constant).object();
     }
 
     @Override
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetClassLoader0Node.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetClassLoader0Node.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.hotspot.meta.*;
@@ -55,14 +56,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                /*
-                 * This is an intrinsic for getClassLoader0, which occurs after any security checks.
-                 * We can't call that directly so just call getClassLoader.
-                 */
-                ClassLoader classLoader = c.getClassLoader();
-                return ConstantNode.forConstant(HotSpotObjectConstantImpl.forObject(classLoader), tool.getMetaAccess());
+            HotSpotObjectConstant c = (HotSpotObjectConstant) javaClass.asJavaConstant();
+            JavaConstant classLoader = c.getClassLoader();
+            if (classLoader != null) {
+                return ConstantNode.forConstant(classLoader, tool.getMetaAccess());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetComponentTypeNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetComponentTypeNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.hotspot.meta.*;
@@ -54,10 +55,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                Class<?> componentType = c.getComponentType();
-                return ConstantNode.forConstant(HotSpotObjectConstantImpl.forObject(componentType), tool.getMetaAccess());
+            HotSpotObjectConstant c = (HotSpotObjectConstant) javaClass.asJavaConstant();
+            JavaConstant componentType = c.getComponentType();
+            if (componentType != null) {
+                return ConstantNode.forConstant(componentType, tool.getMetaAccess());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetModifiersNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forInt(c.getModifiers());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forInt(type.getModifiers());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetSuperclassNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassGetSuperclassNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.hotspot.meta.*;
@@ -54,10 +55,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                Class<?> superclass = c.getSuperclass();
-                return ConstantNode.forConstant(HotSpotObjectConstantImpl.forObject(superclass), tool.getMetaAccess());
+            HotSpotObjectConstant c = (HotSpotObjectConstant) javaClass.asJavaConstant();
+            JavaConstant superclass = c.getSuperclass();
+            if (superclass != null) {
+                return ConstantNode.forConstant(superclass, tool.getMetaAccess());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsArrayNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forBoolean(c.isArray());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forBoolean(type.isArray());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsInterfaceNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forBoolean(c.isInterface());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forBoolean(type.isInterface());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/ClassIsPrimitiveNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,9 +22,9 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.spi.*;
-import com.oracle.graal.hotspot.meta.*;
 import com.oracle.graal.hotspot.replacements.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
@@ -54,9 +54,10 @@
     public Node canonical(CanonicalizerTool tool) {
         ValueNode javaClass = getJavaClass();
         if (javaClass.isConstant()) {
-            Class<?> c = (Class<?>) HotSpotObjectConstantImpl.asObject(javaClass.asJavaConstant());
-            if (c != null) {
-                return ConstantNode.forBoolean(c.isPrimitive());
+            ConstantReflectionProvider constantReflection = tool.getConstantReflection();
+            ResolvedJavaType type = constantReflection.asJavaType(javaClass.asJavaConstant());
+            if (type != null) {
+                return ConstantNode.forBoolean(type.isPrimitive());
             }
         }
         return this;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/AheadOfTimeVerificationPhase.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/AheadOfTimeVerificationPhase.java	Thu Nov 06 20:14:47 2014 +0100
@@ -31,8 +31,6 @@
 import com.oracle.graal.phases.*;
 import com.oracle.graal.phases.tiers.*;
 
-import edu.umd.cs.findbugs.annotations.*;
-
 /**
  * Checks for illegal object constants in a graph processed for AOT compilation. The only legal
  * object constants are {@linkplain String#intern() interned} strings as they will be installed in
@@ -74,18 +72,12 @@
         return StampTool.typeOrNull(node).getName().startsWith("Ljava/lang/invoke/BoundMethodHandle");
     }
 
-    @SuppressFBWarnings(value = "ES_COMPARING_STRINGS_WITH_EQ", justification = "reference equality is what we want")
     private static boolean isInternedString(ConstantNode node) {
         if (!isObject(node)) {
             return false;
         }
 
-        Object o = HotSpotObjectConstantImpl.asObject(node.asJavaConstant());
-        if (!(o instanceof String)) {
-            return false;
-        }
-
-        String s = (String) o;
-        return s == s.intern();
+        HotSpotObjectConstant c = (HotSpotObjectConstant) node.asConstant();
+        return c.isInternedString();
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java	Thu Nov 06 20:14:47 2014 +0100
@@ -60,44 +60,48 @@
     }
 
     private ValueNode getClassConstantReplacement(StructuredGraph graph, PhaseContext context, JavaConstant constant) {
-        if (constant instanceof HotSpotObjectConstant && HotSpotObjectConstantImpl.asObject(constant) instanceof Class<?>) {
-            MetaAccessProvider metaAccess = context.getMetaAccess();
-            ResolvedJavaType type = metaAccess.lookupJavaType((Class<?>) HotSpotObjectConstantImpl.asObject(constant));
-            JavaConstant klass;
-            LocationNode location;
-            if (type instanceof HotSpotResolvedObjectType) {
-                location = ConstantLocationNode.create(CLASS_MIRROR_LOCATION, Kind.Object, classMirrorOffset, graph);
-                klass = ((HotSpotResolvedObjectType) type).klass();
-            } else {
-                /*
-                 * Primitive classes are more difficult since they don't have a corresponding Klass*
-                 * so get them from Class.TYPE for the java box type.
-                 */
-                HotSpotResolvedPrimitiveType primitive = (HotSpotResolvedPrimitiveType) type;
-                ResolvedJavaType boxingClass = metaAccess.lookupJavaType(primitive.getKind().toBoxedJavaClass());
-                klass = ((HotSpotResolvedObjectType) boxingClass).klass();
-                HotSpotResolvedJavaField[] a = (HotSpotResolvedJavaField[]) boxingClass.getStaticFields();
-                HotSpotResolvedJavaField typeField = null;
-                for (HotSpotResolvedJavaField f : a) {
-                    if (f.getName().equals("TYPE")) {
-                        typeField = f;
-                        break;
+        if (constant instanceof HotSpotObjectConstant) {
+            ConstantReflectionProvider constantReflection = context.getConstantReflection();
+            ResolvedJavaType c = constantReflection.asJavaType(constant);
+            if (c != null) {
+                MetaAccessProvider metaAccess = context.getMetaAccess();
+                ResolvedJavaType type = c;
+                JavaConstant klass;
+                LocationNode location;
+                if (type instanceof HotSpotResolvedObjectType) {
+                    location = ConstantLocationNode.create(CLASS_MIRROR_LOCATION, Kind.Object, classMirrorOffset, graph);
+                    klass = ((HotSpotResolvedObjectType) type).klass();
+                } else {
+                    /*
+                     * Primitive classes are more difficult since they don't have a corresponding
+                     * Klass* so get them from Class.TYPE for the java box type.
+                     */
+                    HotSpotResolvedPrimitiveType primitive = (HotSpotResolvedPrimitiveType) type;
+                    ResolvedJavaType boxingClass = metaAccess.lookupJavaType(primitive.getKind().toBoxedJavaClass());
+                    klass = ((HotSpotResolvedObjectType) boxingClass).klass();
+                    HotSpotResolvedJavaField[] a = (HotSpotResolvedJavaField[]) boxingClass.getStaticFields();
+                    HotSpotResolvedJavaField typeField = null;
+                    for (HotSpotResolvedJavaField f : a) {
+                        if (f.getName().equals("TYPE")) {
+                            typeField = f;
+                            break;
+                        }
                     }
-                }
-                if (typeField == null) {
-                    throw new GraalInternalError("Can't find TYPE field in class");
+                    if (typeField == null) {
+                        throw new GraalInternalError("Can't find TYPE field in class");
+                    }
+                    location = ConstantLocationNode.create(FINAL_LOCATION, Kind.Object, typeField.offset(), graph);
                 }
-                location = ConstantLocationNode.create(FINAL_LOCATION, Kind.Object, typeField.offset(), graph);
-            }
-            ConstantNode klassNode = ConstantNode.forConstant(klass, metaAccess, graph);
+                ConstantNode klassNode = ConstantNode.forConstant(klass, metaAccess, graph);
 
-            Stamp stamp = StampFactory.exactNonNull(metaAccess.lookupJavaType(Class.class));
-            FloatingReadNode freadNode = graph.unique(FloatingReadNode.create(klassNode, location, null, stamp));
+                Stamp stamp = StampFactory.exactNonNull(metaAccess.lookupJavaType(Class.class));
+                FloatingReadNode freadNode = graph.unique(FloatingReadNode.create(klassNode, location, null, stamp));
 
-            if (HotSpotObjectConstantImpl.isCompressed(constant)) {
-                return CompressionNode.compress(freadNode, oopEncoding);
-            } else {
-                return freadNode;
+                if (((HotSpotObjectConstant) constant).isCompressed()) {
+                    return CompressionNode.compress(freadNode, oopEncoding);
+                } else {
+                    return freadNode;
+                }
             }
         }
         return null;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CallSiteTargetNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CallSiteTargetNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.hotspot.replacements;
 
-import java.lang.invoke.*;
-
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
@@ -51,15 +49,11 @@
 
     private ConstantNode getConstantCallTarget(MetaAccessProvider metaAccess, Assumptions assumptions) {
         if (getCallSite().isConstant() && !getCallSite().isNullConstant()) {
-            CallSite callSite = (CallSite) HotSpotObjectConstantImpl.asObject(getCallSite().asJavaConstant());
-            MethodHandle target = callSite.getTarget();
-            if (!(callSite instanceof ConstantCallSite)) {
-                if (assumptions == null || !assumptions.useOptimisticAssumptions()) {
-                    return null;
-                }
-                assumptions.record(new Assumptions.CallSiteTargetValue(callSite, target));
+            HotSpotObjectConstant c = (HotSpotObjectConstant) getCallSite().asConstant();
+            JavaConstant target = c.getCallSiteTarget(assumptions);
+            if (target != null) {
+                return ConstantNode.forConstant(target, metaAccess);
             }
-            return ConstantNode.forConstant(HotSpotObjectConstantImpl.forObject(target), metaAccess, graph());
         }
         return null;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CompositeValueClassSubstitutions.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CompositeValueClassSubstitutions.java	Thu Nov 06 20:14:47 2014 +0100
@@ -55,13 +55,13 @@
             super(invoke);
         }
 
-        @SuppressWarnings("unchecked")
         @Override
         protected JavaConstant evaluate(JavaConstant param, MetaAccessProvider metaAccess) {
             if (param.isNull() || ImmutableCode.getValue()) {
                 return null;
             }
-            return HotSpotObjectConstantImpl.forObject(CompositeValueClass.get((Class<? extends CompositeValue>) HotSpotObjectConstantImpl.asObject(param)));
+            HotSpotObjectConstant c = (HotSpotObjectConstant) param;
+            return c.getCompositeValueClass();
         }
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotNodeClassSubstitutions.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotNodeClassSubstitutions.java	Thu Nov 06 20:14:47 2014 +0100
@@ -60,7 +60,8 @@
             if (param.isNull() || ImmutableCode.getValue()) {
                 return null;
             }
-            return HotSpotObjectConstantImpl.forObject(NodeClass.get((Class<?>) HotSpotObjectConstantImpl.asObject(param)));
+            HotSpotObjectConstant c = (HotSpotObjectConstant) param;
+            return c.getNodeClass();
         }
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/SystemIdentityHashCodeNode.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/SystemIdentityHashCodeNode.java	Thu Nov 06 20:14:47 2014 +0100
@@ -43,6 +43,10 @@
 
     @Override
     protected JavaConstant evaluate(JavaConstant param, MetaAccessProvider metaAccess) {
-        return ImmutableCode.getValue() || param.isNull() ? null : JavaConstant.forInt(System.identityHashCode(HotSpotObjectConstantImpl.asObject(param)));
+        if (ImmutableCode.getValue() || param.isNull()) {
+            return null;
+        }
+        HotSpotObjectConstant c = (HotSpotObjectConstant) param;
+        return JavaConstant.forInt(c.getIdentityHashCode());
     }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Replacements.java	Thu Nov 06 16:27:21 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Replacements.java	Thu Nov 06 20:14:47 2014 +0100
@@ -33,7 +33,7 @@
 /**
  * Interface for managing replacements.
  */
-public interface Replacements extends Remote {
+public interface Replacements extends Remote{
 
     /**
      * Gets the snippet graph derived from a given method.