Mercurial > hg > truffle
changeset 11397:956bf8c5bd8f
Fix for ReadNode.push which could cause some reads to float before the necessary checkcast.
This would cause loading non-oops as if they were oops in some rare cases.
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Thu, 22 Aug 2013 20:04:51 +0200 |
parents | a268b0de65d6 |
children | 8747d6af5b58 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java |
diffstat | 1 files changed, 4 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Thu Aug 22 15:22:26 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Thu Aug 22 20:04:51 2013 +0200 @@ -112,10 +112,11 @@ if (receiverType != null) { ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement); - if (field != null) { + if (field != null && parent.object().stamp() instanceof ObjectStamp) { ResolvedJavaType declaringClass = field.getDeclaringClass(); - if (declaringClass.isAssignableFrom(receiverType) && declaringClass != receiverType && parent.object().stamp() instanceof ObjectStamp) { - ObjectStamp piValueStamp = (ObjectStamp) parent.object().stamp(); + ObjectStamp piValueStamp = (ObjectStamp) parent.object().stamp(); + ResolvedJavaType piValueType = ObjectStamp.typeOrNull(piValueStamp); + if (piValueType != null && declaringClass.isAssignableFrom(piValueType) && declaringClass != receiverType) { if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { replaceFirstInput(parent, parent.object()); return true;