changeset 17340:53e91025205f

don't skip ValueProxy nodes while looking for ArrayLengthProviders
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 06 Oct 2014 09:39:34 +0200
parents 43cd0fc25ccb
children e3f3233ec6cd
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java
diffstat 5 files changed, 38 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiArrayNode.java	Sat Oct 04 01:39:59 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiArrayNode.java	Mon Oct 06 09:39:34 2014 +0200
@@ -28,6 +28,7 @@
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.util.*;
 
 /**
  * A {@link PiNode} that also provides an array length in addition to a more refined stamp. A usage
@@ -54,7 +55,7 @@
 
     @Override
     public Node canonical(CanonicalizerTool tool) {
-        if (!(object() instanceof ArrayLengthProvider) || length() != ((ArrayLengthProvider) object()).length()) {
+        if (GraphUtil.arrayLength(object()) != length()) {
             return this;
         }
         return super.canonical(tool);
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Sat Oct 04 01:39:59 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ReadNode.java	Mon Oct 06 09:39:34 2014 +0200
@@ -30,6 +30,7 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
+import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.nodes.virtual.*;
 
 /**
@@ -139,8 +140,8 @@
                     }
                 }
             }
-            if (location.getLocationIdentity() == LocationIdentity.ARRAY_LENGTH_LOCATION && object instanceof ArrayLengthProvider) {
-                ValueNode length = ((ArrayLengthProvider) object).length();
+            if (location.getLocationIdentity() == LocationIdentity.ARRAY_LENGTH_LOCATION) {
+                ValueNode length = GraphUtil.arrayLength(object);
                 if (length != null) {
                     // TODO Does this need a PiCastNode to the positive range?
                     return length;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java	Sat Oct 04 01:39:59 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java	Mon Oct 06 09:39:34 2014 +0200
@@ -92,14 +92,12 @@
      * @return a node representing the length of {@code array} or null if it is not available
      */
     public static ValueNode readArrayLength(ValueNode originalArray, ConstantReflectionProvider constantReflection) {
+        ValueNode length = GraphUtil.arrayLength(originalArray);
+        if (length != null) {
+            // Ensure that any proxies on the original value end up on the length value
+            return reproxyValue(originalArray, length);
+        }
         ValueNode array = GraphUtil.unproxify(originalArray);
-        if (array instanceof ArrayLengthProvider) {
-            ValueNode length = ((ArrayLengthProvider) array).length();
-            if (length != null) {
-                // Ensure that any proxies on the original value end up on the length value
-                return reproxyValue(originalArray, length);
-            }
-        }
         if (constantReflection != null && array.isConstant() && !array.isNullConstant()) {
             Constant constantValue = array.asConstant();
             if (constantValue != null && constantValue.isNonNull()) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Sat Oct 04 01:39:59 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java	Mon Oct 06 09:39:34 2014 +0200
@@ -326,6 +326,31 @@
     }
 
     /**
+     * Looks for an {@link ArrayLengthProvider} while iterating through all {@link ValueProxy
+     * ValueProxies}.
+     *
+     * @param value The start value.
+     * @return The array length if one was found, or null otherwise.
+     */
+    public static ValueNode arrayLength(ValueNode value) {
+        ValueNode current = value;
+        do {
+            if (current instanceof ArrayLengthProvider) {
+                ValueNode length = ((ArrayLengthProvider) current).length();
+                if (length != null) {
+                    return length;
+                }
+            }
+            if (current instanceof ValueProxy) {
+                current = ((ValueProxy) current).getOriginalNode();
+            } else {
+                break;
+            }
+        } while (true);
+        return null;
+    }
+
+    /**
      * Tries to find an original value of the given node by traversing through proxies and
      * unambiguous phis. Note that this method will perform an exhaustive search through phis. It is
      * intended to be used during graph building, when phi nodes aren't yet canonicalized.
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java	Sat Oct 04 01:39:59 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java	Mon Oct 06 09:39:34 2014 +0200
@@ -31,6 +31,7 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.nodes.virtual.*;
 
 @NodeInfo
@@ -60,7 +61,7 @@
     /*
      * Looks at the given stamp and determines if it is an exact type (or can be assumed to be an
      * exact type) and if it is a cloneable type.
-     *
+     * 
      * If yes, then the exact type is returned, otherwise it returns null.
      */
     protected static ResolvedJavaType getConcreteType(Stamp stamp, Assumptions assumptions, MetaAccessProvider metaAccess) {
@@ -127,10 +128,6 @@
 
     @Override
     public ValueNode length() {
-        if (getObject() instanceof ArrayLengthProvider) {
-            return ((ArrayLengthProvider) getObject()).length();
-        } else {
-            return null;
-        }
+        return GraphUtil.arrayLength(getObject());
     }
 }