changeset 17342:a690ca62772c

add array length information in PartialEvaluator before expanding @ExplodeLoop
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 06 Oct 2014 09:46:27 +0200
parents e3f3233ec6cd
children da1f5b9ccac6
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java
diffstat 1 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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<Node> 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)) {