annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ProfileCompiledMethodsPhase.java @ 18993:480bd3b1adcd

Rename BeginNode => AbstractBeginNode.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 28 Jan 2015 00:50:31 +0100
parents c943ba97b2a7
children a2cb19764970
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
1 /*
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
4 *
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
8 *
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
13 * accompanied this code).
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
14 *
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
18 *
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
21 * questions.
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
22 */
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.phases.common;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
24
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
25 import java.util.*;
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
26 import java.util.function.*;
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
27
15192
644dfe49c0f4 Move packages com.oracle.graal.cfg to com.oracle.graal.compiler.common.cfg.
Josef Eisl <josef.eisl@jku.at>
parents: 15157
diff changeset
28 import com.oracle.graal.compiler.common.cfg.*;
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.graph.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.nodes.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
31 import com.oracle.graal.nodes.calc.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.nodes.cfg.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.nodes.debug.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
34 import com.oracle.graal.nodes.extended.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.nodes.java.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
36 import com.oracle.graal.nodes.spi.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
37 import com.oracle.graal.nodes.virtual.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
38 import com.oracle.graal.phases.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
39 import com.oracle.graal.phases.graph.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
40 import com.oracle.graal.phases.schedule.*;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
41
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
42 /**
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
43 * This phase add counters for the dynamically executed number of nodes. Incrementing the counter
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
44 * for each node would be too costly, so this phase takes the compromise that it trusts split
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
45 * probabilities, but not loop frequencies. This means that it will insert counters at the start of
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
46 * a method and at each loop header.
15107
1bf700e19e84 Make Loop generic.
Josef Eisl <josef.eisl@jku.at>
parents: 14725
diff changeset
47 *
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
48 * A schedule is created so that floating nodes can also be taken into account. The weight of a node
18941
c943ba97b2a7 Remove class ScheduledNode from the node class hierarchy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18547
diff changeset
49 * is determined heuristically in the {@link ProfileCompiledMethodsPhase#getNodeWeight(ValueNode)}
c943ba97b2a7 Remove class ScheduledNode from the node class hierarchy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18547
diff changeset
50 * method.
15107
1bf700e19e84 Make Loop generic.
Josef Eisl <josef.eisl@jku.at>
parents: 14725
diff changeset
51 *
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
52 * Additionally, there's a second counter that's only increased for code sections without invokes.
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
53 */
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
54 public class ProfileCompiledMethodsPhase extends Phase {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
55
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
56 private static final String GROUP_NAME = "~profiled weight";
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
57 private static final String GROUP_NAME_WITHOUT = "~profiled weight (invoke-free sections)";
15369
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
58 private static final String GROUP_NAME_INVOKES = "~profiled invokes";
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
59
18547
fa981f5bb53a reenable -XX:+GraalCountersExcludeCompiler option
Lukas Stadler <lukas.stadler@oracle.com>
parents: 18163
diff changeset
60 private static final boolean WITH_SECTION_HEADER = Boolean.parseBoolean(System.getProperty("ProfileCompiledMethodsPhase.WITH_SECTION_HEADER", "false"));
18163
c88ab4f1f04a re-enabled Checkstyle with the release of 6.0 that supports Java 8; fixed existing Checkstyle warnings
Doug Simon <doug.simon@oracle.com>
parents: 17200
diff changeset
61 private static final boolean WITH_INVOKE_FREE_SECTIONS = Boolean.parseBoolean(System.getProperty("ProfileCompiledMethodsPhase.WITH_FREE_SECTIONS", "false"));
c88ab4f1f04a re-enabled Checkstyle with the release of 6.0 that supports Java 8; fixed existing Checkstyle warnings
Doug Simon <doug.simon@oracle.com>
parents: 17200
diff changeset
62 private static final boolean WITH_INVOKES = Boolean.parseBoolean(System.getProperty("ProfileCompiledMethodsPhase.WITH_INVOKES", "true"));
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
63
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
64 @Override
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
65 protected void run(StructuredGraph graph) {
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
66 ToDoubleFunction<FixedNode> probabilities = new FixedNodeProbabilityCache();
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
67 SchedulePhase schedule = new SchedulePhase();
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
68 schedule.apply(graph, false);
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
69
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
70 ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true);
15107
1bf700e19e84 Make Loop generic.
Josef Eisl <josef.eisl@jku.at>
parents: 14725
diff changeset
71 for (Loop<Block> loop : cfg.getLoops()) {
15534
4bd6ad45ee0a Encapsulate members of Loop.
Josef Eisl <josef.eisl@jku.at>
parents: 15470
diff changeset
72 double loopProbability = probabilities.applyAsDouble(loop.getHeader().getBeginNode());
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
73 if (loopProbability > (1D / Integer.MAX_VALUE)) {
15534
4bd6ad45ee0a Encapsulate members of Loop.
Josef Eisl <josef.eisl@jku.at>
parents: 15470
diff changeset
74 addSectionCounters(loop.getHeader().getBeginNode(), loop.getBlocks(), loop.getChildren(), schedule, probabilities);
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
75 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
76 }
15351
bf5d4bec3f29 fix ProfileCompiledMethods for OSR methods
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15192
diff changeset
77 // don't put the counter increase directly after the start (problems with OSR)
bf5d4bec3f29 fix ProfileCompiledMethods for OSR methods
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15192
diff changeset
78 FixedWithNextNode current = graph.start();
bf5d4bec3f29 fix ProfileCompiledMethods for OSR methods
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15192
diff changeset
79 while (current.next() instanceof FixedWithNextNode) {
bf5d4bec3f29 fix ProfileCompiledMethods for OSR methods
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15192
diff changeset
80 current = (FixedWithNextNode) current.next();
bf5d4bec3f29 fix ProfileCompiledMethods for OSR methods
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15192
diff changeset
81 }
15537
8117e9cadb48 Use List instead of an array in AbstractControlFlowGraph.
Josef Eisl <josef.eisl@jku.at>
parents: 15534
diff changeset
82 addSectionCounters(current, cfg.getBlocks(), cfg.getLoops(), schedule, probabilities);
15369
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
83
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
84 if (WITH_INVOKES) {
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
85 for (Node node : graph.getNodes()) {
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
86 if (node instanceof Invoke) {
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
87 Invoke invoke = (Invoke) node;
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
88 DynamicCounterNode.addCounterBefore(GROUP_NAME_INVOKES, invoke.callTarget().targetName(), 1, true, invoke.asNode());
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
89
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
90 }
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
91 }
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
92 }
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
93 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
94
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
95 private static void addSectionCounters(FixedWithNextNode start, Collection<Block> sectionBlocks, Collection<Loop<Block>> childLoops, SchedulePhase schedule,
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
96 ToDoubleFunction<FixedNode> probabilities) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
97 HashSet<Block> blocks = new HashSet<>(sectionBlocks);
15107
1bf700e19e84 Make Loop generic.
Josef Eisl <josef.eisl@jku.at>
parents: 14725
diff changeset
98 for (Loop<?> loop : childLoops) {
15534
4bd6ad45ee0a Encapsulate members of Loop.
Josef Eisl <josef.eisl@jku.at>
parents: 15470
diff changeset
99 blocks.removeAll(loop.getBlocks());
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
100 }
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
101 double weight = getSectionWeight(schedule, probabilities, blocks) / probabilities.applyAsDouble(start);
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
102 DynamicCounterNode.addCounterBefore(GROUP_NAME, sectionHead(start), (long) weight, true, start.next());
15369
24d4b669756e add option to explicitly count invokes to ProfileCompiledMethodsPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15366
diff changeset
103 if (WITH_INVOKE_FREE_SECTIONS && !hasInvoke(blocks)) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
104 DynamicCounterNode.addCounterBefore(GROUP_NAME_WITHOUT, sectionHead(start), (long) weight, true, start.next());
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
105 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
106 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
107
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
108 private static String sectionHead(Node node) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
109 if (WITH_SECTION_HEADER) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
110 return node.toString();
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
111 } else {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
112 return "";
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
113 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
114 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
115
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
116 private static double getSectionWeight(SchedulePhase schedule, ToDoubleFunction<FixedNode> probabilities, Collection<Block> blocks) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
117 double count = 0;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
118 for (Block block : blocks) {
15470
c55f44b3c5e5 remove NodesToDoubles, refactoring of node probability and inlining relevance computation
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15369
diff changeset
119 double blockProbability = probabilities.applyAsDouble(block.getBeginNode());
18941
c943ba97b2a7 Remove class ScheduledNode from the node class hierarchy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18547
diff changeset
120 for (ValueNode node : schedule.getBlockToNodesMap().get(block)) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
121 count += blockProbability * getNodeWeight(node);
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
122 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
123 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
124 return count;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
125 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
126
18941
c943ba97b2a7 Remove class ScheduledNode from the node class hierarchy.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18547
diff changeset
127 private static double getNodeWeight(ValueNode node) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
128 if (node instanceof MergeNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
129 return ((MergeNode) node).phiPredecessorCount();
18993
480bd3b1adcd Rename BeginNode => AbstractBeginNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18941
diff changeset
130 } else if (node instanceof AbstractBeginNode || node instanceof AbstractEndNode || node instanceof MonitorIdNode || node instanceof ConstantNode || node instanceof ParameterNode ||
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
131 node instanceof CallTargetNode || node instanceof ValueProxy || node instanceof VirtualObjectNode || node instanceof ReinterpretNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
132 return 0;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
133 } else if (node instanceof AccessMonitorNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
134 return 10;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
135 } else if (node instanceof Access) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
136 return 2;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
137 } else if (node instanceof LogicNode || node instanceof ConvertNode || node instanceof BinaryNode || node instanceof NotNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
138 return 1;
17200
56458afc02a3 Use common nodes for integer and floating point arithmetic.
Roland Schatz <roland.schatz@oracle.com>
parents: 17197
diff changeset
139 } else if (node instanceof IntegerDivNode || node instanceof DivNode || node instanceof IntegerRemNode || node instanceof RemNode) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
140 return 10;
17200
56458afc02a3 Use common nodes for integer and floating point arithmetic.
Roland Schatz <roland.schatz@oracle.com>
parents: 17197
diff changeset
141 } else if (node instanceof MulNode) {
14725
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
142 return 3;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
143 } else if (node instanceof Invoke) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
144 return 5;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
145 } else if (node instanceof IfNode || node instanceof SafepointNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
146 return 1;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
147 } else if (node instanceof SwitchNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
148 return node.successors().count();
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
149 } else if (node instanceof ReturnNode || node instanceof UnwindNode || node instanceof DeoptimizeNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
150 return node.successors().count();
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
151 } else if (node instanceof AbstractNewObjectNode) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
152 return 10;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
153 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
154 return 2;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
155 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
156
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
157 private static boolean hasInvoke(Collection<Block> blocks) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
158 boolean hasInvoke = false;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
159 for (Block block : blocks) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
160 for (FixedNode fixed : block.getNodes()) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
161 if (fixed instanceof Invoke) {
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
162 hasInvoke = true;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
163 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
164 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
165 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
166 return hasInvoke;
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
167 }
ba7b08d90fde new ProfileCompiledMethods tool
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
168 }