annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java @ 9708:9530c8b1bd07

InliningPhase cleanups.
author Christian Haeubl <haeubl@ssw.jku.at>
date Tue, 14 May 2013 10:32:02 +0200
parents f44d7e24cebd
children b5dd7e3c8c80
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
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
25 import java.util.*;
7879
1474fe91323c create debug scope for graph building during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 7827
diff changeset
26 import java.util.concurrent.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
27
5510
426c605c9d3c Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5507
diff changeset
28 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
29 import com.oracle.graal.api.meta.*;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
30 import com.oracle.graal.debug.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
31 import com.oracle.graal.graph.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
32 import com.oracle.graal.nodes.*;
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
33 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
34 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
35 import com.oracle.graal.nodes.util.*;
6525
2c913b643422 rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents: 6522
diff changeset
36 import com.oracle.graal.phases.*;
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
37 import com.oracle.graal.phases.PhasePlan.PhasePosition;
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
38 import com.oracle.graal.phases.common.CanonicalizerPhase.CustomCanonicalizer;
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
39 import com.oracle.graal.phases.common.InliningUtil.InlineInfo;
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
40 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
41 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
42 import com.oracle.graal.phases.graph.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
43
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
44 public class InliningPhase extends Phase {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
45
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
46 private final PhasePlan plan;
8608
056966f39a36 changed parameters of InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8385
diff changeset
47 private final MetaAccessProvider runtime;
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
48 private final Assumptions compilationAssumptions;
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
49 private final Replacements replacements;
5718
10341299528c renamings: ExtendedRiRuntime -> GraalCodeCacheProvider, CiLoweringTool -> LoweringTool, RiGraphCache -> GraphCache
Doug Simon <doug.simon@oracle.com>
parents: 5674
diff changeset
50 private final GraphCache cache;
4468
87a12a816e99 added C1 inlining policy for comparison, bugfixes
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4461
diff changeset
51 private final InliningPolicy inliningPolicy;
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
52 private final OptimisticOptimizations optimisticOpts;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
53
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
54 private CustomCanonicalizer customCanonicalizer;
8548
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
55 private int inliningCount;
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
56 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
57
4348
d49c90e641cb Remove GraalMetrics, replace with new syntax for metrics.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4205
diff changeset
58 // Metrics
4356
249752adcb8d Rename Timer DebugTimer and Metric DebugMetric.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4352
diff changeset
59 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
60 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
61 private static final DebugMetric metricInliningStoppedByMaxDesiredSize = Debug.metric("InliningStoppedByMaxDesiredSize");
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
62 private static final DebugMetric metricInliningRuns = Debug.metric("Runs");
4348
d49c90e641cb Remove GraalMetrics, replace with new syntax for metrics.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 4205
diff changeset
63
8930
Lukas Stadler <lukas.stadler@jku.at>
parents: 8915 8637
diff changeset
64 public InliningPhase(MetaAccessProvider runtime, Map<Invoke, Double> hints, Replacements replacements, Assumptions assumptions, GraphCache cache, PhasePlan plan,
Lukas Stadler <lukas.stadler@jku.at>
parents: 8915 8637
diff changeset
65 OptimisticOptimizations optimisticOpts) {
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
66 this(runtime, replacements, assumptions, cache, plan, optimisticOpts, hints);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
67 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
68
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
69 private InliningPhase(MetaAccessProvider runtime, Replacements replacements, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts,
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
70 Map<Invoke, Double> hints) {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
71 this.runtime = runtime;
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
72 this.replacements = replacements;
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
73 this.compilationAssumptions = assumptions;
5177
a26b6248d398 added graph caching (-G:+CacheGraphs)
Lukas Stadler <lukas.stadler@jku.at>
parents: 5114
diff changeset
74 this.cache = cache;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
75 this.plan = plan;
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
76 this.inliningPolicy = new GreedyInliningPolicy(replacements, hints);
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
77 this.optimisticOpts = optimisticOpts;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
78 }
8618
832b9a115a2d style fixes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8617
diff changeset
79
8617
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
80 public void setCustomCanonicalizer(CustomCanonicalizer customCanonicalizer) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
81 this.customCanonicalizer = customCanonicalizer;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
82 }
8618
832b9a115a2d style fixes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8617
diff changeset
83
8617
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
84 public void setMaxMethodsPerInlining(int max) {
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
85 maxMethodPerInlining = max;
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8608 8552
diff changeset
86 }
8618
832b9a115a2d style fixes
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8617
diff changeset
87
8548
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
88 public int getInliningCount() {
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
89 return inliningCount;
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
90 }
51d5999900e2 simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents: 8385
diff changeset
91
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
92 public static void storeStatisticsAfterLowTier(StructuredGraph graph) {
9705
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
93 ResolvedJavaMethod method = graph.method();
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
94 if (method != null) {
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
95 CompiledMethodInfo info = compiledMethodInfo(graph.method());
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
96 info.setLowLevelNodeCount(graph.getNodeCount());
de7319e48e48 Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9704
diff changeset
97 }
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
98 }
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
99
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
100 @Override
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
101 protected void run(final StructuredGraph graph) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
102 InliningData data = new InliningData();
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
103 data.pushGraph(graph, 1.0, 1.0);
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
104
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
105 while (data.hasUnprocessedGraphs()) {
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 GraphInfo graphInfo = data.currentGraph();
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
107 if (graphInfo.hasRemainingInvokes() && inliningPolicy.continueInlining(data)) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
108 processNextInvoke(data, graphInfo);
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
109 } 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
110 data.popGraph();
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
111 MethodInvocation currentInvocation = data.currentInvocation();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
112 if (currentInvocation != null) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
113 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
114 currentInvocation.incrementProcessedGraphs();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
115 if (currentInvocation.processedAllGraphs()) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
116 data.popInvocation();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
117 MethodInvocation parentInvoke = data.currentInvocation();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
118 tryToInline(data.currentGraph(), currentInvocation, parentInvoke);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
119 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
120 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
121 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
122 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
123 }
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
124
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
125 /**
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
126 * 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
127 */
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
128 private void processNextInvoke(InliningData data, GraphInfo graphInfo) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
129 Invoke invoke = graphInfo.popInvoke();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
130 MethodInvocation callerInvocation = data.currentInvocation();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
131 Assumptions parentAssumptions = callerInvocation == null ? compilationAssumptions : callerInvocation.assumptions();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
132 InlineInfo info = InliningUtil.getInlineInfo(data, invoke, maxMethodPerInlining, replacements, parentAssumptions, optimisticOpts);
9234
b9cf7d0b598e removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9147
diff changeset
133
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
134 double invokeProbability = graphInfo.invokeProbability(invoke);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
135 double invokeRelevance = graphInfo.invokeRelevance(invoke);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
136 if (info != null && inliningPolicy.isWorthInlining(info, invokeProbability, invokeRelevance, false)) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
137 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
138
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
139 for (int i = 0; i < info.numberOfMethods(); i++) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
140 InlineableElement elem = getInlineableElement(info.methodAt(i), info.invoke(), calleeInvocation.assumptions());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
141 info.setInlinableElement(i, elem);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
142 if (elem instanceof StructuredGraph) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
143 data.pushGraph((StructuredGraph) elem, invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i));
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
144 } else {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
145 assert elem instanceof InlineableMacroNode;
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
146 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
147 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
148 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
149 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
150 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
151
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
152 private void tryToInline(GraphInfo callerGraphInfo, MethodInvocation calleeInfo, MethodInvocation parentInvocation) {
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
153 InlineInfo callee = calleeInfo.callee();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
154 Assumptions callerAssumptions = parentInvocation == null ? compilationAssumptions : 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
155
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
156 if (inliningPolicy.isWorthInlining(callee, calleeInfo.probability(), calleeInfo.relevance(), 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
157 doInline(callerGraphInfo, calleeInfo, callerAssumptions);
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
158 } else if (optimisticOpts.devirtualizeInvokes()) {
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
159 callee.tryToDevirtualizeInvoke(runtime, callerAssumptions);
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
160 }
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
161 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
162 }
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
163
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
164 private void doInline(GraphInfo callerGraphInfo, MethodInvocation calleeInfo, Assumptions callerAssumptions) {
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
165 StructuredGraph callerGraph = callerGraphInfo.graph();
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
166 int 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
167 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
168 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
169 List<Node> invokeUsages = callee.invoke().asNode().usages().snapshot();
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
170 callee.inline(runtime, callerAssumptions, replacements);
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
171 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
172 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
173 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
174
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 if (GraalOptions.OptCanonicalizer) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
176 int markBeforeCanonicalization = callerGraph.getMark();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
177 new CanonicalizerPhase.Instance(runtime, callerAssumptions, invokeUsages, markBeforeInlining, customCanonicalizer).apply(callerGraph);
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
178
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
179 // 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
180 for (Node newNode : callerGraph.getNewNodes(markBeforeCanonicalization)) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
181 if (newNode instanceof Invoke) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
182 callerGraphInfo.pushInvoke((Invoke) newNode);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
183 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
184 }
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
185 }
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
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 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
188
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 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
190 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
191 } 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
192 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
193 } 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
194 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
195 } 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
196 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
197 }
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
198 }
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
199
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 private InlineableElement getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, Assumptions 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
201 Class<? extends FixedWithNextNode> macroNodeClass = InliningUtil.getMacroNodeClass(replacements, 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
202 if (macroNodeClass != null) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
203 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
204 } 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
205 return buildGraph(method, invoke, 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
206 }
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 }
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
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 private StructuredGraph buildGraph(final ResolvedJavaMethod method, final Invoke invoke, final Assumptions 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
210 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
211 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
212
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
213 // 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
214 // any invokes
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
215 StructuredGraph intrinsicGraph = InliningUtil.getIntrinsicGraph(replacements, 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
216 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
217 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
218 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
219 } 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
220 StructuredGraph cachedGraph = getCachedGraph(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
221 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
222 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
223 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
224 } 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
225 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
226 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
227 }
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
228 }
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
229
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
230 return Debug.scope("InlineGraph", newGraph, new Callable<StructuredGraph>() {
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
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 @Override
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 public StructuredGraph call() throws Exception {
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 if (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
235 parseBytecodes(newGraph, 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
236 }
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
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
238 boolean callerHasMoreInformationAboutArguments = false;
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
239 NodeInputList<ValueNode> args = invoke.callTarget().arguments();
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
240 for (LocalNode localNode : newGraph.getNodes(LocalNode.class).snapshot()) {
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
241 ValueNode arg = args.get(localNode.index());
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
242 if (arg.isConstant()) {
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
243 Constant constant = arg.asConstant();
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
244 newGraph.replaceFloating(localNode, ConstantNode.forConstant(constant, runtime, newGraph));
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
245 callerHasMoreInformationAboutArguments = true;
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
246 } else {
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
247 Stamp joinedStamp = localNode.stamp().join(arg.stamp());
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
248 if (!joinedStamp.equals(localNode.stamp())) {
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
249 localNode.setStamp(joinedStamp);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
250 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
251 }
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
252 }
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
253 }
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
254
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
255 if (!callerHasMoreInformationAboutArguments) {
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
256 // TODO (chaeubl): if args are not more concrete, inlining should be avoided
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
257 // in most cases or we could at least use the previous graph size + invoke
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
258 // probability to check the inlining
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
259 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
260
9706
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
261 if (GraalOptions.OptCanonicalizer) {
f44d7e24cebd Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9705
diff changeset
262 new CanonicalizerPhase.Instance(runtime, assumptions).apply(newGraph);
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 }
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
264
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
265 return 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
266 }
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
267 });
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
268 }
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
269
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
270 private StructuredGraph getCachedGraph(ResolvedJavaMethod method) {
6353
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
271 if (GraalOptions.CacheGraphs && cache != null) {
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
272 StructuredGraph cachedGraph = cache.get(method);
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
273 if (cachedGraph != null) {
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
274 return cachedGraph;
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
275 }
2590d9cc3b6d remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 5788
diff changeset
276 }
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
277 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
278 }
7879
1474fe91323c create debug scope for graph building during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents: 7827
diff changeset
279
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
280 private StructuredGraph parseBytecodes(StructuredGraph newGraph, Assumptions 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
281 if (plan != 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
282 plan.runPhases(PhasePosition.AFTER_PARSING, 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
283 }
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
284 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
285
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
286 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
287
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
288 if (GraalOptions.OptCanonicalizer) {
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
289 new CanonicalizerPhase.Instance(runtime, assumptions).apply(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
290 }
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
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
292 if (GraalOptions.CullFrameStates) {
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
293 new CullFrameStatesPhase().apply(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
294 }
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
295 if (GraalOptions.CacheGraphs && cache != 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
296 cache.put(newGraph.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
297 }
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 return newGraph;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
299 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
300
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
301 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
302 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
303 if (info == null) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
304 info = new CompiledMethodInfo();
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
305 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
306 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
307 return info;
4670
41034914e2ee add MethodContents assumption to fix debbugging issue
Lukas Stadler <lukas.stadler@jku.at>
parents: 4598
diff changeset
308 }
41034914e2ee add MethodContents assumption to fix debbugging issue
Lukas Stadler <lukas.stadler@jku.at>
parents: 4598
diff changeset
309
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
310 private abstract static class AbstractInliningPolicy implements InliningPolicy {
4594
eb6df44a1374 bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4591
diff changeset
311
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
312 protected final Replacements replacements;
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
313 protected final Map<Invoke, Double> hints;
4594
eb6df44a1374 bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4591
diff changeset
314
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
315 public AbstractInliningPolicy(Replacements replacements, Map<Invoke, Double> hints) {
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
316 this.replacements = replacements;
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
317 this.hints = hints;
4594
eb6df44a1374 bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4591
diff changeset
318 }
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7392
diff changeset
319
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
320 protected double computeMaximumSize(double relevance, int configuredMaximum) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
321 double inlineRatio = Math.min(GraalOptions.RelevanceCapForInlining, relevance);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
322 return configuredMaximum * inlineRatio;
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
323 }
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
324
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
325 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
326 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
327 return hints.get(info.invoke());
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
328 }
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
329 return 1;
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
330 }
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
331
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
332 protected boolean isIntrinsic(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
333 if (GraalOptions.AlwaysInlineIntrinsics) {
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
334 return onlyIntrinsics(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
335 } 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
336 return onlyForcedIntrinsics(info);
7388
599ea4fcdb6d added flag AlwaysInlineIntrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7256
diff changeset
337 }
4569
333ce00358f4 added another inlining policy, added option to disable propagation of loop frequencies
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4564
diff changeset
338 }
333ce00358f4 added another inlining policy, added option to disable propagation of loop frequencies
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4564
diff changeset
339
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
340 private boolean onlyIntrinsics(InlineInfo info) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
341 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
342 if (!InliningUtil.canIntrinsify(replacements, info.methodAt(i))) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
343 return false;
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
344 }
7388
599ea4fcdb6d added flag AlwaysInlineIntrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7256
diff changeset
345 }
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
346 return true;
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
347 }
8915
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
348
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
349 private boolean onlyForcedIntrinsics(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
350 for (int i = 0; i < info.numberOfMethods(); i++) {
8930
Lukas Stadler <lukas.stadler@jku.at>
parents: 8915 8637
diff changeset
351 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
352 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
353 }
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
354 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
355 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
356 }
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
357 }
880619fd6a67 allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents: 8618
diff changeset
358 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
359 }
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
360
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
361 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
362 int size = 0;
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
363 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
364 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
365 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
366 return size;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
367 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
368
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
369 protected static int determineNodeCount(InlineInfo info) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
370 int nodes = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
371 for (int i = 0; i < info.numberOfMethods(); i++) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
372 InlineableElement elem = info.inlineableElementAt(i);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
373 if (elem != null) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
374 nodes += elem.getNodeCount();
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 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
377 return nodes;
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
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
380 protected static double determineInvokeProbability(InlineInfo info) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
381 double invokeProbability = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
382 for (int i = 0; i < info.numberOfMethods(); i++) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
383 InlineableElement callee = info.inlineableElementAt(i);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
384 Iterable<Invoke> invokes = callee.getInvokes();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
385 if (invokes.iterator().hasNext()) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
386 NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure((StructuredGraph) callee).apply();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
387 for (Invoke invoke : invokes) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
388 invokeProbability += nodeProbabilities.get(invoke.asNode());
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 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
391 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
392 return invokeProbability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
393 }
7065
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
394 }
cfacf5d5bade fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7064
diff changeset
395
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
396 private static class GreedyInliningPolicy extends AbstractInliningPolicy {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7392
diff changeset
397
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
398 public GreedyInliningPolicy(Replacements replacements, Map<Invoke, Double> hints) {
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
399 super(replacements, hints);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
400 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
401
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
402 public boolean continueInlining(InliningData data) {
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
403 if (data.currentGraph().graph().getNodeCount() >= GraalOptions.MaximumDesiredSize) {
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
404 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
405 metricInliningStoppedByMaxDesiredSize.increment();
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
406 return false;
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
407 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
408
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
409 MethodInvocation currentInvocation = data.currentInvocation();
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
410 if (currentInvocation == 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
411 return 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
412 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
413
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
414 return isWorthInlining(currentInvocation.callee(), currentInvocation.probability(), currentInvocation.relevance(), false);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
415 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
416
9234
b9cf7d0b598e removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9147
diff changeset
417 @Override
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
418 public boolean isWorthInlining(InlineInfo info, double probability, double relevance, boolean fullyProcessed) {
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
419 if (isIntrinsic(info)) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
420 return InliningUtil.logInlinedMethod(info, 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
421 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
422
9699
9529ab567367 Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9238
diff changeset
423 double inliningBonus = getInliningBonus(info);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
424
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
425 int lowLevelGraphSize = previousLowLevelGraphSize(info);
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
426 if (GraalOptions.SmallCompiledLowLevelGraphSize > 0 && lowLevelGraphSize > GraalOptions.SmallCompiledLowLevelGraphSize * inliningBonus) {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
427 return InliningUtil.logNotInlinedMethod(info, "too large previous low-level graph: %d", lowLevelGraphSize);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
428 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
429
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
430 /*
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
431 * 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
432 * 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
433 * 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
434 * 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
435 */
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
436
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
437 int nodes = determineNodeCount(info);
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
438 if (nodes < GraalOptions.TrivialInliningSize * inliningBonus) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
439 return InliningUtil.logInlinedMethod(info, fullyProcessed, "trivial (nodes=%d)", nodes);
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
440 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
441
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
442 double invokes = determineInvokeProbability(info);
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
443 if (GraalOptions.LimitInlinedInvokes > 0 && fullyProcessed && invokes > GraalOptions.LimitInlinedInvokes * inliningBonus) {
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
444 return InliningUtil.logNotInlinedMethod(info, "invoke probability is too high (%f)", invokes);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
445 }
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
446
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
447 double maximumNodes = computeMaximumSize(relevance, (int) (GraalOptions.MaximumInliningSize * inliningBonus));
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 if (nodes < maximumNodes) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
449 return InliningUtil.logInlinedMethod(info, fullyProcessed, "relevance-based (relevance=%f, nodes=%d)", relevance, nodes);
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
450 }
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
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 return InliningUtil.logNotInlinedMethod(info, "(relevance=%f, probability=%f, bonus=%f)", relevance, probability, inliningBonus);
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
453 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
454 }
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
455
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
456 private static class InliningIterator {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7392
diff changeset
457
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
458 private final FixedNode start;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
459 private final Deque<FixedNode> nodeQueue;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
460 private final NodeBitMap queuedNodes;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
461
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
462 public InliningIterator(FixedNode start, NodeBitMap visitedFixedNodes) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
463 this.start = start;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
464 this.nodeQueue = new ArrayDeque<>();
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
465 this.queuedNodes = visitedFixedNodes;
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
466 assert start.isAlive();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
467 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
468
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
469 public Stack<Invoke> apply() {
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
470 Stack<Invoke> invokes = new Stack<>();
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
471 FixedNode current;
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
472 forcedQueue(start);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
473
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
474 while ((current = nextQueuedNode()) != null) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
475 assert current.isAlive();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
476
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
477 if (current instanceof Invoke) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
478 if (current != start) {
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
479 invokes.push((Invoke) current);
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
480 }
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
481 queueSuccessors(current);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
482 } else if (current instanceof LoopBeginNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
483 queueSuccessors(current);
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
484 } else if (current instanceof LoopEndNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
485 // nothing todo
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
486 } else if (current instanceof MergeNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
487 queueSuccessors(current);
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
488 } else if (current instanceof FixedWithNextNode) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
489 queueSuccessors(current);
9435
794370a64b71 Replace AbstractEndNode usages with EndNode usages wherever appropriate.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9434
diff changeset
490 } else if (current instanceof EndNode) {
794370a64b71 Replace AbstractEndNode usages with EndNode usages wherever appropriate.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9434
diff changeset
491 queueMerge((EndNode) current);
8385
85d4392b9e26 Introduce a ControlSinkNode base class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7879
diff changeset
492 } else if (current instanceof ControlSinkNode) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
493 // nothing todo
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
494 } else if (current instanceof ControlSplitNode) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
495 queueSuccessors(current);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
496 } else {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
497 assert false : current;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
498 }
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
499 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
500
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
501 return invokes;
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
502 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
503
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
504 private void queueSuccessors(FixedNode x) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
505 for (Node node : x.successors()) {
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
506 queue(node);
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
507 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
508 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
509
7684
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
510 private void queue(Node node) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
511 if (node != null && !queuedNodes.isMarked(node)) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
512 forcedQueue(node);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
513 }
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
514 }
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
515
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
516 private void forcedQueue(Node node) {
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
517 queuedNodes.mark(node);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
518 nodeQueue.addFirst((FixedNode) node);
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
519 }
bbf97d6688d3 cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7392
diff changeset
520
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
521 private FixedNode nextQueuedNode() {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
522 if (nodeQueue.isEmpty()) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
523 return null;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
524 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
525
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
526 FixedNode result = nodeQueue.removeFirst();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
527 assert queuedNodes.isMarked(result);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
528 return result;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
529 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
530
9434
50f02c7d1cec Rename EndNode => AbstractEndNode and make abstract class. Introduce concrete EndNode subclass.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 9389
diff changeset
531 private void queueMerge(AbstractEndNode end) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
532 MergeNode merge = end.merge();
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
533 if (!queuedNodes.isMarked(merge) && visitedAllEnds(merge)) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
534 queuedNodes.mark(merge);
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
535 nodeQueue.add(merge);
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
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
539 private boolean visitedAllEnds(MergeNode merge) {
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
540 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
541 if (!queuedNodes.isMarked(merge.forwardEndAt(i))) {
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
542 return false;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
543 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
544 }
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
545 return true;
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
546 }
7064
8d16b9b2c51e first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 7063
diff changeset
547 }
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
548
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
549 /**
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
550 * 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
551 * invocation can have multiple graphs).
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
552 */
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
553 static class InliningData {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
554
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
555 private static final GraphInfo DummyGraphInfo = new GraphInfo(null, new Stack<Invoke>(), 1.0, 1.0);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
556
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
557 private final ArrayDeque<GraphInfo> graphQueue;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
558 private final ArrayDeque<MethodInvocation> invocationQueue;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
559
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
560 private int maxGraphs = 1;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
561
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
562 public InliningData() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
563 this.graphQueue = new ArrayDeque<>();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
564 this.invocationQueue = new ArrayDeque<>();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
565 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
566
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
567 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
568 assert !contains(graph);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
569 NodeBitMap visitedFixedNodes = graph.createNodeBitMap();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
570 Stack<Invoke> invokes = new InliningIterator(graph.start(), visitedFixedNodes).apply();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
571 assert invokes.size() == count(graph.getInvokes());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
572 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
573 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
574 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
575
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
576 public void pushDummyGraph() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
577 graphQueue.push(DummyGraphInfo);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
578 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
579
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
580 public boolean hasUnprocessedGraphs() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
581 return !graphQueue.isEmpty();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
582 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
583
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
584 public GraphInfo currentGraph() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
585 return graphQueue.peek();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
586 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
587
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
588 public void popGraph() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
589 graphQueue.pop();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
590 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
591 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
592
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
593 public MethodInvocation currentInvocation() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
594 return invocationQueue.peek();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
595 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
596
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
597 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
598 MethodInvocation methodInvocation = new MethodInvocation(info, new Assumptions(assumptions.useOptimisticAssumptions()), probability, relevance);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
599 invocationQueue.push(methodInvocation);
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
600 maxGraphs += info.numberOfMethods();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
601 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
602 return methodInvocation;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
603 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
604
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
605 public void popInvocation() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
606 maxGraphs -= invocationQueue.peek().callee.numberOfMethods();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
607 assert graphQueue.size() <= maxGraphs;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
608 invocationQueue.pop();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
609 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
610
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
611 public int countRecursiveInlining(ResolvedJavaMethod method) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
612 int count = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
613 for (GraphInfo graphInfo : graphQueue) {
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
614 if (method.equals(graphInfo.method())) {
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
615 count++;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
616 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
617 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
618 return count;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
619 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
620
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
621 public int inliningDepth() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
622 return invocationQueue.size();
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
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
625 @Override
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
626 public String toString() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
627 StringBuilder result = new StringBuilder("Invocations: ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
628
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
629 for (MethodInvocation invocation : invocationQueue) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
630 result.append(invocation.callee().numberOfMethods());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
631 result.append("x ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
632 result.append(invocation.callee().invoke());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
633 result.append("; ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
634 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
635
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
636 result.append("\nGraphs: ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
637 for (GraphInfo graph : graphQueue) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
638 result.append(graph.graph());
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
639 result.append("; ");
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
640 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
641
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
642 return result.toString();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
643 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
644
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
645 private boolean contains(StructuredGraph graph) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
646 for (GraphInfo info : graphQueue) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
647 if (info.graph() == graph) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
648 return true;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
649 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
650 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
651 return false;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
652 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
653
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
654 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
655 int count = 0;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
656 Iterator<Invoke> iterator = invokes.iterator();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
657 while (iterator.hasNext()) {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
658 iterator.next();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
659 count++;
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 return count;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
662 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
663 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
664
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
665 private static class MethodInvocation {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
666
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
667 private final InlineInfo callee;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
668 private final Assumptions assumptions;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
669 private final double probability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
670 private final double relevance;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
671
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
672 private int processedGraphs;
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 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
675 this.callee = info;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
676 this.assumptions = assumptions;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
677 this.probability = probability;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
678 this.relevance = relevance;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
679 }
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 public void incrementProcessedGraphs() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
682 processedGraphs++;
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
683 assert processedGraphs <= callee.numberOfMethods();
9701
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
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
686 public boolean processedAllGraphs() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
687 assert processedGraphs <= callee.numberOfMethods();
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
688 return processedGraphs == callee.numberOfMethods();
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
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
691 public InlineInfo callee() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
692 return callee;
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
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
695 public Assumptions assumptions() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
696 return assumptions;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
697 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
698
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
699 public double probability() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
700 return probability;
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 public double relevance() {
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
704 return relevance;
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
705 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
706 }
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
707
9702
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
708 private static class GraphInfo {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
709
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
710 private final StructuredGraph graph;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
711 private final Stack<Invoke> remainingInvokes;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
712 private final double probability;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
713 private final double relevance;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
714
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
715 private NodesToDoubles nodeProbabilities;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
716 private NodesToDoubles nodeRelevance;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
717
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
718 public GraphInfo(StructuredGraph graph, Stack<Invoke> invokes, double probability, double relevance) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
719 this.graph = graph;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
720 this.remainingInvokes = invokes;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
721 this.probability = probability;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
722 this.relevance = relevance;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
723
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
724 if (graph != null) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
725 computeProbabilities();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
726 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
727 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
728
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
729 public ResolvedJavaMethod method() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
730 return graph.method();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
731 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
732
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
733 public boolean hasRemainingInvokes() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
734 return !remainingInvokes.isEmpty();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
735 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
736
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
737 public StructuredGraph graph() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
738 return graph;
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
739 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
740
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
741 public Invoke popInvoke() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
742 return remainingInvokes.pop();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
743 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
744
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
745 public void pushInvoke(Invoke invoke) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
746 remainingInvokes.push(invoke);
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
747 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
748
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
749 public void computeProbabilities() {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
750 nodeProbabilities = new ComputeProbabilityClosure(graph).apply();
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
751 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
752 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
753
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
754 public double invokeProbability(Invoke invoke) {
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
755 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
756 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
757
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
758 public double invokeRelevance(Invoke invoke) {
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
759 return Math.min(GraalOptions.CapInheritedRelevance, 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
760 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
761 }
907f1124b427 Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9701
diff changeset
762
9701
e538498d6eae some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9699
diff changeset
763 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
764
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
765 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
766
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
767 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
768 }
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
769
9703
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
770 public int lowLevelNodeCount() {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
771 return lowLevelNodes;
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
772 }
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
773
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
774 public void setLowLevelNodeCount(int lowLevelNodes) {
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
775 this.lowLevelNodes = lowLevelNodes;
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
776 }
57113d21ce36 Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents: 9702
diff changeset
777
7063
0d7dfa5b79e8 merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents: 6539
diff changeset
778 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
779 }