Mercurial > hg > truffle
diff graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java @ 4635:f35c183f33ce
fixed checkcast when inlining more than one method
author | Christian Haeubl <christian.haeubl@oracle.com> |
---|---|
date | Fri, 17 Feb 2012 10:34:34 -0800 |
parents | 7d928ba6f3f2 |
children | 495a81cd6969 |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java Fri Feb 17 10:30:39 2012 -0800 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/InliningUtil.java Fri Feb 17 10:34:34 2012 -0800 @@ -326,18 +326,11 @@ for (int i = 0; i < calleeEntryNodes.length; i++) { BeginNode node = calleeEntryNodes[i]; Invoke invokeForInlining = (Invoke) node.next(); - int typeIdx = -1; - for (int j = 0; j < typesToConcretes.length; j++) { - if (typesToConcretes[j] == i) { - typeIdx = j; - break; - } - } - assert typeIdx >= 0; + RiResolvedType commonType = getLeastCommonType(i); ValueNode receiver = invokeForInlining.callTarget().receiver(); - ConstantNode typeConst = graph.unique(ConstantNode.forCiConstant(types[typeIdx].getEncoding(Representation.ObjectHub), runtime, graph)); - CheckCastNode checkCast = graph.unique(new CheckCastNode(node, typeConst, types[typeIdx], receiver)); + ConstantNode typeConst = graph.unique(ConstantNode.forCiConstant(commonType.getEncoding(Representation.ObjectHub), runtime, graph)); + CheckCastNode checkCast = graph.unique(new CheckCastNode(node, typeConst, commonType, receiver)); invokeForInlining.callTarget().replaceFirstInput(receiver, checkCast); RiResolvedMethod concrete = concretes.get(i); @@ -347,6 +340,21 @@ } } + private RiResolvedType getLeastCommonType(int concreteMethodIndex) { + RiResolvedType commonType = null; + for (int i = 0; i < typesToConcretes.length; i++) { + if (typesToConcretes[i] == concreteMethodIndex) { + if (commonType == null) { + commonType = types[i]; + } else { + commonType = commonType.leastCommonAncestor(types[i]); + } + } + } + assert commonType != null; + return commonType; + } + private void inlineSingleMethod(StructuredGraph graph, GraalRuntime runtime, InliningCallback callback) { assert concretes.size() == 1 && types.length > 1 && !shouldFallbackToInvoke() && notRecordedTypeProbability == 0;