1/*
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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.
8 *
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).
14 *
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.
18 *
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
21 * questions.
22 *
23 */
24
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"
32
33int Phase::_total_bytes_compiled = 0;
34
35elapsedTimer Phase::_t_totalCompilation;
36elapsedTimer Phase::_t_methodCompilation;
37elapsedTimer Phase::_t_stubCompilation;
38
39// The counters to use for LogCompilation
40elapsedTimer Phase::timers[max_phase_timers];
41
42//------------------------------Phase------------------------------------------
43Phase::Phase( PhaseNumber pnum ) : _pnum(pnum), C( pnum == Compiler ? NULL : 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();
48}
49
50void 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());
53
54 {
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());
61 }
62 tty->print_cr (" GVN 1: %7.3f s", timers[_t_iterGVN].seconds());
63
64 {
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());
70
71 double other = timers[_t_incrInline].seconds() -
72 (timers[_t_incrInline_ideal].seconds() +
73 timers[_t_incrInline_igvn].seconds() +
74 timers[_t_incrInline_inline].seconds() +
75 timers[_t_incrInline_pru].seconds());
76 if (other > 0) {
77 tty->print_cr(" Other: %7.3f s", other);
78 }
79 }
80 tty->print_cr (" Renumber Live: %7.3f s", timers[_t_renumberLive].seconds());
81 tty->print_cr (" IdealLoop: %7.3f s", timers[_t_idealLoop].seconds());
82 tty->print_cr (" IdealLoop Verify: %7.3f s", timers[_t_idealLoopVerify].seconds());
83 tty->print_cr (" Cond Const Prop: %7.3f s", timers[_t_ccp].seconds());
84 tty->print_cr (" GVN 2: %7.3f s", timers[_t_iterGVN2].seconds());
85 tty->print_cr (" Macro Expand: %7.3f s", timers[_t_macroExpand].seconds());
86 tty->print_cr (" Barrier Expand: %7.3f s", timers[_t_barrierExpand].seconds());
87 tty->print_cr (" Graph Reshape: %7.3f s", timers[_t_graphReshaping].seconds());
88
89 double other = timers[_t_optimizer].seconds() -
90 (timers[_t_escapeAnalysis].seconds() +
91 timers[_t_iterGVN].seconds() +
92 timers[_t_incrInline].seconds() +
93 timers[_t_renumberLive].seconds() +
94 timers[_t_idealLoop].seconds() +
95 timers[_t_idealLoopVerify].seconds() +
96 timers[_t_ccp].seconds() +
97 timers[_t_iterGVN2].seconds() +
98 timers[_t_macroExpand].seconds() +
99 timers[_t_barrierExpand].seconds() +
100 timers[_t_graphReshaping].seconds());
101 if (other > 0) {
102 tty->print_cr(" Other: %7.3f s", other);
103 }
104 }
105
106 tty->print_cr (" Matcher: %7.3f s", timers[_t_matcher].seconds());
107 tty->print_cr (" Scheduler: %7.3f s", timers[_t_scheduler].seconds());
108
109 {
110 tty->print_cr (" Regalloc: %7.3f s", timers[_t_registerAllocation].seconds());
111 tty->print_cr (" Ctor Chaitin: %7.3f s", timers[_t_ctorChaitin].seconds());
112 tty->print_cr (" Build IFG (virt): %7.3f s", timers[_t_buildIFGvirtual].seconds());
113 tty->print_cr (" Build IFG (phys): %7.3f s", timers[_t_buildIFGphysical].seconds());
114 tty->print_cr (" Compute Liveness: %7.3f s", timers[_t_computeLive].seconds());
115 tty->print_cr (" Regalloc Split: %7.3f s", timers[_t_regAllocSplit].seconds());
116 tty->print_cr (" Postalloc Copy Rem: %7.3f s", timers[_t_postAllocCopyRemoval].seconds());
117 tty->print_cr (" Merge multidefs: %7.3f s", timers[_t_mergeMultidefs].seconds());
118 tty->print_cr (" Fixup Spills: %7.3f s", timers[_t_fixupSpills].seconds());
119 tty->print_cr (" Compact: %7.3f s", timers[_t_chaitinCompact].seconds());
120 tty->print_cr (" Coalesce 1: %7.3f s", timers[_t_chaitinCoalesce1].seconds());
121 tty->print_cr (" Coalesce 2: %7.3f s", timers[_t_chaitinCoalesce2].seconds());
122 tty->print_cr (" Coalesce 3: %7.3f s", timers[_t_chaitinCoalesce3].seconds());
123 tty->print_cr (" Cache LRG: %7.3f s", timers[_t_chaitinCacheLRG].seconds());
124 tty->print_cr (" Simplify: %7.3f s", timers[_t_chaitinSimplify].seconds());
125 tty->print_cr (" Select: %7.3f s", timers[_t_chaitinSelect].seconds());
126
127 double other = timers[_t_registerAllocation].seconds() -
128 (timers[_t_ctorChaitin].seconds() +
129 timers[_t_buildIFGvirtual].seconds() +
130 timers[_t_buildIFGphysical].seconds() +
131 timers[_t_computeLive].seconds() +
132 timers[_t_regAllocSplit].seconds() +
133 timers[_t_postAllocCopyRemoval].seconds() +
134 timers[_t_mergeMultidefs].seconds() +
135 timers[_t_fixupSpills].seconds() +
136 timers[_t_chaitinCompact].seconds() +
137 timers[_t_chaitinCoalesce1].seconds() +
138 timers[_t_chaitinCoalesce2].seconds() +
139 timers[_t_chaitinCoalesce3].seconds() +
140 timers[_t_chaitinCacheLRG].seconds() +
141 timers[_t_chaitinSimplify].seconds() +
142 timers[_t_chaitinSelect].seconds());
143
144 if (other > 0) {
145 tty->print_cr(" Other: %7.3f s", other);
146 }
147 }
148 tty->print_cr (" Block Ordering: %7.3f s", timers[_t_blockOrdering].seconds());
149 tty->print_cr (" Peephole: %7.3f s", timers[_t_peephole].seconds());
150 if (Matcher::require_postalloc_expand) {
151 tty->print_cr (" Postalloc Expand: %7.3f s", timers[_t_postalloc_expand].seconds());
152 }
153 tty->print_cr (" Code Emission: %7.3f s", timers[_t_output].seconds());
154 tty->print_cr (" Insn Scheduling: %7.3f s", timers[_t_instrSched].seconds());
155 tty->print_cr (" Build OOP maps: %7.3f s", timers[_t_buildOopMaps].seconds());
156 tty->print_cr (" Code Installation: %7.3f s", timers[_t_registerMethod].seconds());
157
158 if( timers[_t_temporaryTimer1].seconds() > 0 ) {
159 tty->cr();
160 tty->print_cr (" Temp Timer 1: %7.3f s", timers[_t_temporaryTimer1].seconds());
161 }
162 if( timers[_t_temporaryTimer2].seconds() > 0 ) {
163 tty->cr();
164 tty->print_cr (" Temp Timer 2: %7.3f s", timers[_t_temporaryTimer2].seconds());
165 }
166
167 double other = Phase::_t_totalCompilation.seconds() -
168 (timers[_t_parser].seconds() +
169 timers[_t_optimizer].seconds() +
170 timers[_t_matcher].seconds() +
171 timers[_t_scheduler].seconds() +
172 timers[_t_registerAllocation].seconds() +
173 timers[_t_blockOrdering].seconds() +
174 timers[_t_peephole].seconds() +
175 timers[_t_postalloc_expand].seconds() +
176 timers[_t_output].seconds() +
177 timers[_t_registerMethod].seconds() +
178 timers[_t_temporaryTimer1].seconds() +
179 timers[_t_temporaryTimer2].seconds());
180 if (other > 0) {
181 tty->print_cr(" Other: %7.3f s", other);
182 }
183
184}
185