jdk

Форк
0
/
phase.cpp 
206 строк · 10.2 Кб
1
/*
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.
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

33
int Phase::_total_bytes_compiled = 0;
34

35
elapsedTimer Phase::_t_totalCompilation;
36
elapsedTimer Phase::_t_methodCompilation;
37
elapsedTimer Phase::_t_stubCompilation;
38

39
// The counters to use for LogCompilation
40
elapsedTimer Phase::timers[max_phase_timers];
41

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();
48
}
49

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());
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
       if (other > 0) {
74
         tty->print_cr("           Other:               %7.3f s", other);
75
       }
76
    }
77

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());
91

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());
105
    if (other > 0) {
106
      tty->print_cr("         Other:               %7.3f s", other);
107
    }
108
  }
109

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());
113
  }
114
  tty->print_cr ("       Scheduler:                %7.3f s", timers[_t_scheduler].seconds());
115

116
  {
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());
133

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());
150

151
    if (other > 0) {
152
      tty->print_cr("         Other:               %7.3f s", other);
153
    }
154
  }
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());
159
  }
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());
166

167
  {
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());
174

175
    if (other > 0) {
176
      tty->print_cr("         Other:               %7.3f s", other);
177
    }
178
  }
179

180
  if( timers[_t_temporaryTimer1].seconds() > 0 ) {
181
    tty->cr();
182
    tty->print_cr ("       Temp Timer 1:        %7.3f s", timers[_t_temporaryTimer1].seconds());
183
  }
184
  if( timers[_t_temporaryTimer2].seconds() > 0 ) {
185
    tty->cr();
186
    tty->print_cr ("       Temp Timer 2:        %7.3f s", timers[_t_temporaryTimer2].seconds());
187
  }
188

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());
202
    if (other > 0) {
203
      tty->print_cr("       Other:               %7.3f s", other);
204
    }
205

206
}
207

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.