changeset 18188:8652481a1110

Introduce new Constant interface for use in high-level graph.
author Roland Schatz <roland.schatz@oracle.com>
date Thu, 30 Oct 2014 13:03:33 +0100
parents 9619ba4daf4c
children e75eb4720d4e
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Constant.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/JavaConstant.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/VMConstant.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/calc/Condition.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractObjectStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ArithmeticOpTable.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSenReduTest.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/deopt/CompiledMethodTest.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/DataPatchInConstantsTest.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstant.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstant.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyCallNode.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/NegateNodeCanonicalizationTest.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AddNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/DivNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerEqualsNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerLessThanNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/MulNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SubNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java
diffstat 49 files changed, 313 insertions(+), 196 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeCacheProvider.java	Thu Oct 30 13:03:33 2014 +0100
@@ -85,10 +85,9 @@
     boolean needsDataPatch(JavaConstant constant);
 
     /**
-     * Create a {@link Data} item for a {@link JavaConstant}, that can be used in a
-     * {@link DataPatch}.
+     * Create a {@link Data} item for a {@link Constant}, that can be used in a {@link DataPatch}.
      */
-    Data createDataItem(JavaConstant constant);
+    Data createDataItem(Constant constant);
 
     /**
      * Gets a description of the target architecture.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Constant.java	Thu Oct 30 13:03:33 2014 +0100
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.api.meta;
+
+/**
+ * Represents a compile-time constant (boxed) value within the compiler.
+ */
+public interface Constant {
+
+    boolean isDefaultForKind();
+
+    String toValueString();
+}
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/ConstantReflectionProvider.java	Thu Oct 30 13:03:33 2014 +0100
@@ -38,7 +38,7 @@
      * {@link Boolean#FALSE false} if they are different. Returns {@code null} if the constants
      * cannot be compared at this point.
      */
-    Boolean constantEquals(JavaConstant x, JavaConstant y);
+    Boolean constantEquals(Constant x, Constant y);
 
     /**
      * Returns the length of the array constant. Returns {@code null} if the constant is not an
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/JavaConstant.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/JavaConstant.java	Thu Oct 30 13:03:33 2014 +0100
@@ -25,10 +25,10 @@
 /**
  * Represents a constant (boxed) value, such as an integer, floating point number, or object
  * reference, within the compiler and across the compiler/runtime interface. Exports a set of
- * {@code Constant} instances that represent frequently used constant values, such as
+ * {@code JavaConstant} instances that represent frequently used constant values, such as
  * {@link #NULL_OBJECT}.
  */
-public abstract class JavaConstant extends Value {
+public abstract class JavaConstant extends Value implements Constant {
 
     private static final long serialVersionUID = -6355452536852663986L;
 
@@ -61,6 +61,14 @@
      */
     public abstract boolean isNull();
 
+    public static boolean isNull(Constant c) {
+        if (c instanceof JavaConstant) {
+            return ((JavaConstant) c).isNull();
+        } else {
+            return false;
+        }
+    }
+
     /**
      * Checks whether this constant is non-null.
      *
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/VMConstant.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/VMConstant.java	Thu Oct 30 13:03:33 2014 +0100
@@ -22,5 +22,5 @@
  */
 package com.oracle.graal.api.meta;
 
-public interface VMConstant {
+public interface VMConstant extends Constant {
 }
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/calc/Condition.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/calc/Condition.java	Thu Oct 30 13:03:33 2014 +0100
@@ -336,16 +336,18 @@
      * @return true if the comparison is known to be true, false if the comparison is known to be
      *         false
      */
-    public boolean foldCondition(JavaConstant lt, JavaConstant rt, ConstantReflectionProvider constantReflection, boolean unorderedIsTrue) {
+    public boolean foldCondition(Constant lt, Constant rt, ConstantReflectionProvider constantReflection, boolean unorderedIsTrue) {
         if (lt instanceof PrimitiveConstant) {
-            switch (lt.getKind()) {
+            PrimitiveConstant lp = (PrimitiveConstant) lt;
+            PrimitiveConstant rp = (PrimitiveConstant) rt;
+            switch (lp.getKind()) {
                 case Boolean:
                 case Byte:
                 case Char:
                 case Short:
                 case Int: {
-                    int x = lt.asInt();
-                    int y = rt.asInt();
+                    int x = lp.asInt();
+                    int y = rp.asInt();
                     switch (this) {
                         case EQ:
                             return x == y;
@@ -372,8 +374,8 @@
                     }
                 }
                 case Long: {
-                    long x = lt.asLong();
-                    long y = rt.asLong();
+                    long x = lp.asLong();
+                    long y = rp.asLong();
                     switch (this) {
                         case EQ:
                             return x == y;
@@ -400,8 +402,8 @@
                     }
                 }
                 case Float: {
-                    float x = lt.asFloat();
-                    float y = rt.asFloat();
+                    float x = lp.asFloat();
+                    float y = rp.asFloat();
                     if (Float.isNaN(x) || Float.isNaN(y)) {
                         return unorderedIsTrue;
                     }
@@ -423,8 +425,8 @@
                     }
                 }
                 case Double: {
-                    double x = lt.asDouble();
-                    double y = rt.asDouble();
+                    double x = lp.asDouble();
+                    double y = rp.asDouble();
                     if (Double.isNaN(x) || Double.isNaN(y)) {
                         return unorderedIsTrue;
                     }
@@ -446,7 +448,7 @@
                     }
                 }
                 default:
-                    throw new GraalInternalError("expected value kind %s while folding condition: %s", lt.getKind(), this);
+                    throw new GraalInternalError("expected value kind %s while folding condition: %s", lp.getKind(), this);
             }
         } else {
             Boolean equal = constantReflection.constantEquals(lt, rt);
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractObjectStamp.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractObjectStamp.java	Thu Oct 30 13:03:33 2014 +0100
@@ -53,9 +53,10 @@
     }
 
     @Override
-    public Stamp constant(JavaConstant c, MetaAccessProvider meta) {
-        ResolvedJavaType constType = c.isNull() ? null : meta.lookupJavaType(c);
-        return copyWith(constType, c.isNonNull(), c.isNonNull(), c.isNull());
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
+        JavaConstant jc = (JavaConstant) c;
+        ResolvedJavaType constType = jc.isNull() ? null : meta.lookupJavaType(jc);
+        return copyWith(constType, jc.isNonNull(), jc.isNonNull(), jc.isNull());
     }
 
     @Override
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ArithmeticOpTable.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ArithmeticOpTable.java	Thu Oct 30 13:03:33 2014 +0100
@@ -278,9 +278,9 @@
         }
 
         /**
-         * Apply the operation to a {@link JavaConstant}.
+         * Apply the operation to a {@link Constant}.
          */
-        public abstract JavaConstant foldConstant(JavaConstant value);
+        public abstract Constant foldConstant(Constant value);
 
         /**
          * Apply the operation to a {@link Stamp}.
@@ -359,9 +359,9 @@
         }
 
         /**
-         * Apply the operation to two {@linkplain JavaConstant Constants}.
+         * Apply the operation to two {@linkplain Constant Constants}.
          */
-        public abstract JavaConstant foldConstant(JavaConstant a, JavaConstant b);
+        public abstract Constant foldConstant(Constant a, Constant b);
 
         /**
          * Apply the operation to two {@linkplain Stamp Stamps}.
@@ -388,13 +388,13 @@
         }
 
         /**
-         * Check whether a {@link JavaConstant} is a neutral element for this operation. A neutral
+         * Check whether a {@link Constant} is a neutral element for this operation. A neutral
          * element is any element {@code n} where {@code a . n == a} for all a.
          *
-         * @param n the {@link JavaConstant} that should be tested
+         * @param n the {@link Constant} that should be tested
          * @return true iff for all {@code a}: {@code a . n == a}
          */
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant n) {
             return false;
         }
 
@@ -407,7 +407,7 @@
          * @return a unique {@code z} such that {@code z == a . a} for each {@code a} in
          *         {@code stamp} if it exists, otherwise {@code null}
          */
-        public JavaConstant getZero(Stamp stamp) {
+        public Constant getZero(Stamp stamp) {
             return null;
         }
     }
@@ -453,7 +453,7 @@
             super(op);
         }
 
-        public abstract JavaConstant foldConstant(int inputBits, int resultBits, JavaConstant value);
+        public abstract Constant foldConstant(int inputBits, int resultBits, Constant value);
 
         public abstract Stamp foldStamp(int inputBits, int resultBits, Stamp stamp);
     }
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java	Thu Oct 30 13:03:33 2014 +0100
@@ -61,9 +61,10 @@
     }
 
     @Override
-    public Stamp constant(JavaConstant c, MetaAccessProvider meta) {
-        assert c.getKind().isNumericFloat() && c.getKind().getBitCount() == getBits();
-        return StampFactory.forConstant(c);
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
+        JavaConstant jc = (JavaConstant) c;
+        assert jc.getKind().isNumericFloat() && jc.getKind().getBitCount() == getBits();
+        return StampFactory.forConstant(jc);
     }
 
     @Override
@@ -260,7 +261,8 @@
     new UnaryOp.Neg() {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             switch (value.getKind()) {
                 case Float:
                     return JavaConstant.forFloat(-value.asFloat());
@@ -281,7 +283,9 @@
     new BinaryOp.Add(false, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             switch (a.getKind()) {
                 case Float:
@@ -300,7 +304,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             switch (n.getKind()) {
                 case Float:
                     return Float.compare(n.asFloat(), -0.0f) == 0;
@@ -315,7 +320,9 @@
     new BinaryOp.Sub(false, false) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             switch (a.getKind()) {
                 case Float:
@@ -334,7 +341,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             switch (n.getKind()) {
                 case Float:
                     return Float.compare(n.asFloat(), 0.0f) == 0;
@@ -349,7 +357,9 @@
     new BinaryOp.Mul(false, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             switch (a.getKind()) {
                 case Float:
@@ -368,7 +378,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             switch (n.getKind()) {
                 case Float:
                     return Float.compare(n.asFloat(), 1.0f) == 0;
@@ -383,7 +394,9 @@
     new BinaryOp.Div(false, false) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             switch (a.getKind()) {
                 case Float:
@@ -402,7 +415,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             switch (n.getKind()) {
                 case Float:
                     return Float.compare(n.asFloat(), 1.0f) == 0;
@@ -417,7 +431,9 @@
     new BinaryOp.Rem(false, false) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             switch (a.getKind()) {
                 case Float:
@@ -443,7 +459,8 @@
     new FloatConvertOp(F2I) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forInt((int) value.asFloat());
         }
 
@@ -457,7 +474,8 @@
     new FloatConvertOp(F2L) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forLong((long) value.asFloat());
         }
 
@@ -471,7 +489,8 @@
     new FloatConvertOp(D2I) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forInt((int) value.asDouble());
         }
 
@@ -485,7 +504,8 @@
     new FloatConvertOp(D2L) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forLong((long) value.asDouble());
         }
 
@@ -499,7 +519,8 @@
     new FloatConvertOp(F2D) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forDouble(value.asFloat());
         }
 
@@ -513,7 +534,8 @@
     new FloatConvertOp(D2F) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forFloat((float) value.asDouble());
         }
 
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IllegalStamp.java	Thu Oct 30 13:03:33 2014 +0100
@@ -55,7 +55,7 @@
     }
 
     @Override
-    public Stamp constant(JavaConstant c, MetaAccessProvider meta) {
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
         throw GraalInternalError.shouldNotReachHere("illegal stamp has no value");
     }
 
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/IntegerStamp.java	Thu Oct 30 13:03:33 2014 +0100
@@ -89,8 +89,8 @@
     }
 
     @Override
-    public Stamp constant(JavaConstant c, MetaAccessProvider meta) {
-        long value = c.asLong();
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
+        long value = ((PrimitiveConstant) c).asLong();
         return StampFactory.forInteger(getBits(), value, value);
     }
 
@@ -373,8 +373,9 @@
     new UnaryOp.Neg() {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
-            return JavaConstant.forIntegerKind(value.getKind(), -value.asLong());
+        public Constant foldConstant(Constant value) {
+            PrimitiveConstant c = (PrimitiveConstant) value;
+            return PrimitiveConstant.forIntegerKind(c.getKind(), -c.asLong());
         }
 
         @Override
@@ -393,7 +394,9 @@
     new BinaryOp.Add(true, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() + b.asLong());
         }
@@ -442,7 +445,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             return n.asLong() == 0;
         }
     },
@@ -450,7 +454,9 @@
     new BinaryOp.Sub(true, false) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() - b.asLong());
         }
@@ -461,12 +467,13 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             return n.asLong() == 0;
         }
 
         @Override
-        public JavaConstant getZero(Stamp s) {
+        public Constant getZero(Stamp s) {
             IntegerStamp stamp = (IntegerStamp) s;
             return JavaConstant.forPrimitiveInt(stamp.getBits(), 0);
         }
@@ -475,7 +482,9 @@
     new BinaryOp.Mul(true, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() * b.asLong());
         }
@@ -495,7 +504,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             return n.asLong() == 1;
         }
     },
@@ -503,7 +513,9 @@
     new BinaryOp.Div(true, false) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() / b.asLong());
         }
@@ -523,7 +535,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             return n.asLong() == 1;
         }
     },
@@ -531,7 +544,9 @@
     new BinaryOp.Rem(false, false) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() % b.asLong());
         }
@@ -562,7 +577,8 @@
     new UnaryOp.Not() {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forIntegerKind(value.getKind(), ~value.asLong());
         }
 
@@ -578,7 +594,9 @@
     new BinaryOp.And(true, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() & b.asLong());
         }
@@ -592,7 +610,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             int bits = n.getKind().getBitCount();
             long mask = CodeUtil.mask(bits);
             return (n.asLong() & mask) == mask;
@@ -602,7 +621,9 @@
     new BinaryOp.Or(true, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() | b.asLong());
         }
@@ -616,7 +637,8 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             return n.asLong() == 0;
         }
     },
@@ -624,7 +646,9 @@
     new BinaryOp.Xor(true, true) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant a, JavaConstant b) {
+        public Constant foldConstant(Constant const1, Constant const2) {
+            PrimitiveConstant a = (PrimitiveConstant) const1;
+            PrimitiveConstant b = (PrimitiveConstant) const2;
             assert a.getKind() == b.getKind();
             return JavaConstant.forIntegerKind(a.getKind(), a.asLong() ^ b.asLong());
         }
@@ -642,12 +666,13 @@
         }
 
         @Override
-        public boolean isNeutral(JavaConstant n) {
+        public boolean isNeutral(Constant value) {
+            PrimitiveConstant n = (PrimitiveConstant) value;
             return n.asLong() == 0;
         }
 
         @Override
-        public JavaConstant getZero(Stamp s) {
+        public Constant getZero(Stamp s) {
             IntegerStamp stamp = (IntegerStamp) s;
             return JavaConstant.forPrimitiveInt(stamp.getBits(), 0);
         }
@@ -656,7 +681,8 @@
     new IntegerConvertOp.ZeroExtend() {
 
         @Override
-        public JavaConstant foldConstant(int inputBits, int resultBits, JavaConstant value) {
+        public Constant foldConstant(int inputBits, int resultBits, Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forPrimitiveInt(resultBits, CodeUtil.zeroExtend(value.asLong(), inputBits));
         }
 
@@ -685,7 +711,8 @@
     new IntegerConvertOp.SignExtend() {
 
         @Override
-        public JavaConstant foldConstant(int inputBits, int resultBits, JavaConstant value) {
+        public Constant foldConstant(int inputBits, int resultBits, Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forPrimitiveInt(resultBits, CodeUtil.signExtend(value.asLong(), inputBits));
         }
 
@@ -706,7 +733,8 @@
     new IntegerConvertOp.Narrow() {
 
         @Override
-        public JavaConstant foldConstant(int inputBits, int resultBits, JavaConstant value) {
+        public Constant foldConstant(int inputBits, int resultBits, Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forPrimitiveInt(resultBits, CodeUtil.narrow(value.asLong(), resultBits));
         }
 
@@ -744,7 +772,8 @@
     new FloatConvertOp(I2F) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forFloat(value.asInt());
         }
 
@@ -759,7 +788,8 @@
     new FloatConvertOp(L2F) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forFloat(value.asLong());
         }
 
@@ -774,7 +804,8 @@
     new FloatConvertOp(I2D) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forDouble(value.asInt());
         }
 
@@ -789,7 +820,8 @@
     new FloatConvertOp(L2D) {
 
         @Override
-        public JavaConstant foldConstant(JavaConstant value) {
+        public Constant foldConstant(Constant c) {
+            PrimitiveConstant value = (PrimitiveConstant) c;
             return JavaConstant.forDouble(value.asLong());
         }
 
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/Stamp.java	Thu Oct 30 13:03:33 2014 +0100
@@ -93,7 +93,7 @@
      * If it is not possible to represent single value stamps, this method returns a stamp that
      * includes c, and is otherwise as narrow as possible.
      */
-    public abstract Stamp constant(JavaConstant c, MetaAccessProvider meta);
+    public abstract Stamp constant(Constant c, MetaAccessProvider meta);
 
     /**
      * Test whether two stamps have the same base type.
@@ -112,7 +112,7 @@
      * @return the constant corresponding to the single value of this stamp and null if this stamp
      *         can represent less or more than one value.
      */
-    public JavaConstant asConstant() {
+    public Constant asConstant() {
         return null;
     }
 }
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/VoidStamp.java	Thu Oct 30 13:03:33 2014 +0100
@@ -103,7 +103,7 @@
     }
 
     @Override
-    public Stamp constant(JavaConstant c, MetaAccessProvider meta) {
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
         throw GraalInternalError.shouldNotReachHere("void stamp has no value");
     }
 
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSenReduTest.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSenReduTest.java	Thu Oct 30 13:03:33 2014 +0100
@@ -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
@@ -162,7 +162,7 @@
         ConstantNode c2 = (ConstantNode) iter.next().result();
 
         assertDeepEquals(c1, c2);
-        assertDeepEquals(0, c1.getValue().asInt());
+        assertDeepEquals(0, c1.asJavaConstant().asInt());
     }
 
     @Test
@@ -222,7 +222,7 @@
         ConstantNode c2 = (ConstantNode) iter.next().result();
 
         assertDeepEquals(c1, c2);
-        Assert.assertTrue(c1.getValue().isNull());
+        Assert.assertTrue(c1.asJavaConstant().isNull());
     }
 
     /*
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/deopt/CompiledMethodTest.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/deopt/CompiledMethodTest.java	Thu Oct 30 13:03:33 2014 +0100
@@ -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
@@ -56,7 +56,7 @@
         new DeadCodeEliminationPhase().apply(graph);
 
         for (ConstantNode node : ConstantNode.getConstantNodes(graph)) {
-            if (node.getKind() == Kind.Object && " ".equals(getSnippetReflection().asObject(node.getValue()))) {
+            if (node.getKind() == Kind.Object && " ".equals(getSnippetReflection().asObject(node.asJavaConstant()))) {
                 node.replace(graph, ConstantNode.forConstant(getSnippetReflection().forObject("-"), getMetaAccess(), graph));
             }
         }
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/DebugInfoBuilder.java	Thu Oct 30 13:03:33 2014 +0100
@@ -209,7 +209,7 @@
                 ValueNode unproxied = GraphUtil.unproxify(value);
                 if (unproxied instanceof ConstantNode) {
                     STATE_CONSTANTS.increment();
-                    return ((ConstantNode) unproxied).getValue();
+                    return unproxied.asJavaConstant();
 
                 } else if (value != null) {
                     STATE_VARIABLES.increment();
--- a/graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/DataPatchInConstantsTest.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64.test/src/com/oracle/graal/hotspot/amd64/test/DataPatchInConstantsTest.java	Thu Oct 30 13:03:33 2014 +0100
@@ -182,11 +182,11 @@
 
     private static class LoadThroughPatchOp extends LIRInstructionBase {
 
-        final JavaConstant c;
+        final Constant c;
         final boolean compressed;
         @Def({REG}) AllocatableValue result;
 
-        LoadThroughPatchOp(JavaConstant c, boolean compressed, AllocatableValue result) {
+        LoadThroughPatchOp(Constant c, boolean compressed, AllocatableValue result) {
             this.c = c;
             this.compressed = compressed;
             this.result = result;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCodeCacheProvider.java	Thu Oct 30 13:03:33 2014 +0100
@@ -256,7 +256,7 @@
         return constant instanceof HotSpotMetaspaceConstant;
     }
 
-    public Data createDataItem(JavaConstant constant) {
+    public Data createDataItem(Constant constant) {
         int size;
         DataBuilder builder;
         if (constant instanceof VMConstant) {
@@ -267,8 +267,9 @@
                 compressed = HotSpotObjectConstant.isCompressed(constant);
                 raw = 0xDEADDEADDEADDEADL;
             } else if (constant instanceof HotSpotMetaspaceConstant) {
-                compressed = constant.getKind() != target.wordKind;
-                raw = constant.asLong();
+                HotSpotMetaspaceConstant meta = (HotSpotMetaspaceConstant) constant;
+                compressed = meta.getKind() != target.wordKind;
+                raw = meta.asLong();
             } else {
                 throw GraalInternalError.shouldNotReachHere();
             }
@@ -286,13 +287,14 @@
                     buffer.putLong(raw);
                 };
             }
-        } else if (constant.isNull()) {
+        } else if (JavaConstant.isNull(constant)) {
             boolean compressed = HotSpotObjectConstant.isCompressed(constant);
             size = target.getSizeInBytes(compressed ? Kind.Int : target.wordKind);
             builder = DataBuilder.zero(size);
         } else if (constant instanceof PrimitiveConstant) {
-            size = target.getSizeInBytes(constant.getKind());
-            builder = DataBuilder.primitive((PrimitiveConstant) constant);
+            PrimitiveConstant prim = (PrimitiveConstant) constant;
+            size = target.getSizeInBytes(prim.getKind());
+            builder = DataBuilder.primitive(prim);
         } else {
             throw GraalInternalError.shouldNotReachHere();
         }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstant.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstant.java	Thu Oct 30 13:03:33 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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,8 +22,10 @@
  */
 package com.oracle.graal.hotspot.meta;
 
+import com.oracle.graal.api.meta.*;
+
 /**
  * Marker interface for hotspot specific constants.
  */
-public interface HotSpotConstant {
+public interface HotSpotConstant extends Constant {
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantReflectionProvider.java	Thu Oct 30 13:03:33 2014 +0100
@@ -43,7 +43,7 @@
     }
 
     @Override
-    public Boolean constantEquals(JavaConstant x, JavaConstant y) {
+    public Boolean constantEquals(Constant x, Constant y) {
         return x.equals(y);
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstant.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstant.java	Thu Oct 30 13:03:33 2014 +0100
@@ -48,26 +48,26 @@
         }
     }
 
-    public static Object asObject(JavaConstant constant) {
-        if (constant.isNull()) {
+    public static Object asObject(Constant constant) {
+        if (JavaConstant.isNull(constant)) {
             return null;
         } else {
             return ((HotSpotObjectConstant) constant).object;
         }
     }
 
-    public static Object asBoxedValue(JavaConstant constant) {
-        if (constant.isNull()) {
+    public static Object asBoxedValue(Constant constant) {
+        if (JavaConstant.isNull(constant)) {
             return null;
         } else if (constant instanceof HotSpotObjectConstant) {
             return ((HotSpotObjectConstant) constant).object;
         } else {
-            return constant.asBoxedPrimitive();
+            return ((JavaConstant) constant).asBoxedPrimitive();
         }
     }
 
-    public static boolean isCompressed(JavaConstant constant) {
-        if (constant.isNull()) {
+    public static boolean isCompressed(Constant constant) {
+        if (JavaConstant.isNull(constant)) {
             return HotSpotCompressedNullConstant.NULL_OBJECT.equals(constant);
         } else {
             return ((HotSpotObjectConstant) constant).compressed;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -73,34 +73,36 @@
         return input.graph().unique(CompressionNode.create(CompressionOp.Uncompress, input, encoding));
     }
 
-    private static JavaConstant compress(JavaConstant c, CompressEncoding encoding) {
+    private static Constant compress(Constant c, CompressEncoding encoding) {
         if (JavaConstant.NULL_OBJECT.equals(c)) {
             return HotSpotCompressedNullConstant.COMPRESSED_NULL;
         } else if (c instanceof HotSpotObjectConstant) {
             return ((HotSpotObjectConstant) c).compress();
         } else if (c instanceof HotSpotMetaspaceConstant) {
-            assert c.getKind() == Kind.Long;
-            return HotSpotMetaspaceConstant.forMetaspaceObject(Kind.Int, encoding.compress(c.asLong()), HotSpotMetaspaceConstant.getMetaspaceObject(c), true);
+            HotSpotMetaspaceConstant meta = (HotSpotMetaspaceConstant) c;
+            assert meta.getKind() == Kind.Long;
+            return HotSpotMetaspaceConstant.forMetaspaceObject(Kind.Int, encoding.compress(meta.asLong()), HotSpotMetaspaceConstant.getMetaspaceObject(meta), true);
         } else {
             throw GraalInternalError.shouldNotReachHere("invalid constant input for compress op: " + c);
         }
     }
 
-    private static JavaConstant uncompress(JavaConstant c, CompressEncoding encoding) {
+    private static Constant uncompress(Constant c, CompressEncoding encoding) {
         if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) {
             return JavaConstant.NULL_OBJECT;
         } else if (c instanceof HotSpotObjectConstant) {
             return ((HotSpotObjectConstant) c).uncompress();
         } else if (c instanceof HotSpotMetaspaceConstant) {
-            assert c.getKind() == Kind.Int;
-            return HotSpotMetaspaceConstant.forMetaspaceObject(Kind.Long, encoding.uncompress(c.asInt()), HotSpotMetaspaceConstant.getMetaspaceObject(c), false);
+            HotSpotMetaspaceConstant meta = (HotSpotMetaspaceConstant) c;
+            assert meta.getKind() == Kind.Int;
+            return HotSpotMetaspaceConstant.forMetaspaceObject(Kind.Long, encoding.uncompress(meta.asInt()), HotSpotMetaspaceConstant.getMetaspaceObject(meta), false);
         } else {
             throw GraalInternalError.shouldNotReachHere("invalid constant input for uncompress op: " + c);
         }
     }
 
     @Override
-    public JavaConstant convert(JavaConstant c) {
+    public Constant convert(Constant c) {
         switch (op) {
             case Compress:
                 return compress(c, encoding);
@@ -112,7 +114,7 @@
     }
 
     @Override
-    public JavaConstant reverse(JavaConstant c) {
+    public Constant reverse(Constant c) {
         switch (op) {
             case Compress:
                 return uncompress(c, encoding);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyCallNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ArrayCopyCallNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -193,8 +193,8 @@
             // Can treat as disjoint
             disjoint = true;
         }
-        JavaConstant constantSrc = srcPos.stamp().asConstant();
-        JavaConstant constantDst = destPos.stamp().asConstant();
+        PrimitiveConstant constantSrc = (PrimitiveConstant) srcPos.stamp().asConstant();
+        PrimitiveConstant constantDst = (PrimitiveConstant) destPos.stamp().asConstant();
         if (constantSrc != null && constantDst != null) {
             if (!aligned) {
                 aligned = isHeapWordAligned(constantSrc, componentKind) && isHeapWordAligned(constantDst, componentKind);
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/CompilationResultBuilder.java	Thu Oct 30 13:03:33 2014 +0100
@@ -80,7 +80,7 @@
 
     private List<ExceptionInfo> exceptionInfoList;
 
-    private final IdentityHashMap<JavaConstant, Data> dataCache;
+    private final IdentityHashMap<Constant, Data> dataCache;
 
     public CompilationResultBuilder(CodeCacheProvider codeCache, ForeignCallsProvider foreignCalls, FrameMap frameMap, Assembler asm, FrameContext frameContext, CompilationResult compilationResult) {
         this.target = codeCache.getTarget();
@@ -177,7 +177,7 @@
         return asm.getPlaceholder();
     }
 
-    public AbstractAddress recordDataReferenceInCode(JavaConstant constant, int alignment) {
+    public AbstractAddress recordDataReferenceInCode(Constant constant, int alignment) {
         assert constant != null;
         Debug.log("Constant reference in code: pos = %d, data = %s", asm.position(), constant);
         Data data = dataCache.get(constant);
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java	Thu Oct 30 13:03:33 2014 +0100
@@ -118,11 +118,12 @@
     }
 
     @Override
-    public Value emitLoadConstant(LIRKind kind, JavaConstant constant) {
-        if (canInlineConstant(constant)) {
-            return constant;
+    public Value emitLoadConstant(LIRKind kind, Constant constant) {
+        JavaConstant javaConstant = (JavaConstant) constant;
+        if (canInlineConstant(javaConstant)) {
+            return javaConstant;
         } else {
-            return emitMove(constant);
+            return emitMove(javaConstant);
         }
     }
 
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java	Thu Oct 30 13:03:33 2014 +0100
@@ -52,7 +52,7 @@
 
     void doBlockEnd(AbstractBlock<?> block);
 
-    Value emitLoadConstant(LIRKind kind, JavaConstant constant);
+    Value emitLoadConstant(LIRKind kind, Constant constant);
 
     Value emitLoad(LIRKind kind, Value address, LIRFrameState state);
 
--- a/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/NegateNodeCanonicalizationTest.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/NegateNodeCanonicalizationTest.java	Thu Oct 30 13:03:33 2014 +0100
@@ -48,7 +48,7 @@
         for (byte i : a) {
             ConstantNode node = ConstantNode.forByte(i, graph);
             JavaConstant expected = JavaConstant.forInt(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
@@ -58,7 +58,7 @@
         for (char i : a) {
             ConstantNode node = ConstantNode.forChar(i, graph);
             JavaConstant expected = JavaConstant.forInt(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
@@ -68,7 +68,7 @@
         for (short i : a) {
             ConstantNode node = ConstantNode.forShort(i, graph);
             JavaConstant expected = JavaConstant.forInt(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
@@ -78,7 +78,7 @@
         for (int i : a) {
             ConstantNode node = ConstantNode.forInt(i, graph);
             JavaConstant expected = JavaConstant.forInt(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
@@ -88,7 +88,7 @@
         for (long i : a) {
             ConstantNode node = ConstantNode.forLong(i, graph);
             JavaConstant expected = JavaConstant.forLong(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
@@ -98,7 +98,7 @@
         for (float i : a) {
             ConstantNode node = ConstantNode.forFloat(i, graph);
             JavaConstant expected = JavaConstant.forFloat(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
@@ -108,7 +108,7 @@
         for (double i : a) {
             ConstantNode node = ConstantNode.forDouble(i, graph);
             JavaConstant expected = JavaConstant.forDouble(-i);
-            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asJavaConstant()));
+            assertEquals(expected, ArithmeticOpTable.forStamp(node.stamp()).getNeg().foldConstant(node.asConstant()));
         }
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -36,14 +36,14 @@
 import com.oracle.graal.nodes.spi.*;
 
 /**
- * The {@code ConstantNode} represents a {@link JavaConstant constant}.
+ * The {@code ConstantNode} represents a {@link Constant constant}.
  */
 @NodeInfo(shortName = "Const", nameTemplate = "Const({p#rawvalue})")
 public class ConstantNode extends FloatingNode implements LIRLowerable {
 
     private static final DebugMetric ConstantNodes = Debug.metric("ConstantNodes");
 
-    protected final JavaConstant value;
+    protected final Constant value;
 
     private static ConstantNode createPrimitive(JavaConstant value) {
         assert value.getKind() != Kind.Object;
@@ -55,11 +55,11 @@
      *
      * @param value the constant
      */
-    public static ConstantNode create(JavaConstant value, Stamp stamp) {
+    public static ConstantNode create(Constant value, Stamp stamp) {
         return new ConstantNode(value, stamp);
     }
 
-    protected ConstantNode(JavaConstant value, Stamp stamp) {
+    protected ConstantNode(Constant value, Stamp stamp) {
         super(stamp);
         assert stamp != null;
         this.value = value;
@@ -69,7 +69,7 @@
     /**
      * @return the constant value represented by this node
      */
-    public JavaConstant getValue() {
+    public Constant getValue() {
         return value;
     }
 
@@ -92,7 +92,7 @@
     @Override
     public void generate(NodeLIRBuilderTool gen) {
         if (onlyUsedInVirtualState()) {
-            gen.setResult(this, value);
+            gen.setResult(this, (JavaConstant) value);
         } else {
             LIRKind kind = gen.getLIRGeneratorTool().getLIRKind(stamp());
             gen.setResult(this, gen.getLIRGeneratorTool().emitLoadConstant(kind, value));
@@ -132,11 +132,11 @@
         }
     }
 
-    public static ConstantNode forConstant(Stamp stamp, JavaConstant constant, MetaAccessProvider metaAccess, StructuredGraph graph) {
+    public static ConstantNode forConstant(Stamp stamp, Constant constant, MetaAccessProvider metaAccess, StructuredGraph graph) {
         return graph.unique(ConstantNode.create(constant, stamp.constant(constant, metaAccess)));
     }
 
-    public static ConstantNode forConstant(Stamp stamp, JavaConstant constant, MetaAccessProvider metaAccess) {
+    public static ConstantNode forConstant(Stamp stamp, Constant constant, MetaAccessProvider metaAccess) {
         return ConstantNode.create(constant, stamp.constant(constant, metaAccess));
     }
 
@@ -173,14 +173,16 @@
     /**
      * Returns a node for a primitive of a given type.
      */
-    public static ConstantNode forPrimitive(Stamp stamp, JavaConstant constant) {
+    public static ConstantNode forPrimitive(Stamp stamp, Constant constant) {
         if (stamp instanceof IntegerStamp) {
-            assert constant.getKind().isNumericInteger() && stamp.getStackKind() == constant.getKind().getStackKind();
+            PrimitiveConstant primitive = (PrimitiveConstant) constant;
+            assert primitive.getKind().isNumericInteger() && stamp.getStackKind() == primitive.getKind().getStackKind();
             IntegerStamp istamp = (IntegerStamp) stamp;
-            return forIntegerBits(istamp.getBits(), constant);
+            return forIntegerBits(istamp.getBits(), primitive);
         } else if (stamp instanceof FloatStamp) {
-            assert constant.getKind().isNumericFloat() && stamp.getStackKind() == constant.getKind();
-            return forConstant(constant, null);
+            PrimitiveConstant primitive = (PrimitiveConstant) constant;
+            assert primitive.getKind().isNumericFloat() && stamp.getStackKind() == primitive.getKind();
+            return forConstant(primitive, null);
         } else {
             assert !(stamp instanceof AbstractObjectStamp);
             return ConstantNode.create(constant, stamp.constant(constant, null));
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -279,8 +279,8 @@
         assert trueSuccessor().usages().isEmpty() && falseSuccessor().usages().isEmpty();
         if (condition() instanceof IntegerLessThanNode) {
             IntegerLessThanNode lessThan = (IntegerLessThanNode) condition();
-            JavaConstant y = lessThan.getY().stamp().asConstant();
-            if (y != null && y.asLong() == 0 && falseSuccessor().next() instanceof IfNode) {
+            Constant y = lessThan.getY().stamp().asConstant();
+            if (y instanceof PrimitiveConstant && ((PrimitiveConstant) y).asLong() == 0 && falseSuccessor().next() instanceof IfNode) {
                 IfNode ifNode2 = (IfNode) falseSuccessor().next();
                 if (ifNode2.condition() instanceof IntegerLessThanNode) {
                     IntegerLessThanNode lessThan2 = (IntegerLessThanNode) ifNode2.condition();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -115,7 +115,7 @@
      * @return the {@link JavaConstant} represented by this value if it is a constant; {@code null}
      *         otherwise
      */
-    public final JavaConstant asJavaConstant() {
+    public final Constant asConstant() {
         if (this instanceof ConstantNode) {
             return ((ConstantNode) this).getValue();
         } else {
@@ -123,6 +123,15 @@
         }
     }
 
+    public final JavaConstant asJavaConstant() {
+        Constant value = asConstant();
+        if (value instanceof JavaConstant) {
+            return (JavaConstant) value;
+        } else {
+            return null;
+        }
+    }
+
     public ValueNode asNode() {
         return this;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AddNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AddNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -72,7 +72,7 @@
             }
         }
         if (forY.isConstant()) {
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (op.isNeutral(c)) {
                 return forX;
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -58,13 +58,13 @@
             return AndNode.create(forY, forX);
         }
         if (forY.isConstant()) {
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (getOp(forX, forY).isNeutral(c)) {
                 return forX;
             }
 
-            if (c.getKind().isNumericInteger()) {
-                long rawY = c.asLong();
+            if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getKind().isNumericInteger()) {
+                long rawY = ((PrimitiveConstant) c).asLong();
                 long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp()));
                 if ((rawY & mask) == 0) {
                     return ConstantNode.forIntegerStamp(stamp(), 0);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -58,7 +58,7 @@
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
         if (forX.isConstant() && forY.isConstant()) {
-            JavaConstant ret = getOp(forX, forY).foldConstant(forX.asJavaConstant(), forY.asJavaConstant());
+            Constant ret = getOp(forX, forY).foldConstant(forX.asConstant(), forY.asConstant());
             return ConstantNode.forPrimitive(stamp(), ret);
         }
         return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/CompareNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -62,7 +62,7 @@
      */
     public abstract boolean unorderedIsTrue();
 
-    private ValueNode optimizeConditional(JavaConstant constant, ConditionalNode conditionalNode, ConstantReflectionProvider constantReflection, Condition cond) {
+    private ValueNode optimizeConditional(Constant constant, ConditionalNode conditionalNode, ConstantReflectionProvider constantReflection, Condition cond) {
         JavaConstant trueConstant = conditionalNode.trueValue().asJavaConstant();
         JavaConstant falseConstant = conditionalNode.falseValue().asJavaConstant();
 
@@ -86,7 +86,7 @@
         return this;
     }
 
-    protected ValueNode optimizeNormalizeCmp(JavaConstant constant, NormalizeCompareNode normalizeNode, boolean mirrored) {
+    protected ValueNode optimizeNormalizeCmp(Constant constant, NormalizeCompareNode normalizeNode, boolean mirrored) {
         throw new GraalInternalError("NormalizeCompareNode connected to %s (%s %s %s)", this, constant, normalizeNode, mirrored);
     }
 
@@ -97,11 +97,11 @@
         }
         ValueNode result;
         if (forX.isConstant()) {
-            if ((result = canonicalizeSymmetricConstant(tool, forX.asJavaConstant(), forY, true)) != this) {
+            if ((result = canonicalizeSymmetricConstant(tool, forX.asConstant(), forY, true)) != this) {
                 return result;
             }
         } else if (forY.isConstant()) {
-            if ((result = canonicalizeSymmetricConstant(tool, forY.asJavaConstant(), forX, false)) != this) {
+            if ((result = canonicalizeSymmetricConstant(tool, forY.asConstant(), forX, false)) != this) {
                 return result;
             }
         } else if (forX instanceof ConvertNode && forY instanceof ConvertNode) {
@@ -116,7 +116,7 @@
 
     protected abstract CompareNode duplicateModified(ValueNode newX, ValueNode newY);
 
-    protected ValueNode canonicalizeSymmetricConstant(CanonicalizerTool tool, JavaConstant constant, ValueNode nonConstant, boolean mirrored) {
+    protected ValueNode canonicalizeSymmetricConstant(CanonicalizerTool tool, Constant constant, ValueNode nonConstant, boolean mirrored) {
         if (nonConstant instanceof ConditionalNode) {
             return optimizeConditional(constant, (ConditionalNode) nonConstant, tool.getConstantReflection(), mirrored ? condition().mirror() : condition());
         } else if (nonConstant instanceof NormalizeCompareNode) {
@@ -135,9 +135,9 @@
         return this;
     }
 
-    private ConstantNode canonicalConvertConstant(CanonicalizerTool tool, ConvertNode convert, JavaConstant constant) {
+    private ConstantNode canonicalConvertConstant(CanonicalizerTool tool, ConvertNode convert, Constant constant) {
         if (convert.preservesOrder(condition())) {
-            JavaConstant reverseConverted = convert.reverse(constant);
+            Constant reverseConverted = convert.reverse(constant);
             if (convert.convert(reverseConverted).equals(constant)) {
                 return ConstantNode.forConstant(convert.getValue().stamp(), reverseConverted, tool.getMetaAccess());
             }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -35,9 +35,9 @@
 
     ValueNode getValue();
 
-    JavaConstant convert(JavaConstant c);
+    Constant convert(Constant c);
 
-    JavaConstant reverse(JavaConstant c);
+    Constant reverse(Constant c);
 
     /**
      * Check whether a conversion is lossless.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/DivNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/DivNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -51,12 +51,12 @@
         }
 
         if (forY.isConstant()) {
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (getOp(forX, forY).isNeutral(c)) {
                 return forX;
             }
-            if (c.getKind().isNumericInteger()) {
-                long i = c.asLong();
+            if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getKind().isNumericInteger()) {
+                long i = ((PrimitiveConstant) c).asLong();
                 boolean signFlip = false;
                 if (i < 0) {
                     i = -i;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -55,12 +55,12 @@
     }
 
     @Override
-    public JavaConstant convert(JavaConstant c) {
+    public Constant convert(Constant c) {
         return getOp(getValue()).foldConstant(c);
     }
 
     @Override
-    public JavaConstant reverse(JavaConstant c) {
+    public Constant reverse(Constant c) {
         FloatConvertOp reverse = ArithmeticOpTable.forStamp(stamp()).getFloatConvert(op.reverse());
         return reverse.foldConstant(c);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -66,12 +66,12 @@
     }
 
     @Override
-    public JavaConstant convert(JavaConstant c) {
+    public Constant convert(Constant c) {
         return getOp(getValue()).foldConstant(getInputBits(), getResultBits(), c);
     }
 
     @Override
-    public JavaConstant reverse(JavaConstant c) {
+    public Constant reverse(Constant c) {
         IntegerConvertOp<REV> reverse = getReverseOp.apply(ArithmeticOpTable.forStamp(stamp()));
         return reverse.foldConstant(getResultBits(), getInputBits(), c);
     }
@@ -86,7 +86,7 @@
         if (inputBits == resultBits) {
             return value;
         } else if (value.isConstant()) {
-            return ConstantNode.forPrimitive(stamp(), convert(forValue.asJavaConstant()));
+            return ConstantNode.forPrimitive(stamp(), convert(forValue.asConstant()));
         } else {
             return this;
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerEqualsNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerEqualsNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -61,8 +61,9 @@
     }
 
     @Override
-    protected ValueNode optimizeNormalizeCmp(JavaConstant constant, NormalizeCompareNode normalizeNode, boolean mirrored) {
-        if (constant.getKind() == Kind.Int && constant.asInt() == 0) {
+    protected ValueNode optimizeNormalizeCmp(Constant constant, NormalizeCompareNode normalizeNode, boolean mirrored) {
+        PrimitiveConstant primitive = (PrimitiveConstant) constant;
+        if (primitive.getKind() == Kind.Int && primitive.asInt() == 0) {
             ValueNode a = mirrored ? normalizeNode.getY() : normalizeNode.getX();
             ValueNode b = mirrored ? normalizeNode.getX() : normalizeNode.getY();
 
@@ -96,8 +97,8 @@
     }
 
     @Override
-    protected ValueNode canonicalizeSymmetricConstant(CanonicalizerTool tool, JavaConstant constant, ValueNode nonConstant, boolean mirrored) {
-        if (constant.asLong() == 0) {
+    protected ValueNode canonicalizeSymmetricConstant(CanonicalizerTool tool, Constant constant, ValueNode nonConstant, boolean mirrored) {
+        if (constant instanceof PrimitiveConstant && ((PrimitiveConstant) constant).asLong() == 0) {
             if (nonConstant instanceof AndNode) {
                 AndNode andNode = (AndNode) nonConstant;
                 return IntegerTestNode.create(andNode.getX(), andNode.getY());
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerLessThanNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerLessThanNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -61,9 +61,10 @@
     }
 
     @Override
-    protected ValueNode optimizeNormalizeCmp(JavaConstant constant, NormalizeCompareNode normalizeNode, boolean mirrored) {
+    protected ValueNode optimizeNormalizeCmp(Constant constant, NormalizeCompareNode normalizeNode, boolean mirrored) {
+        PrimitiveConstant primitive = (PrimitiveConstant) constant;
         assert condition() == Condition.LT;
-        if (constant.getKind() == Kind.Int && constant.asInt() == 0) {
+        if (primitive.getKind() == Kind.Int && primitive.asInt() == 0) {
             ValueNode a = mirrored ? normalizeNode.getY() : normalizeNode.getX();
             ValueNode b = mirrored ? normalizeNode.getX() : normalizeNode.getY();
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/MulNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/MulNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -56,13 +56,13 @@
         }
         if (forY.isConstant()) {
             BinaryOp<Mul> op = getOp(forX, forY);
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (op.isNeutral(c)) {
                 return forX;
             }
 
-            if (c.getKind().isNumericInteger()) {
-                long i = c.asLong();
+            if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getKind().isNumericInteger()) {
+                long i = ((PrimitiveConstant) c).asLong();
                 boolean signFlip = false;
                 if (i < 0) {
                     i = -i;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -58,13 +58,13 @@
             return create(forY, forX);
         }
         if (forY.isConstant()) {
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (getOp(forX, forY).isNeutral(c)) {
                 return forX;
             }
 
-            if (c.getKind().isNumericInteger()) {
-                long rawY = c.asLong();
+            if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getKind().isNumericInteger()) {
+                long rawY = ((PrimitiveConstant) c).asLong();
                 long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp()));
                 if ((rawY & mask) == mask) {
                     return ConstantNode.forIntegerStamp(stamp(), mask);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SubNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/SubNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -54,7 +54,7 @@
 
         BinaryOp<Sub> op = getOp(forX, forY);
         if (GraphUtil.unproxify(forX) == GraphUtil.unproxify(forY)) {
-            JavaConstant zero = op.getZero(forX.stamp());
+            Constant zero = op.getZero(forX.stamp());
             if (zero != null) {
                 return ConstantNode.forPrimitive(stamp(), zero);
             }
@@ -97,7 +97,7 @@
             }
         }
         if (forY.isConstant()) {
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (op.isNeutral(c)) {
                 return forX;
             }
@@ -107,8 +107,8 @@
                     return reassociated;
                 }
             }
-            if (c.getKind().isNumericInteger()) {
-                long i = c.asLong();
+            if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getKind().isNumericInteger()) {
+                long i = ((PrimitiveConstant) c).asLong();
                 if (i < 0 || ((IntegerStamp) StampFactory.forKind(forY.getKind())).contains(-i)) {
                     // Adding a negative is more friendly to the backend since adds are
                     // commutative, so prefer add when it fits.
@@ -116,7 +116,7 @@
                 }
             }
         } else if (forX.isConstant()) {
-            JavaConstant c = forX.asJavaConstant();
+            Constant c = forX.asConstant();
             if (ArithmeticOpTable.forStamp(stamp()).getAdd().isNeutral(c)) {
                 /*
                  * Note that for floating point numbers, + and - have different neutral elements. We
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -53,7 +53,7 @@
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
         if (forValue.isConstant()) {
-            return ConstantNode.forPrimitive(stamp(), getOp(forValue).foldConstant(forValue.asJavaConstant()));
+            return ConstantNode.forPrimitive(stamp(), getOp(forValue).foldConstant(forValue.asConstant()));
         }
         return this;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java	Thu Oct 30 13:03:33 2014 +0100
@@ -59,13 +59,13 @@
             return XorNode.create(forY, forX);
         }
         if (forY.isConstant()) {
-            JavaConstant c = forY.asJavaConstant();
+            Constant c = forY.asConstant();
             if (getOp(forX, forY).isNeutral(c)) {
                 return forX;
             }
 
-            if (c.getKind().isNumericInteger()) {
-                long rawY = c.asLong();
+            if (c instanceof PrimitiveConstant && ((PrimitiveConstant) c).getKind().isNumericInteger()) {
+                long rawY = ((PrimitiveConstant) c).asLong();
                 long mask = CodeUtil.mask(PrimitiveStamp.getBits(stamp()));
                 if ((rawY & mask) == mask) {
                     return NotNode.create(forX);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java	Thu Oct 30 13:03:33 2014 +0100
@@ -196,7 +196,7 @@
                         if (node instanceof ValueNode) {
                             ValueNode valueNode = (ValueNode) node;
                             boolean improvedStamp = tryInferStamp(valueNode);
-                            JavaConstant constant = valueNode.stamp().asConstant();
+                            Constant constant = valueNode.stamp().asConstant();
                             if (constant != null && !(node instanceof ConstantNode)) {
                                 valueNode.replaceAtUsages(InputType.Value, ConstantNode.forConstant(valueNode.stamp(), constant, context.getMetaAccess(), graph));
                                 GraphUtil.tryKillUnused(valueNode);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Thu Oct 30 13:03:33 2014 +0100
@@ -716,7 +716,7 @@
                     PiNode piNode;
                     if (isNull) {
                         ConstantNode nullObject = ConstantNode.defaultForKind(Kind.Object, graph);
-                        piNode = graph.unique(PiNode.create(nullObject, StampFactory.forConstant(nullObject.getValue(), metaAccess), replacementAnchor.asNode()));
+                        piNode = graph.unique(PiNode.create(nullObject, StampFactory.forConstant(nullObject.asJavaConstant(), metaAccess), replacementAnchor.asNode()));
                     } else {
                         piNode = graph.unique(PiNode.create(object, StampFactory.declared(type, nonNull, true), replacementAnchor.asNode()));
                     }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java	Thu Oct 30 13:03:33 2014 +0100
@@ -277,7 +277,7 @@
         Kind readKind = load.accessKind();
         ValueNode[] base = null;
         ValueNode object = load.object();
-        if (object.isConstant() && object.asJavaConstant().isDefaultForKind()) {
+        if (object.isConstant() && object.asConstant().isDefaultForKind()) {
             base = new ValueNode[1];
         }
         LocationNode location = createLocation(load, base);
@@ -295,7 +295,7 @@
         StructuredGraph graph = store.graph();
         ValueNode object = store.object();
         ValueNode[] base = null;
-        if (object.isConstant() && object.asJavaConstant().isDefaultForKind()) {
+        if (object.isConstant() && object.asConstant().isDefaultForKind()) {
             base = new ValueNode[1];
         }
         LocationNode location = createLocation(store, base);
@@ -360,7 +360,7 @@
                     }
                     if (value == null) {
                         omittedValues.set(valuePos);
-                    } else if (!(value.isConstant() && value.asJavaConstant().isDefaultForKind())) {
+                    } else if (!(value.isConstant() && value.asConstant().isDefaultForKind())) {
                         // Constant.illegal is always the defaultForKind, so it is skipped
                         Kind valueKind = value.getKind();
                         Kind entryKind = virtual.entryKind(i);
--- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java	Thu Oct 30 12:21:07 2014 +0100
+++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java	Thu Oct 30 13:03:33 2014 +0100
@@ -93,8 +93,8 @@
         if (isWord(node)) {
             if (node.isConstant()) {
                 ConstantNode oldConstant = (ConstantNode) node;
-                assert oldConstant.getValue().getKind() == Kind.Object;
-                WordBase value = (WordBase) snippetReflection.asObject(oldConstant.getValue());
+                assert oldConstant.asJavaConstant().getKind() == Kind.Object;
+                WordBase value = (WordBase) snippetReflection.asObject(oldConstant.asJavaConstant());
                 ConstantNode newConstant = ConstantNode.forIntegerKind(wordKind, value.rawValue(), node.graph());
                 graph.replaceFloating(oldConstant, newConstant);