Mercurial > hg > graal-jvmci-8
annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java @ 10769:395d34c10e26
HSAIL backend changes
Contributed-by: Tom Deneau <tom.deneau@amd.com>
* stackslot mapping was incorrect when combinations of 32-bit and
64-bit stores were generated. StackSlot alignment in
HSAILTargetDescription set to 8.
* compressedOops support in various heap size configurations (with or
without either of shift or heap base). So we don't need
XX:-UseCompressedOops anymore.
* some support for unsigned shifts, long shifts, logical ops for long
datatype.
* a new GraalOption, InlineEverything. Some HSAIL targets are not
able to handle HSAIL function calls yet, plus we are still working
on emitting HSAIL function calls in the compiler.
* hack for emitForeignCall special cases of createOutOfBoundsException
or createNullPointerException. (We just emit a comment. Real
exception handling still pending). These nodes came about when we
more aggressively inlined, although this has not been explained yet.
* support HSAILAddressValues as operands for arithmetic ops. Use
HSAIL lda instruction to get address into a register. Used in
particular for USHR for card-marking.
* Added some new junit tests. (some ported from their lambda versions)
* StaticNBodyCallTest which would fail with default inlining (since
we don't yet generate HSAIL calls). It uses junit.assumeTrue and
tests whether InlineEverything is set. It (and also some
lambda-based junit tests not part of this webrev) do pass nicely
when InlineEverything is set true.
* tests for storing an object, which test being able to handle the
card-marking logic, as well as the encoding and decoding of a
compressed oop.
* some 2D matrix tests that showed a problem before the stackslot
change above. (have a mixture of 32-bit and 64-bit stackslot
spills)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 15 Jul 2013 18:22:25 +0200 |
parents | 3c2a77f01e89 |
children | 2151775dfd98 |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
4 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
8 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
14 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
18 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
21 * questions. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
22 */ |
6526
ee651c726397
split phases out of graal.phases project into graal.phases.common project
Doug Simon <doug.simon@oracle.com>
parents:
6525
diff
changeset
|
23 package com.oracle.graal.phases.common; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
25 import static com.oracle.graal.phases.GraalOptions.*; |
9987
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
26 import static com.oracle.graal.phases.common.InliningPhase.Options.*; |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
27 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
28 import java.util.*; |
7879
1474fe91323c
create debug scope for graph building during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
7827
diff
changeset
|
29 import java.util.concurrent.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
30 |
5510
426c605c9d3c
Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5507
diff
changeset
|
31 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
|
32 import com.oracle.graal.api.meta.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
33 import com.oracle.graal.debug.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
34 import com.oracle.graal.graph.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
35 import com.oracle.graal.nodes.*; |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
36 import com.oracle.graal.nodes.java.*; |
5720
46ad94a0574a
moved everything from com.oracle.graal.nodes.cri into com.oracle.graal.nodes.spi
Doug Simon <doug.simon@oracle.com>
parents:
5718
diff
changeset
|
37 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
|
38 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
|
39 import com.oracle.graal.nodes.util.*; |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9786
diff
changeset
|
40 import com.oracle.graal.options.*; |
6525
2c913b643422
rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6522
diff
changeset
|
41 import com.oracle.graal.phases.*; |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
42 import com.oracle.graal.phases.PhasePlan.PhasePosition; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
43 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
|
44 import com.oracle.graal.phases.common.InliningUtil.InlineInfo; |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
45 import com.oracle.graal.phases.common.InliningUtil.Inlineable; |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
46 import com.oracle.graal.phases.common.InliningUtil.InlineableMacroNode; |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
47 import com.oracle.graal.phases.common.InliningUtil.InlineableGraph; |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
48 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
|
49 import com.oracle.graal.phases.graph.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
50 |
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
|
51 public class InliningPhase extends Phase { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
52 |
9987
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
53 static class Options { |
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
54 |
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
55 // @formatter:off |
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
56 @Option(help = "Unconditionally inline intrinsics") |
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
57 public static final OptionValue<Boolean> AlwaysInlineIntrinsics = new OptionValue<>(false); |
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
58 // @formatter:on |
b270f0856a39
fixed issues detected by VerifyHotSpotOptionsPhase
Doug Simon <doug.simon@oracle.com>
parents:
9961
diff
changeset
|
59 } |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9786
diff
changeset
|
60 |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
61 private final PhasePlan plan; |
8608
056966f39a36
changed parameters of InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
8385
diff
changeset
|
62 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
|
63 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
|
64 private final Replacements replacements; |
5718
10341299528c
renamings: ExtendedRiRuntime -> GraalCodeCacheProvider, CiLoweringTool -> LoweringTool, RiGraphCache -> GraphCache
Doug Simon <doug.simon@oracle.com>
parents:
5674
diff
changeset
|
65 private final GraphCache cache; |
4468
87a12a816e99
added C1 inlining policy for comparison, bugfixes
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4461
diff
changeset
|
66 private final InliningPolicy inliningPolicy; |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
67 private final OptimisticOptimizations optimisticOpts; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
68 |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
69 private CustomCanonicalizer customCanonicalizer; |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8385
diff
changeset
|
70 private int inliningCount; |
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8385
diff
changeset
|
71 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
|
72 |
4348
d49c90e641cb
Remove GraalMetrics, replace with new syntax for metrics.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4205
diff
changeset
|
73 // Metrics |
4356
249752adcb8d
Rename Timer DebugTimer and Metric DebugMetric.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4352
diff
changeset
|
74 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
|
75 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
|
76 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
|
77 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
|
78 |
8930 | 79 public InliningPhase(MetaAccessProvider runtime, Map<Invoke, Double> hints, Replacements replacements, Assumptions assumptions, GraphCache cache, PhasePlan plan, |
80 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
|
81 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
|
82 } |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
83 |
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
|
84 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
|
85 Map<Invoke, Double> hints) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
86 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
|
87 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
|
88 this.compilationAssumptions = assumptions; |
5177
a26b6248d398
added graph caching (-G:+CacheGraphs)
Lukas Stadler <lukas.stadler@jku.at>
parents:
5114
diff
changeset
|
89 this.cache = cache; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
90 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
|
91 this.inliningPolicy = new GreedyInliningPolicy(replacements, hints); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
92 this.optimisticOpts = optimisticOpts; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
93 } |
8618 | 94 |
10051
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
95 public InliningPhase(MetaAccessProvider runtime, Replacements replacements, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts, InliningPolicy policy) { |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
96 this.runtime = runtime; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
97 this.replacements = replacements; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
98 this.compilationAssumptions = assumptions; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
99 this.cache = cache; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
100 this.plan = plan; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
101 this.inliningPolicy = policy; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
102 this.optimisticOpts = optimisticOpts; |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
103 } |
215a4291e387
add InliningPhase constructor with explicit InliningPolicy
Lukas Stadler <lukas.stadler@jku.at>
parents:
10047
diff
changeset
|
104 |
8617 | 105 public void setCustomCanonicalizer(CustomCanonicalizer customCanonicalizer) { |
106 this.customCanonicalizer = customCanonicalizer; | |
107 } | |
8618 | 108 |
8617 | 109 public void setMaxMethodsPerInlining(int max) { |
110 maxMethodPerInlining = max; | |
111 } | |
8618 | 112 |
8548
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8385
diff
changeset
|
113 public int getInliningCount() { |
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8385
diff
changeset
|
114 return inliningCount; |
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8385
diff
changeset
|
115 } |
51d5999900e2
simple iterative inlining, simple read elimination in PEA
Lukas Stadler <lukas.stadler@jku.at>
parents:
8385
diff
changeset
|
116 |
9706
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
117 public static void storeStatisticsAfterLowTier(StructuredGraph graph) { |
9705
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
118 ResolvedJavaMethod method = graph.method(); |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
119 if (method != null) { |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
120 CompiledMethodInfo info = compiledMethodInfo(graph.method()); |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
121 info.setLowLevelNodeCount(graph.getNodeCount()); |
de7319e48e48
Temporary fixes for the merge.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9704
diff
changeset
|
122 } |
9703
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
123 } |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
124 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
125 @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
|
126 protected void run(final StructuredGraph graph) { |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
127 final InliningData data = new InliningData(graph, compilationAssumptions); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
128 |
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
|
129 while (data.hasUnprocessedGraphs()) { |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
130 final MethodInvocation currentInvocation = data.currentInvocation(); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
131 GraphInfo graphInfo = data.currentGraph(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
132 if (!currentInvocation.isRoot() && !inliningPolicy.isWorthInlining(currentInvocation.callee(), data.inliningDepth(), currentInvocation.probability(), currentInvocation.relevance(), false)) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
133 int remainingGraphs = currentInvocation.totalGraphs() - currentInvocation.processedGraphs(); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
134 assert remainingGraphs > 0; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
135 data.popGraphs(remainingGraphs); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
136 data.popInvocation(); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
137 } else if (graphInfo.hasRemainingInvokes() && inliningPolicy.continueInlining(graphInfo.graph())) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
138 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
|
139 } 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
|
140 data.popGraph(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
141 if (!currentInvocation.isRoot()) { |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
142 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
|
143 currentInvocation.incrementProcessedGraphs(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
144 if (currentInvocation.processedGraphs() == currentInvocation.totalGraphs()) { |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
145 data.popInvocation(); |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
146 final MethodInvocation parentInvoke = data.currentInvocation(); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
147 Debug.scope("Inlining", data.inliningContext(), new Runnable() { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
148 |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
149 @Override |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
150 public void run() { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
151 tryToInline(data.currentGraph(), currentInvocation, parentInvoke, data.inliningDepth() + 1); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
152 } |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
153 }); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
154 |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
155 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
156 } |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
157 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
158 } |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
159 |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
160 assert data.inliningDepth() == 0; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
161 assert data.graphCount() == 0; |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
162 } |
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
|
163 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
164 /** |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
165 * 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
|
166 */ |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
167 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
|
168 Invoke invoke = graphInfo.popInvoke(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
169 MethodInvocation callerInvocation = data.currentInvocation(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
170 Assumptions parentAssumptions = callerInvocation.assumptions(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
171 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
|
172 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
173 if (info != null) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
174 double invokeProbability = graphInfo.invokeProbability(invoke); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
175 double invokeRelevance = graphInfo.invokeRelevance(invoke); |
9961
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
176 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
|
177 |
9961
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
178 for (int i = 0; i < info.numberOfMethods(); i++) { |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
179 Inlineable elem = getInlineableElement(info.methodAt(i), info.invoke(), calleeInvocation.assumptions()); |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
180 info.setInlinableElement(i, elem); |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
181 if (elem instanceof InlineableGraph) { |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
182 data.pushGraph(((InlineableGraph) elem).getGraph(), invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i)); |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
183 } else { |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
184 assert elem instanceof InlineableMacroNode; |
a91b0d42917f
Slightly simplified inlining policy.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9930
diff
changeset
|
185 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
|
186 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
187 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
188 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
189 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
190 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
191 private void tryToInline(GraphInfo callerGraphInfo, MethodInvocation calleeInfo, MethodInvocation parentInvocation, int inliningDepth) { |
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
|
192 InlineInfo callee = calleeInfo.callee(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
193 Assumptions callerAssumptions = parentInvocation.assumptions(); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
194 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
195 if (inliningPolicy.isWorthInlining(callee, inliningDepth, 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
|
196 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
|
197 } 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
|
198 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
|
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 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
|
201 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
202 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
203 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
|
204 StructuredGraph callerGraph = callerGraphInfo.graph(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
205 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
|
206 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
|
207 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
|
208 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
|
209 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
|
210 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
|
211 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
|
212 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
|
213 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
214 if (OptCanonicalizer.getValue()) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
215 int markBeforeCanonicalization = callerGraph.getMark(); |
10009
b5c87b5c6e9c
add option to enable ahead of time compilation for hotspot (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9987
diff
changeset
|
216 new CanonicalizerPhase.Instance(runtime, callerAssumptions, !AOTCompilation.getValue(), 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
|
217 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
218 // 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
|
219 for (Node newNode : callerGraph.getNewNodes(markBeforeCanonicalization)) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
220 if (newNode instanceof Invoke) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
221 callerGraphInfo.pushInvoke((Invoke) newNode); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
222 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
223 } |
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
|
224 } |
9529ab567367
Drafted 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 |
9529ab567367
Drafted 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 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
|
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 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
|
229 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
|
230 } 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
|
231 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
|
232 } 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
|
233 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
|
234 } 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
|
235 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
|
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 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
238 |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
239 private Inlineable getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, Assumptions assumptions) { |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
240 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
|
241 if (macroNodeClass != null) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
242 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
|
243 } else { |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
244 return new InlineableGraph(buildGraph(method, invoke, 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
|
245 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
246 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
247 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
248 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
|
249 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
|
250 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
|
251 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
252 // 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
|
253 // 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
|
254 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
|
255 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
|
256 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
|
257 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
|
258 } 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 } 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
|
264 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
|
265 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
|
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 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
|
270 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
271 @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
|
272 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
|
273 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
|
274 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
|
275 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
276 |
9706
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
277 boolean callerHasMoreInformationAboutArguments = false; |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
278 NodeInputList<ValueNode> args = invoke.callTarget().arguments(); |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
279 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
|
280 ValueNode arg = args.get(localNode.index()); |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
281 if (arg.isConstant()) { |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
282 Constant constant = arg.asConstant(); |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
283 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
|
284 callerHasMoreInformationAboutArguments = true; |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
285 } else { |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
286 Stamp joinedStamp = localNode.stamp().join(arg.stamp()); |
9786
6c1f7b853d35
Generalize the code for detecting invalid stamps in join operations.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9722
diff
changeset
|
287 if (joinedStamp != null && !joinedStamp.equals(localNode.stamp())) { |
9706
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
288 localNode.setStamp(joinedStamp); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
289 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
|
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 } |
9706
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
292 } |
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
|
293 |
9706
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
294 if (!callerHasMoreInformationAboutArguments) { |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
295 // 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
|
296 // 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
|
297 // probability to check the inlining |
f44d7e24cebd
Fixes for the merge and inlining cleanups.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9705
diff
changeset
|
298 } |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
299 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
300 if (OptCanonicalizer.getValue()) { |
10009
b5c87b5c6e9c
add option to enable ahead of time compilation for hotspot (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9987
diff
changeset
|
301 new CanonicalizerPhase.Instance(runtime, assumptions, !AOTCompilation.getValue()).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
|
302 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
303 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
304 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
|
305 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
306 }); |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
307 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
308 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
309 private StructuredGraph getCachedGraph(ResolvedJavaMethod method) { |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
310 if (CacheGraphs.getValue() && cache != null) { |
6353
2590d9cc3b6d
remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5788
diff
changeset
|
311 StructuredGraph cachedGraph = cache.get(method); |
2590d9cc3b6d
remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5788
diff
changeset
|
312 if (cachedGraph != null) { |
2590d9cc3b6d
remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5788
diff
changeset
|
313 return cachedGraph; |
2590d9cc3b6d
remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5788
diff
changeset
|
314 } |
2590d9cc3b6d
remove unnecessary debug scope during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
5788
diff
changeset
|
315 } |
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
|
316 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
|
317 } |
7879
1474fe91323c
create debug scope for graph building during inlining
Lukas Stadler <lukas.stadler@jku.at>
parents:
7827
diff
changeset
|
318 |
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
|
319 private StructuredGraph parseBytecodes(StructuredGraph newGraph, Assumptions assumptions) { |
9928
a9311ec68721
Avoid graph caching if immature or no profiling information was used for graph building.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9927
diff
changeset
|
320 boolean hasMatureProfilingInfo = newGraph.method().getProfilingInfo().isMature(); |
a9311ec68721
Avoid graph caching if immature or no profiling information was used for graph building.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9927
diff
changeset
|
321 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
322 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
|
323 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
|
324 } |
9529ab567367
Drafted 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 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
|
326 |
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
|
327 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
|
328 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
329 if (OptCanonicalizer.getValue()) { |
10009
b5c87b5c6e9c
add option to enable ahead of time compilation for hotspot (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9987
diff
changeset
|
330 new CanonicalizerPhase.Instance(runtime, assumptions, !AOTCompilation.getValue()).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
|
331 } |
9529ab567367
Drafted 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 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
333 if (CacheGraphs.getValue() && cache != null) { |
9928
a9311ec68721
Avoid graph caching if immature or no profiling information was used for graph building.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9927
diff
changeset
|
334 cache.put(newGraph.copy(), hasMatureProfilingInfo); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
335 } |
9529ab567367
Drafted 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 newGraph; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
337 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
338 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
339 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
|
340 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
|
341 if (info == null) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
342 info = new CompiledMethodInfo(); |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
343 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
|
344 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
345 return info; |
4670
41034914e2ee
add MethodContents assumption to fix debbugging issue
Lukas Stadler <lukas.stadler@jku.at>
parents:
4598
diff
changeset
|
346 } |
41034914e2ee
add MethodContents assumption to fix debbugging issue
Lukas Stadler <lukas.stadler@jku.at>
parents:
4598
diff
changeset
|
347 |
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
|
348 private abstract static class AbstractInliningPolicy implements InliningPolicy { |
4594
eb6df44a1374
bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4591
diff
changeset
|
349 |
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
|
350 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
|
351 protected final Map<Invoke, Double> hints; |
4594
eb6df44a1374
bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4591
diff
changeset
|
352 |
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
|
353 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
|
354 this.replacements = replacements; |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
355 this.hints = hints; |
4594
eb6df44a1374
bugfixes, added bytecode complexity estimation
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4591
diff
changeset
|
356 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7392
diff
changeset
|
357 |
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
|
358 protected double computeMaximumSize(double relevance, int configuredMaximum) { |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
359 double inlineRatio = Math.min(RelevanceCapForInlining.getValue(), relevance); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
360 return configuredMaximum * inlineRatio; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
361 } |
7065
cfacf5d5bade
fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7064
diff
changeset
|
362 |
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
|
363 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
|
364 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
|
365 return hints.get(info.invoke()); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
366 } |
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
|
367 return 1; |
7065
cfacf5d5bade
fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7064
diff
changeset
|
368 } |
cfacf5d5bade
fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7064
diff
changeset
|
369 |
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
|
370 protected boolean isIntrinsic(InlineInfo info) { |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9786
diff
changeset
|
371 if (AlwaysInlineIntrinsics.getValue()) { |
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
|
372 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
|
373 } 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
|
374 return onlyForcedIntrinsics(info); |
7388
599ea4fcdb6d
added flag AlwaysInlineIntrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7256
diff
changeset
|
375 } |
4569
333ce00358f4
added another inlining policy, added option to disable propagation of loop frequencies
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4564
diff
changeset
|
376 } |
333ce00358f4
added another inlining policy, added option to disable propagation of loop frequencies
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4564
diff
changeset
|
377 |
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
|
378 private boolean onlyIntrinsics(InlineInfo info) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
379 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
|
380 if (!InliningUtil.canIntrinsify(replacements, info.methodAt(i))) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
381 return false; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
382 } |
7388
599ea4fcdb6d
added flag AlwaysInlineIntrinsics
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7256
diff
changeset
|
383 } |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
384 return true; |
7065
cfacf5d5bade
fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7064
diff
changeset
|
385 } |
8915
880619fd6a67
allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents:
8618
diff
changeset
|
386 |
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
|
387 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
|
388 for (int i = 0; i < info.numberOfMethods(); i++) { |
8930 | 389 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
|
390 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
|
391 } |
880619fd6a67
allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents:
8618
diff
changeset
|
392 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
|
393 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
|
394 } |
880619fd6a67
allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents:
8618
diff
changeset
|
395 } |
880619fd6a67
allow MethodSubstitutions and MacroSubstitutions to be forced (instead of depending on inlining)
Lukas Stadler <lukas.stadler@jku.at>
parents:
8618
diff
changeset
|
396 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
|
397 } |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
398 |
9703
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
399 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
|
400 int size = 0; |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
401 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
|
402 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
|
403 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
404 return size; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
405 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
406 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
407 protected static int determineNodeCount(InlineInfo info) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
408 int nodes = 0; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
409 for (int i = 0; i < info.numberOfMethods(); i++) { |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
410 Inlineable elem = info.inlineableElementAt(i); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
411 if (elem != null) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
412 nodes += elem.getNodeCount(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
413 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
414 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
415 return nodes; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
416 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
417 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
418 protected static double determineInvokeProbability(InlineInfo info) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
419 double invokeProbability = 0; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
420 for (int i = 0; i < info.numberOfMethods(); i++) { |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
421 Inlineable callee = info.inlineableElementAt(i); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
422 Iterable<Invoke> invokes = callee.getInvokes(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
423 if (invokes.iterator().hasNext()) { |
9921
26785bb7006d
Refactorings for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9722
diff
changeset
|
424 NodesToDoubles nodeProbabilities = new ComputeProbabilityClosure(((InlineableGraph) callee).getGraph()).apply(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
425 for (Invoke invoke : invokes) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
426 invokeProbability += nodeProbabilities.get(invoke.asNode()); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
427 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
428 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
429 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
430 return invokeProbability; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
431 } |
7065
cfacf5d5bade
fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7064
diff
changeset
|
432 } |
cfacf5d5bade
fixed logging of inlining decisions
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7064
diff
changeset
|
433 |
10626
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
434 private static final class GreedyInliningPolicy extends AbstractInliningPolicy { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7392
diff
changeset
|
435 |
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
|
436 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
|
437 super(replacements, hints); |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
438 } |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
439 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
440 public boolean continueInlining(StructuredGraph currentGraph) { |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
441 if (currentGraph.getNodeCount() >= MaximumDesiredSize.getValue()) { |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
442 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
|
443 metricInliningStoppedByMaxDesiredSize.increment(); |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
444 return false; |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
445 } |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
446 return true; |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
447 } |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
448 |
9234
b9cf7d0b598e
removal of FixedNode.probability (draft)
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9147
diff
changeset
|
449 @Override |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
450 public boolean isWorthInlining(InlineInfo info, int inliningDepth, double probability, double relevance, boolean fullyProcessed) { |
10769 | 451 if (InlineEverything.getValue()) { |
452 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "inline everything"); | |
453 } | |
454 | |
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
|
455 if (isIntrinsic(info)) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
456 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "intrinsic"); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
457 } |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
458 |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
459 double inliningBonus = getInliningBonus(info); |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
460 int nodes = determineNodeCount(info); |
9703
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
461 int lowLevelGraphSize = previousLowLevelGraphSize(info); |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
462 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
463 if (SmallCompiledLowLevelGraphSize.getValue() > 0 && lowLevelGraphSize > SmallCompiledLowLevelGraphSize.getValue() * inliningBonus) { |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
464 return InliningUtil.logNotInlinedMethod(info, inliningDepth, "too large previous low-level graph (low-level-nodes: %d, relevance=%f, probability=%f, bonus=%f, nodes=%d)", |
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
465 lowLevelGraphSize, relevance, probability, inliningBonus, nodes); |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
466 } |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
467 |
9915
d8a8d794f631
More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9914
diff
changeset
|
468 if (nodes < TrivialInliningSize.getValue() * inliningBonus) { |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
469 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "trivial (relevance=%f, probability=%f, bonus=%f, nodes=%d)", relevance, probability, inliningBonus, nodes); |
9915
d8a8d794f631
More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9914
diff
changeset
|
470 } |
d8a8d794f631
More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9914
diff
changeset
|
471 |
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
|
472 /* |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
473 * 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
|
474 * 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
|
475 * 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
|
476 * 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
|
477 */ |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
478 double invokes = determineInvokeProbability(info); |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
479 if (LimitInlinedInvokes.getValue() > 0 && fullyProcessed && invokes > LimitInlinedInvokes.getValue() * inliningBonus) { |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
480 return InliningUtil.logNotInlinedMethod(info, inliningDepth, "callee invoke probability is too high (invokeP=%f, relevance=%f, probability=%f, bonus=%f, nodes=%d)", invokes, |
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
481 relevance, probability, inliningBonus, nodes); |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
482 } |
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
|
483 |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
484 double maximumNodes = computeMaximumSize(relevance, (int) (MaximumInliningSize.getValue() * inliningBonus)); |
9915
d8a8d794f631
More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9914
diff
changeset
|
485 if (nodes <= maximumNodes) { |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
486 return InliningUtil.logInlinedMethod(info, inliningDepth, fullyProcessed, "relevance-based (relevance=%f, probability=%f, bonus=%f, nodes=%d <= %f)", relevance, probability, |
9915
d8a8d794f631
More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9914
diff
changeset
|
487 inliningBonus, nodes, maximumNodes); |
9699
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
488 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
489 |
9930
5a4fbe932ab3
Assume that those path which end in a DeoptimizeNode are taken less frequently.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9928
diff
changeset
|
490 return InliningUtil.logNotInlinedMethod(info, inliningDepth, "relevance-based (relevance=%f, probability=%f, bonus=%f, nodes=%d > %f)", relevance, probability, inliningBonus, nodes, |
9915
d8a8d794f631
More precise inlining decision messages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
9914
diff
changeset
|
491 maximumNodes); |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
492 } |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
493 } |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
494 |
10626
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
495 public static final class InlineEverythingPolicy implements InliningPolicy { |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
496 |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
497 public boolean continueInlining(StructuredGraph graph) { |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
498 if (graph.getNodeCount() >= MaximumDesiredSize.getValue()) { |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
499 throw new BailoutException("Inline all calls failed. The resulting graph is too large."); |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
500 } |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
501 return true; |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
502 } |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
503 |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
504 public boolean isWorthInlining(InlineInfo info, int inliningDepth, double probability, double relevance, boolean fullyProcessed) { |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
505 return true; |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
506 } |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
507 } |
b02b3c6a59b6
Added an inlining policy that tries to inline all calls.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
10051
diff
changeset
|
508 |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
509 private static class InliningIterator { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7392
diff
changeset
|
510 |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
511 private final FixedNode start; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
512 private final Deque<FixedNode> nodeQueue; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
513 private final NodeBitMap queuedNodes; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
514 |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
515 public InliningIterator(FixedNode start, NodeBitMap visitedFixedNodes) { |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
516 this.start = start; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
517 this.nodeQueue = new ArrayDeque<>(); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
518 this.queuedNodes = visitedFixedNodes; |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
519 assert start.isAlive(); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
520 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
521 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
522 public LinkedList<Invoke> apply() { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
523 LinkedList<Invoke> invokes = new LinkedList<>(); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
524 FixedNode current; |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
525 forcedQueue(start); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
526 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
527 while ((current = nextQueuedNode()) != null) { |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
528 assert current.isAlive(); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
529 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
530 if (current instanceof Invoke) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
531 if (current != start) { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
532 invokes.addLast((Invoke) current); |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
533 } |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
534 queueSuccessors(current); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
535 } else if (current instanceof LoopBeginNode) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
536 queueSuccessors(current); |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
537 } else if (current instanceof LoopEndNode) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
538 // nothing todo |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
539 } else if (current instanceof MergeNode) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
540 queueSuccessors(current); |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
541 } else if (current instanceof FixedWithNextNode) { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
542 queueSuccessors(current); |
9435
794370a64b71
Replace AbstractEndNode usages with EndNode usages wherever appropriate.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
543 } else if (current instanceof EndNode) { |
794370a64b71
Replace AbstractEndNode usages with EndNode usages wherever appropriate.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9434
diff
changeset
|
544 queueMerge((EndNode) current); |
8385
85d4392b9e26
Introduce a ControlSinkNode base class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7879
diff
changeset
|
545 } else if (current instanceof ControlSinkNode) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
546 // nothing todo |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
547 } else if (current instanceof ControlSplitNode) { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
548 queueSuccessors(current); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
549 } else { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
550 assert false : current; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
551 } |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
552 } |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
553 |
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
554 return invokes; |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
555 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
556 |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
557 private void queueSuccessors(FixedNode x) { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
558 for (Node node : x.successors()) { |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
559 queue(node); |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
560 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
561 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
562 |
7684
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
563 private void queue(Node node) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
564 if (node != null && !queuedNodes.isMarked(node)) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
565 forcedQueue(node); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
566 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
567 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
568 |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
569 private void forcedQueue(Node node) { |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
570 queuedNodes.mark(node); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
571 nodeQueue.addFirst((FixedNode) node); |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
572 } |
bbf97d6688d3
cleanup for the inlining policies
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7392
diff
changeset
|
573 |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
574 private FixedNode nextQueuedNode() { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
575 if (nodeQueue.isEmpty()) { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
576 return null; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
577 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
578 |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
579 FixedNode result = nodeQueue.removeFirst(); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
580 assert queuedNodes.isMarked(result); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
581 return result; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
582 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
583 |
9434
50f02c7d1cec
Rename EndNode => AbstractEndNode and make abstract class. Introduce concrete EndNode subclass.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9389
diff
changeset
|
584 private void queueMerge(AbstractEndNode end) { |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
585 MergeNode merge = end.merge(); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
586 if (!queuedNodes.isMarked(merge) && visitedAllEnds(merge)) { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
587 queuedNodes.mark(merge); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
588 nodeQueue.add(merge); |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
589 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
590 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
591 |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
592 private boolean visitedAllEnds(MergeNode merge) { |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
593 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
|
594 if (!queuedNodes.isMarked(merge.forwardEndAt(i))) { |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
595 return false; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
596 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
597 } |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
598 return true; |
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
599 } |
7064
8d16b9b2c51e
first part of refactoring the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
7063
diff
changeset
|
600 } |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
601 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
602 /** |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
603 * 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
|
604 * invocation can have multiple graphs). |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
605 */ |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
606 static class InliningData { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
607 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
608 private static final GraphInfo DummyGraphInfo = new GraphInfo(null, new LinkedList<Invoke>(), 1.0, 1.0); |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
609 |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
610 /** |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
611 * Call hierarchy from outer most call (i.e., compilation unit) to inner most callee. |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
612 */ |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
613 private final ArrayDeque<GraphInfo> graphQueue; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
614 private final ArrayDeque<MethodInvocation> invocationQueue; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
615 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
616 private int maxGraphs; |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
617 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
618 public InliningData(StructuredGraph rootGraph, Assumptions rootAssumptions) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
619 this.graphQueue = new ArrayDeque<>(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
620 this.invocationQueue = new ArrayDeque<>(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
621 this.maxGraphs = 1; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
622 |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
623 invocationQueue.push(new MethodInvocation(null, rootAssumptions, 1.0, 1.0)); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
624 pushGraph(rootGraph, 1.0, 1.0); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
625 } |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
626 |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
627 public int graphCount() { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
628 return graphQueue.size(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
629 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
630 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
631 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
|
632 assert !contains(graph); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
633 NodeBitMap visitedFixedNodes = graph.createNodeBitMap(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
634 LinkedList<Invoke> invokes = new InliningIterator(graph.start(), visitedFixedNodes).apply(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
635 assert invokes.size() == count(graph.getInvokes()); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
636 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
|
637 assert graphQueue.size() <= maxGraphs; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
638 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
639 |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
640 public void pushDummyGraph() { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
641 graphQueue.push(DummyGraphInfo); |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
642 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
643 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
644 public boolean hasUnprocessedGraphs() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
645 return !graphQueue.isEmpty(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
646 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
647 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
648 public GraphInfo currentGraph() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
649 return graphQueue.peek(); |
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 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
652 public void popGraph() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
653 graphQueue.pop(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
654 assert graphQueue.size() <= maxGraphs; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
655 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
656 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
657 public void popGraphs(int count) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
658 assert count >= 0; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
659 for (int i = 0; i < count; i++) { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
660 graphQueue.pop(); |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
661 } |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
662 } |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
663 |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
664 /** |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
665 * Gets the call hierarchy of this inling from outer most call to inner most callee. |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
666 */ |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
667 public Object[] inliningContext() { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
668 Object[] result = new Object[graphQueue.size()]; |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
669 int i = 0; |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
670 for (GraphInfo g : graphQueue) { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
671 result[i++] = g.graph.method(); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
672 } |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
673 return result; |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
674 } |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
675 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
676 public MethodInvocation currentInvocation() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
677 return invocationQueue.peek(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
678 } |
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 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
|
681 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
|
682 invocationQueue.push(methodInvocation); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
683 maxGraphs += info.numberOfMethods(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
684 assert graphQueue.size() <= maxGraphs; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
685 return methodInvocation; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
686 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
687 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
688 public void popInvocation() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
689 maxGraphs -= invocationQueue.peek().callee.numberOfMethods(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
690 assert graphQueue.size() <= maxGraphs; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
691 invocationQueue.pop(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
692 } |
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 public int countRecursiveInlining(ResolvedJavaMethod method) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
695 int count = 0; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
696 for (GraphInfo graphInfo : graphQueue) { |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
697 if (method.equals(graphInfo.method())) { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
698 count++; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
699 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
700 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
701 return count; |
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 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
704 public int inliningDepth() { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
705 assert invocationQueue.size() > 0; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
706 return invocationQueue.size() - 1; |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
707 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
708 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
709 @Override |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
710 public String toString() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
711 StringBuilder result = new StringBuilder("Invocations: "); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
712 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
713 for (MethodInvocation invocation : invocationQueue) { |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
714 if (invocation.callee() != null) { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
715 result.append(invocation.callee().numberOfMethods()); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
716 result.append("x "); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
717 result.append(invocation.callee().invoke()); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
718 result.append("; "); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
719 } |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
720 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
721 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
722 result.append("\nGraphs: "); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
723 for (GraphInfo graph : graphQueue) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
724 result.append(graph.graph()); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
725 result.append("; "); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
726 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
727 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
728 return result.toString(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
729 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
730 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
731 private boolean contains(StructuredGraph graph) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
732 for (GraphInfo info : graphQueue) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
733 if (info.graph() == graph) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
734 return true; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
735 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
736 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
737 return false; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
738 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
739 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
740 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
|
741 int count = 0; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
742 Iterator<Invoke> iterator = invokes.iterator(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
743 while (iterator.hasNext()) { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
744 iterator.next(); |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
745 count++; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
746 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
747 return count; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
748 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
749 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
750 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
751 private static class MethodInvocation { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
752 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
753 private final InlineInfo callee; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
754 private final Assumptions assumptions; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
755 private final double probability; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
756 private final double relevance; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
757 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
758 private int processedGraphs; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
759 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
760 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
|
761 this.callee = info; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
762 this.assumptions = assumptions; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
763 this.probability = probability; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
764 this.relevance = relevance; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
765 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
766 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
767 public void incrementProcessedGraphs() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
768 processedGraphs++; |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
769 assert processedGraphs <= callee.numberOfMethods(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
770 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
771 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
772 public int processedGraphs() { |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
773 assert processedGraphs <= callee.numberOfMethods(); |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
774 return processedGraphs; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
775 } |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
776 |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
777 public int totalGraphs() { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
778 return callee.numberOfMethods(); |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
779 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
780 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
781 public InlineInfo callee() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
782 return callee; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
783 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
784 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
785 public Assumptions assumptions() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
786 return assumptions; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
787 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
788 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
789 public double probability() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
790 return probability; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
791 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
792 |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
793 public double relevance() { |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
794 return relevance; |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
795 } |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
796 |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
797 public boolean isRoot() { |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
798 return callee == null; |
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
799 } |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
800 |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
801 @Override |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
802 public String toString() { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
803 if (isRoot()) { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
804 return "<root>"; |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
805 } |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
806 CallTargetNode callTarget = callee.invoke().callTarget(); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
807 if (callTarget instanceof MethodCallTargetNode) { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
808 ResolvedJavaMethod calleeMethod = ((MethodCallTargetNode) callTarget).targetMethod(); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
809 return MetaUtil.format("Invoke#%H.%n(%p)", calleeMethod); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
810 } else { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
811 return "Invoke#" + callTarget.targetName(); |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
812 } |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
813 } |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
814 } |
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
815 |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
816 /** |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
817 * Information about a graph that will potentially be inlined. This includes tracking the |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
818 * invocations in graph that will subject to inlining themselves. |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
819 */ |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
820 private static class GraphInfo { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
821 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
822 private final StructuredGraph graph; |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
823 private final LinkedList<Invoke> remainingInvokes; |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
824 private final double probability; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
825 private final double relevance; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
826 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
827 private NodesToDoubles nodeProbabilities; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
828 private NodesToDoubles nodeRelevance; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
829 |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
830 public GraphInfo(StructuredGraph graph, LinkedList<Invoke> invokes, double probability, double relevance) { |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
831 this.graph = graph; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
832 this.remainingInvokes = invokes; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
833 this.probability = probability; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
834 this.relevance = relevance; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
835 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
836 if (graph != null) { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
837 computeProbabilities(); |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
838 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
839 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
840 |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
841 /** |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
842 * Gets the method associated with the {@linkplain #graph() graph} represented by this |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
843 * object. |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
844 */ |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
845 public ResolvedJavaMethod method() { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
846 return graph.method(); |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
847 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
848 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
849 public boolean hasRemainingInvokes() { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
850 return !remainingInvokes.isEmpty(); |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
851 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
852 |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
853 /** |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
854 * The graph about which this object contains inlining information. |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
855 */ |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
856 public StructuredGraph graph() { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
857 return graph; |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
858 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
859 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
860 public Invoke popInvoke() { |
9722
b5dd7e3c8c80
Bugfixes for the inlining phase and for -XX:+PrintInlining.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9708
diff
changeset
|
861 return remainingInvokes.removeFirst(); |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
862 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
863 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
864 public void pushInvoke(Invoke invoke) { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
865 remainingInvokes.push(invoke); |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
866 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
867 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
868 public void computeProbabilities() { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
869 nodeProbabilities = new ComputeProbabilityClosure(graph).apply(); |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
870 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
|
871 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
872 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
873 public double invokeProbability(Invoke invoke) { |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
874 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
|
875 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
876 |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
877 public double invokeRelevance(Invoke invoke) { |
9864
063a712fe8d8
converted remaining options in GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9855
diff
changeset
|
878 return Math.min(CapInheritedRelevance.getValue(), relevance) * nodeRelevance.get(invoke.asNode()); |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
879 } |
10607
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
880 |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
881 @Override |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
882 public String toString() { |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
883 return MetaUtil.format("%H.%n(%p)", method()) + remainingInvokes; |
dd5a042811f6
enhanced debug context for inlining so that inlining hierarchy is correctly shown in IGV
Doug Simon <doug.simon@oracle.com>
parents:
10051
diff
changeset
|
884 } |
9702
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
885 } |
907f1124b427
Removed memory leak and bugfixes for the InliningPhase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9701
diff
changeset
|
886 |
9701
e538498d6eae
some refactorings and cleanups for the InliningPhase
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9699
diff
changeset
|
887 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
|
888 |
9703
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
889 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
|
890 |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
891 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
|
892 } |
9529ab567367
Drafted version of an inlining policy that uses the callee graph size as its metric.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9238
diff
changeset
|
893 |
9703
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
894 public int lowLevelNodeCount() { |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
895 return lowLevelNodes; |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
896 } |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
897 |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
898 public void setLowLevelNodeCount(int lowLevelNodes) { |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
899 this.lowLevelNodes = lowLevelNodes; |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
900 } |
57113d21ce36
Added some tunable parameters to the inlining phase.
Christian Haeubl <haeubl@ssw.jku.at>
parents:
9702
diff
changeset
|
901 |
7063
0d7dfa5b79e8
merged inlining and intrinsification phases
Christian Haeubl <haeubl@ssw.jku.at>
parents:
6539
diff
changeset
|
902 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
903 } |