comparison graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java @ 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 ef6915cf1e59
children 95cbf029018c
comparison
equal deleted inserted replaced
11396:a268b0de65d6 11397:956bf8c5bd8f
110 ObjectStamp piStamp = (ObjectStamp) parent.stamp(); 110 ObjectStamp piStamp = (ObjectStamp) parent.stamp();
111 ResolvedJavaType receiverType = piStamp.type(); 111 ResolvedJavaType receiverType = piStamp.type();
112 if (receiverType != null) { 112 if (receiverType != null) {
113 ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement); 113 ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement);
114 114
115 if (field != null) { 115 if (field != null && parent.object().stamp() instanceof ObjectStamp) {
116 ResolvedJavaType declaringClass = field.getDeclaringClass(); 116 ResolvedJavaType declaringClass = field.getDeclaringClass();
117 if (declaringClass.isAssignableFrom(receiverType) && declaringClass != receiverType && parent.object().stamp() instanceof ObjectStamp) { 117 ObjectStamp piValueStamp = (ObjectStamp) parent.object().stamp();
118 ObjectStamp piValueStamp = (ObjectStamp) parent.object().stamp(); 118 ResolvedJavaType piValueType = ObjectStamp.typeOrNull(piValueStamp);
119 if (piValueType != null && declaringClass.isAssignableFrom(piValueType) && declaringClass != receiverType) {
119 if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { 120 if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) {
120 replaceFirstInput(parent, parent.object()); 121 replaceFirstInput(parent, parent.object());
121 return true; 122 return true;
122 } 123 }
123 } 124 }