changeset 18490:ca81508f2a19

Generalize NULL handling to work on arbitrary pointers.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 24 Nov 2014 13:53:14 +0100
parents 1a21e7ced544
children 8d9c1a018e77
files graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/ConstantTest.java graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestConstantReflectionProvider.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/Kind.java graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/NullConstant.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractPointerStamp.java graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCompressedNullConstant.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MethodPointerStamp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.lir.hsail/src/com/oracle/graal/lir/hsail/HSAILMove.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/PointerEqualsNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/CheckCastReduction.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/EquationalReasoner.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/GuardingPiReduction.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/State.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java
diffstat 50 files changed, 136 insertions(+), 137 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/ConstantTest.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/ConstantTest.java	Mon Nov 24 13:53:14 2014 +0100
@@ -36,7 +36,7 @@
 
     @Test
     public void testNullIsNull() {
-        Assert.assertTrue(JavaConstant.NULL_OBJECT.isNull());
+        Assert.assertTrue(JavaConstant.NULL_POINTER.isNull());
     }
 
     @Test
--- a/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestConstantReflectionProvider.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.api.meta.test/src/com/oracle/graal/api/meta/test/TestConstantReflectionProvider.java	Mon Nov 24 13:53:14 2014 +0100
@@ -79,7 +79,7 @@
         assertEquals(Byte.valueOf((byte) 123), snippetReflection.asObject(constantReflection.boxPrimitive(JavaConstant.forByte((byte) 123))));
         assertSame(Boolean.TRUE, snippetReflection.asObject(constantReflection.boxPrimitive(JavaConstant.forBoolean(true))));
 
-        assertNull(constantReflection.boxPrimitive(JavaConstant.NULL_OBJECT));
+        assertNull(constantReflection.boxPrimitive(JavaConstant.NULL_POINTER));
         assertNull(constantReflection.boxPrimitive(snippetReflection.forObject("abc")));
     }
 
@@ -97,7 +97,7 @@
         assertEquals(JavaConstant.forByte((byte) 123), constantReflection.unboxPrimitive(snippetReflection.forObject(Byte.valueOf((byte) 123))));
         assertSame(JavaConstant.forBoolean(true), constantReflection.unboxPrimitive(snippetReflection.forObject(Boolean.TRUE)));
 
-        assertNull(constantReflection.unboxPrimitive(JavaConstant.NULL_OBJECT));
+        assertNull(constantReflection.unboxPrimitive(JavaConstant.NULL_POINTER));
         assertNull(constantReflection.unboxPrimitive(snippetReflection.forObject("abc")));
     }
 
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/JavaConstant.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/JavaConstant.java	Mon Nov 24 13:53:14 2014 +0100
@@ -26,7 +26,7 @@
  * 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 JavaConstant} instances that represent frequently used constant values, such as
- * {@link #NULL_OBJECT}.
+ * {@link #NULL_POINTER}.
  */
 public interface JavaConstant extends Constant, JavaValue, Value {
 
@@ -34,7 +34,7 @@
      * Using a larger cache for integers leads to only a slight increase in cache hit ratio which is
      * not enough to justify the impact on startup time.
      */
-    JavaConstant NULL_OBJECT = new NullConstant();
+    JavaConstant NULL_POINTER = new NullConstant();
     PrimitiveConstant INT_MINUS_1 = new PrimitiveConstant(Kind.Int, -1);
     PrimitiveConstant INT_0 = new PrimitiveConstant(Kind.Int, 0);
     PrimitiveConstant INT_1 = new PrimitiveConstant(Kind.Int, 1);
@@ -346,7 +346,7 @@
             case Long:
                 return LONG_0;
             case Object:
-                return NULL_OBJECT;
+                return NULL_POINTER;
             default:
                 throw new IllegalArgumentException(kind.toString());
         }
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Kind.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Kind.java	Mon Nov 24 13:53:14 2014 +0100
@@ -450,7 +450,7 @@
             case Double:
                 return JavaConstant.DOUBLE_0;
             case Object:
-                return JavaConstant.NULL_OBJECT;
+                return JavaConstant.NULL_POINTER;
             case Byte:
             case Char:
             case Short:
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/NullConstant.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/NullConstant.java	Mon Nov 24 13:53:14 2014 +0100
@@ -23,7 +23,7 @@
 package com.oracle.graal.api.meta;
 
 /**
- * The implementation type of the {@link JavaConstant#NULL_OBJECT null constant}.
+ * The implementation type of the {@link JavaConstant#NULL_POINTER null constant}.
  */
 final class NullConstant extends AbstractValue implements JavaConstant {
 
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractPointerStamp.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/AbstractPointerStamp.java	Mon Nov 24 13:53:14 2014 +0100
@@ -67,6 +67,15 @@
     }
 
     @Override
+    public Constant asConstant() {
+        if (alwaysNull) {
+            return JavaConstant.NULL_POINTER;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
     public Kind getStackKind() {
         return Kind.Illegal;
     }
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/ObjectStamp.java	Mon Nov 24 13:53:14 2014 +0100
@@ -61,15 +61,6 @@
     }
 
     @Override
-    public JavaConstant asConstant() {
-        if (alwaysNull()) {
-            return JavaConstant.NULL_OBJECT;
-        } else {
-            return null;
-        }
-    }
-
-    @Override
     public LIRKind getLIRKind(LIRKindTool tool) {
         return tool.getObjectKind();
     }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java	Mon Nov 24 13:53:14 2014 +0100
@@ -61,7 +61,7 @@
 
     @Test
     public void test3() {
-        testEscapeAnalysis("test3Snippet", JavaConstant.NULL_OBJECT, false);
+        testEscapeAnalysis("test3Snippet", JavaConstant.NULL_POINTER, false);
     }
 
     public static Object test3Snippet() {
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Mon Nov 24 13:53:14 2014 +0100
@@ -406,7 +406,7 @@
 
     @Override
     public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) {
-        moveDeoptValuesToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, 0), JavaConstant.NULL_OBJECT);
+        moveDeoptValuesToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, 0), JavaConstant.NULL_POINTER);
         append(new AMD64HotSpotDeoptimizeCallerOp());
     }
 
@@ -581,7 +581,7 @@
                 append(new AMD64Move.NullCheckOp(load(uncompress), state));
             }
         } else {
-            assert address.getKind() == Kind.Object : address + " - " + address.getKind() + " not an object!";
+            assert address.getKind() == Kind.Object || address.getKind() == Kind.Long : address + " - " + address.getKind() + " not a pointer!";
             append(new AMD64Move.NullCheckOp(load(address), state));
         }
     }
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Mon Nov 24 13:53:14 2014 +0100
@@ -183,7 +183,7 @@
 
     @Override
     public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) {
-        moveDeoptValuesToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, 0), JavaConstant.NULL_OBJECT);
+        moveDeoptValuesToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, 0), JavaConstant.NULL_POINTER);
         append(new SPARCHotSpotDeoptimizeCallerOp());
     }
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java	Mon Nov 24 13:53:14 2014 +0100
@@ -181,7 +181,7 @@
             NodeInputList<ValueNode> parameters = callTarget.arguments();
             ValueNode receiver = parameters.size() <= 0 ? null : parameters.get(0);
             GuardingNode receiverNullCheck = null;
-            if (!callTarget.isStatic() && receiver.stamp() instanceof ObjectStamp && !StampTool.isObjectNonNull(receiver)) {
+            if (!callTarget.isStatic() && receiver.stamp() instanceof ObjectStamp && !StampTool.isPointerNonNull(receiver)) {
                 receiverNullCheck = createNullCheck(receiver, invoke.asNode(), tool);
                 invoke.setGuard(receiverNullCheck);
             }
@@ -379,7 +379,7 @@
 
     private static boolean addReadBarrier(UnsafeLoadNode load) {
         if (useG1GC() && load.graph().getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS && load.object().getKind() == Kind.Object && load.accessKind() == Kind.Object &&
-                        !StampTool.isObjectAlwaysNull(load.object())) {
+                        !StampTool.isPointerAlwaysNull(load.object())) {
             ResolvedJavaType type = StampTool.typeOrNull(load.object());
             if (type != null && !type.isArray()) {
                 return true;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCompressedNullConstant.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotCompressedNullConstant.java	Mon Nov 24 13:53:14 2014 +0100
@@ -25,7 +25,7 @@
 import com.oracle.graal.api.meta.*;
 
 /**
- * The compressed representation of the {@link JavaConstant#NULL_OBJECT null constant}.
+ * The compressed representation of the {@link JavaConstant#NULL_POINTER null constant}.
  */
 public final class HotSpotCompressedNullConstant extends AbstractValue implements JavaConstant, HotSpotConstant {
 
@@ -94,7 +94,6 @@
 
     @Override
     public boolean equals(Object o) {
-        assert o == this || !(o instanceof HotSpotCompressedNullConstant) : "null constant is a singleton";
-        return o == this;
+        return o instanceof HotSpotCompressedNullConstant;
     }
 }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotObjectConstantImpl.java	Mon Nov 24 13:53:14 2014 +0100
@@ -45,7 +45,7 @@
 
     public static JavaConstant forObject(Object object, boolean compressed) {
         if (object == null) {
-            return compressed ? HotSpotCompressedNullConstant.COMPRESSED_NULL : JavaConstant.NULL_OBJECT;
+            return compressed ? HotSpotCompressedNullConstant.COMPRESSED_NULL : JavaConstant.NULL_POINTER;
         } else {
             return new HotSpotObjectConstantImpl(object, compressed);
         }
@@ -53,7 +53,7 @@
 
     public static JavaConstant forStableArray(Object object, int stableDimension, boolean isDefaultStable) {
         if (object == null) {
-            return JavaConstant.NULL_OBJECT;
+            return JavaConstant.NULL_POINTER;
         } else {
             assert object.getClass().isArray();
             return new HotSpotObjectConstantImpl(object, false, stableDimension, isDefaultStable);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -74,7 +74,7 @@
     }
 
     private static Constant compress(Constant c, CompressEncoding encoding) {
-        if (JavaConstant.NULL_OBJECT.equals(c)) {
+        if (JavaConstant.NULL_POINTER.equals(c)) {
             return HotSpotCompressedNullConstant.COMPRESSED_NULL;
         } else if (c instanceof HotSpotObjectConstant) {
             return ((HotSpotObjectConstant) c).compress();
@@ -87,7 +87,7 @@
 
     private static Constant uncompress(Constant c, CompressEncoding encoding) {
         if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) {
-            return JavaConstant.NULL_OBJECT;
+            return JavaConstant.NULL_POINTER;
         } else if (c instanceof HotSpotObjectConstant) {
             return ((HotSpotObjectConstant) c).uncompress();
         } else if (c instanceof HotSpotMetaspaceConstant) {
@@ -174,7 +174,7 @@
         HotSpotLIRGenerator hsGen = (HotSpotLIRGenerator) gen.getLIRGeneratorTool();
         boolean nonNull;
         if (getValue().stamp() instanceof AbstractObjectStamp) {
-            nonNull = StampTool.isObjectNonNull(getValue().stamp());
+            nonNull = StampTool.isPointerNonNull(getValue().stamp());
         } else {
             // metaspace pointers are never null
             nonNull = true;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java	Mon Nov 24 13:53:14 2014 +0100
@@ -64,6 +64,22 @@
     }
 
     @Override
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
+        if (isCompressed()) {
+            if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) {
+                return new KlassPointerStamp(false, true, encoding);
+            }
+        } else {
+            if (JavaConstant.NULL_POINTER.equals(c)) {
+                return new KlassPointerStamp(false, true);
+            }
+        }
+
+        assert c instanceof HotSpotMetaspaceConstant;
+        return this;
+    }
+
+    @Override
     public LIRKind getLIRKind(LIRKindTool tool) {
         if (isCompressed()) {
             return LIRKind.value(Kind.Int);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MetaspacePointerStamp.java	Mon Nov 24 13:53:14 2014 +0100
@@ -26,7 +26,6 @@
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.compiler.common.spi.*;
 import com.oracle.graal.compiler.common.type.*;
-import com.oracle.graal.hotspot.meta.*;
 
 public abstract class MetaspacePointerStamp extends AbstractPointerStamp {
 
@@ -67,12 +66,6 @@
     }
 
     @Override
-    public Stamp constant(Constant c, MetaAccessProvider meta) {
-        assert c instanceof HotSpotMetaspaceConstant;
-        return this;
-    }
-
-    @Override
     public boolean isLegal() {
         return true;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MethodPointerStamp.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/MethodPointerStamp.java	Mon Nov 24 13:53:14 2014 +0100
@@ -49,6 +49,16 @@
     }
 
     @Override
+    public Stamp constant(Constant c, MetaAccessProvider meta) {
+        if (JavaConstant.NULL_POINTER.equals(c)) {
+            return new MethodPointerStamp(false, true);
+        } else {
+            assert c instanceof HotSpotMetaspaceConstant;
+            return this;
+        }
+    }
+
+    @Override
     public Constant readConstant(MemoryAccessProvider provider, Constant base, long displacement) {
         HotSpotMemoryAccessProvider hsProvider = (HotSpotMemoryAccessProvider) provider;
         return hsProvider.readMethodPointerConstant(base, displacement);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/WriteBarrierAdditionPhase.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -79,12 +79,12 @@
     }
 
     protected void addG1PostWriteBarrier(FixedAccessNode node, ValueNode object, ValueNode value, LocationNode location, boolean precise, StructuredGraph graph) {
-        final boolean alwaysNull = StampTool.isObjectAlwaysNull(value);
+        final boolean alwaysNull = StampTool.isPointerAlwaysNull(value);
         graph.addAfterFixed(node, graph.add(G1PostWriteBarrier.create(object, value, location, precise, alwaysNull)));
     }
 
     protected void addSerialPostWriteBarrier(FixedAccessNode node, ValueNode object, ValueNode value, LocationNode location, boolean precise, StructuredGraph graph) {
-        final boolean alwaysNull = StampTool.isObjectAlwaysNull(value);
+        final boolean alwaysNull = StampTool.isPointerAlwaysNull(value);
         final LocationNode loc = (precise ? location : null);
         graph.addAfterFixed(node, graph.add(SerialWriteBarrier.create(object, loc, precise, alwaysNull)));
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java	Mon Nov 24 13:53:14 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
@@ -83,10 +83,7 @@
                         ConstantNode cn = ConstantNode.forConstant(stamp(), objectType.getObjectHub(), metaAccess);
                         return cn;
                     } else if (exactType instanceof HotSpotResolvedPrimitiveType) {
-                        /*
-                         * The constant value is null but we don't have a JavaConstant subclass to
-                         * talk about a NULL pointer yet.
-                         */
+                        return ConstantNode.forConstant(stamp(), JavaConstant.NULL_POINTER, metaAccess);
                     }
                 }
             }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java	Mon Nov 24 13:53:14 2014 +0100
@@ -520,7 +520,7 @@
     }
 
     private void genIfNull(Condition cond) {
-        T y = appendConstant(JavaConstant.NULL_OBJECT);
+        T y = appendConstant(JavaConstant.NULL_POINTER);
         T x = frameState.apop();
         genIf(x, cond, y);
     }
@@ -927,7 +927,7 @@
         // @formatter:off
     switch (opcode) {
         case NOP            : /* nothing to do */ break;
-        case ACONST_NULL    : frameState.apush(appendConstant(JavaConstant.NULL_OBJECT)); break;
+        case ACONST_NULL    : frameState.apush(appendConstant(JavaConstant.NULL_POINTER)); break;
         case ICONST_M1      : // fall through
         case ICONST_0       : // fall through
         case ICONST_1       : // fall through
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Mon Nov 24 13:53:14 2014 +0100
@@ -336,7 +336,7 @@
             protected void handleUnresolvedCheckCast(JavaType type, ValueNode object) {
                 assert !graphBuilderConfig.eagerResolving();
                 append(FixedGuardNode.create(currentGraph.unique(IsNullNode.create(object)), Unresolved, InvalidateRecompile));
-                frameState.apush(appendConstant(JavaConstant.NULL_OBJECT));
+                frameState.apush(appendConstant(JavaConstant.NULL_POINTER));
             }
 
             /**
@@ -652,7 +652,7 @@
 
             @Override
             protected void emitNullCheck(ValueNode receiver) {
-                if (StampTool.isObjectNonNull(receiver.stamp())) {
+                if (StampTool.isPointerNonNull(receiver.stamp())) {
                     return;
                 }
                 BlockPlaceholderNode trueSucc = currentGraph.add(BlockPlaceholderNode.create(this));
--- a/graal/com.oracle.graal.lir.hsail/src/com/oracle/graal/lir/hsail/HSAILMove.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.lir.hsail/src/com/oracle/graal/lir/hsail/HSAILMove.java	Mon Nov 24 13:53:14 2014 +0100
@@ -78,7 +78,7 @@
 
         private void checkForNullObjectInput() {
             if (result.getKind() == Kind.Object && isConstant(input) && input.getKind() == Kind.Long && ((JavaConstant) input).asLong() == 0) {
-                input = JavaConstant.NULL_OBJECT;
+                input = JavaConstant.NULL_POINTER;
             }
         }
 
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java	Mon Nov 24 13:53:14 2014 +0100
@@ -362,7 +362,7 @@
             case Long:
                 return JavaConstant.forLong(dead);
             case Object:
-                return JavaConstant.NULL_OBJECT;
+                return JavaConstant.NULL_POINTER;
             default:
                 throw new IllegalArgumentException(kind.toString());
         }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java	Mon Nov 24 13:53:14 2014 +0100
@@ -158,7 +158,7 @@
             cond = graph.unique(IntegerLessThanNode.create(end, v1));
         }
         overflowGuard = graph.unique(GuardNode.create(cond, BeginNode.prevBegin(loop.entryPoint()), DeoptimizationReason.LoopLimitCheck, DeoptimizationAction.InvalidateRecompile, true,
-                        JavaConstant.NULL_OBJECT)); // TODO gd: use speculation
+                        JavaConstant.NULL_POINTER)); // TODO gd: use speculation
         loop.loopBegin().setOverflowGuard(overflowGuard);
         return overflowGuard;
     }
--- a/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -63,7 +63,7 @@
     public void testJoin3() {
         Stamp d = StampFactory.declared(getType(D.class));
         Stamp c = StampFactory.declared(getType(C.class));
-        Assert.assertTrue(StampTool.isObjectAlwaysNull(join(c, d)));
+        Assert.assertTrue(StampTool.isPointerAlwaysNull(join(c, d)));
     }
 
     @Test
@@ -78,7 +78,7 @@
         Stamp dExact = StampFactory.exact(getType(D.class));
         Stamp c = StampFactory.declared(getType(C.class));
         Stamp join = join(c, dExact);
-        Assert.assertTrue(StampTool.isObjectAlwaysNull(join));
+        Assert.assertTrue(StampTool.isPointerAlwaysNull(join));
         Assert.assertNull(StampTool.typeOrNull(join));
         Assert.assertFalse(StampTool.isExactType(join));
     }
@@ -89,8 +89,8 @@
         Stamp alwaysNull = StampFactory.alwaysNull();
         Stamp join = join(alwaysNull, dExactNonNull);
         Assert.assertFalse(join.isLegal());
-        Assert.assertFalse(StampTool.isObjectNonNull(join));
-        Assert.assertFalse(StampTool.isObjectAlwaysNull(join));
+        Assert.assertFalse(StampTool.isPointerNonNull(join));
+        Assert.assertFalse(StampTool.isPointerAlwaysNull(join));
     }
 
     @Test
@@ -98,7 +98,7 @@
         Stamp aExact = StampFactory.exact(getType(A.class));
         Stamp e = StampFactory.declared(getType(E.class));
         Stamp join = join(aExact, e);
-        Assert.assertTrue(StampTool.isObjectAlwaysNull(join));
+        Assert.assertTrue(StampTool.isPointerAlwaysNull(join));
         Assert.assertNull(StampTool.typeOrNull(join));
         Assert.assertFalse(StampTool.isExactType(join));
     }
@@ -116,7 +116,7 @@
         Stamp bExact = StampFactory.exact(getType(B.class));
         Stamp dExact = StampFactory.exact(getType(D.class));
         Stamp join = join(bExact, dExact);
-        Assert.assertTrue(StampTool.isObjectAlwaysNull(join));
+        Assert.assertTrue(StampTool.isPointerAlwaysNull(join));
         Assert.assertNull(StampTool.typeOrNull(join));
         Assert.assertNull(StampTool.typeOrNull(join));
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -465,7 +465,7 @@
             case Long:
                 return ConstantNode.forLong(0L, graph);
             case Object:
-                return ConstantNode.forConstant(JavaConstant.NULL_OBJECT, null, graph);
+                return ConstantNode.forConstant(JavaConstant.NULL_POINTER, null, graph);
             default:
                 return null;
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -39,7 +39,7 @@
     }
 
     protected DeoptimizeNode(DeoptimizationAction action, DeoptimizationReason reason) {
-        this(action, reason, 0, JavaConstant.NULL_OBJECT, null);
+        this(action, reason, 0, JavaConstant.NULL_POINTER, null);
     }
 
     public static DeoptimizeNode create(DeoptimizationAction action, DeoptimizationReason reason, int debugId, JavaConstant speculation, FrameState stateBefore) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -76,7 +76,7 @@
     }
 
     protected PiNode(ValueNode object, ResolvedJavaType toType, boolean exactType, boolean nonNull) {
-        this(object, StampFactory.object(toType, exactType, nonNull || StampTool.isObjectNonNull(object.stamp()), true));
+        this(object, StampFactory.object(toType, exactType, nonNull || StampTool.isPointerNonNull(object.stamp()), true));
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/TypeProfileProxyNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -112,7 +112,7 @@
                 return this;
             }
             lastCheckedType = type;
-            JavaTypeProfile newProfile = this.profile.restrict(type, StampTool.isObjectNonNull(forValue));
+            JavaTypeProfile newProfile = this.profile.restrict(type, StampTool.isPointerNonNull(forValue));
             if (newProfile != this.profile) {
                 Debug.log("Improved profile via static type information.");
                 if (newProfile.getTypes().length == 0) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -22,7 +22,6 @@
  */
 package com.oracle.graal.nodes.calc;
 
-import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodeinfo.*;
@@ -57,18 +56,15 @@
     @Override
     public boolean verify() {
         assertTrue(getValue() != null, "is null input must not be null");
-        assertTrue(getValue().stamp() instanceof AbstractObjectStamp, "is null input must be an object");
+        assertTrue(getValue().stamp() instanceof AbstractPointerStamp, "is null input must be a pointer");
         return super.verify();
     }
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
-        JavaConstant constant = forValue.asJavaConstant();
-        if (constant != null) {
-            assert constant.getKind() == Kind.Object;
-            return LogicConstantNode.forBoolean(constant.isNull());
-        }
-        if (StampTool.isObjectNonNull(forValue.stamp())) {
+        if (StampTool.isPointerAlwaysNull(forValue)) {
+            return LogicConstantNode.tautology();
+        } else if (StampTool.isPointerNonNull(forValue)) {
             return LogicConstantNode.contradiction();
         }
         return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ObjectEqualsNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -24,11 +24,9 @@
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
-import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
-import com.oracle.graal.nodes.type.*;
 
 @NodeInfo(shortName = "==")
 public class ObjectEqualsNode extends PointerEqualsNode implements Virtualizable {
@@ -49,20 +47,6 @@
         assert y.stamp() instanceof AbstractObjectStamp;
     }
 
-    @Override
-    public ValueNode canonical(CanonicalizerTool tool, ValueNode forX, ValueNode forY) {
-        ValueNode result = super.canonical(tool, forX, forY);
-        if (result != this) {
-            return result;
-        }
-        if (StampTool.isObjectAlwaysNull(forX)) {
-            return IsNullNode.create(forY);
-        } else if (StampTool.isObjectAlwaysNull(forY)) {
-            return IsNullNode.create(forX);
-        }
-        return this;
-    }
-
     private void virtualizeNonVirtualComparison(State state, ValueNode other, VirtualizerTool tool) {
         if (!state.getVirtualObject().hasIdentity() && state.getVirtualObject().entryKind(0) == Kind.Boolean) {
             if (other.isConstant()) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/PointerEqualsNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/PointerEqualsNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -64,6 +64,10 @@
             return LogicConstantNode.tautology();
         } else if (forX.stamp().alwaysDistinct(forY.stamp())) {
             return LogicConstantNode.contradiction();
+        } else if (((AbstractPointerStamp) forX.stamp()).alwaysNull()) {
+            return IsNullNode.create(forY);
+        } else if (((AbstractPointerStamp) forY.stamp()).alwaysNull()) {
+            return IsNullNode.create(forX);
         }
         return super.canonical(tool, forX, forY);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadMethodNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -102,7 +102,7 @@
              * This really represent a misuse of LoadMethod since we're loading from a class which
              * isn't known to implement the original method but for now at least fold it away.
              */
-            return ConstantNode.forConstant(JavaConstant.NULL_OBJECT, null);
+            return ConstantNode.forConstant(JavaConstant.NULL_POINTER, null);
         } else {
             return ConstantNode.forConstant(stamp(), newMethod.getEncoding(), tool.getMetaAccess());
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -65,7 +65,7 @@
     }
 
     protected UnsafeCastNode(ValueNode object, ResolvedJavaType toType, boolean exactType, boolean nonNull) {
-        this(object, toType.getKind() == Kind.Object ? StampFactory.object(toType, exactType, nonNull || StampTool.isObjectNonNull(object.stamp()), true) : StampFactory.forKind(toType.getKind()));
+        this(object, toType.getKind() == Kind.Object ? StampFactory.object(toType, exactType, nonNull || StampTool.isPointerNonNull(object.stamp()), true) : StampFactory.forKind(toType.getKind()));
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -95,7 +95,7 @@
 
     @Override
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject, ValueNode forHub) {
-        if (StampTool.isObjectAlwaysNull(forObject)) {
+        if (StampTool.isPointerAlwaysNull(forObject)) {
             return forObject;
         }
         if (forHub.isConstant()) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -114,7 +114,7 @@
             // This is a check cast that will always fail
             condition = LogicConstantNode.contradiction(graph());
             newStamp = StampFactory.declaredTrusted(type);
-        } else if (StampTool.isObjectNonNull(object)) {
+        } else if (StampTool.isPointerNonNull(object)) {
             condition = graph().addWithoutUnique(InstanceOfNode.create(type, object, profile));
         } else {
             if (profile != null && profile.getNullSeen() == TriState.FALSE) {
@@ -161,7 +161,7 @@
             return object();
         }
 
-        if (StampTool.isObjectAlwaysNull(object())) {
+        if (StampTool.isPointerAlwaysNull(object())) {
             return object();
         }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -67,7 +67,7 @@
     }
 
     public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) {
-        if (usages().isEmpty() && !isVolatile() && (isStatic() || StampTool.isObjectNonNull(forObject.stamp()))) {
+        if (usages().isEmpty() && !isVolatile() && (isStatic() || StampTool.isPointerNonNull(forObject.stamp()))) {
             return null;
         }
         MetaAccessProvider metaAccess = tool.getMetaAccess();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java	Mon Nov 24 13:53:14 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
@@ -193,7 +193,7 @@
                 LogicNode condition = graph().unique(InstanceOfNode.create(singleImplementor, receiver, getProfile()));
                 GuardNode guard = graph().unique(
                                 GuardNode.create(condition, BeginNode.prevBegin(invoke().asNode()), DeoptimizationReason.OptimizedTypeCheckViolated, DeoptimizationAction.InvalidateRecompile, false,
-                                                JavaConstant.NULL_OBJECT));
+                                                JavaConstant.NULL_POINTER));
                 PiNode piNode = graph().unique(PiNode.create(receiver, StampFactory.declaredNonNull(singleImplementor), guard));
                 arguments().set(0, piNode);
                 setInvokeKind(InvokeKind.Virtual);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreIndexedNode.java	Mon Nov 24 13:53:14 2014 +0100
@@ -81,7 +81,7 @@
             int idx = indexValue.isConstant() ? indexValue.asJavaConstant().asInt() : -1;
             if (idx >= 0 && idx < arrayState.getVirtualObject().entryCount()) {
                 ResolvedJavaType componentType = arrayState.getVirtualObject().type().getComponentType();
-                if (componentType.isPrimitive() || StampTool.isObjectAlwaysNull(value) || componentType.getSuperclass() == null ||
+                if (componentType.isPrimitive() || StampTool.isPointerAlwaysNull(value) || componentType.getSuperclass() == null ||
                                 (StampTool.typeOrNull(value) != null && componentType.isAssignableFrom(StampTool.typeOrNull(value)))) {
                     tool.setVirtualEntry(arrayState, idx, value(), false);
                     tool.delete();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -174,53 +174,53 @@
     }
 
     /**
-     * Checks whether this {@link ValueNode} represents a {@linkplain Stamp#isLegal() legal} Object
+     * Checks whether this {@link ValueNode} represents a {@linkplain Stamp#isLegal() legal} pointer
      * value which is known to be always null.
      *
      * @param node the node to check
      * @return true if this node represents a legal object value which is known to be always null
      */
-    public static boolean isObjectAlwaysNull(ValueNode node) {
-        return isObjectAlwaysNull(node.stamp());
+    public static boolean isPointerAlwaysNull(ValueNode node) {
+        return isPointerAlwaysNull(node.stamp());
     }
 
     /**
-     * Checks whether this {@link Stamp} represents a {@linkplain Stamp#isLegal() legal} Object
+     * Checks whether this {@link Stamp} represents a {@linkplain Stamp#isLegal() legal} pointer
      * stamp whose values are known to be always null.
      *
      * @param stamp the stamp to check
      * @return true if this stamp represents a legal object stamp whose values are known to be
      *         always null
      */
-    public static boolean isObjectAlwaysNull(Stamp stamp) {
-        if (stamp instanceof AbstractObjectStamp && stamp.isLegal()) {
-            return ((AbstractObjectStamp) stamp).alwaysNull();
+    public static boolean isPointerAlwaysNull(Stamp stamp) {
+        if (stamp instanceof AbstractPointerStamp && stamp.isLegal()) {
+            return ((AbstractPointerStamp) stamp).alwaysNull();
         }
         return false;
     }
 
     /**
-     * Checks whether this {@link ValueNode} represents a {@linkplain Stamp#isLegal() legal} Object
+     * Checks whether this {@link ValueNode} represents a {@linkplain Stamp#isLegal() legal} pointer
      * value which is known to never be null.
      *
      * @param node the node to check
      * @return true if this node represents a legal object value which is known to never be null
      */
-    public static boolean isObjectNonNull(ValueNode node) {
-        return isObjectNonNull(node.stamp());
+    public static boolean isPointerNonNull(ValueNode node) {
+        return isPointerNonNull(node.stamp());
     }
 
     /**
-     * Checks whether this {@link Stamp} represents a {@linkplain Stamp#isLegal() legal} Object
+     * Checks whether this {@link Stamp} represents a {@linkplain Stamp#isLegal() legal} pointer
      * stamp whose values known to be always null.
      *
      * @param stamp the stamp to check
      * @return true if this stamp represents a legal object stamp whose values are known to be
      *         always null
      */
-    public static boolean isObjectNonNull(Stamp stamp) {
-        if (stamp instanceof AbstractObjectStamp && stamp.isLegal()) {
-            return ((AbstractObjectStamp) stamp).nonNull();
+    public static boolean isPointerNonNull(Stamp stamp) {
+        if (stamp instanceof AbstractPointerStamp && stamp.isLegal()) {
+            return ((AbstractPointerStamp) stamp).nonNull();
         }
         return false;
     }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Mon Nov 24 13:53:14 2014 +0100
@@ -235,11 +235,11 @@
         }
 
         public boolean isNull(ValueNode value) {
-            return StampTool.isObjectAlwaysNull(value) || knownNull.contains(GraphUtil.unproxify(value));
+            return StampTool.isPointerAlwaysNull(value) || knownNull.contains(GraphUtil.unproxify(value));
         }
 
         public boolean isNonNull(ValueNode value) {
-            return StampTool.isObjectNonNull(value) || knownNonNull.contains(GraphUtil.unproxify(value));
+            return StampTool.isPointerNonNull(value) || knownNonNull.contains(GraphUtil.unproxify(value));
         }
 
         @Override
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java	Mon Nov 24 13:53:14 2014 +0100
@@ -121,7 +121,7 @@
 
         private void processGuard(Node node) {
             GuardNode guard = (GuardNode) node;
-            if (guard.isNegated() && guard.condition() instanceof IsNullNode && (guard.getSpeculation() == null || guard.getSpeculation().equals(JavaConstant.NULL_OBJECT))) {
+            if (guard.isNegated() && guard.condition() instanceof IsNullNode && (guard.getSpeculation() == null || guard.getSpeculation().equals(JavaConstant.NULL_POINTER))) {
                 ValueNode obj = ((IsNullNode) guard.condition()).getValue();
                 nullGuarded.put(obj, guard);
             }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java	Mon Nov 24 13:53:14 2014 +0100
@@ -154,7 +154,7 @@
                 handle.safeDelete();
                 return result;
             } else {
-                GuardNode newGuard = graph.unique(GuardNode.create(condition, guardAnchor, deoptReason, action, negated, JavaConstant.NULL_OBJECT));
+                GuardNode newGuard = graph.unique(GuardNode.create(condition, guardAnchor, deoptReason, action, negated, JavaConstant.NULL_POINTER));
                 if (OptEliminateGuards.getValue()) {
                     activeGuards.markAndGrow(newGuard);
                 }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java	Mon Nov 24 13:53:14 2014 +0100
@@ -100,7 +100,7 @@
             for (AbstractEndNode end : merge.cfgPredecessors().snapshot()) {
                 ValueNode thisReason = reasons != null ? reasons.get(index) : reason;
                 ValueNode thisSpeculation = speculations != null ? speculations.get(index++) : speculation;
-                if (!thisReason.isConstant() || !thisSpeculation.isConstant() || !thisSpeculation.asConstant().equals(JavaConstant.NULL_OBJECT)) {
+                if (!thisReason.isConstant() || !thisSpeculation.isConstant() || !thisSpeculation.asConstant().equals(JavaConstant.NULL_POINTER)) {
                     continue;
                 }
                 DeoptimizationReason deoptimizationReason = metaAccessProvider.decodeDeoptReason(thisReason.asJavaConstant());
@@ -113,7 +113,7 @@
         if (deoptimizationReason != DeoptimizationReason.NullCheckException && deoptimizationReason != DeoptimizationReason.UnreachedCode) {
             return;
         }
-        if (speculation != null && !speculation.equals(JavaConstant.NULL_OBJECT)) {
+        if (speculation != null && !speculation.equals(JavaConstant.NULL_POINTER)) {
             return;
         }
         if (predecessor instanceof MergeNode) {
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/CheckCastReduction.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/CheckCastReduction.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -111,7 +111,7 @@
 
         // --------- checkCast deemed redundant by subject-stamp alone ---------
         // --------- in particular due to stamp informing always null ----------
-        boolean isRedundantPerStamp = StampTool.isObjectAlwaysNull(subject) || (subjectType != null && toType.isAssignableFrom(subjectType));
+        boolean isRedundantPerStamp = StampTool.isPointerAlwaysNull(subject) || (subjectType != null && toType.isAssignableFrom(subjectType));
         if (isRedundantPerStamp) {
             metricCheckCastRemoved.increment();
             checkCast.replaceAtUsages(subject);
@@ -119,7 +119,7 @@
             return;
         }
 
-        assert !StampTool.isObjectAlwaysNull(subject) : "Null as per stamp subjects should have been handled above";
+        assert !StampTool.isPointerAlwaysNull(subject) : "Null as per stamp subjects should have been handled above";
 
         // --------- checkCast deemed unsatisfiable by subject-stamp alone ---------
         if (state.knownNotToPassCheckCast(subject, toType)) {
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/EquationalReasoner.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/EquationalReasoner.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -575,7 +575,7 @@
         if (FlowUtil.isLiteralNode(object)) {
             return object;
         }
-        if (StampTool.isObjectAlwaysNull(object.stamp())) {
+        if (StampTool.isPointerAlwaysNull(object.stamp())) {
             return object;
         }
 
@@ -696,7 +696,7 @@
         if (anchor == null) {
             return null;
         }
-        if (object instanceof GuardedNode && StampTool.isObjectAlwaysNull(object.stamp())) {
+        if (object instanceof GuardedNode && StampTool.isPointerAlwaysNull(object.stamp())) {
             return (PiNode) object;
         }
         // notice nullConstant is wrapped, not object
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/GuardingPiReduction.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/GuardingPiReduction.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -214,7 +214,7 @@
                 /*
                  * GuardingPiNode succeeds if payload null
                  */
-                ValueNode replacement = StampTool.isObjectAlwaysNull(payload) ? payload : reasoner.nonTrivialNull(payload);
+                ValueNode replacement = StampTool.isPointerAlwaysNull(payload) ? payload : reasoner.nonTrivialNull(payload);
                 if (replacement != null) {
                     // replacement == null means !isKnownNull(payload)
                     removeGuardingPiNode(envelope, replacement);
@@ -274,7 +274,7 @@
             return true;
         }
 
-        if (StampTool.isObjectNonNull(payload)) {
+        if (StampTool.isPointerNonNull(payload)) {
             // payload needs no downcasting, it satisfies as-is the GuardingPiNode's condition.
             if (precisionLoss(envelope, payload)) {
                 /*
@@ -334,7 +334,7 @@
             return false;
         }
 
-        if (StampTool.isObjectAlwaysNull(d)) {
+        if (StampTool.isPointerAlwaysNull(d)) {
             removeGuardingPiNode(envelope, d);
             return true;
         }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/State.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/State.java	Mon Nov 24 13:53:14 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -336,7 +336,7 @@
      */
     public boolean isNull(ValueNode object) {
         assert FlowUtil.hasLegalObjectStamp(object);
-        if (StampTool.isObjectAlwaysNull(object)) {
+        if (StampTool.isPointerAlwaysNull(object)) {
             return true;
         }
         ValueNode scrutinee = GraphUtil.unproxify(object);
@@ -364,7 +364,7 @@
      */
     public boolean isNonNull(ValueNode object) {
         assert FlowUtil.hasLegalObjectStamp(object);
-        if (StampTool.isObjectNonNull(object)) {
+        if (StampTool.isPointerNonNull(object)) {
             return true;
         }
         Witness w = typeInfo(object);
@@ -847,7 +847,7 @@
      */
     public GuardingNode nonTrivialNullAnchor(ValueNode object) {
         assert FlowUtil.hasLegalObjectStamp(object);
-        if (StampTool.isObjectAlwaysNull(object)) {
+        if (StampTool.isPointerAlwaysNull(object)) {
             return null;
         }
         ValueNode scrutinee = GraphUtil.unproxify(object);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Mon Nov 24 13:53:14 2014 +0100
@@ -500,7 +500,7 @@
         assert !callTarget.isStatic() : callTarget.targetMethod();
         StructuredGraph graph = callTarget.graph();
         ValueNode firstParam = callTarget.arguments().get(0);
-        if (firstParam.getKind() == Kind.Object && !StampTool.isObjectNonNull(firstParam)) {
+        if (firstParam.getKind() == Kind.Object && !StampTool.isPointerNonNull(firstParam)) {
             IsNullNode condition = graph.unique(IsNullNode.create(firstParam));
             Stamp stamp = firstParam.stamp().join(objectNonNull());
             GuardingPiNode nonNullReceiver = graph.add(GuardingPiNode.create(firstParam, condition, true, NullCheckException, InvalidateReprofile, stamp));
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java	Mon Nov 24 13:20:02 2014 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java	Mon Nov 24 13:53:14 2014 +0100
@@ -178,7 +178,7 @@
         ValueNode value = storeIndexed.value();
         ValueNode array = storeIndexed.array();
         FixedWithNextNode checkCastNode = null;
-        if (elementKind == Kind.Object && !StampTool.isObjectAlwaysNull(value)) {
+        if (elementKind == Kind.Object && !StampTool.isPointerAlwaysNull(value)) {
             /* Array store check. */
             ResolvedJavaType arrayType = StampTool.typeOrNull(array);
             if (arrayType != null && StampTool.isExactType(array)) {
@@ -708,7 +708,7 @@
     }
 
     protected GuardingNode createNullCheck(ValueNode object, FixedNode before, LoweringTool tool) {
-        if (StampTool.isObjectNonNull(object)) {
+        if (StampTool.isPointerNonNull(object)) {
             return null;
         }
         return tool.createGuard(before, before.graph().unique(IsNullNode.create(object)), DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true);