Mercurial > hg > graal-compiler
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)) {