# HG changeset patch # User Lukas Stadler # Date 1357901084 -3600 # Node ID c1a5c3bc56565ee47b09288e9c17766f9370c694 # Parent 4e25ceefee4c2ef9fdae300001c039e0960c9006 more accurate inferStamp for UnsafeCastNode and CheckCastNode diff -r 4e25ceefee4c -r c1a5c3bc5656 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Fri Jan 11 11:44:11 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Fri Jan 11 11:44:44 2013 +0100 @@ -50,6 +50,19 @@ } @Override + public boolean inferStamp() { + if (kind() != Kind.Object || object().kind() != Kind.Object) { + return false; + } + if (object().objectStamp().alwaysNull() && objectStamp().nonNull()) { + // a null value flowing into a nonNull UnsafeCastNode should be guarded by a type/isNull guard, but the + // compiler might see this situation before the branch is deleted + return false; + } + return updateStamp(stamp().join(object().stamp())); + } + + @Override public ValueNode canonical(CanonicalizerTool tool) { if (kind() != object.kind()) { return this; diff -r 4e25ceefee4c -r c1a5c3bc5656 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 Fri Jan 11 11:44:11 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Fri Jan 11 11:44:44 2013 +0100 @@ -59,11 +59,10 @@ @Override public boolean inferStamp() { - if (object().stamp().nonNull() && !stamp().nonNull()) { - setStamp(StampFactory.declaredNonNull(type)); - return true; + if (object().objectStamp().alwaysNull() && objectStamp().nonNull()) { + return false; } - return super.inferStamp(); + return updateStamp(stamp().join(object().stamp())); } @Override