Mercurial > hg > truffle
annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java @ 13502:89a9d3f5bc17
Bugfix in inlining
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Fri, 03 Jan 2014 11:55:14 -0800 |
parents | 16d99e9d77ad |
children | 83fd2094ff66 |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
4233
fa53d5e4aa35
Remove lock information from frame states, and compute it instead when LIR is generated.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4205
diff
changeset
|
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
4 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
8 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
14 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
18 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
21 * questions. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
22 */ |
6526
ee651c726397
split phases out of graal.phases project into graal.phases.common project
Doug Simon <doug.simon@oracle.com>
parents:
6525
diff
changeset
|
23 package com.oracle.graal.phases.common; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
11839
0e2cceed1caf
Temporarily move encodeDeoptActionAndReason to MetaAccessProvider
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11712
diff
changeset
|
25 import static com.oracle.graal.api.meta.DeoptimizationAction.*; |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
26 import static com.oracle.graal.api.meta.DeoptimizationReason.*; |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
27 import static com.oracle.graal.nodes.type.StampFactory.*; |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9837
diff
changeset
|
28 import static com.oracle.graal.phases.GraalOptions.*; |
13118
d511d688b782
re-enabled TieredCompilation when GRAAL is defined by handling abstract types in profiles gathered by C1
Doug Simon <doug.simon@oracle.com>
parents:
12655
diff
changeset
|
29 import static java.lang.reflect.Modifier.*; |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9837
diff
changeset
|
30 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
31 import java.lang.reflect.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
32 import java.util.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
33 |
5510
426c605c9d3c
Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5507
diff
changeset
|
34 import com.oracle.graal.api.code.*; |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
35 import com.oracle.graal.api.code.Assumptions.Assumption; |
5507
dc71b06d09f8
Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5506
diff
changeset
|
36 import com.oracle.graal.api.meta.*; |
7071 | 37 import com.oracle.graal.api.meta.JavaTypeProfile.ProfiledType; |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6526
diff
changeset
|
38 import com.oracle.graal.api.meta.ResolvedJavaType.Representation; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
39 import com.oracle.graal.debug.*; |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
40 import com.oracle.graal.debug.Debug.Scope; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
41 import com.oracle.graal.graph.*; |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
42 import com.oracle.graal.graph.Graph.DuplicationReplacement; |
11573
8a3d99fc36cf
Pass canonicalizer into tail duplication.
Roland Schatz <roland.schatz@oracle.com>
parents:
11270
diff
changeset
|
43 import com.oracle.graal.graph.Node.Verbosity; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
44 import com.oracle.graal.nodes.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
45 import com.oracle.graal.nodes.calc.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
46 import com.oracle.graal.nodes.extended.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
47 import com.oracle.graal.nodes.java.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
48 import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; |
8637
ce5750014c3d
moved Replacements and MacroSubstitution from the graal.api.replacements project to graal.nodes project and reversed the dependency between these two projects (the latter now/again depends on the former)
Doug Simon <doug.simon@oracle.com>
parents:
8636
diff
changeset
|
49 import com.oracle.graal.nodes.spi.*; |
5339
e8f80481326d
use PiNodes instead of CheckCastNodes to pin inlining receivers, remove emitCode flag
Lukas Stadler <lukas.stadler@jku.at>
parents:
5316
diff
changeset
|
50 import com.oracle.graal.nodes.type.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
51 import com.oracle.graal.nodes.util.*; |
6525
2c913b643422
rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6522
diff
changeset
|
52 import com.oracle.graal.phases.*; |
9705
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
53 import com.oracle.graal.phases.common.InliningPhase.InliningData; |
9329
fa188fbfe3fe
Perform only targeted canonicalization after tail duplication.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9310
diff
changeset
|
54 import com.oracle.graal.phases.tiers.*; |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
55 import com.oracle.graal.phases.util.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
56 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
57 public class InliningUtil { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
58 |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
59 private static final DebugMetric metricInliningTailDuplication = Debug.metric("InliningTailDuplication"); |
7071 | 60 private static final String inliningDecisionsScopeString = "InliningDecisions"; |
7558
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7540
diff
changeset
|
61 /** |
7660
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
62 * Meters the size (in bytecodes) of all methods processed during compilation (i.e., top level |
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
63 * and all inlined methods), irrespective of how many bytecodes in each method are actually |
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
64 * parsed (which may be none for methods whose IR is retrieved from a cache). |
7558
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7540
diff
changeset
|
65 */ |
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7540
diff
changeset
|
66 public static final DebugMetric InlinedBytecodes = Debug.metric("InlinedBytecodes"); |
223f645acb9b
added compilation rate measurements on top of existing metric/timer facility - enabled with -Dgraal.benchmark.compilation=true
Doug Simon <doug.simon@oracle.com>
parents:
7540
diff
changeset
|
67 |
7071 | 68 public interface InliningPolicy { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
69 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
70 boolean continueInlining(StructuredGraph graph); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
71 |
10933
9878214a0093
Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents:
10930
diff
changeset
|
72 boolean isWorthInlining(Replacements replacements, InlineInfo info, int inliningDepth, double probability, double relevance, boolean fullyProcessed); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
73 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
74 |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
75 public interface Inlineable { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
76 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
77 int getNodeCount(); |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
78 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
79 Iterable<Invoke> getInvokes(); |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
80 } |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
81 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
82 public static class InlineableGraph implements Inlineable { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
83 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
84 private final StructuredGraph graph; |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
85 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
86 public InlineableGraph(StructuredGraph graph) { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
87 this.graph = graph; |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
88 } |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
89 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
90 @Override |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
91 public int getNodeCount() { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
92 return graph.getNodeCount(); |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
93 } |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
94 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
95 @Override |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
96 public Iterable<Invoke> getInvokes() { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
97 return graph.getInvokes(); |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
98 } |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
99 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
100 public StructuredGraph getGraph() { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
101 return graph; |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
102 } |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
103 } |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
104 |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
105 public static class InlineableMacroNode implements Inlineable { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
106 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
107 private final Class<? extends FixedWithNextNode> macroNodeClass; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
108 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
109 public InlineableMacroNode(Class<? extends FixedWithNextNode> macroNodeClass) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
110 this.macroNodeClass = macroNodeClass; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
111 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
112 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
113 @Override |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
114 public int getNodeCount() { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
115 return 1; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
116 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
117 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
118 @Override |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
119 public Iterable<Invoke> getInvokes() { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
120 return Collections.emptyList(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
121 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
122 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
123 public Class<? extends FixedWithNextNode> getMacroNodeClass() { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
124 return macroNodeClass; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
125 } |
7071 | 126 } |
127 | |
8996
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
128 /** |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
129 * Print a HotSpot-style inlining message to the console. |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
130 */ |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
131 private static void printInlining(final InlineInfo info, final int inliningDepth, final boolean success, final String msg, final Object... args) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
132 printInlining(info.methodAt(0), info.invoke(), inliningDepth, success, msg, args); |
8996
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
133 } |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
134 |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
135 /** |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
136 * Print a HotSpot-style inlining message to the console. |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
137 */ |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
138 private static void printInlining(final ResolvedJavaMethod method, final Invoke invoke, final int inliningDepth, final boolean success, final String msg, final Object... args) { |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9837
diff
changeset
|
139 if (HotSpotPrintInlining.getValue()) { |
8996
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
140 final int mod = method.getModifiers(); |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
141 // 1234567 |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
142 TTY.print(" "); // print timestamp |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
143 // 1234 |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
144 TTY.print(" "); // print compilation number |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
145 // % s ! b n |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
146 TTY.print("%c%c%c%c%c ", ' ', Modifier.isSynchronized(mod) ? 's' : ' ', ' ', ' ', Modifier.isNative(mod) ? 'n' : ' '); |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
147 TTY.print(" "); // more indent |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
148 TTY.print(" "); // initial inlining indent |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
149 for (int i = 0; i < inliningDepth; i++) { |
8996
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
150 TTY.print(" "); |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
151 } |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
152 TTY.println(String.format("@ %d %s %s%s", invoke.bci(), methodName(method, null), success ? "" : "not inlining ", String.format(msg, args))); |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
153 } |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
154 } |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
155 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
156 public static boolean logInlinedMethod(InlineInfo info, int inliningDepth, boolean allowLogging, String msg, Object... args) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
157 return logInliningDecision(info, inliningDepth, allowLogging, true, msg, args); |
8996
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
158 } |
6d86ce1297bc
GRAAL-213: add HotSpot-style PrintCompilation and PrintInlining
twisti
parents:
8649
diff
changeset
|
159 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
160 public static boolean logNotInlinedMethod(InlineInfo info, int inliningDepth, String msg, Object... args) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
161 return logInliningDecision(info, inliningDepth, true, false, msg, args); |
7071 | 162 } |
163 | |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
164 public static boolean logInliningDecision(InlineInfo info, int inliningDepth, boolean allowLogging, boolean success, String msg, final Object... args) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
165 if (allowLogging) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
166 printInlining(info, inliningDepth, success, msg, args); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
167 if (shouldLogInliningDecision()) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
168 logInliningDecision(methodName(info), success, msg, args); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
169 } |
7071 | 170 } |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
171 return success; |
7071 | 172 } |
173 | |
174 public static void logInliningDecision(final String msg, final Object... args) { | |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
175 try (Scope s = Debug.scope(inliningDecisionsScopeString)) { |
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
176 Debug.log(msg, args); |
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
177 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
178 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
179 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
180 private static boolean logNotInlinedMethod(Invoke invoke, String msg) { |
7071 | 181 if (shouldLogInliningDecision()) { |
7391
36dafe48bc38
added relevance-based inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7388
diff
changeset
|
182 String methodString = invoke.toString() + (invoke.callTarget() == null ? " callTarget=null" : invoke.callTarget().targetName()); |
7071 | 183 logInliningDecision(methodString, false, msg, new Object[0]); |
184 } | |
185 return false; | |
186 } | |
187 | |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
188 private static InlineInfo logNotInlinedMethodAndReturnNull(Invoke invoke, int inliningDepth, ResolvedJavaMethod method, String msg) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
189 return logNotInlinedMethodAndReturnNull(invoke, inliningDepth, method, msg, new Object[0]); |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
190 } |
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
191 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
192 private static InlineInfo logNotInlinedMethodAndReturnNull(Invoke invoke, int inliningDepth, ResolvedJavaMethod method, String msg, Object... args) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
193 printInlining(method, invoke, inliningDepth, false, msg, args); |
7071 | 194 if (shouldLogInliningDecision()) { |
195 String methodString = methodName(method, invoke); | |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
196 logInliningDecision(methodString, false, msg, args); |
7071 | 197 } |
198 return null; | |
199 } | |
200 | |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
201 private static boolean logNotInlinedMethodAndReturnFalse(Invoke invoke, int inliningDepth, ResolvedJavaMethod method, String msg) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
202 printInlining(method, invoke, inliningDepth, false, msg, new Object[0]); |
7071 | 203 if (shouldLogInliningDecision()) { |
204 String methodString = methodName(method, invoke); | |
205 logInliningDecision(methodString, false, msg, new Object[0]); | |
206 } | |
207 return false; | |
208 } | |
209 | |
210 private static void logInliningDecision(final String methodString, final boolean success, final String msg, final Object... args) { | |
211 String inliningMsg = "inlining " + methodString + ": " + msg; | |
212 if (!success) { | |
213 inliningMsg = "not " + inliningMsg; | |
214 } | |
215 logInliningDecision(inliningMsg, args); | |
216 } | |
217 | |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
218 public static boolean shouldLogInliningDecision() { |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
219 try (Scope s = Debug.scope(inliningDecisionsScopeString)) { |
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
220 return Debug.isLogEnabled(); |
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
13196
diff
changeset
|
221 } |
7071 | 222 } |
223 | |
224 private static String methodName(ResolvedJavaMethod method, Invoke invoke) { | |
225 if (invoke != null && invoke.stateAfter() != null) { | |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6526
diff
changeset
|
226 return methodName(invoke.stateAfter(), invoke.bci()) + ": " + MetaUtil.format("%H.%n(%p):%r", method) + " (" + method.getCodeSize() + " bytes)"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
227 } else { |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6526
diff
changeset
|
228 return MetaUtil.format("%H.%n(%p):%r", method) + " (" + method.getCodeSize() + " bytes)"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
229 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
230 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
231 |
7071 | 232 private static String methodName(InlineInfo info) { |
233 if (info == null) { | |
234 return "null"; | |
235 } else if (info.invoke() != null && info.invoke().stateAfter() != null) { | |
236 return methodName(info.invoke().stateAfter(), info.invoke().bci()) + ": " + info.toString(); | |
5316
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
237 } else { |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
238 return info.toString(); |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
239 } |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
240 } |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
241 |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
242 private static String methodName(FrameState frameState, int bci) { |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
243 StringBuilder sb = new StringBuilder(); |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
244 if (frameState.outerFrameState() != null) { |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
245 sb.append(methodName(frameState.outerFrameState(), frameState.outerFrameState().bci)); |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
246 sb.append("->"); |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
247 } |
5719
429accae15aa
moved some methods from CodeUtil to MetaUtil
Doug Simon <doug.simon@oracle.com>
parents:
5718
diff
changeset
|
248 sb.append(MetaUtil.format("%h.%n", frameState.method())); |
5316
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
249 sb.append("@").append(bci); |
8ac40aed34bf
Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
5210
diff
changeset
|
250 return sb.toString(); |
5127
7b2efb5ff2ea
better inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5114
diff
changeset
|
251 } |
7b2efb5ff2ea
better inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5114
diff
changeset
|
252 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
253 /** |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
254 * Represents an opportunity for inlining at a given invoke, with the given weight and level. |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
255 * The weight is the amortized weight of the additional code - so smaller is better. The level |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
256 * is the number of nested inlinings that lead to this invoke. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
257 */ |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
258 public interface InlineInfo { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
259 |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
260 /** |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
261 * The graph containing the {@link #invoke() invocation} that may be inlined. |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
262 */ |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
263 StructuredGraph graph(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
264 |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
265 /** |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
266 * The invocation that may be inlined. |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
267 */ |
7071 | 268 Invoke invoke(); |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
269 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
270 /** |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
271 * Returns the number of methods that may be inlined by the {@link #invoke() invocation}. |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
272 * This may be more than one in the case of a invocation profile showing a number of "hot" |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
273 * concrete methods dispatched to by the invocation. |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
274 */ |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
275 int numberOfMethods(); |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
276 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
277 ResolvedJavaMethod methodAt(int index); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
278 |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
279 Inlineable inlineableElementAt(int index); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
280 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
281 double probabilityAt(int index); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
282 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
283 double relevanceAt(int index); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
284 |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
285 void setInlinableElement(int index, Inlineable inlineableElement); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
286 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
287 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
288 * Performs the inlining described by this object and returns the node that represents the |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
289 * return value of the inlined method (or null for void methods and methods that have no |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
290 * non-exceptional exit). |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
291 */ |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
292 void inline(Providers providers, Assumptions assumptions); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
293 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
294 /** |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
295 * Try to make the call static bindable to avoid interface and virtual method calls. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
296 */ |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
297 void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions); |
7071 | 298 } |
299 | |
300 public abstract static class AbstractInlineInfo implements InlineInfo { | |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
301 |
7071 | 302 protected final Invoke invoke; |
303 | |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
304 public AbstractInlineInfo(Invoke invoke) { |
7071 | 305 this.invoke = invoke; |
306 } | |
307 | |
308 @Override | |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
309 public StructuredGraph graph() { |
9705
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
310 return invoke.asNode().graph(); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
311 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
312 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
313 @Override |
7071 | 314 public Invoke invoke() { |
315 return invoke; | |
316 } | |
317 | |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
318 protected static void inline(Invoke invoke, ResolvedJavaMethod concrete, Inlineable inlineable, Assumptions assumptions, boolean receiverNullCheck) { |
9704 | 319 StructuredGraph graph = invoke.asNode().graph(); |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
320 if (inlineable instanceof InlineableGraph) { |
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
321 StructuredGraph calleeGraph = ((InlineableGraph) inlineable).getGraph(); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
322 InliningUtil.inline(invoke, calleeGraph, receiverNullCheck); |
7071 | 323 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
324 graph.getLeafGraphIds().add(calleeGraph.graphId()); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
325 // we might at some point cache already-inlined graphs, so add recursively: |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
326 graph.getLeafGraphIds().addAll(calleeGraph.getLeafGraphIds()); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
327 } else { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
328 assert inlineable instanceof InlineableMacroNode; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
329 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
330 Class<? extends FixedWithNextNode> macroNodeClass = ((InlineableMacroNode) inlineable).getMacroNodeClass(); |
10644
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
331 inlineMacroNode(invoke, concrete, graph, macroNodeClass); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
332 } |
7660
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
333 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
334 InlinedBytecodes.add(concrete.getCodeSize()); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
335 assumptions.recordMethodContents(concrete); |
7071 | 336 } |
9310
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9238
diff
changeset
|
337 } |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
338 |
9310
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9238
diff
changeset
|
339 public static void replaceInvokeCallTarget(Invoke invoke, StructuredGraph graph, InvokeKind invokeKind, ResolvedJavaMethod targetMethod) { |
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9238
diff
changeset
|
340 MethodCallTargetNode oldCallTarget = (MethodCallTargetNode) invoke.callTarget(); |
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9238
diff
changeset
|
341 MethodCallTargetNode newCallTarget = graph.add(new MethodCallTargetNode(invokeKind, targetMethod, oldCallTarget.arguments().toArray(new ValueNode[0]), oldCallTarget.returnType())); |
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9238
diff
changeset
|
342 invoke.asNode().replaceFirstInput(oldCallTarget, newCallTarget); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
343 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
344 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
345 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
346 * Represents an inlining opportunity where the compiler can statically determine a monomorphic |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
347 * target method and therefore is able to determine the called method exactly. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
348 */ |
11689
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
349 public static class ExactInlineInfo extends AbstractInlineInfo { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
350 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
351 protected final ResolvedJavaMethod concrete; |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
352 private Inlineable inlineableElement; |
11689
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
353 private boolean suppressNullCheck; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
354 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
355 public ExactInlineInfo(Invoke invoke, ResolvedJavaMethod concrete) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
356 super(invoke); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
357 this.concrete = concrete; |
9961
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9927
diff
changeset
|
358 assert concrete != null; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
359 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
360 |
11689
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
361 public void suppressNullCheck() { |
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
362 suppressNullCheck = true; |
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
363 } |
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
364 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
365 @Override |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
366 public void inline(Providers providers, Assumptions assumptions) { |
11689
8d0303d8dbde
make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents:
11675
diff
changeset
|
367 inline(invoke, concrete, inlineableElement, assumptions, !suppressNullCheck); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
368 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
369 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
370 @Override |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
371 public void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
372 // nothing todo, can already be bound statically |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
373 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
374 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
375 @Override |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
376 public int numberOfMethods() { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
377 return 1; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
378 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
379 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
380 @Override |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
381 public ResolvedJavaMethod methodAt(int index) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
382 assert index == 0; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
383 return concrete; |
4528
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
384 } |
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
385 |
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
386 @Override |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
387 public double probabilityAt(int index) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
388 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
389 return 1.0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
390 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
391 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
392 @Override |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
393 public double relevanceAt(int index) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
394 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
395 return 1.0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
396 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
397 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
398 @Override |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
399 public String toString() { |
5719
429accae15aa
moved some methods from CodeUtil to MetaUtil
Doug Simon <doug.simon@oracle.com>
parents:
5718
diff
changeset
|
400 return "exact " + MetaUtil.format("%H.%n(%p):%r", concrete); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
401 } |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
402 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
403 @Override |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
404 public Inlineable inlineableElementAt(int index) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
405 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
406 return inlineableElement; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
407 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
408 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
409 @Override |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
410 public void setInlinableElement(int index, Inlineable inlineableElement) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
411 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
412 this.inlineableElement = inlineableElement; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
413 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
414 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
415 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
416 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
417 * Represents an inlining opportunity for which profiling information suggests a monomorphic |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
418 * receiver, but for which the receiver type cannot be proven. A type check guard will be |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
419 * generated if this inlining is performed. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
420 */ |
7071 | 421 private static class TypeGuardInlineInfo extends AbstractInlineInfo { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
422 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
423 private final ResolvedJavaMethod concrete; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
424 private final ResolvedJavaType type; |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
425 private Inlineable inlineableElement; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
426 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
427 public TypeGuardInlineInfo(Invoke invoke, ResolvedJavaMethod concrete, ResolvedJavaType type) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
428 super(invoke); |
4451
defa1b705f14
NullCheck and IsTypeNode were in wrong order
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4449
diff
changeset
|
429 this.concrete = concrete; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
430 this.type = type; |
13196
e343d4623e47
weakened assertion around type profiles to allow array types (GRAAL-618)
Doug Simon <doug.simon@oracle.com>
parents:
13166
diff
changeset
|
431 assert type.isArray() || !isAbstract(type.getModifiers()) : type; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
432 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
433 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
434 @Override |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
435 public int numberOfMethods() { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
436 return 1; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
437 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
438 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
439 @Override |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
440 public ResolvedJavaMethod methodAt(int index) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
441 assert index == 0; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
442 return concrete; |
4528
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
443 } |
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
444 |
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
445 @Override |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
446 public Inlineable inlineableElementAt(int index) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
447 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
448 return inlineableElement; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
449 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
450 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
451 @Override |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
452 public double probabilityAt(int index) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
453 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
454 return 1.0; |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
455 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
456 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
457 @Override |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
458 public double relevanceAt(int index) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
459 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
460 return 1.0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
461 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
462 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
463 @Override |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
464 public void setInlinableElement(int index, Inlineable inlineableElement) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
465 assert index == 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
466 this.inlineableElement = inlineableElement; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
467 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
468 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
469 @Override |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
470 public void inline(Providers providers, Assumptions assumptions) { |
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
471 createGuard(graph(), providers.getMetaAccess()); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
472 inline(invoke, concrete, inlineableElement, assumptions, false); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
473 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
474 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
475 @Override |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
476 public void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions) { |
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
477 createGuard(graph(), metaAccess); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
478 replaceInvokeCallTarget(invoke, graph(), InvokeKind.Special, concrete); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
479 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
480 |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
481 private void createGuard(StructuredGraph graph, MetaAccessProvider metaAccess) { |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
482 ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke); |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
483 ConstantNode typeHub = ConstantNode.forConstant(type.getEncoding(Representation.ObjectHub), metaAccess, graph); |
11652
f091e0d6f4f3
Disallow add for global value numberable node types. Introduce addWithoutUnique.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11573
diff
changeset
|
484 LoadHubNode receiverHub = graph.unique(new LoadHubNode(nonNullReceiver, typeHub.kind(), null)); |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
485 |
12655
2c4aa758ee18
made ConstantNodes external to a Graph (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
12054
diff
changeset
|
486 CompareNode typeCheck = CompareNode.createCompareNode(graph, Condition.EQ, receiverHub, typeHub); |
7660
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
487 FixedGuardNode guard = graph.add(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
488 assert invoke.predecessor() != null; |
4453
c0430421d43d
bugfixes for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4452
diff
changeset
|
489 |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
490 ValueNode anchoredReceiver = createAnchoredReceiver(graph, guard, type, nonNullReceiver, true); |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
491 invoke.callTarget().replaceFirstInput(nonNullReceiver, anchoredReceiver); |
4622
00e01f401c03
Add checkcast for type-guarded inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4618
diff
changeset
|
492 |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
493 graph.addBeforeFixed(invoke.asNode(), guard); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
494 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
495 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
496 @Override |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
497 public String toString() { |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
498 return "type-checked with type " + type.getName() + " and method " + MetaUtil.format("%H.%n(%p):%r", concrete); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
499 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
500 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
501 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
502 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
503 * Polymorphic inlining of m methods with n type checks (n >= m) in case that the profiling |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
504 * information suggests a reasonable amount of different receiver types and different methods. |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
505 * If an unknown type is encountered a deoptimization is triggered. |
4451
defa1b705f14
NullCheck and IsTypeNode were in wrong order
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4449
diff
changeset
|
506 */ |
7071 | 507 private static class MultiTypeGuardInlineInfo extends AbstractInlineInfo { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
508 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
509 private final List<ResolvedJavaMethod> concretes; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
510 private final double[] methodProbabilities; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
511 private final double maximumMethodProbability; |
9704 | 512 private final ArrayList<Integer> typesToConcretes; |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
513 private final ArrayList<ProfiledType> ptypes; |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
514 private final ArrayList<Double> concretesProbabilities; |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
515 private final double notRecordedTypeProbability; |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
516 private final Inlineable[] inlineableElements; |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
517 |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
518 public MultiTypeGuardInlineInfo(Invoke invoke, ArrayList<ResolvedJavaMethod> concretes, ArrayList<Double> concretesProbabilities, ArrayList<ProfiledType> ptypes, |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
519 ArrayList<Integer> typesToConcretes, double notRecordedTypeProbability) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
520 super(invoke); |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
521 assert concretes.size() > 0 : "must have at least one method"; |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
522 assert ptypes.size() == typesToConcretes.size() : "array lengths must match"; |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
523 |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
524 this.concretesProbabilities = concretesProbabilities; |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
525 this.concretes = concretes; |
5335
439ca5ecc7dc
types profiles are now sorted in descending order of each profiled type's probability
Doug Simon <doug.simon@oracle.com>
parents:
5316
diff
changeset
|
526 this.ptypes = ptypes; |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
527 this.typesToConcretes = typesToConcretes; |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
528 this.notRecordedTypeProbability = notRecordedTypeProbability; |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
529 this.inlineableElements = new Inlineable[concretes.size()]; |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
530 this.methodProbabilities = computeMethodProbabilities(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
531 this.maximumMethodProbability = maximumMethodProbability(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
532 assert maximumMethodProbability > 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
533 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
534 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
535 private double[] computeMethodProbabilities() { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
536 double[] result = new double[concretes.size()]; |
9705
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
537 for (int i = 0; i < typesToConcretes.size(); i++) { |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
538 int concrete = typesToConcretes.get(i); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
539 double probability = ptypes.get(i).getProbability(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
540 result[concrete] += probability; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
541 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
542 return result; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
543 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
544 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
545 private double maximumMethodProbability() { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
546 double max = 0; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
547 for (int i = 0; i < methodProbabilities.length; i++) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
548 max = Math.max(max, methodProbabilities[i]); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
549 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
550 return max; |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
551 } |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
552 |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
553 @Override |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
554 public int numberOfMethods() { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
555 return concretes.size(); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
556 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
557 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
558 @Override |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
559 public ResolvedJavaMethod methodAt(int index) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
560 assert index >= 0 && index < concretes.size(); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
561 return concretes.get(index); |
4528
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
562 } |
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
563 |
e6e14d25e608
added two inlining policies for comparison
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4473
diff
changeset
|
564 @Override |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
565 public Inlineable inlineableElementAt(int index) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
566 assert index >= 0 && index < concretes.size(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
567 return inlineableElements[index]; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
568 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
569 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
570 @Override |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
571 public double probabilityAt(int index) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
572 return methodProbabilities[index]; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
573 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
574 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
575 @Override |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
576 public double relevanceAt(int index) { |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
577 return probabilityAt(index) / maximumMethodProbability; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
578 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
579 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
580 @Override |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
581 public void setInlinableElement(int index, Inlineable inlineableElement) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
582 assert index >= 0 && index < concretes.size(); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
583 inlineableElements[index] = inlineableElement; |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
584 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
585 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
586 @Override |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
587 public void inline(Providers providers, Assumptions assumptions) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
588 if (hasSingleMethod()) { |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
589 inlineSingleMethod(graph(), providers.getMetaAccess(), assumptions); |
4455 | 590 } else { |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
591 inlineMultipleMethods(graph(), providers, assumptions); |
4455 | 592 } |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
593 } |
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
594 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
595 private boolean hasSingleMethod() { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
596 return concretes.size() == 1 && !shouldFallbackToInvoke(); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
597 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
598 |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
599 private boolean shouldFallbackToInvoke() { |
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
600 return notRecordedTypeProbability > 0; |
4455 | 601 } |
602 | |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
603 private void inlineMultipleMethods(StructuredGraph graph, Providers providers, Assumptions assumptions) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
604 int numberOfMethods = concretes.size(); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
605 FixedNode continuation = invoke.next(); |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
606 |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
607 ValueNode originalReceiver = ((MethodCallTargetNode) invoke.callTarget()).receiver(); |
4456
f4c82dd4619e
inlining bugfixes and cleanup
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4455
diff
changeset
|
608 // setup merge and phi nodes for results and exceptions |
4455 | 609 MergeNode returnMerge = graph.add(new MergeNode()); |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
610 returnMerge.setStateAfter(invoke.stateAfter()); |
4455 | 611 |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
612 PhiNode returnValuePhi = null; |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
613 if (invoke.asNode().kind() != Kind.Void) { |
11652
f091e0d6f4f3
Disallow add for global value numberable node types. Introduce addWithoutUnique.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11573
diff
changeset
|
614 returnValuePhi = graph.addWithoutUnique(new PhiNode(invoke.asNode().kind(), returnMerge)); |
4455 | 615 } |
616 | |
617 MergeNode exceptionMerge = null; | |
618 PhiNode exceptionObjectPhi = null; | |
619 if (invoke instanceof InvokeWithExceptionNode) { | |
620 InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke; | |
8461
6a8ad083746e
The exception edge for invokes should still be a DispatchBeginNode to allow lowering of ExceptionObjectNode after guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8441
diff
changeset
|
621 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithException.exceptionEdge(); |
4455 | 622 |
623 exceptionMerge = graph.add(new MergeNode()); | |
624 | |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
625 FixedNode exceptionSux = exceptionEdge.next(); |
4455 | 626 graph.addBeforeFixed(exceptionSux, exceptionMerge); |
11657
74ea8747b43a
Add PhiNode in InliningUtil with addWithoutUnique.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11652
diff
changeset
|
627 exceptionObjectPhi = graph.addWithoutUnique(new PhiNode(Kind.Object, exceptionMerge)); |
8469
718c0304ffeb
Fix for polymorphic inlining after fusing exception obecjt and the distaptch begin
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8461
diff
changeset
|
628 exceptionMerge.setStateAfter(exceptionEdge.stateAfter().duplicateModified(invoke.stateAfter().bci, true, Kind.Object, exceptionObjectPhi)); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
629 } |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
630 |
4456
f4c82dd4619e
inlining bugfixes and cleanup
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4455
diff
changeset
|
631 // create one separate block for each invoked method |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
632 AbstractBeginNode[] successors = new AbstractBeginNode[numberOfMethods + 1]; |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
633 for (int i = 0; i < numberOfMethods; i++) { |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
634 successors[i] = createInvocationBlock(graph, invoke, returnMerge, returnValuePhi, exceptionMerge, exceptionObjectPhi, true); |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
635 } |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
636 |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
637 // create the successor for an unknown type |
7071 | 638 FixedNode unknownTypeSux; |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
639 if (shouldFallbackToInvoke()) { |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
640 unknownTypeSux = createInvocationBlock(graph, invoke, returnMerge, returnValuePhi, exceptionMerge, exceptionObjectPhi, false); |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
641 } else { |
7660
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
642 unknownTypeSux = graph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.TypeCheckedInliningViolated)); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
643 } |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
644 successors[successors.length - 1] = AbstractBeginNode.begin(unknownTypeSux); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
645 |
4455 | 646 // replace the invoke exception edge |
647 if (invoke instanceof InvokeWithExceptionNode) { | |
648 InvokeWithExceptionNode invokeWithExceptionNode = (InvokeWithExceptionNode) invoke; | |
8461
6a8ad083746e
The exception edge for invokes should still be a DispatchBeginNode to allow lowering of ExceptionObjectNode after guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8441
diff
changeset
|
649 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithExceptionNode.exceptionEdge(); |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
650 exceptionEdge.replaceAtUsages(exceptionObjectPhi); |
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
651 exceptionEdge.setNext(null); |
4455 | 652 GraphUtil.killCFG(invokeWithExceptionNode.exceptionEdge()); |
653 } | |
654 | |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
655 assert invoke.asNode().isAlive(); |
7071 | 656 |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
657 // replace the invoke with a switch on the type of the actual receiver |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
658 boolean methodDispatch = createDispatchOnTypeBeforeInvoke(graph, successors, false, providers.getMetaAccess()); |
4458
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
659 |
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
660 assert invoke.next() == continuation; |
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
661 invoke.setNext(null); |
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
662 returnMerge.setNext(continuation); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
663 invoke.asNode().replaceAtUsages(returnValuePhi); |
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
664 invoke.asNode().replaceAndDelete(null); |
4455 | 665 |
10706
8d961f93725c
Use GuardedValueNode in the inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10692
diff
changeset
|
666 ArrayList<GuardedValueNode> replacementNodes = new ArrayList<>(); |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
667 |
4455 | 668 // do the actual inlining for every invoke |
7071 | 669 for (int i = 0; i < numberOfMethods; i++) { |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
670 AbstractBeginNode node = successors[i]; |
4455 | 671 Invoke invokeForInlining = (Invoke) node.next(); |
4636
495a81cd6969
avoid code generation for typechecks that are only used for anchoring
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4635
diff
changeset
|
672 |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
673 ResolvedJavaType commonType; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
674 if (methodDispatch) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
675 commonType = concretes.get(i).getDeclaringClass(); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
676 } else { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
677 commonType = getLeastCommonType(i); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
678 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
679 |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
680 ValueNode receiver = ((MethodCallTargetNode) invokeForInlining.callTarget()).receiver(); |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
681 boolean exact = (getTypeCount(i) == 1 && !methodDispatch); |
10706
8d961f93725c
Use GuardedValueNode in the inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10692
diff
changeset
|
682 GuardedValueNode anchoredReceiver = createAnchoredReceiver(graph, node, commonType, receiver, exact); |
5339
e8f80481326d
use PiNodes instead of CheckCastNodes to pin inlining receivers, remove emitCode flag
Lukas Stadler <lukas.stadler@jku.at>
parents:
5316
diff
changeset
|
683 invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver); |
4622
00e01f401c03
Add checkcast for type-guarded inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4618
diff
changeset
|
684 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
685 inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7392
diff
changeset
|
686 |
8636
ac4dbfecec8f
passed a Replacements object to inlining utility methods that need one instead of the GraalRuntime API
Doug Simon <doug.simon@oracle.com>
parents:
8627
diff
changeset
|
687 replacementNodes.add(anchoredReceiver); |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
688 } |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
689 if (shouldFallbackToInvoke()) { |
8636
ac4dbfecec8f
passed a Replacements object to inlining utility methods that need one instead of the GraalRuntime API
Doug Simon <doug.simon@oracle.com>
parents:
8627
diff
changeset
|
690 replacementNodes.add(null); |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
691 } |
9374
8649dbda7d25
New experiment with megamorphic inlining.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9329
diff
changeset
|
692 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9837
diff
changeset
|
693 if (OptTailDuplication.getValue()) { |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
694 /* |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
695 * We might want to perform tail duplication at the merge after a type switch, if |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
696 * there are invokes that would benefit from the improvement in type information. |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
697 */ |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
698 FixedNode current = returnMerge; |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
699 int opportunities = 0; |
5791
506e76281145
(symptomatic) fix for NPE in InliningUtil
Lukas Stadler <lukas.stadler@jku.at>
parents:
5786
diff
changeset
|
700 do { |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
701 if (current instanceof InvokeNode && ((InvokeNode) current).callTarget() instanceof MethodCallTargetNode && |
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
702 ((MethodCallTargetNode) ((InvokeNode) current).callTarget()).receiver() == originalReceiver) { |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
703 opportunities++; |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
704 } else if (current.inputs().contains(originalReceiver)) { |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
705 opportunities++; |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
706 } |
5791
506e76281145
(symptomatic) fix for NPE in InliningUtil
Lukas Stadler <lukas.stadler@jku.at>
parents:
5786
diff
changeset
|
707 current = ((FixedWithNextNode) current).next(); |
506e76281145
(symptomatic) fix for NPE in InliningUtil
Lukas Stadler <lukas.stadler@jku.at>
parents:
5786
diff
changeset
|
708 } while (current instanceof FixedWithNextNode); |
9705
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
709 |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
710 if (opportunities > 0) { |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
711 metricInliningTailDuplication.increment(); |
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
712 Debug.log("MultiTypeGuardInlineInfo starting tail duplication (%d opportunities)", opportunities); |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
713 PhaseContext phaseContext = new PhaseContext(providers, assumptions); |
13378
16d99e9d77ad
Options: rename flag (AOTCompilation -> ImmutableCode)
Bernhard Urban <bernhard.urban@jku.at>
parents:
13327
diff
changeset
|
714 CanonicalizerPhase canonicalizer = new CanonicalizerPhase(!ImmutableCode.getValue()); |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
715 TailDuplicationPhase.tailDuplicate(returnMerge, TailDuplicationPhase.TRUE_DECISION, replacementNodes, phaseContext, canonicalizer); |
5786
f69a406355b2
new tail duplication phase
Lukas Stadler <lukas.stadler@jku.at>
parents:
5720
diff
changeset
|
716 } |
4455 | 717 } |
718 } | |
719 | |
6289
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
720 private int getTypeCount(int concreteMethodIndex) { |
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
721 int count = 0; |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
722 for (int i = 0; i < typesToConcretes.size(); i++) { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
723 if (typesToConcretes.get(i) == concreteMethodIndex) { |
6289
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
724 count++; |
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
725 } |
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
726 } |
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
727 return count; |
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
728 } |
72eb3a1a20c4
create PiNodes with exact types during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5792
diff
changeset
|
729 |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
730 private ResolvedJavaType getLeastCommonType(int concreteMethodIndex) { |
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
731 ResolvedJavaType commonType = null; |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
732 for (int i = 0; i < typesToConcretes.size(); i++) { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
733 if (typesToConcretes.get(i) == concreteMethodIndex) { |
4635
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
734 if (commonType == null) { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
735 commonType = ptypes.get(i).getType(); |
4635
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
736 } else { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
737 commonType = commonType.findLeastCommonAncestor(ptypes.get(i).getType()); |
4635
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
738 } |
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
739 } |
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
740 } |
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
741 assert commonType != null; |
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
742 return commonType; |
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
743 } |
f35c183f33ce
fixed checkcast when inlining more than one method
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4627
diff
changeset
|
744 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
745 private ResolvedJavaType getLeastCommonType() { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
746 ResolvedJavaType result = getLeastCommonType(0); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
747 for (int i = 1; i < concretes.size(); i++) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
748 result = result.findLeastCommonAncestor(getLeastCommonType(i)); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
749 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
750 return result; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
751 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
752 |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
753 private void inlineSingleMethod(StructuredGraph graph, MetaAccessProvider metaAccess, Assumptions assumptions) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
754 assert concretes.size() == 1 && inlineableElements.length == 1 && ptypes.size() > 1 && !shouldFallbackToInvoke() && notRecordedTypeProbability == 0; |
4455 | 755 |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
756 AbstractBeginNode calleeEntryNode = graph.add(new BeginNode()); |
4459
d389f4b5bdd6
fixed typecheck branch probability
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4458
diff
changeset
|
757 |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
758 AbstractBeginNode unknownTypeSux = createUnknownTypeSuccessor(graph); |
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
759 AbstractBeginNode[] successors = new AbstractBeginNode[]{calleeEntryNode, unknownTypeSux}; |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
760 createDispatchOnTypeBeforeInvoke(graph, successors, false, metaAccess); |
4455 | 761 |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
762 calleeEntryNode.setNext(invoke.asNode()); |
4455 | 763 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
764 inline(invoke, methodAt(0), inlineableElementAt(0), assumptions, false); |
4455 | 765 } |
766 | |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
767 private boolean createDispatchOnTypeBeforeInvoke(StructuredGraph graph, AbstractBeginNode[] successors, boolean invokeIsOnlySuccessor, MetaAccessProvider metaAccess) { |
9374
8649dbda7d25
New experiment with megamorphic inlining.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9329
diff
changeset
|
768 assert ptypes.size() >= 1; |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
769 ValueNode nonNullReceiver = nonNullReceiver(invoke); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
770 Kind hubKind = ((MethodCallTargetNode) invoke.callTarget()).targetMethod().getDeclaringClass().getEncoding(Representation.ObjectHub).getKind(); |
11652
f091e0d6f4f3
Disallow add for global value numberable node types. Introduce addWithoutUnique.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11573
diff
changeset
|
771 LoadHubNode hub = graph.unique(new LoadHubNode(nonNullReceiver, hubKind, null)); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
772 |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
773 if (!invokeIsOnlySuccessor && chooseMethodDispatch()) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
774 assert successors.length == concretes.size() + 1; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
775 assert concretes.size() > 0; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
776 Debug.log("Method check cascade with %d methods", concretes.size()); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
777 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
778 ValueNode[] constantMethods = new ValueNode[concretes.size()]; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
779 double[] probability = new double[concretes.size()]; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
780 for (int i = 0; i < concretes.size(); ++i) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
781 ResolvedJavaMethod firstMethod = concretes.get(i); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
782 Constant firstMethodConstant = firstMethod.getEncoding(); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
783 |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
784 ValueNode firstMethodConstantNode = ConstantNode.forConstant(firstMethodConstant, metaAccess, graph); |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
785 constantMethods[i] = firstMethodConstantNode; |
9467
3531cdfddff6
Ensure probabilities are never negative. Add additional assertions.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9436
diff
changeset
|
786 double concretesProbability = concretesProbabilities.get(i); |
3531cdfddff6
Ensure probabilities are never negative. Add additional assertions.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9436
diff
changeset
|
787 assert concretesProbability >= 0.0; |
3531cdfddff6
Ensure probabilities are never negative. Add additional assertions.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9436
diff
changeset
|
788 probability[i] = concretesProbability; |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
789 if (i > 0) { |
9469
8c37649cbb62
Fixes for probability calculation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9467
diff
changeset
|
790 double prevProbability = probability[i - 1]; |
8c37649cbb62
Fixes for probability calculation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9467
diff
changeset
|
791 if (prevProbability == 1.0) { |
8c37649cbb62
Fixes for probability calculation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9467
diff
changeset
|
792 probability[i] = 1.0; |
8c37649cbb62
Fixes for probability calculation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9467
diff
changeset
|
793 } else { |
9470
225fc5463430
Make sure if trueSuccessor probability is always <= 1.0.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9469
diff
changeset
|
794 probability[i] = Math.min(1.0, Math.max(0.0, probability[i] / (1.0 - prevProbability))); |
9469
8c37649cbb62
Fixes for probability calculation.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9467
diff
changeset
|
795 } |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
796 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
797 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
798 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
799 FixedNode lastSucc = successors[concretes.size()]; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
800 for (int i = concretes.size() - 1; i >= 0; --i) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
801 LoadMethodNode method = graph.add(new LoadMethodNode(concretes.get(i), hub, constantMethods[i].kind())); |
12655
2c4aa758ee18
made ConstantNodes external to a Graph (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
12054
diff
changeset
|
802 CompareNode methodCheck = CompareNode.createCompareNode(graph, Condition.EQ, method, constantMethods[i]); |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
803 IfNode ifNode = graph.add(new IfNode(methodCheck, successors[i], lastSucc, probability[i])); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
804 method.setNext(ifNode); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
805 lastSucc = method; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
806 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
807 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
808 FixedWithNextNode pred = (FixedWithNextNode) invoke.asNode().predecessor(); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
809 pred.setNext(lastSucc); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
810 return true; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
811 } else { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
812 Debug.log("Type switch with %d types", concretes.size()); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
813 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
814 |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
815 ResolvedJavaType[] keys = new ResolvedJavaType[ptypes.size()]; |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
816 double[] keyProbabilities = new double[ptypes.size() + 1]; |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
817 int[] keySuccessors = new int[ptypes.size() + 1]; |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
818 for (int i = 0; i < ptypes.size(); i++) { |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
819 keys[i] = ptypes.get(i).getType(); |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
820 keyProbabilities[i] = ptypes.get(i).getProbability(); |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
821 keySuccessors[i] = invokeIsOnlySuccessor ? 0 : typesToConcretes.get(i); |
7071 | 822 assert keySuccessors[i] < successors.length - 1 : "last successor is the unknownTypeSux"; |
4459
d389f4b5bdd6
fixed typecheck branch probability
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4458
diff
changeset
|
823 } |
7071 | 824 keyProbabilities[keyProbabilities.length - 1] = notRecordedTypeProbability; |
825 keySuccessors[keySuccessors.length - 1] = successors.length - 1; | |
4459
d389f4b5bdd6
fixed typecheck branch probability
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4458
diff
changeset
|
826 |
7705
96a596d751ab
remove successorProbabilities from SwitchNode
Lukas Stadler <lukas.stadler@jku.at>
parents:
7660
diff
changeset
|
827 TypeSwitchNode typeSwitch = graph.add(new TypeSwitchNode(hub, successors, keys, keyProbabilities, keySuccessors)); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
828 FixedWithNextNode pred = (FixedWithNextNode) invoke.asNode().predecessor(); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
829 pred.setNext(typeSwitch); |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
830 return false; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
831 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
832 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
833 private boolean chooseMethodDispatch() { |
9610
ae17e540c5d2
More asserts while getting vtable offsets
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9602
diff
changeset
|
834 for (ResolvedJavaMethod concrete : concretes) { |
ae17e540c5d2
More asserts while getting vtable offsets
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9602
diff
changeset
|
835 if (!concrete.isInVirtualMethodTable()) { |
ae17e540c5d2
More asserts while getting vtable offsets
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9602
diff
changeset
|
836 return false; |
ae17e540c5d2
More asserts while getting vtable offsets
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9602
diff
changeset
|
837 } |
ae17e540c5d2
More asserts while getting vtable offsets
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9602
diff
changeset
|
838 } |
ae17e540c5d2
More asserts while getting vtable offsets
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9602
diff
changeset
|
839 |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
840 if (concretes.size() == 1 && this.notRecordedTypeProbability > 0) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
841 // Always chose method dispatch if there is a single concrete method and the call |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
842 // site is megamorphic. |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
843 return true; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
844 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
845 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
846 if (concretes.size() == ptypes.size()) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
847 // Always prefer types over methods if the number of types is smaller than the |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
848 // number of methods. |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
849 return false; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
850 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
851 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
852 return chooseMethodDispatchCostBased(); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
853 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
854 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
855 private boolean chooseMethodDispatchCostBased() { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
856 double remainder = 1.0 - this.notRecordedTypeProbability; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
857 double costEstimateMethodDispatch = remainder; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
858 for (int i = 0; i < concretes.size(); ++i) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
859 if (i != 0) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
860 costEstimateMethodDispatch += remainder; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
861 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
862 remainder -= concretesProbabilities.get(i); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
863 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
864 |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
865 double costEstimateTypeDispatch = 0.0; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
866 remainder = 1.0; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
867 for (int i = 0; i < ptypes.size(); ++i) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
868 if (i != 0) { |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
869 costEstimateTypeDispatch += remainder; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
870 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
871 remainder -= ptypes.get(i).getProbability(); |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
872 } |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
873 costEstimateTypeDispatch += notRecordedTypeProbability; |
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
874 return costEstimateMethodDispatch < costEstimateTypeDispatch; |
4454
008a5ea590ca
fixed merge control flow for inlining
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4453
diff
changeset
|
875 } |
008a5ea590ca
fixed merge control flow for inlining
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4453
diff
changeset
|
876 |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
877 private static AbstractBeginNode createInvocationBlock(StructuredGraph graph, Invoke invoke, MergeNode returnMerge, PhiNode returnValuePhi, MergeNode exceptionMerge, |
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
878 PhiNode exceptionObjectPhi, boolean useForInlining) { |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
879 Invoke duplicatedInvoke = duplicateInvokeForInlining(graph, invoke, exceptionMerge, exceptionObjectPhi, useForInlining); |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
880 AbstractBeginNode calleeEntryNode = graph.add(new BeginNode()); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
881 calleeEntryNode.setNext(duplicatedInvoke.asNode()); |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
882 |
9434
50f02c7d1cec
Rename EndNode => AbstractEndNode and make abstract class. Introduce concrete EndNode subclass.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9392
diff
changeset
|
883 AbstractEndNode endNode = graph.add(new EndNode()); |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
884 duplicatedInvoke.setNext(endNode); |
4614
a3882fd1ae61
Make it possible to have multiple LoopEnds per LoopBegin
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4571
diff
changeset
|
885 returnMerge.addForwardEnd(endNode); |
5005
c2ebd3d559f7
fixed probabilities when polymorphic inlining is used
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5003
diff
changeset
|
886 |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
887 if (returnValuePhi != null) { |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
888 returnValuePhi.addInput(duplicatedInvoke.asNode()); |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
889 } |
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
890 return calleeEntryNode; |
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
891 } |
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
892 |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
893 private static Invoke duplicateInvokeForInlining(StructuredGraph graph, Invoke invoke, MergeNode exceptionMerge, PhiNode exceptionObjectPhi, boolean useForInlining) { |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
894 Invoke result = (Invoke) invoke.asNode().copyWithInputs(); |
4622
00e01f401c03
Add checkcast for type-guarded inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4618
diff
changeset
|
895 Node callTarget = result.callTarget().copyWithInputs(); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
896 result.asNode().replaceFirstInput(result.callTarget(), callTarget); |
4472
63cd21fda79b
hotspot gc bugfix, added possibility to fallback to invocation if type check is violated
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4467
diff
changeset
|
897 result.setUseForInlining(useForInlining); |
4539
98b3b255913c
Fix stateAfter for multiple type inline
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4530
diff
changeset
|
898 |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
899 Kind kind = invoke.asNode().kind(); |
7098
e23980f4a890
Cleanup of Kind class: remove isXxx methods
Christian Wimmer <christian.wimmer@oracle.com>
parents:
7097
diff
changeset
|
900 if (kind != Kind.Void) { |
4539
98b3b255913c
Fix stateAfter for multiple type inline
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4530
diff
changeset
|
901 FrameState stateAfter = invoke.stateAfter(); |
98b3b255913c
Fix stateAfter for multiple type inline
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4530
diff
changeset
|
902 stateAfter = stateAfter.duplicate(stateAfter.bci); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
903 stateAfter.replaceFirstInput(invoke.asNode(), result.asNode()); |
4539
98b3b255913c
Fix stateAfter for multiple type inline
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4530
diff
changeset
|
904 result.setStateAfter(stateAfter); |
98b3b255913c
Fix stateAfter for multiple type inline
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4530
diff
changeset
|
905 } |
98b3b255913c
Fix stateAfter for multiple type inline
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4530
diff
changeset
|
906 |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
907 if (invoke instanceof InvokeWithExceptionNode) { |
4458
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
908 assert exceptionMerge != null && exceptionObjectPhi != null; |
4455 | 909 |
4458
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
910 InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke; |
8461
6a8ad083746e
The exception edge for invokes should still be a DispatchBeginNode to allow lowering of ExceptionObjectNode after guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8441
diff
changeset
|
911 ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithException.exceptionEdge(); |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
912 FrameState stateAfterException = exceptionEdge.stateAfter(); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
913 |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
914 ExceptionObjectNode newExceptionEdge = (ExceptionObjectNode) exceptionEdge.copyWithInputs(); |
4529
fc78ad20ec38
fixed exception framestate
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4528
diff
changeset
|
915 // set new state (pop old exception object, push new one) |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
916 newExceptionEdge.setStateAfter(stateAfterException.duplicateModified(stateAfterException.bci, stateAfterException.rethrowException(), Kind.Object, newExceptionEdge)); |
4455 | 917 |
9434
50f02c7d1cec
Rename EndNode => AbstractEndNode and make abstract class. Introduce concrete EndNode subclass.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9392
diff
changeset
|
918 AbstractEndNode endNode = graph.add(new EndNode()); |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
919 newExceptionEdge.setNext(endNode); |
4614
a3882fd1ae61
Make it possible to have multiple LoopEnds per LoopBegin
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4571
diff
changeset
|
920 exceptionMerge.addForwardEnd(endNode); |
8441
21bf57680185
Fuse the ExceptionObject its DispatchBegin into a single node since it has to be atomic while gurads are floating
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8421
diff
changeset
|
921 exceptionObjectPhi.addInput(newExceptionEdge); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
922 |
4458
cdf13998f705
inlining of multiple methods survives bootstrapping
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4457
diff
changeset
|
923 ((InvokeWithExceptionNode) result).setExceptionEdge(newExceptionEdge); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
924 } |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
925 return result; |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
926 } |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
927 |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
928 @Override |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
929 public void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
930 if (hasSingleMethod()) { |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
931 devirtualizeWithTypeSwitch(graph(), InvokeKind.Special, concretes.get(0), metaAccess); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
932 } else { |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
933 tryToDevirtualizeMultipleMethods(graph(), metaAccess); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
934 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
935 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
936 |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
937 private void tryToDevirtualizeMultipleMethods(StructuredGraph graph, MetaAccessProvider metaAccess) { |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
938 MethodCallTargetNode methodCallTarget = (MethodCallTargetNode) invoke.callTarget(); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
939 if (methodCallTarget.invokeKind() == InvokeKind.Interface) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
940 ResolvedJavaMethod targetMethod = methodCallTarget.targetMethod(); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
941 ResolvedJavaType leastCommonType = getLeastCommonType(); |
7686 | 942 // check if we have a common base type that implements the interface -> in that case |
7825
c6c3515bea8e
New formatter settings for enum values (every value on a new line).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7818
diff
changeset
|
943 // we have a vtable entry for the interface method and can use a less expensive |
c6c3515bea8e
New formatter settings for enum values (every value on a new line).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7818
diff
changeset
|
944 // virtual call |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
945 if (!leastCommonType.isInterface() && targetMethod.getDeclaringClass().isAssignableFrom(leastCommonType)) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
946 ResolvedJavaMethod baseClassTargetMethod = leastCommonType.resolveMethod(targetMethod); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
947 if (baseClassTargetMethod != null) { |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
948 devirtualizeWithTypeSwitch(graph, InvokeKind.Virtual, leastCommonType.resolveMethod(targetMethod), metaAccess); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
949 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
950 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
951 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
952 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
953 |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
954 private void devirtualizeWithTypeSwitch(StructuredGraph graph, InvokeKind kind, ResolvedJavaMethod target, MetaAccessProvider metaAccess) { |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
955 AbstractBeginNode invocationEntry = graph.add(new BeginNode()); |
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
956 AbstractBeginNode unknownTypeSux = createUnknownTypeSuccessor(graph); |
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
957 AbstractBeginNode[] successors = new AbstractBeginNode[]{invocationEntry, unknownTypeSux}; |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
958 createDispatchOnTypeBeforeInvoke(graph, successors, true, metaAccess); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
959 |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
960 invocationEntry.setNext(invoke.asNode()); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
961 ValueNode receiver = ((MethodCallTargetNode) invoke.callTarget()).receiver(); |
10706
8d961f93725c
Use GuardedValueNode in the inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10692
diff
changeset
|
962 GuardedValueNode anchoredReceiver = createAnchoredReceiver(graph, invocationEntry, target.getDeclaringClass(), receiver, false); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
963 invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); |
9310
b0f9ab5a185b
Devirtualize invoke before handing it to the macro node.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9238
diff
changeset
|
964 replaceInvokeCallTarget(invoke, graph, kind, target); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
965 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
966 |
9436
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
967 private static AbstractBeginNode createUnknownTypeSuccessor(StructuredGraph graph) { |
ae815a4c112a
Rename BeginNode => AbstractBeginNode and make abstract. Introduce concrete subclass BeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
968 return AbstractBeginNode.begin(graph.add(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.TypeCheckedInliningViolated))); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
969 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
970 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
971 @Override |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
972 public String toString() { |
5019
836e4fce33ab
changed inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5005
diff
changeset
|
973 StringBuilder builder = new StringBuilder(shouldFallbackToInvoke() ? "megamorphic" : "polymorphic"); |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
974 builder.append(", "); |
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
975 builder.append(concretes.size()); |
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
976 builder.append(" methods [ "); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
977 for (int i = 0; i < concretes.size(); i++) { |
5719
429accae15aa
moved some methods from CodeUtil to MetaUtil
Doug Simon <doug.simon@oracle.com>
parents:
5718
diff
changeset
|
978 builder.append(MetaUtil.format(" %H.%n(%p):%r", concretes.get(i))); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
979 } |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
980 builder.append(" ], "); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
981 builder.append(ptypes.size()); |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
982 builder.append(" type checks [ "); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
983 for (int i = 0; i < ptypes.size(); i++) { |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
984 builder.append(" "); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
985 builder.append(ptypes.get(i).getType().getName()); |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
986 builder.append(ptypes.get(i).getProbability()); |
7213
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
987 } |
ceb8c5b29419
print more details when -XX:+PrintDeoptimizationDetails is enabled
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7098
diff
changeset
|
988 builder.append(" ]"); |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
989 return builder.toString(); |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
990 } |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
991 } |
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
992 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
993 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
994 * Represents an inlining opportunity where the current class hierarchy leads to a monomorphic |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
995 * target method, but for which an assumption has to be registered because of non-final classes. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
996 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
997 private static class AssumptionInlineInfo extends ExactInlineInfo { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
998 |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
999 private final Assumption takenAssumption; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1000 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1001 public AssumptionInlineInfo(Invoke invoke, ResolvedJavaMethod concrete, Assumption takenAssumption) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1002 super(invoke, concrete); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1003 this.takenAssumption = takenAssumption; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1004 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1005 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1006 @Override |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
1007 public void inline(Providers providers, Assumptions assumptions) { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1008 assumptions.record(takenAssumption); |
12054
bba234a1670e
grouped provider values/parameters into a Providers object (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
12052
diff
changeset
|
1009 super.inline(providers, assumptions); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1010 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1011 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1012 @Override |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11878
diff
changeset
|
1013 public void tryToDevirtualizeInvoke(MetaAccessProvider metaAccess, Assumptions assumptions) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1014 assumptions.record(takenAssumption); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1015 replaceInvokeCallTarget(invoke, graph(), InvokeKind.Special, concrete); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1016 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1017 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1018 @Override |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1019 public String toString() { |
5719
429accae15aa
moved some methods from CodeUtil to MetaUtil
Doug Simon <doug.simon@oracle.com>
parents:
5718
diff
changeset
|
1020 return "assumption " + MetaUtil.format("%H.%n(%p):%r", concrete); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1021 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1022 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1023 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1024 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1025 * Determines if inlining is possible at the given invoke node. |
11710
8d8a7d7f0259
Remove permanent flag on ValueAnchorNode. Memory aware scheduling fixes the problem with synchronized method return values.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11689
diff
changeset
|
1026 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1027 * @param invoke the invoke that should be inlined |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1028 * @return an instance of InlineInfo, or null if no inlining is possible at the given invoke |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1029 */ |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1030 public static InlineInfo getInlineInfo(InliningData data, Invoke invoke, int maxNumberOfMethods, Replacements replacements, Assumptions assumptions, OptimisticOptimizations optimisticOpts) { |
5127
7b2efb5ff2ea
better inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5114
diff
changeset
|
1031 if (!checkInvokeConditions(invoke)) { |
7b2efb5ff2ea
better inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5114
diff
changeset
|
1032 return null; |
7b2efb5ff2ea
better inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5114
diff
changeset
|
1033 } |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
1034 MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget(); |
7071 | 1035 ResolvedJavaMethod targetMethod = callTarget.targetMethod(); |
5127
7b2efb5ff2ea
better inlining debug output
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5114
diff
changeset
|
1036 |
4571 | 1037 if (callTarget.invokeKind() == InvokeKind.Special || targetMethod.canBeStaticallyBound()) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1038 return getExactInlineInfo(data, invoke, replacements, optimisticOpts, targetMethod); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1039 } |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1040 |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1041 assert callTarget.invokeKind() == InvokeKind.Virtual || callTarget.invokeKind() == InvokeKind.Interface; |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1042 |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1043 ResolvedJavaType holder = targetMethod.getDeclaringClass(); |
11265 | 1044 if (!(callTarget.receiver().stamp() instanceof ObjectStamp)) { |
1045 return null; | |
1046 } | |
1047 ObjectStamp receiverStamp = (ObjectStamp) callTarget.receiver().stamp(); | |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1048 if (receiverStamp.alwaysNull()) { |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1049 // Don't inline if receiver is known to be null |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1050 return null; |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1051 } |
5443
141817e206d4
changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents:
5426
diff
changeset
|
1052 if (receiverStamp.type() != null) { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1053 // the invoke target might be more specific than the holder (happens after inlining: |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1054 // locals lose their declared type...) |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1055 ResolvedJavaType receiverType = receiverStamp.type(); |
7097
6644cecbd3a7
Replace ResolvedJavaType.isAssignableTo with isAssignableFrom to be consistent with java.lang.Class
Christian Wimmer <christian.wimmer@oracle.com>
parents:
7079
diff
changeset
|
1056 if (receiverType != null && holder.isAssignableFrom(receiverType)) { |
5443
141817e206d4
changes to the dependencies and stamp system:
Lukas Stadler <lukas.stadler@jku.at>
parents:
5426
diff
changeset
|
1057 holder = receiverType; |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1058 if (receiverStamp.isExactType()) { |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1059 assert targetMethod.getDeclaringClass().isAssignableFrom(holder) : holder + " subtype of " + targetMethod.getDeclaringClass() + " for " + targetMethod; |
9837
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1060 ResolvedJavaMethod resolvedMethod = holder.resolveMethod(targetMethod); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1061 if (resolvedMethod != null) { |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1062 return getExactInlineInfo(data, invoke, replacements, optimisticOpts, resolvedMethod); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1063 } |
4457
5acf4a974e4a
fixed framestate for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4456
diff
changeset
|
1064 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1065 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1066 } |
4440
271220b49abc
profiling info fixes
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4249
diff
changeset
|
1067 |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1068 if (holder.isArray()) { |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1069 // arrays can be treated as Objects |
9837
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1070 ResolvedJavaMethod resolvedMethod = holder.resolveMethod(targetMethod); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1071 if (resolvedMethod != null) { |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1072 return getExactInlineInfo(data, invoke, replacements, optimisticOpts, resolvedMethod); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1073 } |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1074 } |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1075 |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1076 if (assumptions.useOptimisticAssumptions()) { |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1077 ResolvedJavaType uniqueSubtype = holder.findUniqueConcreteSubtype(); |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1078 if (uniqueSubtype != null) { |
9837
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1079 ResolvedJavaMethod resolvedMethod = uniqueSubtype.resolveMethod(targetMethod); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1080 if (resolvedMethod != null) { |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1081 return getAssumptionInlineInfo(data, invoke, replacements, optimisticOpts, resolvedMethod, new Assumptions.ConcreteSubtype(holder, uniqueSubtype)); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1082 } |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1083 } |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1084 |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1085 ResolvedJavaMethod concrete = holder.findUniqueConcreteMethod(targetMethod); |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1086 if (concrete != null) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1087 return getAssumptionInlineInfo(data, invoke, replacements, optimisticOpts, concrete, new Assumptions.ConcreteMethod(targetMethod, holder, concrete)); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1088 } |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1089 } |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1090 |
4459
d389f4b5bdd6
fixed typecheck branch probability
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4458
diff
changeset
|
1091 // type check based inlining |
9704 | 1092 return getTypeCheckedInlineInfo(data, invoke, maxNumberOfMethods, replacements, targetMethod, optimisticOpts); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1093 } |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1094 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1095 private static InlineInfo getAssumptionInlineInfo(InliningData data, Invoke invoke, Replacements replacements, OptimisticOptimizations optimisticOpts, ResolvedJavaMethod concrete, |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1096 Assumption takenAssumption) { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1097 assert !Modifier.isAbstract(concrete.getModifiers()); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1098 if (!checkTargetConditions(data, replacements, invoke, concrete, optimisticOpts)) { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1099 return null; |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1100 } |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1101 return new AssumptionInlineInfo(invoke, concrete, takenAssumption); |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1102 } |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1103 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1104 private static InlineInfo getExactInlineInfo(InliningData data, Invoke invoke, Replacements replacements, OptimisticOptimizations optimisticOpts, ResolvedJavaMethod targetMethod) { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1105 assert !Modifier.isAbstract(targetMethod.getModifiers()); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1106 if (!checkTargetConditions(data, replacements, invoke, targetMethod, optimisticOpts)) { |
7223
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1107 return null; |
e2ea829fafd9
use CHA more frequently for inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7221
diff
changeset
|
1108 } |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1109 return new ExactInlineInfo(invoke, targetMethod); |
5109
6766253384bf
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5105
diff
changeset
|
1110 } |
6766253384bf
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5105
diff
changeset
|
1111 |
9705
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
1112 private static InlineInfo getTypeCheckedInlineInfo(InliningData data, Invoke invoke, int maxNumberOfMethods, Replacements replacements, ResolvedJavaMethod targetMethod, |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
1113 OptimisticOptimizations optimisticOpts) { |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
1114 JavaTypeProfile typeProfile; |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1115 ValueNode receiver = invoke.callTarget().arguments().get(0); |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1116 if (receiver instanceof TypeProfileProxyNode) { |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1117 TypeProfileProxyNode typeProfileProxyNode = (TypeProfileProxyNode) receiver; |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1118 typeProfile = typeProfileProxyNode.getProfile(); |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1119 } else { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1120 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "no type profile exists"); |
7071 | 1121 } |
4456
f4c82dd4619e
inlining bugfixes and cleanup
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4455
diff
changeset
|
1122 |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1123 ProfiledType[] ptypes = typeProfile.getTypes(); |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1124 if (ptypes == null || ptypes.length <= 0) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1125 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "no types in profile"); |
7071 | 1126 } |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
1127 |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1128 double notRecordedTypeProbability = typeProfile.getNotRecordedProbability(); |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1129 if (ptypes.length == 1 && notRecordedTypeProbability == 0) { |
7071 | 1130 if (!optimisticOpts.inlineMonomorphicCalls()) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1131 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "inlining monomorphic calls is disabled"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1132 } |
4459
d389f4b5bdd6
fixed typecheck branch probability
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4458
diff
changeset
|
1133 |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1134 ResolvedJavaType type = ptypes[0].getType(); |
13196
e343d4623e47
weakened assertion around type profiles to allow array types (GRAAL-618)
Doug Simon <doug.simon@oracle.com>
parents:
13166
diff
changeset
|
1135 assert type.isArray() || !isAbstract(type.getModifiers()); |
7071 | 1136 ResolvedJavaMethod concrete = type.resolveMethod(targetMethod); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1137 if (!checkTargetConditions(data, replacements, invoke, concrete, optimisticOpts)) { |
7071 | 1138 return null; |
1139 } | |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
1140 return new TypeGuardInlineInfo(invoke, concrete, type); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1141 } else { |
7071 | 1142 invoke.setPolymorphic(true); |
1143 | |
1144 if (!optimisticOpts.inlinePolymorphicCalls() && notRecordedTypeProbability == 0) { | |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1145 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "inlining polymorphic calls is disabled (%d types)", ptypes.length); |
7071 | 1146 } |
1147 if (!optimisticOpts.inlineMegamorphicCalls() && notRecordedTypeProbability > 0) { | |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1148 // due to filtering impossible types, notRecordedTypeProbability can be > 0 although |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1149 // the number of types is lower than what can be recorded in a type profile |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1150 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "inlining megamorphic calls is disabled (%d types, %f %% not recorded types)", ptypes.length, |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1151 notRecordedTypeProbability * 100); |
7071 | 1152 } |
1153 | |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1154 // Find unique methods and their probabilities. |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1155 ArrayList<ResolvedJavaMethod> concreteMethods = new ArrayList<>(); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1156 ArrayList<Double> concreteMethodsProbabilities = new ArrayList<>(); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1157 for (int i = 0; i < ptypes.length; i++) { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1158 ResolvedJavaMethod concrete = ptypes[i].getType().resolveMethod(targetMethod); |
9837
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1159 if (concrete == null) { |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1160 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "could not resolve method"); |
59d799c965c9
Allow ResolvedJavaType.resolveMethod to return null
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9722
diff
changeset
|
1161 } |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1162 int index = concreteMethods.indexOf(concrete); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1163 double curProbability = ptypes[i].getProbability(); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1164 if (index < 0) { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1165 index = concreteMethods.size(); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1166 concreteMethods.add(concrete); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1167 concreteMethodsProbabilities.add(curProbability); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1168 } else { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1169 concreteMethodsProbabilities.set(index, concreteMethodsProbabilities.get(index) + curProbability); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1170 } |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1171 } |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1172 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1173 if (concreteMethods.size() > maxNumberOfMethods) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1174 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "polymorphic call with more than %d target methods", maxNumberOfMethods); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1175 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1176 |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1177 // Clear methods that fall below the threshold. |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1178 if (notRecordedTypeProbability > 0) { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1179 ArrayList<ResolvedJavaMethod> newConcreteMethods = new ArrayList<>(); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1180 ArrayList<Double> newConcreteMethodsProbabilities = new ArrayList<>(); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1181 for (int i = 0; i < concreteMethods.size(); ++i) { |
9966
4158612eca60
GraalOptions: use static import
Bernhard Urban <bernhard.urban@jku.at>
parents:
9961
diff
changeset
|
1182 if (concreteMethodsProbabilities.get(i) >= MegamorphicInliningMinMethodProbability.getValue()) { |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1183 newConcreteMethods.add(concreteMethods.get(i)); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1184 newConcreteMethodsProbabilities.add(concreteMethodsProbabilities.get(i)); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1185 } |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1186 } |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1187 |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1188 if (newConcreteMethods.size() == 0) { |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1189 // No method left that is worth inlining. |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1190 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "no methods remaining after filtering less frequent methods (%d methods previously)", |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1191 concreteMethods.size()); |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1192 } |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1193 |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1194 concreteMethods = newConcreteMethods; |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1195 concreteMethodsProbabilities = newConcreteMethodsProbabilities; |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1196 } |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1197 |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1198 // Clean out types whose methods are no longer available. |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1199 ArrayList<ProfiledType> usedTypes = new ArrayList<>(); |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1200 ArrayList<Integer> typesToConcretes = new ArrayList<>(); |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1201 for (ProfiledType type : ptypes) { |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1202 ResolvedJavaMethod concrete = type.getType().resolveMethod(targetMethod); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1203 int index = concreteMethods.indexOf(concrete); |
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1204 if (index == -1) { |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1205 notRecordedTypeProbability += type.getProbability(); |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1206 } else { |
13196
e343d4623e47
weakened assertion around type profiles to allow array types (GRAAL-618)
Doug Simon <doug.simon@oracle.com>
parents:
13166
diff
changeset
|
1207 assert type.getType().isArray() || !isAbstract(type.getType().getModifiers()) : type + " " + concrete; |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1208 usedTypes.add(type); |
9392
5a74cbafe5b9
Adjustment to the megamorphic inlining strategy such that it focuses on concrete methods.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
1209 typesToConcretes.add(index); |
9374
8649dbda7d25
New experiment with megamorphic inlining.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9329
diff
changeset
|
1210 } |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1211 } |
9374
8649dbda7d25
New experiment with megamorphic inlining.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9329
diff
changeset
|
1212 |
9389
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1213 if (usedTypes.size() == 0) { |
708aea0e5a25
Introduce proxy nodes for propagating profiling information.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9380
diff
changeset
|
1214 // No type left that is worth checking for. |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1215 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "no types remaining after filtering less frequent types (%d types previously)", ptypes.length); |
9374
8649dbda7d25
New experiment with megamorphic inlining.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9329
diff
changeset
|
1216 } |
8649dbda7d25
New experiment with megamorphic inlining.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9329
diff
changeset
|
1217 |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1218 for (ResolvedJavaMethod concrete : concreteMethods) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1219 if (!checkTargetConditions(data, replacements, invoke, concrete, optimisticOpts)) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1220 return logNotInlinedMethodAndReturnNull(invoke, data.inliningDepth(), targetMethod, "it is a polymorphic method call and at least one invoked method cannot be inlined"); |
7071 | 1221 } |
1222 } | |
9380
ee8cd087a731
Dispatch based on method instead of type if it seems more beneficial.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9379
diff
changeset
|
1223 return new MultiTypeGuardInlineInfo(invoke, concreteMethods, concreteMethodsProbabilities, usedTypes, typesToConcretes, notRecordedTypeProbability); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1224 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1225 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1226 |
10706
8d961f93725c
Use GuardedValueNode in the inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10692
diff
changeset
|
1227 private static GuardedValueNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ResolvedJavaType commonType, ValueNode receiver, boolean exact) { |
10041
595f1f253ef4
Use createAnchoredReceiver to create the invokes's receiver check before inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10040
diff
changeset
|
1228 return createAnchoredReceiver(graph, anchor, receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType)); |
595f1f253ef4
Use createAnchoredReceiver to create the invokes's receiver check before inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10040
diff
changeset
|
1229 } |
595f1f253ef4
Use createAnchoredReceiver to create the invokes's receiver check before inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10040
diff
changeset
|
1230 |
10706
8d961f93725c
Use GuardedValueNode in the inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10692
diff
changeset
|
1231 private static GuardedValueNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ValueNode receiver, Stamp stamp) { |
4636
495a81cd6969
avoid code generation for typechecks that are only used for anchoring
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4635
diff
changeset
|
1232 // to avoid that floating reads on receiver fields float above the type check |
10706
8d961f93725c
Use GuardedValueNode in the inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
10692
diff
changeset
|
1233 return graph.unique(new GuardedValueNode(receiver, anchor, stamp)); |
4636
495a81cd6969
avoid code generation for typechecks that are only used for anchoring
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4635
diff
changeset
|
1234 } |
495a81cd6969
avoid code generation for typechecks that are only used for anchoring
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4635
diff
changeset
|
1235 |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
1236 // TODO (chaeubl): cleanup this method |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1237 private static boolean checkInvokeConditions(Invoke invoke) { |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1238 if (invoke.predecessor() == null || !invoke.asNode().isAlive()) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
1239 return logNotInlinedMethod(invoke, "the invoke is dead code"); |
7391
36dafe48bc38
added relevance-based inlining
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7388
diff
changeset
|
1240 } else if (!(invoke.callTarget() instanceof MethodCallTargetNode)) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
1241 return logNotInlinedMethod(invoke, "the invoke has already been lowered, or has been created as a low-level node"); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
1242 } else if (((MethodCallTargetNode) invoke.callTarget()).targetMethod() == null) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
1243 return logNotInlinedMethod(invoke, "target method is null"); |
7071 | 1244 } else if (invoke.stateAfter() == null) { |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
1245 // TODO (chaeubl): why should an invoke not have a state after? |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
1246 return logNotInlinedMethod(invoke, "the invoke has no after state"); |
7071 | 1247 } else if (!invoke.useForInlining()) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
1248 return logNotInlinedMethod(invoke, "the invoke is marked to be not used for inlining"); |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
1249 } else if (((MethodCallTargetNode) invoke.callTarget()).receiver() != null && ((MethodCallTargetNode) invoke.callTarget()).receiver().isConstant() && |
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
1250 ((MethodCallTargetNode) invoke.callTarget()).receiver().asConstant().isNull()) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
1251 return logNotInlinedMethod(invoke, "receiver is null"); |
7071 | 1252 } else { |
1253 return true; | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1254 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1255 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1256 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9310
diff
changeset
|
1257 private static boolean checkTargetConditions(InliningData data, Replacements replacements, Invoke invoke, ResolvedJavaMethod method, OptimisticOptimizations optimisticOpts) { |
4530 | 1258 if (method == null) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1259 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "the method is not resolved"); |
9966
4158612eca60
GraalOptions: use static import
Bernhard Urban <bernhard.urban@jku.at>
parents:
9961
diff
changeset
|
1260 } else if (Modifier.isNative(method.getModifiers()) && (!Intrinsify.getValue() || !InliningUtil.canIntrinsify(replacements, method))) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1261 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "it is a non-intrinsic native method"); |
7071 | 1262 } else if (Modifier.isAbstract(method.getModifiers())) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1263 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "it is an abstract method"); |
7071 | 1264 } else if (!method.getDeclaringClass().isInitialized()) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1265 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "the method's class is not initialized"); |
7071 | 1266 } else if (!method.canBeInlined()) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1267 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "it is marked non-inlinable"); |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9837
diff
changeset
|
1268 } else if (data.countRecursiveInlining(method) > MaximumRecursiveInlining.getValue()) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1269 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "it exceeds the maximum recursive inlining depth"); |
13217
210f58e992a1
Use separate method profile for OSR compilations.
Roland Schatz <roland.schatz@oracle.com>
parents:
13197
diff
changeset
|
1270 } else if (new OptimisticOptimizations(method.getProfilingInfo()).lessOptimisticThan(optimisticOpts)) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9711
diff
changeset
|
1271 return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "the callee uses less optimistic optimizations than caller"); |
7071 | 1272 } else { |
1273 return true; | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1274 } |
7071 | 1275 } |
1276 | |
8229
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1277 static MonitorExitNode findPrecedingMonitorExit(UnwindNode unwind) { |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1278 Node pred = unwind.predecessor(); |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1279 while (pred != null) { |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1280 if (pred instanceof MonitorExitNode) { |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1281 return (MonitorExitNode) pred; |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1282 } |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1283 pred = pred.predecessor(); |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1284 } |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1285 return null; |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1286 } |
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1287 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1288 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1289 * Performs an actual inlining, thereby replacing the given invoke with the given inlineGraph. |
11710
8d8a7d7f0259
Remove permanent flag on ValueAnchorNode. Memory aware scheduling fixes the problem with synchronized method return values.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11689
diff
changeset
|
1290 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1291 * @param invoke the invoke that will be replaced |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1292 * @param inlineGraph the graph that the invoke will be replaced with |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1293 * @param receiverNullCheck true if a null check needs to be generated for non-static inlinings, |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1294 * false if no such check is required |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1295 */ |
7309
75c18356504d
Added capability to return the map of dupblicates when inlining a graph.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7257
diff
changeset
|
1296 public static Map<Node, Node> inline(Invoke invoke, StructuredGraph inlineGraph, boolean receiverNullCheck) { |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1297 final NodeInputList<ValueNode> parameters = invoke.callTarget().arguments(); |
9602
19c5a07c7843
Introduce a graph() method that returns a StructuredGraph, to make many explicit casts unnecessary
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9470
diff
changeset
|
1298 StructuredGraph graph = invoke.asNode().graph(); |
13285
54248131f787
InliningPhase asserts correct order on the garph stages
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
13217
diff
changeset
|
1299 assert inlineGraph.getGuardsStage().ordinal() >= graph.getGuardsStage().ordinal(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1300 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1301 FrameState stateAfter = invoke.stateAfter(); |
9672
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1302 assert stateAfter == null || stateAfter.isAlive(); |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1303 if (receiverNullCheck && !((MethodCallTargetNode) invoke.callTarget()).isStatic()) { |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1304 nonNullReceiver(invoke); |
9861
2d5c0f7ce7a1
Add a PiNode for the null-checked receiver during inlining
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9837
diff
changeset
|
1305 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1306 |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1307 ArrayList<Node> nodes = new ArrayList<>(inlineGraph.getNodes().count()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1308 ReturnNode returnNode = null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1309 UnwindNode unwindNode = null; |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1310 final StartNode entryPointNode = inlineGraph.start(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1311 FixedNode firstCFGNode = entryPointNode.next(); |
11712
0d16339188ef
Improvements to the Truffle cache.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11710
diff
changeset
|
1312 if (firstCFGNode == null) { |
0d16339188ef
Improvements to the Truffle cache.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11710
diff
changeset
|
1313 throw new IllegalStateException("Inlined graph is in invalid state"); |
0d16339188ef
Improvements to the Truffle cache.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11710
diff
changeset
|
1314 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1315 for (Node node : inlineGraph.getNodes()) { |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1316 if (node == entryPointNode || node == entryPointNode.stateAfter() || node instanceof LocalNode) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1317 // Do nothing. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1318 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1319 nodes.add(node); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1320 if (node instanceof ReturnNode) { |
5693
0356d95f01ba
While inlining, ensure proper anchoring of things that where anchored to the StartNode
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5662
diff
changeset
|
1321 assert returnNode == null; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1322 returnNode = (ReturnNode) node; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1323 } else if (node instanceof UnwindNode) { |
5693
0356d95f01ba
While inlining, ensure proper anchoring of things that where anchored to the StartNode
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5662
diff
changeset
|
1324 assert unwindNode == null; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1325 unwindNode = (UnwindNode) node; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1326 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1327 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1328 } |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1329 |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1330 final AbstractBeginNode prevBegin = AbstractBeginNode.prevBegin(invoke.asNode()); |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1331 DuplicationReplacement localReplacement = new DuplicationReplacement() { |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1332 |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1333 public Node replacement(Node node) { |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1334 if (node instanceof LocalNode) { |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1335 return parameters.get(((LocalNode) node).index()); |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1336 } else if (node == entryPointNode) { |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1337 return prevBegin; |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1338 } |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1339 return node; |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1340 } |
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1341 }; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1342 |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1343 assert invoke.asNode().successors().first() != null : invoke; |
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1344 assert invoke.asNode().predecessor() != null; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1345 |
11675
77d9f12797c5
Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11669
diff
changeset
|
1346 Map<Node, Node> duplicates = graph.addDuplicates(nodes, inlineGraph, inlineGraph.getNodeCount(), localReplacement); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1347 FixedNode firstCFGNodeDuplicate = (FixedNode) duplicates.get(firstCFGNode); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1348 invoke.asNode().replaceAtPredecessor(firstCFGNodeDuplicate); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1349 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1350 FrameState stateAtExceptionEdge = null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1351 if (invoke instanceof InvokeWithExceptionNode) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1352 InvokeWithExceptionNode invokeWithException = ((InvokeWithExceptionNode) invoke); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1353 if (unwindNode != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1354 assert unwindNode.predecessor() != null; |
4411
cd2b68ef8e23
cleanup around filter and predicates :
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4312
diff
changeset
|
1355 assert invokeWithException.exceptionEdge().successors().count() == 1; |
8461
6a8ad083746e
The exception edge for invokes should still be a DispatchBeginNode to allow lowering of ExceptionObjectNode after guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8441
diff
changeset
|
1356 ExceptionObjectNode obj = (ExceptionObjectNode) invokeWithException.exceptionEdge(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1357 stateAtExceptionEdge = obj.stateAfter(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1358 UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode); |
4455 | 1359 obj.replaceAtUsages(unwindDuplicate.exception()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1360 unwindDuplicate.clearInputs(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1361 Node n = obj.next(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1362 obj.setNext(null); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1363 unwindDuplicate.replaceAndDelete(n); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1364 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1365 invokeWithException.killExceptionEdge(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1366 } |
11878
39e9ec0cf310
Inlining: remove killing begin node in non-exceptional path of InvokeWithException after inlining
Bernhard Urban <bernhard.urban@jku.at>
parents:
11839
diff
changeset
|
1367 |
39e9ec0cf310
Inlining: remove killing begin node in non-exceptional path of InvokeWithException after inlining
Bernhard Urban <bernhard.urban@jku.at>
parents:
11839
diff
changeset
|
1368 // get rid of memory kill |
39e9ec0cf310
Inlining: remove killing begin node in non-exceptional path of InvokeWithException after inlining
Bernhard Urban <bernhard.urban@jku.at>
parents:
11839
diff
changeset
|
1369 AbstractBeginNode begin = invokeWithException.next(); |
39e9ec0cf310
Inlining: remove killing begin node in non-exceptional path of InvokeWithException after inlining
Bernhard Urban <bernhard.urban@jku.at>
parents:
11839
diff
changeset
|
1370 if (begin instanceof KillingBeginNode) { |
13502
89a9d3f5bc17
Bugfix in inlining
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13378
diff
changeset
|
1371 BeginNode newBegin = new BeginNode(); |
89a9d3f5bc17
Bugfix in inlining
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13378
diff
changeset
|
1372 graph.addAfterFixed(begin, graph.add(newBegin)); |
89a9d3f5bc17
Bugfix in inlining
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13378
diff
changeset
|
1373 begin.replaceAtUsages(newBegin); |
11878
39e9ec0cf310
Inlining: remove killing begin node in non-exceptional path of InvokeWithException after inlining
Bernhard Urban <bernhard.urban@jku.at>
parents:
11839
diff
changeset
|
1374 graph.removeFixed(begin); |
39e9ec0cf310
Inlining: remove killing begin node in non-exceptional path of InvokeWithException after inlining
Bernhard Urban <bernhard.urban@jku.at>
parents:
11839
diff
changeset
|
1375 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1376 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1377 if (unwindNode != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1378 UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode); |
8229
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1379 MonitorExitNode monitorExit = findPrecedingMonitorExit(unwindDuplicate); |
7660
0b646334c5f7
keep track of leafGraphIds only at the StructuredGraph level (see GRAAL-60)
Lukas Stadler <lukas.stadler@jku.at>
parents:
7558
diff
changeset
|
1380 DeoptimizeNode deoptimizeNode = new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.NotCompiledExceptionHandler); |
4339
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1381 unwindDuplicate.replaceAndDelete(graph.add(deoptimizeNode)); |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1382 // move the deopt upwards if there is a monitor exit that tries to use the |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7510
diff
changeset
|
1383 // "after exception" frame state |
4339
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1384 // (because there is no "after exception" frame state!) |
8229
3d33975f6497
move test for null exception object passed to unwind operation from stub code to extra HIR
Doug Simon <doug.simon@oracle.com>
parents:
7901
diff
changeset
|
1385 if (monitorExit != null) { |
4339
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1386 if (monitorExit.stateAfter() != null && monitorExit.stateAfter().bci == FrameState.AFTER_EXCEPTION_BCI) { |
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1387 FrameState monitorFrameState = monitorExit.stateAfter(); |
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1388 graph.removeFixed(monitorExit); |
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1389 monitorFrameState.safeDelete(); |
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1390 } |
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1391 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1392 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1393 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1394 |
9672
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1395 if (stateAfter != null) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1396 FrameState outerFrameState = null; |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1397 int callerLockDepth = stateAfter.nestedLockDepth(); |
11675
77d9f12797c5
Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11669
diff
changeset
|
1398 for (Node inlinedNode : inlineGraph.getNodes()) { |
77d9f12797c5
Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11669
diff
changeset
|
1399 Node node = duplicates.get(inlinedNode); |
9672
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1400 if (node instanceof FrameState) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1401 FrameState frameState = (FrameState) node; |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1402 assert frameState.bci != FrameState.BEFORE_BCI : frameState; |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1403 if (frameState.bci == FrameState.AFTER_BCI) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1404 frameState.replaceAndDelete(stateAfter); |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1405 } else if (frameState.bci == FrameState.AFTER_EXCEPTION_BCI) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1406 if (frameState.isAlive()) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1407 assert stateAtExceptionEdge != null; |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1408 frameState.replaceAndDelete(stateAtExceptionEdge); |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1409 } else { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1410 assert stateAtExceptionEdge == null; |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1411 } |
4339
15ec30809d0f
enable UseExceptionProbability by default and fix the InliningUtil to correctly handle FrameState.AFTER_EXCEPTION_BCI for Invokes without an exception edge
Lukas Stadler <lukas.stadler@jku.at>
parents:
4312
diff
changeset
|
1412 } else { |
9672
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1413 // only handle the outermost frame states |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1414 if (frameState.outerFrameState() == null) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1415 assert frameState.bci == FrameState.INVALID_FRAMESTATE_BCI || frameState.method() == inlineGraph.method(); |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1416 if (outerFrameState == null) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1417 outerFrameState = stateAfter.duplicateModified(invoke.bci(), stateAfter.rethrowException(), invoke.asNode().kind()); |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1418 outerFrameState.setDuringCall(true); |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1419 } |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1420 frameState.setOuterFrameState(outerFrameState); |
6435
9ce24a27f035
fix for InliningUtil (dropped outer frame states while inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents:
6411
diff
changeset
|
1421 } |
4449
d84ccb0cc897
some parts for inlining multiple methods
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4442
diff
changeset
|
1422 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1423 } |
9672
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1424 if (callerLockDepth != 0 && node instanceof MonitorReference) { |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1425 MonitorReference monitor = (MonitorReference) node; |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1426 monitor.setLockDepth(monitor.getLockDepth() + callerLockDepth); |
67804a97c1ce
allow inlining of invokes with a null stateAfter
Doug Simon <doug.simon@oracle.com>
parents:
9610
diff
changeset
|
1427 } |
8586
82f6a25321b8
modeling of lock state removed from LIR and runtime specific debug info for locks moved into runtime specific classes
Doug Simon <doug.simon@oracle.com>
parents:
8469
diff
changeset
|
1428 } |
9684
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1429 } else { |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1430 assert checkContainsOnlyInvalidOrAfterFrameState(duplicates); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1431 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1432 Node returnValue = null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1433 if (returnNode != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1434 if (returnNode.result() instanceof LocalNode) { |
11669
a625d254e137
Avoid allocation of replacement hashmap in addDuplicates and also in InliningUtil.inline.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11657
diff
changeset
|
1435 returnValue = localReplacement.replacement(returnNode.result()); |
11675
77d9f12797c5
Use NodeMap in inlining utility when number of nodes is high.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11669
diff
changeset
|
1436 } else if (returnNode.result() != null) { |
13327
c258331fdde6
removed support for external nodes (GRAAL-508)
Doug Simon <doug.simon@oracle.com>
parents:
13285
diff
changeset
|
1437 returnValue = duplicates.get(returnNode.result()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1438 } |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1439 invoke.asNode().replaceAtUsages(returnValue); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1440 Node returnDuplicate = duplicates.get(returnNode); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1441 returnDuplicate.clearInputs(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1442 Node n = invoke.next(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1443 invoke.setNext(null); |
5210
e3e7542d78b7
Loop-closed form GraphBuidling
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5160
diff
changeset
|
1444 returnDuplicate.replaceAndDelete(n); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1445 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1446 |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1447 invoke.asNode().replaceAtUsages(null); |
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9004
diff
changeset
|
1448 GraphUtil.killCFG(invoke.asNode()); |
7309
75c18356504d
Added capability to return the map of dupblicates when inlining a graph.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7257
diff
changeset
|
1449 |
75c18356504d
Added capability to return the map of dupblicates when inlining a graph.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7257
diff
changeset
|
1450 return duplicates; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1451 } |
4451
defa1b705f14
NullCheck and IsTypeNode were in wrong order
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4449
diff
changeset
|
1452 |
9684
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1453 private static boolean checkContainsOnlyInvalidOrAfterFrameState(Map<Node, Node> duplicates) { |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1454 for (Node node : duplicates.values()) { |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1455 if (node instanceof FrameState) { |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1456 FrameState frameState = (FrameState) node; |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1457 assert frameState.bci == FrameState.AFTER_BCI || frameState.bci == FrameState.INVALID_FRAMESTATE_BCI : node.toString(Verbosity.Debugger); |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1458 } |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1459 } |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1460 return true; |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1461 } |
35212baf46e5
added check that the graph inlined for an invoke with a null stateAfter contains only frame states whose bci is AFTER_BCI or INVALID_FRAMESTATE_BCI
Doug Simon <doug.simon@oracle.com>
parents:
9672
diff
changeset
|
1462 |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1463 /** |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1464 * Gets the receiver for an invoke, adding a guard if necessary to ensure it is non-null. |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1465 */ |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1466 public static ValueNode nonNullReceiver(Invoke invoke) { |
9147
07f05f2a8149
Remove methodCallTarget() method from the Invoke interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9089
diff
changeset
|
1467 MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget(); |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1468 assert !callTarget.isStatic() : callTarget.targetMethod(); |
9602
19c5a07c7843
Introduce a graph() method that returns a StructuredGraph, to make many explicit casts unnecessary
Christian Wimmer <christian.wimmer@oracle.com>
parents:
9470
diff
changeset
|
1469 StructuredGraph graph = callTarget.graph(); |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1470 ValueNode firstParam = callTarget.arguments().get(0); |
11265 | 1471 if (firstParam.kind() == Kind.Object && !ObjectStamp.isObjectNonNull(firstParam)) { |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1472 IsNullNode condition = graph.unique(new IsNullNode(firstParam)); |
10692
bebc9672f45e
stamp for GuardingPiNode is determined by caller of constructor, not within constructor
Doug Simon <doug.simon@oracle.com>
parents:
10651
diff
changeset
|
1473 Stamp stamp = firstParam.stamp().join(objectNonNull()); |
bebc9672f45e
stamp for GuardingPiNode is determined by caller of constructor, not within constructor
Doug Simon <doug.simon@oracle.com>
parents:
10651
diff
changeset
|
1474 GuardingPiNode nonNullReceiver = graph.add(new GuardingPiNode(firstParam, condition, true, NullCheckException, InvalidateReprofile, stamp)); |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1475 graph.addBeforeFixed(invoke.asNode(), nonNullReceiver); |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1476 callTarget.replaceFirstInput(firstParam, nonNullReceiver); |
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1477 return nonNullReceiver; |
4451
defa1b705f14
NullCheck and IsTypeNode were in wrong order
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4449
diff
changeset
|
1478 } |
10637
ba1fbbfac0cd
remove null check semantics from LoadHubNode (GRAAL-248)
Doug Simon <doug.simon@oracle.com>
parents:
10041
diff
changeset
|
1479 return firstParam; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1480 } |
7071 | 1481 |
8636
ac4dbfecec8f
passed a Replacements object to inlining utility methods that need one instead of the GraalRuntime API
Doug Simon <doug.simon@oracle.com>
parents:
8627
diff
changeset
|
1482 public static boolean canIntrinsify(Replacements replacements, ResolvedJavaMethod target) { |
ac4dbfecec8f
passed a Replacements object to inlining utility methods that need one instead of the GraalRuntime API
Doug Simon <doug.simon@oracle.com>
parents:
8627
diff
changeset
|
1483 return getIntrinsicGraph(replacements, target) != null || getMacroNodeClass(replacements, target) != null; |
7071 | 1484 } |
1485 | |
8636
ac4dbfecec8f
passed a Replacements object to inlining utility methods that need one instead of the GraalRuntime API
Doug Simon <doug.simon@oracle.com>
parents:
8627
diff
changeset
|
1486 public static StructuredGraph getIntrinsicGraph(Replacements replacements, ResolvedJavaMethod target) { |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8617
diff
changeset
|
1487 return replacements.getMethodSubstitution(target); |
7071 | 1488 } |
1489 | |
8636
ac4dbfecec8f
passed a Replacements object to inlining utility methods that need one instead of the GraalRuntime API
Doug Simon <doug.simon@oracle.com>
parents:
8627
diff
changeset
|
1490 public static Class<? extends FixedWithNextNode> getMacroNodeClass(Replacements replacements, ResolvedJavaMethod target) { |
8627
75db7afee829
implemented lazy installation of replacements (GRAAL-137)
Doug Simon <doug.simon@oracle.com>
parents:
8617
diff
changeset
|
1491 return replacements.getMacroSubstitution(target); |
7510
225002aba5a5
added new macro node facility, removed ArrayCopyIntrinsificationPhase
Lukas Stadler <lukas.stadler@jku.at>
parents:
7392
diff
changeset
|
1492 } |
10644
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1493 |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1494 public static FixedWithNextNode inlineMacroNode(Invoke invoke, ResolvedJavaMethod concrete, StructuredGraph graph, Class<? extends FixedWithNextNode> macroNodeClass) throws GraalInternalError { |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1495 if (((MethodCallTargetNode) invoke.callTarget()).targetMethod() != concrete) { |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1496 assert ((MethodCallTargetNode) invoke.callTarget()).invokeKind() != InvokeKind.Static; |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1497 InliningUtil.replaceInvokeCallTarget(invoke, graph, InvokeKind.Special, concrete); |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1498 } |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1499 |
13128
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1500 FixedWithNextNode macroNode = createMacroNodeInstance(macroNodeClass, invoke); |
10644
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1501 |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1502 CallTargetNode callTarget = invoke.callTarget(); |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1503 if (invoke instanceof InvokeNode) { |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1504 graph.replaceFixedWithFixed((InvokeNode) invoke, graph.add(macroNode)); |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1505 } else { |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1506 InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke; |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1507 invokeWithException.killExceptionEdge(); |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1508 graph.replaceSplitWithFixed(invokeWithException, graph.add(macroNode), invokeWithException.next()); |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1509 } |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1510 GraphUtil.killWithUnusedFloatingInputs(callTarget); |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1511 return macroNode; |
90a7a58bf54f
Create utility method in InliningUtil for inlining macro nodes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
10041
diff
changeset
|
1512 } |
13128
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1513 |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1514 private static FixedWithNextNode createMacroNodeInstance(Class<? extends FixedWithNextNode> macroNodeClass, Invoke invoke) throws GraalInternalError { |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1515 try { |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1516 return macroNodeClass.getConstructor(Invoke.class).newInstance(invoke); |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1517 } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1518 throw new GraalInternalError(e).addContext(invoke.asNode()).addContext("macroSubstitution", macroNodeClass); |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1519 } |
c9660efac5f6
Factor out methods that use reflection so that they can be substituted
Christian Wimmer <christian.wimmer@oracle.com>
parents:
12655
diff
changeset
|
1520 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1521 } |