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
30class IfNode;
31class MergeMemNode;
32class Node;
33class 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.
42class Phase : public StackObj {
43public:
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
117protected:
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
136public:
137 Compile * C;
138 Phase( PhaseNumber pnum );
139
140 static void print_timers();
141};
142
143#endif // SHARE_OPTO_PHASE_HPP
144