Mercurial > hg > truffle
changeset 16422:7f20dee1be60
ensure instanceof and null check stay dependent
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Mon, 07 Jul 2014 20:27:20 -0700 |
parents | c158f653275e |
children | a9b85fe36dbc |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java |
diffstat | 1 files changed, 8 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Mon Jul 07 20:26:31 2014 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Mon Jul 07 20:27:20 2014 -0700 @@ -103,6 +103,7 @@ stamp = ((ObjectStamp) object().stamp()).castTo((ObjectStamp) stamp); } ValueNode condition; + ValueNode theValue = object; if (stamp instanceof IllegalStamp) { // This is a check cast that will always fail condition = LogicConstantNode.contradiction(graph()); @@ -116,6 +117,12 @@ InstanceOfNode typeTest = graph().addWithoutUnique(new InstanceOfNode(type, nullGuarded, profile)); graph().addBeforeFixed(this, nullCheck); condition = typeTest; + /* + * The PiNode is injecting an extra guard into the type so make sure it's used in + * the GuardingPi, otherwise we can lose the null guard if the InstanceOf is + * optimized away. + */ + theValue = nullGuarded; stamp = stamp.join(StampFactory.objectNonNull()); nullCheck.lower(tool); } else { @@ -125,7 +132,7 @@ condition = LogicNode.or(graph().unique(new IsNullNode(object)), typeTest, shortCircuitProbability); } } - GuardingPiNode checkedObject = graph().add(new GuardingPiNode(object, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, stamp)); + GuardingPiNode checkedObject = graph().add(new GuardingPiNode(theValue, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, stamp)); graph().replaceFixedWithFixed(this, checkedObject); checkedObject.lower(tool); }