# HG changeset patch # User Lukas Stadler # Date 1412581587 -7200 # Node ID a690ca62772c11a8a04df5e77caa611d27900fd5 # Parent e3f3233ec6cd481a725f44205fb899c0a9d00b96 add array length information in PartialEvaluator before expanding @ExplodeLoop diff -r e3f3233ec6cd -r a690ca62772c graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Mon Oct 06 09:39:42 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Mon Oct 06 09:46:27 2014 +0200 @@ -37,7 +37,6 @@ import com.oracle.graal.debug.internal.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.Node; -import com.oracle.graal.graph.spi.*; import com.oracle.graal.loop.*; import com.oracle.graal.nodes.CallTargetNode.InvokeKind; import com.oracle.graal.nodes.*; @@ -411,16 +410,19 @@ assert graph.hasLoops() : graph + " does not contain a loop"; final StructuredGraph graphCopy = graph.copy(); final List modifiedNodes = new ArrayList<>(); - for (ParameterNode param : graphCopy.getNodes(ParameterNode.class)) { + for (ParameterNode param : graphCopy.getNodes(ParameterNode.class).snapshot()) { ValueNode arg = arguments.get(param.index()); if (arg.isConstant()) { Constant constant = arg.asConstant(); - for (Node usage : param.usages()) { - if (usage instanceof Canonicalizable) { - modifiedNodes.add(usage); - } + param.usages().snapshotTo(modifiedNodes); + param.replaceAndDelete(ConstantNode.forConstant(constant, phaseContext.getMetaAccess(), graphCopy)); + } else { + ValueNode length = GraphUtil.arrayLength(arg); + if (length != null && length.isConstant()) { + param.usages().snapshotTo(modifiedNodes); + ParameterNode newParam = graphCopy.addWithoutUnique(ParameterNode.create(param.index(), param.stamp())); + param.replaceAndDelete(graphCopy.addWithoutUnique(PiArrayNode.create(newParam, ConstantNode.forInt(length.asConstant().asInt(), graphCopy), param.stamp()))); } - param.replaceAndDelete(ConstantNode.forConstant(constant, phaseContext.getMetaAccess(), graphCopy)); } } try (Scope s = Debug.scope("TruffleUnrollLoop", targetMethod)) {