# HG changeset patch # User Lukas Stadler # Date 1412581174 -7200 # Node ID 53e91025205f4318da6ea8d0e5d1252c14917fb4 # Parent 43cd0fc25ccb5a794cae1732f2e2b212fdcc564f don't skip ValueProxy nodes while looking for ArrayLengthProviders diff -r 43cd0fc25ccb -r 53e91025205f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiArrayNode.java --- 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); diff -r 43cd0fc25ccb -r 53e91025205f 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 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; diff -r 43cd0fc25ccb -r 53e91025205f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/ArrayLengthNode.java --- 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()) { diff -r 43cd0fc25ccb -r 53e91025205f graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/util/GraphUtil.java --- 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. diff -r 43cd0fc25ccb -r 53e91025205f graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BasicObjectCloneNode.java --- 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()); } }