Mercurial > hg > truffle
comparison graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/elem/InlineableGraph.java @ 15991:df679a9e6de0
[inliner] additional bits and pieces of documentation and assertions
author | Miguel Garcia <miguel.m.garcia@oracle.com> |
---|---|
date | Sun, 01 Jun 2014 19:50:02 +0200 |
parents | 5aaef6a8985d |
children | 794daffa3850 |
comparison
equal
deleted
inserted
replaced
15988:5aaef6a8985d | 15991:df679a9e6de0 |
---|---|
120 * canonicalization otherwise. | 120 * canonicalization otherwise. |
121 */ | 121 */ |
122 private static ArrayList<Node> replaceParamsWithMoreInformativeArguments(final Invoke invoke, final StructuredGraph newGraph, final HighTierContext context) { | 122 private static ArrayList<Node> replaceParamsWithMoreInformativeArguments(final Invoke invoke, final StructuredGraph newGraph, final HighTierContext context) { |
123 NodeInputList<ValueNode> args = invoke.callTarget().arguments(); | 123 NodeInputList<ValueNode> args = invoke.callTarget().arguments(); |
124 ArrayList<Node> parameterUsages = null; | 124 ArrayList<Node> parameterUsages = null; |
125 for (ParameterNode param : newGraph.getNodes(ParameterNode.class).snapshot()) { | 125 List<ParameterNode> params = newGraph.getNodes(ParameterNode.class).snapshot(); |
126 assert params.size() <= args.size(); | |
127 /* | |
128 * param-nodes that see no use (eg, after canonicalization) don't occur in `params`. That's | |
129 * why the sizes of `params` and `args` don't always match exactly. It's always possible to | |
130 * pair a param-node with its corresponding arg-node using param.index() as index into the | |
131 * `args` list. | |
132 */ | |
133 for (ParameterNode param : params) { | |
126 if (param.usages().isNotEmpty()) { | 134 if (param.usages().isNotEmpty()) { |
127 ValueNode arg = args.get(param.index()); | 135 ValueNode arg = args.get(param.index()); |
128 if (arg.isConstant()) { | 136 if (arg.isConstant()) { |
129 Constant constant = arg.asConstant(); | 137 Constant constant = arg.asConstant(); |
130 parameterUsages = trackParameterUsages(param, parameterUsages); | 138 parameterUsages = trackParameterUsages(param, parameterUsages); |
131 // collect param usages before replacing the param | 139 // collect param usages before replacing the param |
132 newGraph.replaceFloating(param, ConstantNode.forConstant(constant, context.getMetaAccess(), newGraph)); | 140 newGraph.replaceFloating(param, ConstantNode.forConstant(constant, context.getMetaAccess(), newGraph)); |
141 // param-node gone, leaving a gap in the sequence given by param.index() | |
133 } else { | 142 } else { |
134 Stamp joinedStamp = param.stamp().join(arg.stamp()); | 143 Stamp joinedStamp = param.stamp().join(arg.stamp()); |
135 if (joinedStamp != null && !joinedStamp.equals(param.stamp())) { | 144 if (joinedStamp != null && !joinedStamp.equals(param.stamp())) { |
136 param.setStamp(joinedStamp); | 145 param.setStamp(joinedStamp); |
137 parameterUsages = trackParameterUsages(param, parameterUsages); | 146 parameterUsages = trackParameterUsages(param, parameterUsages); |
139 assert !isArgMoreInformativeThanParam(arg, param); | 148 assert !isArgMoreInformativeThanParam(arg, param); |
140 } | 149 } |
141 } | 150 } |
142 } | 151 } |
143 } | 152 } |
153 assert (parameterUsages == null) || (!parameterUsages.isEmpty()); | |
144 return parameterUsages; | 154 return parameterUsages; |
145 } | 155 } |
146 | 156 |
147 private static ArrayList<Node> trackParameterUsages(ParameterNode param, ArrayList<Node> parameterUsages) { | 157 private static ArrayList<Node> trackParameterUsages(ParameterNode param, ArrayList<Node> parameterUsages) { |
148 ArrayList<Node> result = (parameterUsages == null) ? new ArrayList<>() : parameterUsages; | 158 ArrayList<Node> result = (parameterUsages == null) ? new ArrayList<>() : parameterUsages; |