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;