Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java @ 15798:8c5bcddb4320
[inlining-6] moved Inlineable to dedicated package for inlineable elements
author | Miguel Garcia <miguel.m.garcia@oracle.com> |
---|---|
date | Tue, 20 May 2014 12:04:10 +0200 |
parents | ef6b8d1898e6 |
children | ebe257551ffd |
rev | line source |
---|---|
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
1 /* |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
4 * |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
8 * |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
14 * |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
18 * |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
21 * questions. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
22 */ |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
23 package com.oracle.graal.phases.common.inlining.info; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
24 |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
25 import static com.oracle.graal.compiler.common.GraalOptions.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
26 |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
27 import java.util.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
28 |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
29 import com.oracle.graal.api.code.*; |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
30 import com.oracle.graal.api.meta.*; |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
31 import com.oracle.graal.api.meta.JavaTypeProfile.ProfiledType; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
32 import com.oracle.graal.compiler.common.calc.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
33 import com.oracle.graal.compiler.common.type.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
34 import com.oracle.graal.debug.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
35 import com.oracle.graal.graph.*; |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
36 import com.oracle.graal.nodes.*; |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
37 import com.oracle.graal.nodes.calc.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
38 import com.oracle.graal.nodes.extended.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
39 import com.oracle.graal.nodes.java.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
40 import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
41 import com.oracle.graal.nodes.util.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
42 import com.oracle.graal.phases.common.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
43 import com.oracle.graal.phases.common.inlining.*; |
15798
8c5bcddb4320
[inlining-6] moved Inlineable to dedicated package for inlineable elements
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
15725
diff
changeset
|
44 import com.oracle.graal.phases.common.inlining.info.elem.Inlineable; |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
45 import com.oracle.graal.phases.tiers.*; |
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
46 import com.oracle.graal.phases.util.*; |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
47 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
48 /** |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
49 * Polymorphic inlining of m methods with n type checks (n ≥ m) in case that the profiling |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
50 * information suggests a reasonable amount of different receiver types and different methods. If an |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
51 * unknown type is encountered a deoptimization is triggered. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
52 */ |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
53 public class MultiTypeGuardInlineInfo extends AbstractInlineInfo { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
54 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
55 private static final DebugMetric metricInliningTailDuplication = Debug.metric("InliningTailDuplication"); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
56 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
57 private final List<ResolvedJavaMethod> concretes; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
58 private final double[] methodProbabilities; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
59 private final double maximumMethodProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
60 private final ArrayList<Integer> typesToConcretes; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
61 private final ArrayList<ProfiledType> ptypes; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
62 private final ArrayList<Double> concretesProbabilities; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
63 private final double notRecordedTypeProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
64 private final Inlineable[] inlineableElements; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
65 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
66 public MultiTypeGuardInlineInfo(Invoke invoke, ArrayList<ResolvedJavaMethod> concretes, ArrayList<Double> concretesProbabilities, ArrayList<ProfiledType> ptypes, |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
67 ArrayList<Integer> typesToConcretes, double notRecordedTypeProbability) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
68 super(invoke); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
69 assert concretes.size() > 0 : "must have at least one method"; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
70 assert ptypes.size() == typesToConcretes.size() : "array lengths must match"; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
71 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
72 this.concretesProbabilities = concretesProbabilities; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
73 this.concretes = concretes; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
74 this.ptypes = ptypes; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
75 this.typesToConcretes = typesToConcretes; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
76 this.notRecordedTypeProbability = notRecordedTypeProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
77 this.inlineableElements = new Inlineable[concretes.size()]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
78 this.methodProbabilities = computeMethodProbabilities(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
79 this.maximumMethodProbability = maximumMethodProbability(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
80 assert maximumMethodProbability > 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
81 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
82 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
83 private double[] computeMethodProbabilities() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
84 double[] result = new double[concretes.size()]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
85 for (int i = 0; i < typesToConcretes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
86 int concrete = typesToConcretes.get(i); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
87 double probability = ptypes.get(i).getProbability(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
88 result[concrete] += probability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
89 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
90 return result; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
91 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
92 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
93 private double maximumMethodProbability() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
94 double max = 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
95 for (int i = 0; i < methodProbabilities.length; i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
96 max = Math.max(max, methodProbabilities[i]); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
97 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
98 return max; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
99 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
100 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
101 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
102 public int numberOfMethods() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
103 return concretes.size(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
104 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
105 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
106 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
107 public ResolvedJavaMethod methodAt(int index) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
108 assert index >= 0 && index < concretes.size(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
109 return concretes.get(index); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
110 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
111 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
112 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
113 public Inlineable inlineableElementAt(int index) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
114 assert index >= 0 && index < concretes.size(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
115 return inlineableElements[index]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
116 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
117 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
118 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
119 public double probabilityAt(int index) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
120 return methodProbabilities[index]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
121 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
122 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
123 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
124 public double relevanceAt(int index) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
125 return probabilityAt(index) / maximumMethodProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
126 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
127 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
128 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
129 public void setInlinableElement(int index, Inlineable inlineableElement) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
130 assert index >= 0 && index < concretes.size(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
131 inlineableElements[index] = inlineableElement; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
132 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
133 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
134 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
135 public void inline(Providers providers, Assumptions assumptions) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
136 if (hasSingleMethod()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
137 inlineSingleMethod(graph(), providers.getMetaAccess(), assumptions); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
138 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
139 inlineMultipleMethods(graph(), providers, assumptions); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
140 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
141 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
142 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
143 public boolean shouldInline() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
144 for (ResolvedJavaMethod method : concretes) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
145 if (method.shouldBeInlined()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
146 return true; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
147 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
148 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
149 return false; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
150 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
151 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
152 private boolean hasSingleMethod() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
153 return concretes.size() == 1 && !shouldFallbackToInvoke(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
154 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
155 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
156 private boolean shouldFallbackToInvoke() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
157 return notRecordedTypeProbability > 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
158 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
159 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
160 private void inlineMultipleMethods(StructuredGraph graph, Providers providers, Assumptions assumptions) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
161 int numberOfMethods = concretes.size(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
162 FixedNode continuation = invoke.next(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
163 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
164 ValueNode originalReceiver = ((MethodCallTargetNode) invoke.callTarget()).receiver(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
165 // setup merge and phi nodes for results and exceptions |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
166 MergeNode returnMerge = graph.add(new MergeNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
167 returnMerge.setStateAfter(invoke.stateAfter()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
168 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
169 PhiNode returnValuePhi = null; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
170 if (invoke.asNode().getKind() != Kind.Void) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
171 returnValuePhi = graph.addWithoutUnique(new ValuePhiNode(invoke.asNode().stamp().unrestricted(), returnMerge)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
172 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
173 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
174 MergeNode exceptionMerge = null; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
175 PhiNode exceptionObjectPhi = null; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
176 if (invoke instanceof InvokeWithExceptionNode) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
177 InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
178 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithException.exceptionEdge(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
179 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
180 exceptionMerge = graph.add(new MergeNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
181 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
182 FixedNode exceptionSux = exceptionEdge.next(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
183 graph.addBeforeFixed(exceptionSux, exceptionMerge); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
184 exceptionObjectPhi = graph.addWithoutUnique(new ValuePhiNode(StampFactory.forKind(Kind.Object), exceptionMerge)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
185 exceptionMerge.setStateAfter(exceptionEdge.stateAfter().duplicateModified(invoke.stateAfter().bci, true, Kind.Object, exceptionObjectPhi)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
186 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
187 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
188 // create one separate block for each invoked method |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
189 BeginNode[] successors = new BeginNode[numberOfMethods + 1]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
190 for (int i = 0; i < numberOfMethods; i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
191 successors[i] = createInvocationBlock(graph, invoke, returnMerge, returnValuePhi, exceptionMerge, exceptionObjectPhi, true); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
192 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
193 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
194 // create the successor for an unknown type |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
195 FixedNode unknownTypeSux; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
196 if (shouldFallbackToInvoke()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
197 unknownTypeSux = createInvocationBlock(graph, invoke, returnMerge, returnValuePhi, exceptionMerge, exceptionObjectPhi, false); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
198 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
199 unknownTypeSux = graph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.TypeCheckedInliningViolated)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
200 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
201 successors[successors.length - 1] = BeginNode.begin(unknownTypeSux); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
202 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
203 // replace the invoke exception edge |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
204 if (invoke instanceof InvokeWithExceptionNode) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
205 InvokeWithExceptionNode invokeWithExceptionNode = (InvokeWithExceptionNode) invoke; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
206 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithExceptionNode.exceptionEdge(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
207 exceptionEdge.replaceAtUsages(exceptionObjectPhi); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
208 exceptionEdge.setNext(null); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
209 GraphUtil.killCFG(invokeWithExceptionNode.exceptionEdge()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
210 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
211 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
212 assert invoke.asNode().isAlive(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
213 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
214 // replace the invoke with a switch on the type of the actual receiver |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
215 boolean methodDispatch = createDispatchOnTypeBeforeInvoke(graph, successors, false, providers.getMetaAccess()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
216 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
217 assert invoke.next() == continuation; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
218 invoke.setNext(null); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
219 returnMerge.setNext(continuation); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
220 invoke.asNode().replaceAtUsages(returnValuePhi); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
221 invoke.asNode().replaceAndDelete(null); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
222 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
223 ArrayList<GuardedValueNode> replacementNodes = new ArrayList<>(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
224 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
225 // do the actual inlining for every invoke |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
226 for (int i = 0; i < numberOfMethods; i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
227 BeginNode node = successors[i]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
228 Invoke invokeForInlining = (Invoke) node.next(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
229 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
230 ResolvedJavaType commonType; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
231 if (methodDispatch) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
232 commonType = concretes.get(i).getDeclaringClass(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
233 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
234 commonType = getLeastCommonType(i); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
235 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
236 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
237 ValueNode receiver = ((MethodCallTargetNode) invokeForInlining.callTarget()).receiver(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
238 boolean exact = (getTypeCount(i) == 1 && !methodDispatch); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
239 GuardedValueNode anchoredReceiver = InliningUtil.createAnchoredReceiver(graph, node, commonType, receiver, exact); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
240 invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
241 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
242 inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
243 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
244 replacementNodes.add(anchoredReceiver); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
245 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
246 if (shouldFallbackToInvoke()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
247 replacementNodes.add(null); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
248 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
249 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
250 if (OptTailDuplication.getValue()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
251 /* |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
252 * We might want to perform tail duplication at the merge after a type switch, if there |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
253 * are invokes that would benefit from the improvement in type information. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
254 */ |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
255 FixedNode current = returnMerge; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
256 int opportunities = 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
257 do { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
258 if (current instanceof InvokeNode && ((InvokeNode) current).callTarget() instanceof MethodCallTargetNode && |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
259 ((MethodCallTargetNode) ((InvokeNode) current).callTarget()).receiver() == originalReceiver) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
260 opportunities++; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
261 } else if (current.inputs().contains(originalReceiver)) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
262 opportunities++; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
263 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
264 current = ((FixedWithNextNode) current).next(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
265 } while (current instanceof FixedWithNextNode); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
266 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
267 if (opportunities > 0) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
268 metricInliningTailDuplication.increment(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
269 Debug.log("MultiTypeGuardInlineInfo starting tail duplication (%d opportunities)", opportunities); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
270 PhaseContext phaseContext = new PhaseContext(providers, assumptions); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
271 CanonicalizerPhase canonicalizer = new CanonicalizerPhase(!ImmutableCode.getValue()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
272 TailDuplicationPhase.tailDuplicate(returnMerge, TailDuplicationPhase.TRUE_DECISION, replacementNodes, phaseContext, canonicalizer); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
273 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
274 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
275 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
276 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
277 private int getTypeCount(int concreteMethodIndex) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
278 int count = 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
279 for (int i = 0; i < typesToConcretes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
280 if (typesToConcretes.get(i) == concreteMethodIndex) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
281 count++; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
282 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
283 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
284 return count; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
285 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
286 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
287 private ResolvedJavaType getLeastCommonType(int concreteMethodIndex) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
288 ResolvedJavaType commonType = null; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
289 for (int i = 0; i < typesToConcretes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
290 if (typesToConcretes.get(i) == concreteMethodIndex) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
291 if (commonType == null) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
292 commonType = ptypes.get(i).getType(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
293 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
294 commonType = commonType.findLeastCommonAncestor(ptypes.get(i).getType()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
295 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
296 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
297 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
298 assert commonType != null; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
299 return commonType; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
300 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
301 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
302 private ResolvedJavaType getLeastCommonType() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
303 ResolvedJavaType result = getLeastCommonType(0); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
304 for (int i = 1; i < concretes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
305 result = result.findLeastCommonAncestor(getLeastCommonType(i)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
306 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
307 return result; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
308 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
309 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
310 private void inlineSingleMethod(StructuredGraph graph, MetaAccessProvider metaAccess, Assumptions assumptions) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
311 assert concretes.size() == 1 && inlineableElements.length == 1 && ptypes.size() > 1 && !shouldFallbackToInvoke() && notRecordedTypeProbability == 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
312 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
313 BeginNode calleeEntryNode = graph.add(new BeginNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
314 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
315 BeginNode unknownTypeSux = createUnknownTypeSuccessor(graph); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
316 BeginNode[] successors = new BeginNode[]{calleeEntryNode, unknownTypeSux}; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
317 createDispatchOnTypeBeforeInvoke(graph, successors, false, metaAccess); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
318 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
319 calleeEntryNode.setNext(invoke.asNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
320 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
321 inline(invoke, methodAt(0), inlineableElementAt(0), assumptions, false); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
322 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
323 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
324 private boolean createDispatchOnTypeBeforeInvoke(StructuredGraph graph, BeginNode[] successors, boolean invokeIsOnlySuccessor, MetaAccessProvider metaAccess) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
325 assert ptypes.size() >= 1; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
326 ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
327 Kind hubKind = ((MethodCallTargetNode) invoke.callTarget()).targetMethod().getDeclaringClass().getEncoding(ResolvedJavaType.Representation.ObjectHub).getKind(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
328 LoadHubNode hub = graph.unique(new LoadHubNode(nonNullReceiver, hubKind)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
329 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
330 if (!invokeIsOnlySuccessor && chooseMethodDispatch()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
331 assert successors.length == concretes.size() + 1; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
332 assert concretes.size() > 0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
333 Debug.log("Method check cascade with %d methods", concretes.size()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
334 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
335 ValueNode[] constantMethods = new ValueNode[concretes.size()]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
336 double[] probability = new double[concretes.size()]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
337 for (int i = 0; i < concretes.size(); ++i) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
338 ResolvedJavaMethod firstMethod = concretes.get(i); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
339 Constant firstMethodConstant = firstMethod.getEncoding(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
340 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
341 ValueNode firstMethodConstantNode = ConstantNode.forConstant(firstMethodConstant, metaAccess, graph); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
342 constantMethods[i] = firstMethodConstantNode; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
343 double concretesProbability = concretesProbabilities.get(i); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
344 assert concretesProbability >= 0.0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
345 probability[i] = concretesProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
346 if (i > 0) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
347 double prevProbability = probability[i - 1]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
348 if (prevProbability == 1.0) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
349 probability[i] = 1.0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
350 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
351 probability[i] = Math.min(1.0, Math.max(0.0, probability[i] / (1.0 - prevProbability))); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
352 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
353 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
354 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
355 |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
356 ResolvedJavaType receiverType = invoke.getReceiverType(); |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
357 FixedNode lastSucc = successors[concretes.size()]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
358 for (int i = concretes.size() - 1; i >= 0; --i) { |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
359 LoadMethodNode method = graph.add(new LoadMethodNode(concretes.get(i), receiverType, hub, constantMethods[i].getKind())); |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
360 CompareNode methodCheck = CompareNode.createCompareNode(graph, Condition.EQ, method, constantMethods[i]); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
361 IfNode ifNode = graph.add(new IfNode(methodCheck, successors[i], lastSucc, probability[i])); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
362 method.setNext(ifNode); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
363 lastSucc = method; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
364 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
365 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
366 FixedWithNextNode pred = (FixedWithNextNode) invoke.asNode().predecessor(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
367 pred.setNext(lastSucc); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
368 return true; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
369 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
370 Debug.log("Type switch with %d types", concretes.size()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
371 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
372 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
373 ResolvedJavaType[] keys = new ResolvedJavaType[ptypes.size()]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
374 double[] keyProbabilities = new double[ptypes.size() + 1]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
375 int[] keySuccessors = new int[ptypes.size() + 1]; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
376 for (int i = 0; i < ptypes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
377 keys[i] = ptypes.get(i).getType(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
378 keyProbabilities[i] = ptypes.get(i).getProbability(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
379 keySuccessors[i] = invokeIsOnlySuccessor ? 0 : typesToConcretes.get(i); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
380 assert keySuccessors[i] < successors.length - 1 : "last successor is the unknownTypeSux"; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
381 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
382 keyProbabilities[keyProbabilities.length - 1] = notRecordedTypeProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
383 keySuccessors[keySuccessors.length - 1] = successors.length - 1; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
384 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
385 TypeSwitchNode typeSwitch = graph.add(new TypeSwitchNode(hub, successors, keys, keyProbabilities, keySuccessors)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
386 FixedWithNextNode pred = (FixedWithNextNode) invoke.asNode().predecessor(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
387 pred.setNext(typeSwitch); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
388 return false; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
389 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
390 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
391 private boolean chooseMethodDispatch() { |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
392 ResolvedJavaType receiverType = invoke.getReceiverType(); |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
393 for (ResolvedJavaMethod concrete : concretes) { |
15725
ef6b8d1898e6
Add resolved receiver type to ResolvedJavaMethod.isInVirtualMethodTable in order to be able to do vtable-calls for miranda and default methods
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15722
diff
changeset
|
394 if (!concrete.isInVirtualMethodTable(receiverType)) { |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
395 return false; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
396 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
397 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
398 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
399 if (concretes.size() == 1 && this.notRecordedTypeProbability > 0) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
400 // Always chose method dispatch if there is a single concrete method and the call |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
401 // site is megamorphic. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
402 return true; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
403 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
404 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
405 if (concretes.size() == ptypes.size()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
406 // Always prefer types over methods if the number of types is smaller than the |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
407 // number of methods. |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
408 return false; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
409 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
410 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
411 return chooseMethodDispatchCostBased(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
412 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
413 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
414 private boolean chooseMethodDispatchCostBased() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
415 double remainder = 1.0 - this.notRecordedTypeProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
416 double costEstimateMethodDispatch = remainder; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
417 for (int i = 0; i < concretes.size(); ++i) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
418 if (i != 0) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
419 costEstimateMethodDispatch += remainder; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
420 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
421 remainder -= concretesProbabilities.get(i); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
422 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
423 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
424 double costEstimateTypeDispatch = 0.0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
425 remainder = 1.0; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
426 for (int i = 0; i < ptypes.size(); ++i) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
427 if (i != 0) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
428 costEstimateTypeDispatch += remainder; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
429 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
430 remainder -= ptypes.get(i).getProbability(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
431 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
432 costEstimateTypeDispatch += notRecordedTypeProbability; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
433 return costEstimateMethodDispatch < costEstimateTypeDispatch; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
434 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
435 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
436 private static BeginNode createInvocationBlock(StructuredGraph graph, Invoke invoke, MergeNode returnMerge, PhiNode returnValuePhi, MergeNode exceptionMerge, PhiNode exceptionObjectPhi, |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
437 boolean useForInlining) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
438 Invoke duplicatedInvoke = duplicateInvokeForInlining(graph, invoke, exceptionMerge, exceptionObjectPhi, useForInlining); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
439 BeginNode calleeEntryNode = graph.add(new BeginNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
440 calleeEntryNode.setNext(duplicatedInvoke.asNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
441 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
442 AbstractEndNode endNode = graph.add(new EndNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
443 duplicatedInvoke.setNext(endNode); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
444 returnMerge.addForwardEnd(endNode); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
445 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
446 if (returnValuePhi != null) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
447 returnValuePhi.addInput(duplicatedInvoke.asNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
448 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
449 return calleeEntryNode; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
450 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
451 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
452 private static Invoke duplicateInvokeForInlining(StructuredGraph graph, Invoke invoke, MergeNode exceptionMerge, PhiNode exceptionObjectPhi, boolean useForInlining) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
453 Invoke result = (Invoke) invoke.asNode().copyWithInputs(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
454 Node callTarget = result.callTarget().copyWithInputs(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
455 result.asNode().replaceFirstInput(result.callTarget(), callTarget); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
456 result.setUseForInlining(useForInlining); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
457 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
458 Kind kind = invoke.asNode().getKind(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
459 if (kind != Kind.Void) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
460 FrameState stateAfter = invoke.stateAfter(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
461 stateAfter = stateAfter.duplicate(stateAfter.bci); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
462 stateAfter.replaceFirstInput(invoke.asNode(), result.asNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
463 result.setStateAfter(stateAfter); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
464 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
465 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
466 if (invoke instanceof InvokeWithExceptionNode) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
467 assert exceptionMerge != null && exceptionObjectPhi != null; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
468 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
469 InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
470 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithException.exceptionEdge(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
471 FrameState stateAfterException = exceptionEdge.stateAfter(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
472 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
473 ExceptionObjectNode newExceptionEdge = (ExceptionObjectNode) exceptionEdge.copyWithInputs(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
474 // set new state (pop old exception object, push new one) |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
475 newExceptionEdge.setStateAfter(stateAfterException.duplicateModified(stateAfterException.bci, stateAfterException.rethrowException(), Kind.Object, newExceptionEdge)); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
476 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
477 AbstractEndNode endNode = graph.add(new EndNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
478 newExceptionEdge.setNext(endNode); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
479 exceptionMerge.addForwardEnd(endNode); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
480 exceptionObjectPhi.addInput(newExceptionEdge); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
481 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
482 ((InvokeWithExceptionNode) result).setExceptionEdge(newExceptionEdge); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
483 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
484 return result; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
485 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
486 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
487 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
488 public void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
489 if (hasSingleMethod()) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
490 devirtualizeWithTypeSwitch(graph(), InvokeKind.Special, concretes.get(0), metaAccess); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
491 } else { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
492 tryToDevirtualizeMultipleMethods(graph(), metaAccess); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
493 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
494 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
495 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
496 private void tryToDevirtualizeMultipleMethods(StructuredGraph graph, MetaAccessProvider metaAccess) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
497 MethodCallTargetNode methodCallTarget = (MethodCallTargetNode) invoke.callTarget(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
498 if (methodCallTarget.invokeKind() == InvokeKind.Interface) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
499 ResolvedJavaMethod targetMethod = methodCallTarget.targetMethod(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
500 ResolvedJavaType leastCommonType = getLeastCommonType(); |
15722
c583759bbcfd
ResolvedJavaType.resolveMethod now takes a callerType that is used to check access rules. Make it work for default methods.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15644
diff
changeset
|
501 ResolvedJavaType contextType = invoke.getContextType(); |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
502 // check if we have a common base type that implements the interface -> in that case |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
503 // we have a vtable entry for the interface method and can use a less expensive |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
504 // virtual call |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
505 if (!leastCommonType.isInterface() && targetMethod.getDeclaringClass().isAssignableFrom(leastCommonType)) { |
15722
c583759bbcfd
ResolvedJavaType.resolveMethod now takes a callerType that is used to check access rules. Make it work for default methods.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15644
diff
changeset
|
506 ResolvedJavaMethod baseClassTargetMethod = leastCommonType.resolveMethod(targetMethod, contextType); |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
507 if (baseClassTargetMethod != null) { |
15722
c583759bbcfd
ResolvedJavaType.resolveMethod now takes a callerType that is used to check access rules. Make it work for default methods.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15644
diff
changeset
|
508 devirtualizeWithTypeSwitch(graph, InvokeKind.Virtual, leastCommonType.resolveMethod(targetMethod, contextType), metaAccess); |
15644
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
509 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
510 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
511 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
512 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
513 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
514 private void devirtualizeWithTypeSwitch(StructuredGraph graph, InvokeKind kind, ResolvedJavaMethod target, MetaAccessProvider metaAccess) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
515 BeginNode invocationEntry = graph.add(new BeginNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
516 BeginNode unknownTypeSux = createUnknownTypeSuccessor(graph); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
517 BeginNode[] successors = new BeginNode[]{invocationEntry, unknownTypeSux}; |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
518 createDispatchOnTypeBeforeInvoke(graph, successors, true, metaAccess); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
519 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
520 invocationEntry.setNext(invoke.asNode()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
521 ValueNode receiver = ((MethodCallTargetNode) invoke.callTarget()).receiver(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
522 GuardedValueNode anchoredReceiver = InliningUtil.createAnchoredReceiver(graph, invocationEntry, target.getDeclaringClass(), receiver, false); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
523 invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
524 InliningUtil.replaceInvokeCallTarget(invoke, graph, kind, target); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
525 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
526 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
527 private static BeginNode createUnknownTypeSuccessor(StructuredGraph graph) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
528 return BeginNode.begin(graph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.TypeCheckedInliningViolated))); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
529 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
530 |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
531 @Override |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
532 public String toString() { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
533 StringBuilder builder = new StringBuilder(shouldFallbackToInvoke() ? "megamorphic" : "polymorphic"); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
534 builder.append(", "); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
535 builder.append(concretes.size()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
536 builder.append(" methods [ "); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
537 for (int i = 0; i < concretes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
538 builder.append(MetaUtil.format(" %H.%n(%p):%r", concretes.get(i))); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
539 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
540 builder.append(" ], "); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
541 builder.append(ptypes.size()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
542 builder.append(" type checks [ "); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
543 for (int i = 0; i < ptypes.size(); i++) { |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
544 builder.append(" "); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
545 builder.append(ptypes.get(i).getType().getName()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
546 builder.append(ptypes.get(i).getProbability()); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
547 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
548 builder.append(" ]"); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
549 return builder.toString(); |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
550 } |
cd436bc5d63a
[inlining] moving InlineInfo and subclasses to package inlining.info
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
diff
changeset
|
551 } |