changeset 11387:9088d13767f3

Keep a kind in the illegal stamp
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 21 Aug 2013 18:02:39 +0200
parents 366136516cc6
children a313367eb5c2
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.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/calc/ConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java
diffstat 13 files changed, 54 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java	Wed Aug 21 18:02:39 2013 +0200
@@ -367,7 +367,7 @@
     }
 
     protected void emitNode(ValueNode node) {
-        if (Debug.isLogEnabled() && node.stamp() == StampFactory.illegal()) {
+        if (Debug.isLogEnabled() && node.stamp() instanceof IllegalStamp) {
             Debug.log("This node has invalid type, we are emitting dead code(?): %s", node);
         }
         if (node instanceof LIRGenLowerable) {
--- a/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java	Wed Aug 21 18:02:39 2013 +0200
@@ -69,7 +69,7 @@
     public void testJoin2() {
         Stamp aExact = StampFactory.exactNonNull(getType(A.class));
         Stamp b = StampFactory.declared(getType(B.class));
-        Assert.assertEquals(StampFactory.illegal(), join(aExact, b));
+        Assert.assertEquals(StampFactory.illegal(Kind.Object), join(aExact, b));
     }
 
     @Test
@@ -83,7 +83,7 @@
     public void testJoin4() {
         Stamp dExactNonNull = StampFactory.exactNonNull(getType(D.class));
         Stamp c = StampFactory.declared(getType(C.class));
-        Assert.assertEquals(StampFactory.illegal(), join(c, dExactNonNull));
+        Assert.assertEquals(StampFactory.illegal(Kind.Object), join(c, dExactNonNull));
     }
 
     @Test
@@ -106,7 +106,7 @@
     public void testJoinInterface0() {
         Stamp a = StampFactory.declared(getType(A.class));
         Stamp b = StampFactory.declared(getType(I.class));
-        Assert.assertNotSame(StampFactory.illegal(), join(a, b));
+        Assert.assertNotSame(StampFactory.illegal(Kind.Object), join(a, b));
     }
 
     @Test
@@ -123,7 +123,7 @@
         Stamp bExact = StampFactory.exactNonNull(getType(B.class));
         Stamp i = StampFactory.declared(getType(I.class));
         Stamp join = join(i, bExact);
-        Assert.assertEquals(StampFactory.illegal(), join);
+        Assert.assertEquals(StampFactory.illegal(Kind.Object), join);
     }
 
     private static Stamp join(Stamp a, Stamp b) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java	Wed Aug 21 18:02:39 2013 +0200
@@ -207,8 +207,8 @@
             if (stamp instanceof FloatStamp) {
                 return false;
             }
-            assert stamp == StampFactory.illegal();
-            return updateStamp(StampFactory.illegal());
+            assert stamp instanceof IllegalStamp;
+            return updateStamp(stamp);
         }
         Stamp newStamp;
         IntegerStamp integerStamp = (IntegerStamp) stamp;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java	Wed Aug 21 18:02:39 2013 +0200
@@ -55,7 +55,7 @@
     @Override
     public boolean verify() {
         assertTrue(object() != null, "is null input must not be null");
-        assertTrue(object().stamp() instanceof ObjectStamp || object().stamp() == StampFactory.illegal(), "is null input must be an object");
+        assertTrue(object().stamp() instanceof ObjectStamp || object().stamp() instanceof IllegalStamp, "is null input must be an object");
         return super.verify();
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java	Wed Aug 21 18:02:39 2013 +0200
@@ -103,7 +103,7 @@
             stamp = ((ObjectStamp) object().stamp()).castTo((ObjectStamp) stamp);
         }
         ValueNode condition;
-        if (stamp == StampFactory.illegal()) {
+        if (stamp instanceof IllegalStamp) {
             // This is a check cast that will always fail
             condition = LogicConstantNode.contradiction(graph());
             stamp = StampFactory.declared(type);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java	Wed Aug 21 18:02:39 2013 +0200
@@ -106,7 +106,7 @@
             return otherStamp.meet(this);
         }
         if (!(otherStamp instanceof FloatStamp)) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         FloatStamp other = (FloatStamp) otherStamp;
         assert kind() == other.kind();
@@ -131,7 +131,7 @@
             return otherStamp.join(this);
         }
         if (!(otherStamp instanceof FloatStamp)) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         FloatStamp other = (FloatStamp) otherStamp;
         assert kind() == other.kind();
@@ -143,7 +143,7 @@
         } else if (joinLowerBound == other.lowerBound && joinUpperBound == other.upperBound && joinNonNaN == other.nonNaN) {
             return other;
         } else if (joinLowerBound > joinUpperBound) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(kind());
         } else {
             return new FloatStamp(kind(), joinLowerBound, joinUpperBound, joinNonNaN);
         }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java	Wed Aug 21 18:02:39 2013 +0200
@@ -62,7 +62,7 @@
             return other.join(this);
         }
         if (!(other instanceof GenericStamp) || ((GenericStamp) other).type != type) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         return this;
     }
@@ -73,7 +73,7 @@
             return other.join(this);
         }
         if (!(other instanceof GenericStamp) || ((GenericStamp) other).type != type) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         return this;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java	Wed Aug 21 18:02:39 2013 +0200
@@ -24,12 +24,14 @@
 
 import com.oracle.graal.api.meta.*;
 
+/**
+ * This stamp represents the illegal type. Values with this type can not exist at run time.
+ * 
+ */
 public final class IllegalStamp extends Stamp {
 
-    public static final IllegalStamp ILLEGAL = new IllegalStamp();
-
-    private IllegalStamp() {
-        super(Kind.Illegal);
+    public IllegalStamp(Kind kind) {
+        super(kind);
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java	Wed Aug 21 18:02:39 2013 +0200
@@ -159,7 +159,7 @@
     private Stamp createStamp(IntegerStamp other, long newUpperBound, long newLowerBound, long newDownMask, long newUpMask) {
         assert kind() == other.kind();
         if (newLowerBound > newUpperBound || (newDownMask & (~newUpMask)) != 0) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(kind());
         } else if (newLowerBound == lowerBound && newUpperBound == upperBound && newDownMask == downMask && newUpMask == upMask) {
             return this;
         } else if (newLowerBound == other.lowerBound && newUpperBound == other.upperBound && newDownMask == other.downMask && newUpMask == other.upMask) {
@@ -178,7 +178,7 @@
             return otherStamp.meet(this);
         }
         if (!(otherStamp instanceof IntegerStamp)) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         IntegerStamp other = (IntegerStamp) otherStamp;
         return createStamp(other, Math.max(upperBound, other.upperBound), Math.min(lowerBound, other.lowerBound), downMask & other.downMask, upMask | other.upMask);
@@ -193,7 +193,7 @@
             return otherStamp.join(this);
         }
         if (!(otherStamp instanceof IntegerStamp)) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         IntegerStamp other = (IntegerStamp) otherStamp;
         return createStamp(other, Math.min(upperBound, other.upperBound), Math.max(lowerBound, other.lowerBound), downMask | other.downMask, upMask & other.upMask);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java	Wed Aug 21 18:02:39 2013 +0200
@@ -84,7 +84,7 @@
             return otherStamp.meet(this);
         }
         if (!(otherStamp instanceof ObjectStamp)) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         ObjectStamp other = (ObjectStamp) otherStamp;
         ResolvedJavaType meetType;
@@ -149,14 +149,14 @@
             return otherStamp.join(this);
         }
         if (!(otherStamp instanceof ObjectStamp)) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Illegal);
         }
         ObjectStamp other = (ObjectStamp) otherStamp;
         ResolvedJavaType joinType;
         boolean joinAlwaysNull = alwaysNull || other.alwaysNull;
         boolean joinNonNull = nonNull || other.nonNull;
         if (joinAlwaysNull && joinNonNull) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Object);
         }
         boolean joinExactType = exactType || other.exactType;
         if (type == other.type) {
@@ -164,7 +164,7 @@
         } else if (type == null && other.type == null) {
             joinType = null;
             if (joinExactType) {
-                return StampFactory.illegal();
+                return StampFactory.illegal(Kind.Object);
             }
         } else if (type == null) {
             joinType = other.type;
@@ -196,10 +196,10 @@
         }
         if (joinAlwaysNull) {
             if (joinNonNull) {
-                return StampFactory.illegal();
+                return StampFactory.illegal(Kind.Object);
             }
         } else if (joinExactType && Modifier.isAbstract(joinType.getModifiers()) && !joinType.isArray()) {
-            return StampFactory.illegal();
+            return StampFactory.illegal(Kind.Object);
         }
         if (joinType == type && joinExactType == exactType && joinNonNull == nonNull && joinAlwaysNull == alwaysNull) {
             return this;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java	Wed Aug 21 18:02:39 2013 +0200
@@ -47,7 +47,7 @@
     public abstract ResolvedJavaType javaType(MetaAccessProvider metaAccess);
 
     public boolean alwaysDistinct(Stamp other) {
-        return join(other) == StampFactory.illegal();
+        return join(other) instanceof IllegalStamp;
     }
 
     /**
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java	Wed Aug 21 18:02:39 2013 +0200
@@ -33,6 +33,7 @@
     // JaCoCo Exclude
 
     private static final Stamp[] stampCache = new Stamp[Kind.values().length];
+    private static final Stamp[] illegalStampCache = new Stamp[Kind.values().length];
     private static final Stamp objectStamp = new ObjectStamp(null, false, false, false);
     private static final Stamp objectNonNullStamp = new ObjectStamp(null, false, true, false);
     private static final Stamp objectAlwaysNullStamp = new ObjectStamp(null, false, false, true);
@@ -62,6 +63,9 @@
 
         setCache(Kind.Object, objectStamp);
         setCache(Kind.Void, voidStamp);
+        for (Kind k : Kind.values()) {
+            illegalStampCache[k.ordinal()] = new IllegalStamp(k);
+        }
     }
 
     public static Stamp forKind(Kind kind) {
@@ -113,8 +117,8 @@
         return positiveInt;
     }
 
-    public static Stamp illegal() {
-        return IllegalStamp.ILLEGAL;
+    public static Stamp illegal(Kind kind) {
+        return illegalStampCache[kind.ordinal()];
     }
 
     public static IntegerStamp forInteger(Kind kind, long lowerBound, long upperBound, long downMask, long upMask) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Wed Aug 21 16:56:15 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Wed Aug 21 18:02:39 2013 +0200
@@ -31,6 +31,17 @@
  */
 public class StampTool {
 
+    public static Kind joinKind(Kind a, Kind b) {
+        if (a == b) {
+            return a;
+        }
+        return Kind.Illegal;
+    }
+
+    public static Kind joinKind(Stamp a, Stamp b) {
+        return joinKind(a.kind(), b.kind());
+    }
+
     public static Stamp negate(Stamp stamp) {
         Kind kind = stamp.kind();
         if (stamp instanceof IntegerStamp) {
@@ -74,7 +85,7 @@
         if (stamp1 instanceof IntegerStamp && stamp2 instanceof IntegerStamp) {
             return add((IntegerStamp) stamp1, (IntegerStamp) stamp2);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(joinKind(stamp1, stamp2));
     }
 
     private static long carryBits(long x, long y) {
@@ -89,7 +100,7 @@
         if (stamp1 instanceof IntegerStamp && stamp2 instanceof IntegerStamp) {
             return div((IntegerStamp) stamp1, (IntegerStamp) stamp2);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(joinKind(stamp1, stamp2));
     }
 
     public static Stamp div(IntegerStamp stamp1, IntegerStamp stamp2) {
@@ -177,7 +188,7 @@
         if (stamp1 instanceof IntegerStamp && stamp2 instanceof IntegerStamp) {
             return and((IntegerStamp) stamp1, (IntegerStamp) stamp2);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(joinKind(stamp1, stamp2));
     }
 
     public static Stamp and(IntegerStamp stamp1, IntegerStamp stamp2) {
@@ -189,7 +200,7 @@
         if (stamp1 instanceof IntegerStamp && stamp2 instanceof IntegerStamp) {
             return or((IntegerStamp) stamp1, (IntegerStamp) stamp2);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(joinKind(stamp1, stamp2));
     }
 
     public static Stamp or(IntegerStamp stamp1, IntegerStamp stamp2) {
@@ -201,7 +212,7 @@
         if (stamp1 instanceof IntegerStamp && stamp2 instanceof IntegerStamp) {
             return xor((IntegerStamp) stamp1, (IntegerStamp) stamp2);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(joinKind(stamp1, stamp2));
     }
 
     public static Stamp xor(IntegerStamp stamp1, IntegerStamp stamp2) {
@@ -216,7 +227,7 @@
         if (value instanceof IntegerStamp && shift instanceof IntegerStamp) {
             return unsignedRightShift((IntegerStamp) value, (IntegerStamp) shift);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(value.kind());
     }
 
     public static Stamp unsignedRightShift(IntegerStamp value, IntegerStamp shift) {
@@ -245,7 +256,7 @@
         if (value instanceof IntegerStamp && shift instanceof IntegerStamp) {
             return leftShift((IntegerStamp) value, (IntegerStamp) shift);
         }
-        return StampFactory.illegal();
+        return StampFactory.illegal(value.kind());
     }
 
     public static Stamp leftShift(IntegerStamp value, IntegerStamp shift) {