Mercurial > hg > truffle
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 } |