Mercurial > hg > truffle
changeset 7337:c1a5c3bc5656
more accurate inferStamp for UnsafeCastNode and CheckCastNode
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Fri, 11 Jan 2013 11:44:44 +0100 |
parents | 4e25ceefee4c |
children | 13d5545e24e2 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java |
diffstat | 2 files changed, 16 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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