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;