2
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
25
#include "precompiled.hpp"
26
#include "code/nmethod.hpp"
27
#include "compiler/compileBroker.hpp"
28
#include "opto/compile.hpp"
29
#include "opto/matcher.hpp"
30
#include "opto/node.hpp"
31
#include "opto/phase.hpp"
33
int Phase::_total_bytes_compiled = 0;
35
elapsedTimer Phase::_t_totalCompilation;
36
elapsedTimer Phase::_t_methodCompilation;
37
elapsedTimer Phase::_t_stubCompilation;
39
// The counters to use for LogCompilation
40
elapsedTimer Phase::timers[max_phase_timers];
42
//------------------------------Phase------------------------------------------
43
Phase::Phase( PhaseNumber pnum ) : _pnum(pnum), C( pnum == Compiler ? nullptr : Compile::current()) {
44
// Poll for requests from shutdown mechanism to quiesce compiler (4448539, 4448544).
45
// This is an effective place to poll, since the compiler is full of phases.
46
// In particular, every inlining site uses a recursively created Parse phase.
47
CompileBroker::maybe_block();
50
void Phase::print_timers() {
51
tty->print_cr (" C2 Compile Time: %7.3f s", Phase::_t_totalCompilation.seconds());
52
tty->print_cr (" Parse: %7.3f s", timers[_t_parser].seconds());
55
tty->print_cr (" Optimize: %7.3f s", timers[_t_optimizer].seconds());
56
if (DoEscapeAnalysis) {
57
// EA is part of Optimizer.
58
tty->print_cr (" Escape Analysis: %7.3f s", timers[_t_escapeAnalysis].seconds());
59
tty->print_cr (" Conn Graph: %7.3f s", timers[_t_connectionGraph].seconds());
60
tty->print_cr (" Macro Eliminate: %7.3f s", timers[_t_macroEliminate].seconds());
62
tty->print_cr (" GVN 1: %7.3f s", timers[_t_iterGVN].seconds());
65
tty->print_cr (" Incremental Inline: %7.3f s", timers[_t_incrInline].seconds());
66
tty->print_cr (" IdealLoop: %7.3f s", timers[_t_incrInline_ideal].seconds());
67
tty->print_cr (" (IGVN: %7.3f s)", timers[_t_incrInline_igvn].seconds());
68
tty->print_cr (" (Inline: %7.3f s)", timers[_t_incrInline_inline].seconds());
69
tty->print_cr (" (Prune Useless: %7.3f s)", timers[_t_incrInline_pru].seconds());
71
double other = timers[_t_incrInline].seconds() -
72
(timers[_t_incrInline_ideal].seconds());
74
tty->print_cr(" Other: %7.3f s", other);
78
tty->print_cr (" Vector: %7.3f s", timers[_t_vector].seconds());
79
tty->print_cr (" Box elimination: %7.3f s", timers[_t_vector_elimination].seconds());
80
tty->print_cr (" IGVN: %7.3f s", timers[_t_vector_igvn].seconds());
81
tty->print_cr (" Prune Useless: %7.3f s", timers[_t_vector_pru].seconds());
82
tty->print_cr (" Renumber Live: %7.3f s", timers[_t_renumberLive].seconds());
83
tty->print_cr (" IdealLoop: %7.3f s", timers[_t_idealLoop].seconds());
84
tty->print_cr (" AutoVectorize: %7.3f s", timers[_t_autoVectorize].seconds());
85
tty->print_cr (" IdealLoop Verify: %7.3f s", timers[_t_idealLoopVerify].seconds());
86
tty->print_cr (" Cond Const Prop: %7.3f s", timers[_t_ccp].seconds());
87
tty->print_cr (" GVN 2: %7.3f s", timers[_t_iterGVN2].seconds());
88
tty->print_cr (" Macro Expand: %7.3f s", timers[_t_macroExpand].seconds());
89
tty->print_cr (" Barrier Expand: %7.3f s", timers[_t_barrierExpand].seconds());
90
tty->print_cr (" Graph Reshape: %7.3f s", timers[_t_graphReshaping].seconds());
92
double other = timers[_t_optimizer].seconds() -
93
(timers[_t_escapeAnalysis].seconds() +
94
timers[_t_iterGVN].seconds() +
95
timers[_t_incrInline].seconds() +
96
timers[_t_vector].seconds() +
97
timers[_t_renumberLive].seconds() +
98
timers[_t_idealLoop].seconds() +
99
timers[_t_idealLoopVerify].seconds() +
100
timers[_t_ccp].seconds() +
101
timers[_t_iterGVN2].seconds() +
102
timers[_t_macroExpand].seconds() +
103
timers[_t_barrierExpand].seconds() +
104
timers[_t_graphReshaping].seconds());
106
tty->print_cr(" Other: %7.3f s", other);
110
tty->print_cr (" Matcher: %7.3f s", timers[_t_matcher].seconds());
111
if (Matcher::supports_generic_vector_operands) {
112
tty->print_cr (" Post Selection Cleanup: %7.3f s", timers[_t_postselect_cleanup].seconds());
114
tty->print_cr (" Scheduler: %7.3f s", timers[_t_scheduler].seconds());
117
tty->print_cr (" Regalloc: %7.3f s", timers[_t_registerAllocation].seconds());
118
tty->print_cr (" Ctor Chaitin: %7.3f s", timers[_t_ctorChaitin].seconds());
119
tty->print_cr (" Build IFG (virt): %7.3f s", timers[_t_buildIFGvirtual].seconds());
120
tty->print_cr (" Build IFG (phys): %7.3f s", timers[_t_buildIFGphysical].seconds());
121
tty->print_cr (" Compute Liveness: %7.3f s", timers[_t_computeLive].seconds());
122
tty->print_cr (" Regalloc Split: %7.3f s", timers[_t_regAllocSplit].seconds());
123
tty->print_cr (" Postalloc Copy Rem: %7.3f s", timers[_t_postAllocCopyRemoval].seconds());
124
tty->print_cr (" Merge multidefs: %7.3f s", timers[_t_mergeMultidefs].seconds());
125
tty->print_cr (" Fixup Spills: %7.3f s", timers[_t_fixupSpills].seconds());
126
tty->print_cr (" Compact: %7.3f s", timers[_t_chaitinCompact].seconds());
127
tty->print_cr (" Coalesce 1: %7.3f s", timers[_t_chaitinCoalesce1].seconds());
128
tty->print_cr (" Coalesce 2: %7.3f s", timers[_t_chaitinCoalesce2].seconds());
129
tty->print_cr (" Coalesce 3: %7.3f s", timers[_t_chaitinCoalesce3].seconds());
130
tty->print_cr (" Cache LRG: %7.3f s", timers[_t_chaitinCacheLRG].seconds());
131
tty->print_cr (" Simplify: %7.3f s", timers[_t_chaitinSimplify].seconds());
132
tty->print_cr (" Select: %7.3f s", timers[_t_chaitinSelect].seconds());
134
double other = timers[_t_registerAllocation].seconds() -
135
(timers[_t_ctorChaitin].seconds() +
136
timers[_t_buildIFGvirtual].seconds() +
137
timers[_t_buildIFGphysical].seconds() +
138
timers[_t_computeLive].seconds() +
139
timers[_t_regAllocSplit].seconds() +
140
timers[_t_postAllocCopyRemoval].seconds() +
141
timers[_t_mergeMultidefs].seconds() +
142
timers[_t_fixupSpills].seconds() +
143
timers[_t_chaitinCompact].seconds() +
144
timers[_t_chaitinCoalesce1].seconds() +
145
timers[_t_chaitinCoalesce2].seconds() +
146
timers[_t_chaitinCoalesce3].seconds() +
147
timers[_t_chaitinCacheLRG].seconds() +
148
timers[_t_chaitinSimplify].seconds() +
149
timers[_t_chaitinSelect].seconds());
152
tty->print_cr(" Other: %7.3f s", other);
155
tty->print_cr (" Block Ordering: %7.3f s", timers[_t_blockOrdering].seconds());
156
tty->print_cr (" Peephole: %7.3f s", timers[_t_peephole].seconds());
157
if (Matcher::require_postalloc_expand) {
158
tty->print_cr (" Postalloc Expand: %7.3f s", timers[_t_postalloc_expand].seconds());
160
tty->print_cr (" Code Emission: %7.3f s", timers[_t_output].seconds());
161
tty->print_cr (" Insn Scheduling: %7.3f s", timers[_t_instrSched].seconds());
162
tty->print_cr (" Shorten branches: %7.3f s", timers[_t_shortenBranches].seconds());
163
tty->print_cr (" Build OOP maps: %7.3f s", timers[_t_buildOopMaps].seconds());
164
tty->print_cr (" Fill buffer: %7.3f s", timers[_t_fillBuffer].seconds());
165
tty->print_cr (" Code Installation: %7.3f s", timers[_t_registerMethod].seconds());
168
double other = timers[_t_output].seconds() -
169
(timers[_t_instrSched].seconds() +
170
timers[_t_shortenBranches].seconds() +
171
timers[_t_buildOopMaps].seconds() +
172
timers[_t_fillBuffer].seconds() +
173
timers[_t_registerMethod].seconds());
176
tty->print_cr(" Other: %7.3f s", other);
180
if( timers[_t_temporaryTimer1].seconds() > 0 ) {
182
tty->print_cr (" Temp Timer 1: %7.3f s", timers[_t_temporaryTimer1].seconds());
184
if( timers[_t_temporaryTimer2].seconds() > 0 ) {
186
tty->print_cr (" Temp Timer 2: %7.3f s", timers[_t_temporaryTimer2].seconds());
189
double other = Phase::_t_totalCompilation.seconds() -
190
(timers[_t_parser].seconds() +
191
timers[_t_optimizer].seconds() +
192
timers[_t_matcher].seconds() +
193
timers[_t_scheduler].seconds() +
194
timers[_t_registerAllocation].seconds() +
195
timers[_t_blockOrdering].seconds() +
196
timers[_t_peephole].seconds() +
197
timers[_t_postalloc_expand].seconds() +
198
timers[_t_output].seconds() +
199
timers[_t_registerMethod].seconds() +
200
timers[_t_temporaryTimer1].seconds() +
201
timers[_t_temporaryTimer2].seconds());
203
tty->print_cr(" Other: %7.3f s", other);