# HG changeset patch # User Miguel Garcia # Date 1401645002 -7200 # Node ID df679a9e6de0f6dc266885eb05ef0c4bffbd1198 # Parent 5aaef6a8985d275539e1ba39357bccf508e63ba1 [inliner] additional bits and pieces of documentation and assertions diff -r 5aaef6a8985d -r df679a9e6de0 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Sun Jun 01 16:06:07 2014 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java Sun Jun 01 19:50:02 2014 +0200 @@ -122,7 +122,15 @@ private static ArrayList replaceParamsWithMoreInformativeArguments(final Invoke invoke, final StructuredGraph newGraph, final HighTierContext context) { NodeInputList args = invoke.callTarget().arguments(); ArrayList parameterUsages = null; - for (ParameterNode param : newGraph.getNodes(ParameterNode.class).snapshot()) { + List params = newGraph.getNodes(ParameterNode.class).snapshot(); + assert params.size() <= args.size(); + /* + * param-nodes that see no use (eg, after canonicalization) don't occur in `params`. That's + * why the sizes of `params` and `args` don't always match exactly. It's always possible to + * pair a param-node with its corresponding arg-node using param.index() as index into the + * `args` list. + */ + for (ParameterNode param : params) { if (param.usages().isNotEmpty()) { ValueNode arg = args.get(param.index()); if (arg.isConstant()) { @@ -130,6 +138,7 @@ parameterUsages = trackParameterUsages(param, parameterUsages); // collect param usages before replacing the param newGraph.replaceFloating(param, ConstantNode.forConstant(constant, context.getMetaAccess(), newGraph)); + // param-node gone, leaving a gap in the sequence given by param.index() } else { Stamp joinedStamp = param.stamp().join(arg.stamp()); if (joinedStamp != null && !joinedStamp.equals(param.stamp())) { @@ -141,6 +150,7 @@ } } } + assert (parameterUsages == null) || (!parameterUsages.isEmpty()); return parameterUsages; }