changeset 16012:0497ead7ec50

Support null check directly on compressed oops.
author Roland Schatz <roland.schatz@oracle.com>
date Wed, 04 Jun 2014 11:47:49 +0200
parents dd11a7036c6e
children dd5c15b85f78
files 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/PlatformKind.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java
diffstat 5 files changed, 33 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Kind.java	Tue Jun 03 22:19:31 2014 +0200
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Kind.java	Wed Jun 04 11:47:49 2014 +0200
@@ -436,4 +436,27 @@
                 throw new IllegalArgumentException("illegal call to bits on " + this);
         }
     }
+
+    public Constant getDefaultValue() {
+        switch (this) {
+            case Boolean:
+                return Constant.FALSE;
+            case Int:
+                return Constant.INT_0;
+            case Long:
+                return Constant.LONG_0;
+            case Float:
+                return Constant.FLOAT_0;
+            case Double:
+                return Constant.DOUBLE_0;
+            case Object:
+                return Constant.NULL_OBJECT;
+            case Byte:
+            case Char:
+            case Short:
+                return new PrimitiveConstant(this, 0);
+            default:
+                throw new IllegalArgumentException("illegal call to getDefaultValue on " + this);
+        }
+    }
 }
--- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/PlatformKind.java	Tue Jun 03 22:19:31 2014 +0200
+++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/PlatformKind.java	Wed Jun 04 11:47:49 2014 +0200
@@ -28,4 +28,6 @@
 public interface PlatformKind {
 
     String name();
+
+    Constant getDefaultValue();
 }
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Tue Jun 03 22:19:31 2014 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Wed Jun 04 11:47:49 2014 +0200
@@ -455,7 +455,7 @@
 
     private void emitNullCheckBranch(IsNullNode node, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) {
         PlatformKind kind = gen.getPlatformKind(node.object().stamp());
-        gen.emitCompareBranch(kind, operand(node.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueSuccessor, falseSuccessor, trueSuccessorProbability);
+        gen.emitCompareBranch(kind, operand(node.object()), kind.getDefaultValue(), Condition.EQ, false, trueSuccessor, falseSuccessor, trueSuccessorProbability);
     }
 
     public void emitCompareBranch(CompareNode compare, LabelRef trueSuccessor, LabelRef falseSuccessor, double trueSuccessorProbability) {
@@ -483,7 +483,7 @@
         if (node instanceof IsNullNode) {
             IsNullNode isNullNode = (IsNullNode) node;
             PlatformKind kind = gen.getPlatformKind(isNullNode.object().stamp());
-            return gen.emitConditionalMove(kind, operand(isNullNode.object()), Constant.NULL_OBJECT, Condition.EQ, false, trueValue, falseValue);
+            return gen.emitConditionalMove(kind, operand(isNullNode.object()), kind.getDefaultValue(), Condition.EQ, false, trueValue, falseValue);
         } else if (node instanceof CompareNode) {
             CompareNode compare = (CompareNode) node;
             PlatformKind kind = gen.getPlatformKind(compare.x().stamp());
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java	Tue Jun 03 22:19:31 2014 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/NarrowOopStamp.java	Wed Jun 04 11:47:49 2014 +0200
@@ -26,6 +26,7 @@
 import com.oracle.graal.compiler.common.spi.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding;
+import com.oracle.graal.hotspot.meta.*;
 
 public class NarrowOopStamp extends AbstractObjectStamp {
 
@@ -39,6 +40,10 @@
         public String toString() {
             return name();
         }
+
+        public Constant getDefaultValue() {
+            return HotSpotCompressedNullConstant.COMPRESSED_NULL;
+        }
     };
 
     private final CompressEncoding encoding;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Tue Jun 03 22:19:31 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Wed Jun 04 11:47:49 2014 +0200
@@ -53,7 +53,7 @@
     @Override
     public boolean verify() {
         assertTrue(object() != null, "is null input must not be null");
-        assertTrue(object().stamp() instanceof ObjectStamp || object().stamp() instanceof IllegalStamp, "is null input must be an object");
+        assertTrue(object().stamp() instanceof AbstractObjectStamp, "is null input must be an object");
         return super.verify();
     }