# HG changeset patch # User Bernhard Urban # Date 1377718590 -7200 # Node ID 3653d3a66d3bb35eaf50912a93cbb62438dd83fc # Parent 124662d7d103a4877bff97ad5f108ed019bb1705 ReadNode: minor refactoring in push() diff -r 124662d7d103 -r 3653d3a66d3b 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 Wed Aug 28 21:28:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java Wed Aug 28 21:36:30 2013 +0200 @@ -104,29 +104,31 @@ @Override public boolean push(PiNode parent) { - if (location() instanceof ConstantLocationNode) { - long displacement = ((ConstantLocationNode) location()).getDisplacement(); - if (parent.stamp() instanceof ObjectStamp) { - ObjectStamp piStamp = (ObjectStamp) parent.stamp(); - ResolvedJavaType receiverType = piStamp.type(); - if (receiverType != null) { - ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(displacement); + if (!(location() instanceof ConstantLocationNode && parent.stamp() instanceof ObjectStamp && parent.object().stamp() instanceof ObjectStamp)) { + return false; + } + + ObjectStamp piStamp = (ObjectStamp) parent.stamp(); + ResolvedJavaType receiverType = piStamp.type(); + if (receiverType == null) { + return false; + } - if (field != null && parent.object().stamp() instanceof ObjectStamp) { - ResolvedJavaType declaringClass = field.getDeclaringClass(); - ObjectStamp piValueStamp = (ObjectStamp) parent.object().stamp(); - ResolvedJavaType piValueType = ObjectStamp.typeOrNull(piValueStamp); - if (piValueType != null && declaringClass.isAssignableFrom(piValueType)) { - if (piStamp.nonNull() == piValueStamp.nonNull() && piStamp.alwaysNull() == piValueStamp.alwaysNull()) { - replaceFirstInput(parent, parent.object()); - return true; - } - } - } - } + ResolvedJavaField field = receiverType.findInstanceFieldWithOffset(((ConstantLocationNode) location()).getDisplacement()); + if (field == null) { + // field was not declared by receiverType + return false; + } + + ObjectStamp valueStamp = (ObjectStamp) parent.object().stamp(); + ResolvedJavaType valueType = ObjectStamp.typeOrNull(valueStamp); + if (valueType != null && field.getDeclaringClass().isAssignableFrom(valueType)) { + if (piStamp.nonNull() == valueStamp.nonNull() && piStamp.alwaysNull() == valueStamp.alwaysNull()) { + replaceFirstInput(parent, parent.object()); + return true; } + } - } return false; }