changeset 8653:193403beca24

PiPushable: implementation for ReadNode
author Bernhard Urban <bernhard.urban@jku.at>
date Thu, 04 Apr 2013 15:04:59 +0200
parents bdfd05a48d8e
children 3bbad4ec6510
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java
diffstat 1 files changed, 14 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Fri Apr 05 16:43:13 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Thu Apr 04 15:04:59 2013 +0200
@@ -33,7 +33,7 @@
 /**
  * Reads an {@linkplain AccessNode accessed} value.
  */
-public final class ReadNode extends FloatableAccessNode implements Node.IterableNodeType, LIRLowerable, Canonicalizable {
+public final class ReadNode extends FloatableAccessNode implements Node.IterableNodeType, LIRLowerable, Canonicalizable, PiPushable {
 
     public ReadNode(ValueNode object, ValueNode location, Stamp stamp) {
         super(object, location, stamp);
@@ -98,6 +98,19 @@
         return read;
     }
 
+    @Override
+    public void push(PiNode parent) {
+        Object locId = location().locationIdentity();
+        if (locId instanceof ResolvedJavaField) {
+            ResolvedJavaType fieldType = ((ResolvedJavaField) locId).getDeclaringClass();
+            ResolvedJavaType beforePiType = parent.object().objectStamp().type();
+
+            if (fieldType.isAssignableFrom(beforePiType)) {
+                replaceFirstInput(parent, parent.object());
+            }
+        }
+    }
+
     /**
      * Reads a value from memory.
      *