# HG changeset patch # User Gilles Duboscq # Date 1377100959 -7200 # Node ID 9088d13767f3a0aa6b1dd83392e7e23e97b947ba # Parent 366136516cc6449b5f33e66dbcfbc14a6dc76de4 Keep a kind in the illegal stamp diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- 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) { diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes.test/src/com/oracle/graal/nodes/test/ObjectStampJoinTest.java --- 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) { diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConvertNode.java --- 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; diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IsNullNode.java --- 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(); } diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- 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); diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/FloatStamp.java --- 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); } diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/GenericStamp.java --- 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; } diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IllegalStamp.java --- 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 diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/IntegerStamp.java --- 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); diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java --- 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; diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/Stamp.java --- 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; } /** diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampFactory.java --- 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) { diff -r 366136516cc6 -r 9088d13767f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java --- 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) {