# HG changeset patch # User Gilles Duboscq # Date 1377194691 -7200 # Node ID 956bf8c5bd8fbecf08363bd97bc87c2023ccdf37 # Parent a268b0de65d6c91aa5d958d3f3b90d938232eeb4 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. diff -r a268b0de65d6 -r 956bf8c5bd8f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java --- 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;