1 | /* |
2 | * Copyright (c) 1997, 2019, 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 | #ifndef SHARE_OPTO_PHASE_HPP |
26 | #define SHARE_OPTO_PHASE_HPP |
27 | |
28 | #include "runtime/timer.hpp" |
29 | |
30 | class IfNode; |
31 | class MergeMemNode; |
32 | class Node; |
33 | class PhaseGVN; |
34 | |
35 | //------------------------------Phase------------------------------------------ |
36 | // Most optimizations are done in Phases. Creating a phase does any long |
37 | // running analysis required, and caches the analysis in internal data |
38 | // structures. Later the analysis is queried using transform() calls to |
39 | // guide transforming the program. When the Phase is deleted, so is any |
40 | // cached analysis info. This basic Phase class mostly contains timing and |
41 | // memory management code. |
42 | class Phase : public StackObj { |
43 | public: |
44 | enum PhaseNumber { |
45 | Compiler, // Top-level compiler phase |
46 | Parser, // Parse bytecodes |
47 | Remove_Useless, // Remove useless nodes |
48 | Remove_Useless_And_Renumber_Live, // First, remove useless nodes from the graph. Then, renumber live nodes. |
49 | Optimistic, // Optimistic analysis phase |
50 | GVN, // Pessimistic global value numbering phase |
51 | Ins_Select, // Instruction selection phase |
52 | CFG, // Build a CFG |
53 | BlockLayout, // Linear ordering of blocks |
54 | Register_Allocation, // Register allocation, duh |
55 | LIVE, // Dragon-book LIVE range problem |
56 | StringOpts, // StringBuilder related optimizations |
57 | Interference_Graph, // Building the IFG |
58 | Coalesce, // Coalescing copies |
59 | Ideal_Loop, // Find idealized trip-counted loops |
60 | Macro_Expand, // Expand macro nodes |
61 | Peephole, // Apply peephole optimizations |
62 | last_phase |
63 | }; |
64 | |
65 | enum PhaseTraceId { |
66 | _t_parser, |
67 | _t_optimizer, |
68 | _t_escapeAnalysis, |
69 | _t_connectionGraph, |
70 | _t_macroEliminate, |
71 | _t_iterGVN, |
72 | _t_incrInline, |
73 | _t_incrInline_ideal, |
74 | _t_incrInline_igvn, |
75 | _t_incrInline_pru, |
76 | _t_incrInline_inline, |
77 | _t_renumberLive, |
78 | _t_idealLoop, |
79 | _t_idealLoopVerify, |
80 | _t_ccp, |
81 | _t_iterGVN2, |
82 | _t_macroExpand, |
83 | _t_barrierExpand, |
84 | _t_graphReshaping, |
85 | _t_matcher, |
86 | _t_scheduler, |
87 | _t_registerAllocation, |
88 | _t_ctorChaitin, |
89 | _t_buildIFGvirtual, |
90 | _t_buildIFGphysical, |
91 | _t_computeLive, |
92 | _t_regAllocSplit, |
93 | _t_postAllocCopyRemoval, |
94 | _t_mergeMultidefs, |
95 | _t_fixupSpills, |
96 | _t_chaitinCompact, |
97 | _t_chaitinCoalesce1, |
98 | _t_chaitinCoalesce2, |
99 | _t_chaitinCoalesce3, |
100 | _t_chaitinCacheLRG, |
101 | _t_chaitinSimplify, |
102 | _t_chaitinSelect, |
103 | _t_blockOrdering, |
104 | _t_peephole, |
105 | _t_postalloc_expand, |
106 | _t_output, |
107 | _t_instrSched, |
108 | _t_buildOopMaps, |
109 | _t_registerMethod, |
110 | _t_temporaryTimer1, |
111 | _t_temporaryTimer2, |
112 | max_phase_timers |
113 | }; |
114 | |
115 | static elapsedTimer timers[max_phase_timers]; |
116 | |
117 | protected: |
118 | enum PhaseNumber _pnum; // Phase number (for stat gathering) |
119 | |
120 | static int _total_bytes_compiled; |
121 | |
122 | // accumulated timers |
123 | static elapsedTimer _t_totalCompilation; |
124 | static elapsedTimer _t_methodCompilation; |
125 | static elapsedTimer _t_stubCompilation; |
126 | |
127 | // Generate a subtyping check. Takes as input the subtype and supertype. |
128 | // Returns 2 values: sets the default control() to the true path and |
129 | // returns the false path. Only reads from constant memory taken from the |
130 | // default memory; does not write anything. It also doesn't take in an |
131 | // Object; if you wish to check an Object you need to load the Object's |
132 | // class prior to coming here. |
133 | // Used in GraphKit and PhaseMacroExpand |
134 | static Node* gen_subtype_check(Node* subklass, Node* superklass, Node** ctrl, MergeMemNode* mem, PhaseGVN* gvn); |
135 | |
136 | public: |
137 | Compile * C; |
138 | Phase( PhaseNumber pnum ); |
139 | |
140 | static void print_timers(); |
141 | }; |
142 | |
143 | #endif // SHARE_OPTO_PHASE_HPP |
144 | |