annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java @ 13953:d587baa55dd7

Add shouldBeInlined method to ResolvedJavaMethod, implement it for HotSpot and use it in the inlining phase
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 13 Feb 2014 18:46:15 +0100
parents 0991dc195637
children cd22c8dbda4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1 /*
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
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
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
25 import static com.oracle.graal.phases.GraalOptions.*;
9987
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
26 import static com.oracle.graal.phases.common.InliningPhase.Options.*;
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
27
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
28 import java.util.*;
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
29
5510
426c605c9d3c Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5507
diff changeset
30 import com.oracle.graal.api.code.*;
5507
dc71b06d09f8 Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5503
diff changeset
31 import com.oracle.graal.api.meta.*;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
32 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: 13137
diff changeset
33 import com.oracle.graal.debug.Debug.Scope;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
34 import com.oracle.graal.graph.*;
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12054
diff changeset
35 import com.oracle.graal.graph.Graph.Mark;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
36 import com.oracle.graal.nodes.*;
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
37 import com.oracle.graal.nodes.java.*;
5720
46ad94a0574a moved everything from com.oracle.graal.nodes.cri into com.oracle.graal.nodes.spi
Doug Simon <doug.simon@oracle.com>
parents: 5718
diff changeset
38 import com.oracle.graal.nodes.spi.*;
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
39 import com.oracle.graal.nodes.type.*;
9238
8f01fe16e473 refactorings and cleanups for the removal of FixedNode.probability
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9234
diff changeset
40 import com.oracle.graal.nodes.util.*;
9855
6898d8995866 converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9786
diff changeset
41 import com.oracle.graal.options.*;
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
42 import com.oracle.graal.phases.common.InliningUtil.InlineInfo;
9921
26785bb7006d Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9722
diff changeset
43 import com.oracle.graal.phases.common.InliningUtil.Inlineable;
10935
2da7f2efe6e2 Move inlining phases to HighTier.
Roland Schatz <roland.schatz@oracle.com>
parents: 10934
diff changeset
44 import com.oracle.graal.phases.common.InliningUtil.InlineableGraph;
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
45 import com.oracle.graal.phases.common.InliningUtil.InlineableMacroNode;
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
46 import com.oracle.graal.phases.common.InliningUtil.InliningPolicy;
9238
8f01fe16e473 refactorings and cleanups for the removal of FixedNode.probability
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9234
diff changeset
47 import com.oracle.graal.phases.graph.*;
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
48 import com.oracle.graal.phases.tiers.*;
13137
438ed35bed29 Change PhaseContext so that it does not subclass Providers, to avoid leaking low-level provider objects such as the CodeCacheProvdier to high-level optimization phases
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12686
diff changeset
49 import com.oracle.graal.phases.util.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
50
10935
2da7f2efe6e2 Move inlining phases to HighTier.
Roland Schatz <roland.schatz@oracle.com>
parents: 10934
diff changeset
51 public class InliningPhase extends AbstractInliningPhase {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
52
9987
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
53 static class Options {
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
54
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
55 // @formatter:off
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
56 @Option(help = "Unconditionally inline intrinsics")
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
57 public static final OptionValue<Boolean> AlwaysInlineIntrinsics = new OptionValue<>(false);
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
58 // @formatter:on
b270f0856a39 fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents: 9961
diff changeset
59 }
9855
6898d8995866 converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9786
diff changeset
60
4468
87a12a816e99 added C1 inlining policy for comparison, bugfixes
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4461
diff changeset
61 private final InliningPolicy inliningPolicy;
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
62 private final CanonicalizerPhase canonicalizer;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
63
8548
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
64 private int inliningCount;
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
65 private int maxMethodPerInlining = Integer.MAX_VALUE;
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
66
4348
d49c90e641cb Remove GraalMetrics, replace with new syntax for metrics.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4205
diff changeset
67 // Metrics
4356
249752adcb8d Rename Timer DebugTimer and Metric DebugMetric.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4352
diff changeset
68 private static final DebugMetric metricInliningPerformed = Debug.metric("InliningPerformed");
249752adcb8d Rename Timer DebugTimer and Metric DebugMetric.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4352
diff changeset
69 private static final DebugMetric metricInliningConsidered = Debug.metric("InliningConsidered");
4598
6a44a26ed9e6 set default inlining policy to the greedy one
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4594
diff changeset
70 private static final DebugMetric metricInliningStoppedByMaxDesiredSize = Debug.metric("InliningStoppedByMaxDesiredSize");
11600
60f4c505993e remove global phase metric, replaced with per-phase metrics
Doug Simon <doug.simon@oracle.com>
parents: 11567
diff changeset
71 private static final DebugMetric metricInliningRuns = Debug.metric("InliningRuns");
4348
d49c90e641cb Remove GraalMetrics, replace with new syntax for metrics.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4205
diff changeset
72
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
73 public InliningPhase(CanonicalizerPhase canonicalizer) {
10934
e2333d8c72b1 Make InliningPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 10933
diff changeset
74 this(new GreedyInliningPolicy(null), canonicalizer);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
75 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
76
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
77 public InliningPhase(Map<Invoke, Double> hints, CanonicalizerPhase canonicalizer) {
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
78 this(new GreedyInliningPolicy(hints), canonicalizer);
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
79 }
8618
832b9a115a2d style fixes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8617
diff changeset
80
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
81 public InliningPhase(InliningPolicy policy, CanonicalizerPhase canonicalizer) {
10934
e2333d8c72b1 Make InliningPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 10933
diff changeset
82 this.inliningPolicy = policy;
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
83 this.canonicalizer = canonicalizer;
8617
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
84 }
8618
832b9a115a2d style fixes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8617
diff changeset
85
8617
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
86 public void setMaxMethodsPerInlining(int max) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
87 maxMethodPerInlining = max;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
88 }
8618
832b9a115a2d style fixes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8617
diff changeset
89
8548
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
90 public int getInliningCount() {
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
91 return inliningCount;
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
92 }
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
93
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
94 public static void storeStatisticsAfterLowTier(StructuredGraph graph) {
9705
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
95 ResolvedJavaMethod method = graph.method();
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
96 if (method != null) {
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
97 CompiledMethodInfo info = compiledMethodInfo(graph.method());
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
98 info.setLowLevelNodeCount(graph.getNodeCount());
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
99 }
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
100 }
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
101
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
102 @Override
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
103 protected void run(final StructuredGraph graph, final HighTierContext context) {
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
104 final InliningData data = new InliningData(graph, context.getAssumptions());
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
105
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
106 while (data.hasUnprocessedGraphs()) {
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
107 final MethodInvocation currentInvocation = data.currentInvocation();
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
108 GraphInfo graphInfo = data.currentGraph();
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
109 if (!currentInvocation.isRoot() &&
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
110 !inliningPolicy.isWorthInlining(context.getReplacements(), currentInvocation.callee(), data.inliningDepth(), currentInvocation.probability(),
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
111 currentInvocation.relevance(), false)) {
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
112 int remainingGraphs = currentInvocation.totalGraphs() - currentInvocation.processedGraphs();
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
113 assert remainingGraphs > 0;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
114 data.popGraphs(remainingGraphs);
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
115 data.popInvocation();
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
116 } else if (graphInfo.hasRemainingInvokes() && inliningPolicy.continueInlining(graphInfo.graph())) {
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
117 processNextInvoke(data, graphInfo, context);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
118 } else {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
119 data.popGraph();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
120 if (!currentInvocation.isRoot()) {
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
121 assert currentInvocation.callee().invoke().asNode().isAlive();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
122 currentInvocation.incrementProcessedGraphs();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
123 if (currentInvocation.processedGraphs() == currentInvocation.totalGraphs()) {
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
124 data.popInvocation();
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
125 final MethodInvocation parentInvoke = data.currentInvocation();
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: 13137
diff changeset
126 try (Scope s = Debug.scope("Inlining", data.inliningContext())) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
127 tryToInline(data.currentGraph(), currentInvocation, parentInvoke, data.inliningDepth() + 1, context);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
128 } catch (Throwable e) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
129 throw Debug.handle(e);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
130 }
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
131 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
132 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
133 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
134 }
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
135
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
136 assert data.inliningDepth() == 0;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
137 assert data.graphCount() == 0;
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
138 }
5316
8ac40aed34bf Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents: 5299
diff changeset
139
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
140 /**
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
141 * Process the next invoke and enqueue all its graphs for processing.
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
142 */
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
143 private void processNextInvoke(InliningData data, GraphInfo graphInfo, HighTierContext context) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
144 Invoke invoke = graphInfo.popInvoke();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
145 MethodInvocation callerInvocation = data.currentInvocation();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
146 Assumptions parentAssumptions = callerInvocation.assumptions();
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
147 InlineInfo info = InliningUtil.getInlineInfo(data, invoke, maxMethodPerInlining, context.getReplacements(), parentAssumptions, context.getOptimisticOptimizations());
9234
b9cf7d0b598e removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9147
diff changeset
148
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
149 if (info != null) {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
150 double invokeProbability = graphInfo.invokeProbability(invoke);
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
151 double invokeRelevance = graphInfo.invokeRelevance(invoke);
9961
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
152 MethodInvocation calleeInvocation = data.pushInvocation(info, parentAssumptions, invokeProbability, invokeRelevance);
9234
b9cf7d0b598e removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9147
diff changeset
153
9961
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
154 for (int i = 0; i < info.numberOfMethods(); i++) {
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
155 Inlineable elem = getInlineableElement(info.methodAt(i), info.invoke(), context.replaceAssumptions(calleeInvocation.assumptions()));
9961
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
156 info.setInlinableElement(i, elem);
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
157 if (elem instanceof InlineableGraph) {
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
158 data.pushGraph(((InlineableGraph) elem).getGraph(), invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i));
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
159 } else {
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
160 assert elem instanceof InlineableMacroNode;
a91b0d42917f Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9930
diff changeset
161 data.pushDummyGraph();
5316
8ac40aed34bf Consistent output of inlining decisions. Make all inlining decisions be printable using -G:Log=InliningDecisions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents: 5299
diff changeset
162 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
163 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
164 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
165 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
166
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
167 private void tryToInline(GraphInfo callerGraphInfo, MethodInvocation calleeInfo, MethodInvocation parentInvocation, int inliningDepth, HighTierContext context) {
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
168 InlineInfo callee = calleeInfo.callee();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
169 Assumptions callerAssumptions = parentInvocation.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: 9238
diff changeset
170
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
171 if (inliningPolicy.isWorthInlining(context.getReplacements(), callee, inliningDepth, calleeInfo.probability(), calleeInfo.relevance(), true)) {
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
172 doInline(callerGraphInfo, calleeInfo, callerAssumptions, context);
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
173 } else if (context.getOptimisticOptimizations().devirtualizeInvokes()) {
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11753
diff changeset
174 callee.tryToDevirtualizeInvoke(context.getMetaAccess(), callerAssumptions);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
175 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
176 metricInliningConsidered.increment();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
177 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
178
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
179 private void doInline(GraphInfo callerGraphInfo, MethodInvocation calleeInfo, Assumptions callerAssumptions, HighTierContext context) {
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
180 StructuredGraph callerGraph = callerGraphInfo.graph();
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12054
diff changeset
181 Mark markBeforeInlining = callerGraph.getMark();
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
182 InlineInfo callee = calleeInfo.callee();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
183 try {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
184 List<Node> invokeUsages = callee.invoke().asNode().usages().snapshot();
13137
438ed35bed29 Change PhaseContext so that it does not subclass Providers, to avoid leaking low-level provider objects such as the CodeCacheProvdier to high-level optimization phases
Christian Wimmer <christian.wimmer@oracle.com>
parents: 12686
diff changeset
185 callee.inline(new Providers(context), callerAssumptions);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
186 callerAssumptions.record(calleeInfo.assumptions());
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
187 metricInliningRuns.increment();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
188 Debug.dump(callerGraph, "after %s", callee);
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
189
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
190 if (OptCanonicalizer.getValue()) {
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12054
diff changeset
191 Mark markBeforeCanonicalization = callerGraph.getMark();
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
192 canonicalizer.applyIncremental(callerGraph, context, invokeUsages, markBeforeInlining);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
193
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
194 // process invokes that are possibly created during canonicalization
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
195 for (Node newNode : callerGraph.getNewNodes(markBeforeCanonicalization)) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
196 if (newNode instanceof Invoke) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
197 callerGraphInfo.pushInvoke((Invoke) newNode);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
198 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
199 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
200 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
201
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
202 callerGraphInfo.computeProbabilities();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
203
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
204 inliningCount++;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
205 metricInliningPerformed.increment();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
206 } catch (BailoutException bailout) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
207 throw bailout;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
208 } catch (AssertionError | RuntimeException e) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
209 throw new GraalInternalError(e).addContext(callee.toString());
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
210 } catch (GraalInternalError e) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
211 throw e.addContext(callee.toString());
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
212 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
213 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
214
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
215 private Inlineable getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, HighTierContext context) {
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
216 Class<? extends FixedWithNextNode> macroNodeClass = InliningUtil.getMacroNodeClass(context.getReplacements(), method);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
217 if (macroNodeClass != null) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
218 return new InlineableMacroNode(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: 9238
diff changeset
219 } else {
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
220 return new InlineableGraph(buildGraph(method, invoke, context));
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
221 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
222 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
223
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
224 private StructuredGraph buildGraph(final ResolvedJavaMethod method, final Invoke invoke, final HighTierContext context) {
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
225 final StructuredGraph newGraph;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
226 final boolean parseBytecodes;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
227
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
228 // TODO (chaeubl): copying the graph is only necessary if it is modified or if it contains
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
229 // any invokes
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
230 StructuredGraph intrinsicGraph = InliningUtil.getIntrinsicGraph(context.getReplacements(), method);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
231 if (intrinsicGraph != null) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
232 newGraph = intrinsicGraph.copy();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
233 parseBytecodes = false;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
234 } else {
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
235 StructuredGraph cachedGraph = getCachedGraph(method, context);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
236 if (cachedGraph != null) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
237 newGraph = cachedGraph.copy();
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
238 parseBytecodes = false;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
239 } else {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
240 newGraph = new StructuredGraph(method);
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
241 parseBytecodes = true;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
242 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
243 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
244
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: 13137
diff changeset
245 try (Scope s = Debug.scope("InlineGraph", newGraph)) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
246 if (parseBytecodes) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
247 parseBytecodes(newGraph, context);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
248 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
249
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: 13137
diff changeset
250 boolean callerHasMoreInformationAboutArguments = false;
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
251 NodeInputList<ValueNode> args = invoke.callTarget().arguments();
13614
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13585
diff changeset
252 for (ParameterNode param : newGraph.getNodes(ParameterNode.class).snapshot()) {
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13585
diff changeset
253 ValueNode arg = args.get(param.index());
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: 13137
diff changeset
254 if (arg.isConstant()) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
255 Constant constant = arg.asConstant();
13614
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13585
diff changeset
256 newGraph.replaceFloating(param, ConstantNode.forConstant(constant, context.getMetaAccess(), newGraph));
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: 13137
diff changeset
257 callerHasMoreInformationAboutArguments = true;
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
258 } else {
13614
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13585
diff changeset
259 Stamp joinedStamp = param.stamp().join(arg.stamp());
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13585
diff changeset
260 if (joinedStamp != null && !joinedStamp.equals(param.stamp())) {
0774f3303c2e rename LocalNode to ParameterNode
Lukas Stadler <lukas.stadler@jku.at>
parents: 13585
diff changeset
261 param.setStamp(joinedStamp);
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
262 callerHasMoreInformationAboutArguments = true;
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
263 }
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
264 }
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: 13137
diff changeset
265 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
266
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: 13137
diff changeset
267 if (!callerHasMoreInformationAboutArguments) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
268 // TODO (chaeubl): if args are not more concrete, inlining should be avoided
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
269 // in most cases or we could at least use the previous graph size + invoke
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
270 // probability to check the inlining
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
271 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
272
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: 13137
diff changeset
273 if (OptCanonicalizer.getValue()) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
274 canonicalizer.apply(newGraph, context);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
275 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
276
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: 13137
diff changeset
277 return newGraph;
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
278 } catch (Throwable e) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
279 throw Debug.handle(e);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13137
diff changeset
280 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
281 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
282
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
283 private static StructuredGraph getCachedGraph(ResolvedJavaMethod method, HighTierContext context) {
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
284 if (CacheGraphs.getValue() && context.getGraphCache() != null) {
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
285 StructuredGraph cachedGraph = context.getGraphCache().get(method);
6353
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
286 if (cachedGraph != null) {
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
287 return cachedGraph;
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
288 }
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
289 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
290 return null;
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
291 }
7879
1474fe91323c create debug scope for graph building during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 7827
diff changeset
292
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
293 private StructuredGraph parseBytecodes(StructuredGraph newGraph, HighTierContext context) {
9928
a9311ec68721 Avoid graph caching if immature or no profiling information was used for graph building.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9927
diff changeset
294 boolean hasMatureProfilingInfo = newGraph.method().getProfilingInfo().isMature();
a9311ec68721 Avoid graph caching if immature or no profiling information was used for graph building.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9927
diff changeset
295
13585
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13197
diff changeset
296 if (context.getGraphBuilderSuite() != null) {
f4f0a8a01ce0 remove PhasePlan
Lukas Stadler <lukas.stadler@jku.at>
parents: 13197
diff changeset
297 context.getGraphBuilderSuite().apply(newGraph, context);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
298 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
299 assert newGraph.start().next() != null : "graph needs to be populated during PhasePosition.AFTER_PARSING";
5177
a26b6248d398 added graph caching (-G:+CacheGraphs)
Lukas Stadler <lukas.stadler@jku.at>
parents: 5114
diff changeset
300
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
301 new DeadCodeEliminationPhase().apply(newGraph);
9238
8f01fe16e473 refactorings and cleanups for the removal of FixedNode.probability
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9234
diff changeset
302
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
303 if (OptCanonicalizer.getValue()) {
11567
c69df2e602f4 Use CanonicalizerPhase.applyIncremental in InliningPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 11536
diff changeset
304 canonicalizer.apply(newGraph, context);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
305 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
306
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
307 if (CacheGraphs.getValue() && context.getGraphCache() != null) {
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
308 context.getGraphCache().put(newGraph.copy(), hasMatureProfilingInfo);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
309 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
310 return newGraph;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
311 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
312
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
313 private static synchronized CompiledMethodInfo compiledMethodInfo(ResolvedJavaMethod m) {
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
314 CompiledMethodInfo info = (CompiledMethodInfo) m.getCompilerStorage().get(CompiledMethodInfo.class);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
315 if (info == null) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
316 info = new CompiledMethodInfo();
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
317 m.getCompilerStorage().put(CompiledMethodInfo.class, info);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
318 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
319 return info;
4670
41034914e2ee add MethodContents assumption to fix debbugging issue
Lukas Stadler <lukas.stadler@jku.at>
parents: 4598
diff changeset
320 }
41034914e2ee add MethodContents assumption to fix debbugging issue
Lukas Stadler <lukas.stadler@jku.at>
parents: 4598
diff changeset
321
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
322 private abstract static class AbstractInliningPolicy implements InliningPolicy {
4594
eb6df44a1374 bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4591
diff changeset
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: 9238
diff changeset
324 protected final Map<Invoke, Double> hints;
4594
eb6df44a1374 bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4591
diff changeset
325
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
326 public AbstractInliningPolicy(Map<Invoke, Double> hints) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
327 this.hints = hints;
4594
eb6df44a1374 bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4591
diff changeset
328 }
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7392
diff changeset
329
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
330 protected double computeMaximumSize(double relevance, int configuredMaximum) {
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
331 double inlineRatio = Math.min(RelevanceCapForInlining.getValue(), relevance);
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
332 return configuredMaximum * inlineRatio;
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
333 }
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
334
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
335 protected double getInliningBonus(InlineInfo info) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
336 if (hints != null && hints.containsKey(info.invoke())) {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
337 return hints.get(info.invoke());
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
338 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
339 return 1;
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
340 }
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
341
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
342 protected boolean isIntrinsic(Replacements replacements, InlineInfo info) {
9855
6898d8995866 converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9786
diff changeset
343 if (AlwaysInlineIntrinsics.getValue()) {
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
344 return onlyIntrinsics(replacements, info);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
345 } else {
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
346 return onlyForcedIntrinsics(replacements, info);
7388
599ea4fcdb6d added flag AlwaysInlineIntrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7256
diff changeset
347 }
4569
333ce00358f4 added another inlining policy, added option to disable propagation of loop frequencies
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4564
diff changeset
348 }
333ce00358f4 added another inlining policy, added option to disable propagation of loop frequencies
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4564
diff changeset
349
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
350 private static boolean onlyIntrinsics(Replacements replacements, InlineInfo info) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
351 for (int i = 0; i < info.numberOfMethods(); i++) {
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: 8618
diff changeset
352 if (!InliningUtil.canIntrinsify(replacements, info.methodAt(i))) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
353 return false;
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
354 }
7388
599ea4fcdb6d added flag AlwaysInlineIntrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7256
diff changeset
355 }
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
356 return true;
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
357 }
8915
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
358
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
359 private static boolean onlyForcedIntrinsics(Replacements replacements, InlineInfo info) {
8915
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
360 for (int i = 0; i < info.numberOfMethods(); i++) {
8930
Lukas Stadler <lukas.stadler@jku.at>
parents: 8915 8637
diff changeset
361 if (!InliningUtil.canIntrinsify(replacements, info.methodAt(i))) {
8915
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
362 return false;
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
363 }
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
364 if (!replacements.isForcedSubstitution(info.methodAt(i))) {
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
365 return false;
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
366 }
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
367 }
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
368 return true;
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
369 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
370
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
371 protected static int previousLowLevelGraphSize(InlineInfo info) {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
372 int size = 0;
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
373 for (int i = 0; i < info.numberOfMethods(); i++) {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
374 size += compiledMethodInfo(info.methodAt(i)).lowLevelNodeCount();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
375 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
376 return size;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
377 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
378
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
379 protected static int determineNodeCount(InlineInfo info) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
380 int nodes = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
381 for (int i = 0; i < info.numberOfMethods(); i++) {
9921
26785bb7006d Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9722
diff changeset
382 Inlineable elem = info.inlineableElementAt(i);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
383 if (elem != null) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
384 nodes += elem.getNodeCount();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
385 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
386 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
387 return nodes;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
388 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
389
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
390 protected static double determineInvokeProbability(InlineInfo info) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
391 double invokeProbability = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
392 for (int i = 0; i < info.numberOfMethods(); i++) {
9921
26785bb7006d Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9722
diff changeset
393 Inlineable callee = info.inlineableElementAt(i);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
394 Iterable<Invoke> invokes = callee.getInvokes();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
395 if (invokes.iterator().hasNext()) {
9921
26785bb7006d Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9722
diff changeset
396 NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure(((InlineableGraph) callee).getGraph()).apply();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
397 for (Invoke invoke : invokes) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
398 invokeProbability += nodeProbabilities.get(invoke.asNode());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
399 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
400 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
401 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
402 return invokeProbability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
403 }
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
404 }
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
405
11689
8d0303d8dbde make GreedyInliningPolicy/ExactInlineInfo public, allow optional null check suppression on inline
Mick Jordan <mick.jordan@oracle.com>
parents: 11600
diff changeset
406 public static class GreedyInliningPolicy extends AbstractInliningPolicy {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7392
diff changeset
407
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
408 public GreedyInliningPolicy(Map<Invoke, Double> hints) {
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
409 super(hints);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
410 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
411
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
412 public boolean continueInlining(StructuredGraph currentGraph) {
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
413 if (currentGraph.getNodeCount() >= MaximumDesiredSize.getValue()) {
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
414 InliningUtil.logInliningDecision("inlining is cut off by MaximumDesiredSize");
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
415 metricInliningStoppedByMaxDesiredSize.increment();
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
416 return false;
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
417 }
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
418 return true;
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
419 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
420
9234
b9cf7d0b598e removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9147
diff changeset
421 @Override
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
422 public boolean isWorthInlining(Replacements replacements, InlineInfo info, int inliningDepth, double probability, double relevance, boolean fullyProcessed) {
10769
395d34c10e26 HSAIL backend changes
Doug Simon <doug.simon@oracle.com>
parents: 10629
diff changeset
423 if (InlineEverything.getValue()) {
395d34c10e26 HSAIL backend changes
Doug Simon <doug.simon@oracle.com>
parents: 10629
diff changeset
424 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "inline everything");
395d34c10e26 HSAIL backend changes
Doug Simon <doug.simon@oracle.com>
parents: 10629
diff changeset
425 }
395d34c10e26 HSAIL backend changes
Doug Simon <doug.simon@oracle.com>
parents: 10629
diff changeset
426
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
427 if (isIntrinsic(replacements, info)) {
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
428 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "intrinsic");
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
429 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
430
13953
d587baa55dd7 Add shouldBeInlined method to ResolvedJavaMethod, implement it for HotSpot and use it in the inlining phase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13742
diff changeset
431 if (info.shouldInline()) {
d587baa55dd7 Add shouldBeInlined method to ResolvedJavaMethod, implement it for HotSpot and use it in the inlining phase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13742
diff changeset
432 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "forced inlining");
d587baa55dd7 Add shouldBeInlined method to ResolvedJavaMethod, implement it for HotSpot and use it in the inlining phase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13742
diff changeset
433 }
d587baa55dd7 Add shouldBeInlined method to ResolvedJavaMethod, implement it for HotSpot and use it in the inlining phase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 13742
diff changeset
434
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
435 double inliningBonus = getInliningBonus(info);
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
436 int nodes = determineNodeCount(info);
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
437 int lowLevelGraphSize = previousLowLevelGraphSize(info);
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
438
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
439 if (SmallCompiledLowLevelGraphSize.getValue() > 0 && lowLevelGraphSize > SmallCompiledLowLevelGraphSize.getValue() * inliningBonus) {
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
440 return InliningUtil.logNotInlinedMethod(info, inliningDepth, "too large previous low-level graph (low-level-nodes: %d, relevance=%f, probability=%f, bonus=%f, nodes=%d)",
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
441 lowLevelGraphSize, relevance, probability, inliningBonus, nodes);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
442 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
443
9915
d8a8d794f631 More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9914
diff changeset
444 if (nodes < TrivialInliningSize.getValue() * inliningBonus) {
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
445 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "trivial (relevance=%f, probability=%f, bonus=%f, nodes=%d)", relevance, probability, inliningBonus, nodes);
9915
d8a8d794f631 More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9914
diff changeset
446 }
d8a8d794f631 More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9914
diff changeset
447
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
448 /*
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
449 * TODO (chaeubl): invoked methods that are on important paths but not yet compiled ->
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
450 * will be compiled anyways and it is likely that we are the only caller... might be
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
451 * useful to inline those methods but increases bootstrap time (maybe those methods are
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
452 * also getting queued in the compilation queue concurrently)
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
453 */
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
454 double invokes = determineInvokeProbability(info);
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
455 if (LimitInlinedInvokes.getValue() > 0 && fullyProcessed && invokes > LimitInlinedInvokes.getValue() * inliningBonus) {
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
456 return InliningUtil.logNotInlinedMethod(info, inliningDepth, "callee invoke probability is too high (invokeP=%f, relevance=%f, probability=%f, bonus=%f, nodes=%d)", invokes,
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
457 relevance, probability, inliningBonus, nodes);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
458 }
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
459
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
460 double maximumNodes = computeMaximumSize(relevance, (int) (MaximumInliningSize.getValue() * inliningBonus));
9915
d8a8d794f631 More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9914
diff changeset
461 if (nodes <= maximumNodes) {
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
462 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "relevance-based (relevance=%f, probability=%f, bonus=%f, nodes=%d <= %f)", relevance, probability,
9915
d8a8d794f631 More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9914
diff changeset
463 inliningBonus, nodes, maximumNodes);
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
464 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
465
9930
5a4fbe932ab3 Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9928
diff changeset
466 return InliningUtil.logNotInlinedMethod(info, inliningDepth, "relevance-based (relevance=%f, probability=%f, bonus=%f, nodes=%d > %f)", relevance, probability, inliningBonus, nodes,
9915
d8a8d794f631 More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9914
diff changeset
467 maximumNodes);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
468 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
469 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
470
10626
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
471 public static final class InlineEverythingPolicy implements InliningPolicy {
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
472
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
473 public boolean continueInlining(StructuredGraph graph) {
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
474 if (graph.getNodeCount() >= MaximumDesiredSize.getValue()) {
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
475 throw new BailoutException("Inline all calls failed. The resulting graph is too large.");
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
476 }
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
477 return true;
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
478 }
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
479
10933
9878214a0093 Remove fields from InliningPhase that are already available in HighTierContext.
Roland Schatz <roland.schatz@oracle.com>
parents: 10909
diff changeset
480 public boolean isWorthInlining(Replacements replacements, InlineInfo info, int inliningDepth, double probability, double relevance, boolean fullyProcessed) {
10626
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
481 return true;
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
482 }
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
483 }
b02b3c6a59b6 Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10051
diff changeset
484
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
485 private static class InliningIterator {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7392
diff changeset
486
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
487 private final FixedNode start;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
488 private final Deque<FixedNode> nodeQueue;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
489 private final NodeBitMap queuedNodes;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
490
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
491 public InliningIterator(FixedNode start, NodeBitMap visitedFixedNodes) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
492 this.start = start;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
493 this.nodeQueue = new ArrayDeque<>();
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
494 this.queuedNodes = visitedFixedNodes;
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
495 assert start.isAlive();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
496 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
497
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
498 public LinkedList<Invoke> apply() {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
499 LinkedList<Invoke> invokes = new LinkedList<>();
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
500 FixedNode current;
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
501 forcedQueue(start);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
502
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
503 while ((current = nextQueuedNode()) != null) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
504 assert current.isAlive();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
505
11536
9021f7761457 Inlining only needs to consider invokes of Java methods, i.e., calls with a MethodCallTargetNode
Christian Wimmer <christian.wimmer@oracle.com>
parents: 10935
diff changeset
506 if (current instanceof Invoke && ((Invoke) current).callTarget() instanceof MethodCallTargetNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
507 if (current != start) {
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
508 invokes.addLast((Invoke) current);
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
509 }
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
510 queueSuccessors(current);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
511 } else if (current instanceof LoopBeginNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
512 queueSuccessors(current);
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
513 } else if (current instanceof LoopEndNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
514 // nothing todo
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
515 } else if (current instanceof MergeNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
516 queueSuccessors(current);
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
517 } else if (current instanceof FixedWithNextNode) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
518 queueSuccessors(current);
9435
794370a64b71 Replace AbstractEndNode usages with EndNode usages wherever appropriate.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9434
diff changeset
519 } else if (current instanceof EndNode) {
794370a64b71 Replace AbstractEndNode usages with EndNode usages wherever appropriate.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9434
diff changeset
520 queueMerge((EndNode) current);
8385
85d4392b9e26 Introduce a ControlSinkNode base class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7879
diff changeset
521 } else if (current instanceof ControlSinkNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
522 // nothing todo
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
523 } else if (current instanceof ControlSplitNode) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
524 queueSuccessors(current);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
525 } else {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
526 assert false : current;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
527 }
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
528 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
529
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
530 return invokes;
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
531 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
532
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
533 private void queueSuccessors(FixedNode x) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
534 for (Node node : x.successors()) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
535 queue(node);
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
536 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
537 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
538
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
539 private void queue(Node node) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
540 if (node != null && !queuedNodes.isMarked(node)) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
541 forcedQueue(node);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
542 }
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
543 }
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
544
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
545 private void forcedQueue(Node node) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
546 queuedNodes.mark(node);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
547 nodeQueue.addFirst((FixedNode) node);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
548 }
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
549
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
550 private FixedNode nextQueuedNode() {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
551 if (nodeQueue.isEmpty()) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
552 return null;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
553 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
554
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
555 FixedNode result = nodeQueue.removeFirst();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
556 assert queuedNodes.isMarked(result);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
557 return result;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
558 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
559
9434
50f02c7d1cec Rename EndNode => AbstractEndNode and make abstract class. Introduce concrete EndNode subclass.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9389
diff changeset
560 private void queueMerge(AbstractEndNode end) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
561 MergeNode merge = end.merge();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
562 if (!queuedNodes.isMarked(merge) && visitedAllEnds(merge)) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
563 queuedNodes.mark(merge);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
564 nodeQueue.add(merge);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
565 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
566 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
567
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
568 private boolean visitedAllEnds(MergeNode merge) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
569 for (int i = 0; i < merge.forwardEndCount(); i++) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
570 if (!queuedNodes.isMarked(merge.forwardEndAt(i))) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
571 return false;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
572 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
573 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
574 return true;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
575 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
576 }
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
577
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
578 /**
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
579 * Holds the data for building the callee graphs recursively: graphs and invocations (each
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
580 * invocation can have multiple graphs).
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
581 */
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
582 static class InliningData {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
583
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
584 private static final GraphInfo DummyGraphInfo = new GraphInfo(null, new LinkedList<Invoke>(), 1.0, 1.0);
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
585
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
586 /**
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
587 * Call hierarchy from outer most call (i.e., compilation unit) to inner most callee.
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
588 */
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
589 private final ArrayDeque<GraphInfo> graphQueue;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
590 private final ArrayDeque<MethodInvocation> invocationQueue;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
591
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
592 private int maxGraphs;
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
593
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
594 public InliningData(StructuredGraph rootGraph, Assumptions rootAssumptions) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
595 this.graphQueue = new ArrayDeque<>();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
596 this.invocationQueue = new ArrayDeque<>();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
597 this.maxGraphs = 1;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
598
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
599 invocationQueue.push(new MethodInvocation(null, rootAssumptions, 1.0, 1.0));
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
600 pushGraph(rootGraph, 1.0, 1.0);
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
601 }
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
602
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
603 public int graphCount() {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
604 return graphQueue.size();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
605 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
606
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
607 public void pushGraph(StructuredGraph graph, double probability, double relevance) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
608 assert !contains(graph);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
609 NodeBitMap visitedFixedNodes = graph.createNodeBitMap();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
610 LinkedList<Invoke> invokes = new InliningIterator(graph.start(), visitedFixedNodes).apply();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
611 assert invokes.size() == count(graph.getInvokes());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
612 graphQueue.push(new GraphInfo(graph, invokes, probability, relevance));
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
613 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
614 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
615
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
616 public void pushDummyGraph() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
617 graphQueue.push(DummyGraphInfo);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
618 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
619
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
620 public boolean hasUnprocessedGraphs() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
621 return !graphQueue.isEmpty();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
622 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
623
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
624 public GraphInfo currentGraph() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
625 return graphQueue.peek();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
626 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
627
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
628 public void popGraph() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
629 graphQueue.pop();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
630 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
631 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
632
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
633 public void popGraphs(int count) {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
634 assert count >= 0;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
635 for (int i = 0; i < count; i++) {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
636 graphQueue.pop();
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
637 }
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
638 }
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
639
11753
095325ccbf9a removed dumping overhead during inlining when dumping is not active
Doug Simon <doug.simon@oracle.com>
parents: 11689
diff changeset
640 private static final Object[] NO_CONTEXT = {};
095325ccbf9a removed dumping overhead during inlining when dumping is not active
Doug Simon <doug.simon@oracle.com>
parents: 11689
diff changeset
641
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
642 /**
11753
095325ccbf9a removed dumping overhead during inlining when dumping is not active
Doug Simon <doug.simon@oracle.com>
parents: 11689
diff changeset
643 * Gets the call hierarchy of this inlining from outer most call to inner most callee.
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
644 */
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
645 public Object[] inliningContext() {
11753
095325ccbf9a removed dumping overhead during inlining when dumping is not active
Doug Simon <doug.simon@oracle.com>
parents: 11689
diff changeset
646 if (!Debug.isDumpEnabled()) {
095325ccbf9a removed dumping overhead during inlining when dumping is not active
Doug Simon <doug.simon@oracle.com>
parents: 11689
diff changeset
647 return NO_CONTEXT;
095325ccbf9a removed dumping overhead during inlining when dumping is not active
Doug Simon <doug.simon@oracle.com>
parents: 11689
diff changeset
648 }
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
649 Object[] result = new Object[graphQueue.size()];
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
650 int i = 0;
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
651 for (GraphInfo g : graphQueue) {
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
652 result[i++] = g.graph.method();
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
653 }
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
654 return result;
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
655 }
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
656
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
657 public MethodInvocation currentInvocation() {
10909
2151775dfd98 Changed inlining order to bottom-up.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10769
diff changeset
658 return invocationQueue.peekFirst();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
659 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
660
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
661 public MethodInvocation pushInvocation(InlineInfo info, Assumptions assumptions, double probability, double relevance) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
662 MethodInvocation methodInvocation = new MethodInvocation(info, new Assumptions(assumptions.useOptimisticAssumptions()), probability, relevance);
10909
2151775dfd98 Changed inlining order to bottom-up.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10769
diff changeset
663 invocationQueue.addFirst(methodInvocation);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
664 maxGraphs += info.numberOfMethods();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
665 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
666 return methodInvocation;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
667 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
668
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
669 public void popInvocation() {
10909
2151775dfd98 Changed inlining order to bottom-up.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10769
diff changeset
670 maxGraphs -= invocationQueue.peekFirst().callee.numberOfMethods();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
671 assert graphQueue.size() <= maxGraphs;
10909
2151775dfd98 Changed inlining order to bottom-up.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 10769
diff changeset
672 invocationQueue.removeFirst();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
673 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
674
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
675 public int countRecursiveInlining(ResolvedJavaMethod method) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
676 int count = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
677 for (GraphInfo graphInfo : graphQueue) {
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
678 if (method.equals(graphInfo.method())) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
679 count++;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
680 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
681 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
682 return count;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
683 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
684
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
685 public int inliningDepth() {
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
686 assert invocationQueue.size() > 0;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
687 return invocationQueue.size() - 1;
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
688 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
689
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
690 @Override
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
691 public String toString() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
692 StringBuilder result = new StringBuilder("Invocations: ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
693
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
694 for (MethodInvocation invocation : invocationQueue) {
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
695 if (invocation.callee() != null) {
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
696 result.append(invocation.callee().numberOfMethods());
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
697 result.append("x ");
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
698 result.append(invocation.callee().invoke());
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
699 result.append("; ");
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
700 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
701 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
702
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
703 result.append("\nGraphs: ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
704 for (GraphInfo graph : graphQueue) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
705 result.append(graph.graph());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
706 result.append("; ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
707 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
708
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
709 return result.toString();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
710 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
711
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
712 private boolean contains(StructuredGraph graph) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
713 for (GraphInfo info : graphQueue) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
714 if (info.graph() == graph) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
715 return true;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
716 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
717 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
718 return false;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
719 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
720
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
721 private static int count(Iterable<Invoke> invokes) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
722 int count = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
723 Iterator<Invoke> iterator = invokes.iterator();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
724 while (iterator.hasNext()) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
725 iterator.next();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
726 count++;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
727 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
728 return count;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
729 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
730 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
731
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
732 private static class MethodInvocation {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
733
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
734 private final InlineInfo callee;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
735 private final Assumptions assumptions;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
736 private final double probability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
737 private final double relevance;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
738
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
739 private int processedGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
740
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
741 public MethodInvocation(InlineInfo info, Assumptions assumptions, double probability, double relevance) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
742 this.callee = info;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
743 this.assumptions = assumptions;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
744 this.probability = probability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
745 this.relevance = relevance;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
746 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
747
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
748 public void incrementProcessedGraphs() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
749 processedGraphs++;
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
750 assert processedGraphs <= callee.numberOfMethods();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
751 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
752
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
753 public int processedGraphs() {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
754 assert processedGraphs <= callee.numberOfMethods();
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
755 return processedGraphs;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
756 }
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
757
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
758 public int totalGraphs() {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
759 return callee.numberOfMethods();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
760 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
761
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
762 public InlineInfo callee() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
763 return callee;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
764 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
765
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
766 public Assumptions assumptions() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
767 return assumptions;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
768 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
769
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
770 public double probability() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
771 return probability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
772 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
773
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
774 public double relevance() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
775 return relevance;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
776 }
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
777
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
778 public boolean isRoot() {
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
779 return callee == null;
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
780 }
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
781
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
782 @Override
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
783 public String toString() {
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
784 if (isRoot()) {
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
785 return "<root>";
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
786 }
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
787 CallTargetNode callTarget = callee.invoke().callTarget();
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
788 if (callTarget instanceof MethodCallTargetNode) {
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
789 ResolvedJavaMethod calleeMethod = ((MethodCallTargetNode) callTarget).targetMethod();
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
790 return MetaUtil.format("Invoke#%H.%n(%p)", calleeMethod);
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
791 } else {
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
792 return "Invoke#" + callTarget.targetName();
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
793 }
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
794 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
795 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
796
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
797 /**
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
798 * Information about a graph that will potentially be inlined. This includes tracking the
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
799 * invocations in graph that will subject to inlining themselves.
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
800 */
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
801 private static class GraphInfo {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
802
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
803 private final StructuredGraph graph;
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
804 private final LinkedList<Invoke> remainingInvokes;
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
805 private final double probability;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
806 private final double relevance;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
807
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
808 private NodesToDoubles nodeProbabilities;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
809 private NodesToDoubles nodeRelevance;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
810
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
811 public GraphInfo(StructuredGraph graph, LinkedList<Invoke> invokes, double probability, double relevance) {
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
812 this.graph = graph;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
813 this.remainingInvokes = invokes;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
814 this.probability = probability;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
815 this.relevance = relevance;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
816
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
817 if (graph != null) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
818 computeProbabilities();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
819 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
820 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
821
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
822 /**
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
823 * Gets the method associated with the {@linkplain #graph() graph} represented by this
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
824 * object.
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
825 */
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
826 public ResolvedJavaMethod method() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
827 return graph.method();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
828 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
829
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
830 public boolean hasRemainingInvokes() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
831 return !remainingInvokes.isEmpty();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
832 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
833
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
834 /**
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
835 * The graph about which this object contains inlining information.
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
836 */
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
837 public StructuredGraph graph() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
838 return graph;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
839 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
840
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
841 public Invoke popInvoke() {
9722
b5dd7e3c8c80 Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9708
diff changeset
842 return remainingInvokes.removeFirst();
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
843 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
844
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
845 public void pushInvoke(Invoke invoke) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
846 remainingInvokes.push(invoke);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
847 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
848
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
849 public void computeProbabilities() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
850 nodeProbabilities = new ComputeProbabilityClosure(graph).apply();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
851 nodeRelevance = new ComputeInliningRelevanceClosure(graph, nodeProbabilities).apply();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
852 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
853
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
854 public double invokeProbability(Invoke invoke) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
855 return probability * nodeProbabilities.get(invoke.asNode());
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
856 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
857
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
858 public double invokeRelevance(Invoke invoke) {
9864
063a712fe8d8 converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents: 9855
diff changeset
859 return Math.min(CapInheritedRelevance.getValue(), relevance) * nodeRelevance.get(invoke.asNode());
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
860 }
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
861
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
862 @Override
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
863 public String toString() {
13742
0991dc195637 Handle null in printing
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 13614
diff changeset
864 return (graph != null ? MetaUtil.format("%H.%n(%p)", method()) : "<null method>") + remainingInvokes;
10607
dd5a042811f6 enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents: 10051
diff changeset
865 }
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
866 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
867
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
868 private static class CompiledMethodInfo {
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
869
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
870 private int lowLevelNodes;
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
871
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
872 public CompiledMethodInfo() {
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
873 }
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
874
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
875 public int lowLevelNodeCount() {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
876 return lowLevelNodes;
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
877 }
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
878
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
879 public void setLowLevelNodeCount(int lowLevelNodes) {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
880 this.lowLevelNodes = lowLevelNodes;
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
881 }
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
882
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
883 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
884 }