annotate src/share/vm/opto/compile.hpp @ 1994:6cd6d394f280

7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
author ysr
date Tue, 07 Dec 2010 21:55:53 -0800
parents f95d63e2154a
children 2f644f85485d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1397
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
25 #ifndef SHARE_VM_OPTO_COMPILE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
26 #define SHARE_VM_OPTO_COMPILE_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
28 #include "asm/codeBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
29 #include "ci/compilerInterface.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
30 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
31 #include "code/exceptionHandlerTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
32 #include "compiler/compilerOracle.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
33 #include "libadt/dict.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
34 #include "libadt/port.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
35 #include "libadt/vectset.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
36 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
37 #include "opto/idealGraphPrinter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
38 #include "opto/phase.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
39 #include "opto/regmask.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
40 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
41 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
42
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class Block;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class Bundle;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class C2Compiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class CallGenerator;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ConnectionGraph;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class InlineTree;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class Int_Array;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class Matcher;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class MachNode;
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
52 class MachSafePointNode;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 class Node;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 class Node_Array;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 class Node_Notes;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 class OptoReg;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class PhaseCFG;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 class PhaseGVN;
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
59 class PhaseIterGVN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60 class PhaseRegAlloc;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 class PhaseCCP;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class PhaseCCP_DCE;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 class RootNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 class relocInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 class Scope;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class StartNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 class SafePointNode;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 class JVMState;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 class TypeData;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class TypePtr;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 class TypeFunc;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 class Unique_Node_List;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 class nmethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 class WarmCallInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 //------------------------------Compile----------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // This class defines a top-level Compiler invocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 class Compile : public Phase {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Fixed alias indexes. (See also MergeMemNode.)
a61af66fc99e Initial load
duke
parents:
diff changeset
82 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 AliasIdxTop = 1, // pseudo-index, aliases to nothing (used as sentinel value)
a61af66fc99e Initial load
duke
parents:
diff changeset
84 AliasIdxBot = 2, // pseudo-index, aliases to everything
a61af66fc99e Initial load
duke
parents:
diff changeset
85 AliasIdxRaw = 3 // hard-wired index for TypeRawPtr::BOTTOM
a61af66fc99e Initial load
duke
parents:
diff changeset
86 };
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // Variant of TraceTime(NULL, &_t_accumulator, TimeCompiler);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // Integrated with logging. If logging is turned on, and dolog is true,
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // then brackets are put into the log, with time stamps and node counts.
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // (The time collection itself is always conditionalized on TimeCompiler.)
a61af66fc99e Initial load
duke
parents:
diff changeset
92 class TracePhase : public TraceTime {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
94 Compile* C;
a61af66fc99e Initial load
duke
parents:
diff changeset
95 CompileLog* _log;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
97 TracePhase(const char* name, elapsedTimer* accumulator, bool dolog);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 ~TracePhase();
a61af66fc99e Initial load
duke
parents:
diff changeset
99 };
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Information per category of alias (memory slice)
a61af66fc99e Initial load
duke
parents:
diff changeset
102 class AliasType {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
104 friend class Compile;
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 int _index; // unique index, used with MergeMemNode
a61af66fc99e Initial load
duke
parents:
diff changeset
107 const TypePtr* _adr_type; // normalized address type
a61af66fc99e Initial load
duke
parents:
diff changeset
108 ciField* _field; // relevant instance field, or null if none
a61af66fc99e Initial load
duke
parents:
diff changeset
109 bool _is_rewritable; // false if the memory is write-once only
a61af66fc99e Initial load
duke
parents:
diff changeset
110 int _general_index; // if this is type is an instance, the general
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // type that this is an instance of
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void Init(int i, const TypePtr* at);
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
116 int index() const { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 const TypePtr* adr_type() const { return _adr_type; }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 ciField* field() const { return _field; }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 bool is_rewritable() const { return _is_rewritable; }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 bool is_volatile() const { return (_field ? _field->is_volatile() : false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int general_index() const { return (_general_index != 0) ? _general_index : _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void set_rewritable(bool z) { _is_rewritable = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void set_field(ciField* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 assert(!_field,"");
a61af66fc99e Initial load
duke
parents:
diff changeset
126 _field = f;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 if (f->is_final()) _is_rewritable = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void print_on(outputStream* st) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
131 };
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 logAliasCacheSize = 6,
a61af66fc99e Initial load
duke
parents:
diff changeset
135 AliasCacheSize = (1<<logAliasCacheSize)
a61af66fc99e Initial load
duke
parents:
diff changeset
136 };
a61af66fc99e Initial load
duke
parents:
diff changeset
137 struct AliasCacheEntry { const TypePtr* _adr_type; int _index; }; // simple duple type
a61af66fc99e Initial load
duke
parents:
diff changeset
138 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 trapHistLength = methodDataOopDesc::_trap_hist_limit
a61af66fc99e Initial load
duke
parents:
diff changeset
140 };
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Fixed parameters to this compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 const int _compile_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
145 const bool _save_argument_registers; // save/restore arg regs for trampolines
a61af66fc99e Initial load
duke
parents:
diff changeset
146 const bool _subsume_loads; // Load can be matched as part of a larger op.
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
147 const bool _do_escape_analysis; // Do escape analysis.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148 ciMethod* _method; // The method being compiled.
a61af66fc99e Initial load
duke
parents:
diff changeset
149 int _entry_bci; // entry bci for osr methods.
a61af66fc99e Initial load
duke
parents:
diff changeset
150 const TypeFunc* _tf; // My kind of signature
a61af66fc99e Initial load
duke
parents:
diff changeset
151 InlineTree* _ilt; // Ditto (temporary).
a61af66fc99e Initial load
duke
parents:
diff changeset
152 address _stub_function; // VM entry for stub being compiled, or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
153 const char* _stub_name; // Name of stub or adapter being compiled, or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
154 address _stub_entry_point; // Compile code entry for generated stub, or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Control of this compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
157 int _num_loop_opts; // Number of iterations for doing loop optimiztions
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int _max_inline_size; // Max inline size for this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
159 int _freq_inline_size; // Max hot method inline size for this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
160 int _fixed_slots; // count of frame slots not allocated by the register
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // allocator i.e. locks, original deopt pc, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // For deopt
a61af66fc99e Initial load
duke
parents:
diff changeset
163 int _orig_pc_slot;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 int _orig_pc_slot_offset_in_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 int _major_progress; // Count of something big happening
a61af66fc99e Initial load
duke
parents:
diff changeset
167 bool _has_loops; // True if the method _may_ have some loops
a61af66fc99e Initial load
duke
parents:
diff changeset
168 bool _has_split_ifs; // True if the method _may_ have some split-if
a61af66fc99e Initial load
duke
parents:
diff changeset
169 bool _has_unsafe_access; // True if the method _may_ produce faults in unsafe loads or stores.
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
170 bool _has_stringbuilder; // True StringBuffers or StringBuilders are allocated
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171 uint _trap_hist[trapHistLength]; // Cumulative traps
a61af66fc99e Initial load
duke
parents:
diff changeset
172 bool _trap_can_recompile; // Have we emitted a recompiling trap?
a61af66fc99e Initial load
duke
parents:
diff changeset
173 uint _decompile_count; // Cumulative decompilation counts.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 bool _do_inlining; // True if we intend to do inlining
a61af66fc99e Initial load
duke
parents:
diff changeset
175 bool _do_scheduling; // True if we intend to do scheduling
418
72c5366e5d86 6743900: frequency based block layout
rasbold
parents: 367
diff changeset
176 bool _do_freq_based_layout; // True if we intend to do frequency based block layout
0
a61af66fc99e Initial load
duke
parents:
diff changeset
177 bool _do_count_invocations; // True if we generate code to count invocations
a61af66fc99e Initial load
duke
parents:
diff changeset
178 bool _do_method_data_update; // True if we generate code to update methodDataOops
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int _AliasLevel; // Locally-adjusted version of AliasLevel flag.
a61af66fc99e Initial load
duke
parents:
diff changeset
180 bool _print_assembly; // True if we should dump assembly code for this compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
181 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
182 bool _trace_opto_output;
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
183 bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
185
1265
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
186 // JSR 292
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
187 bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
188
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // Compilation environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
190 Arena _comp_arena; // Arena with lifetime equivalent to Compile
a61af66fc99e Initial load
duke
parents:
diff changeset
191 ciEnv* _env; // CI interface
a61af66fc99e Initial load
duke
parents:
diff changeset
192 CompileLog* _log; // from CompilerThread
a61af66fc99e Initial load
duke
parents:
diff changeset
193 const char* _failure_reason; // for record_failure/failing pattern
a61af66fc99e Initial load
duke
parents:
diff changeset
194 GrowableArray<CallGenerator*>* _intrinsics; // List of intrinsics.
a61af66fc99e Initial load
duke
parents:
diff changeset
195 GrowableArray<Node*>* _macro_nodes; // List of nodes which need to be expanded before matching.
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
196 GrowableArray<Node*>* _predicate_opaqs; // List of Opaque1 nodes for the loop predicates.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
197 ConnectionGraph* _congraph;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
199 IdealGraphPrinter* _printer;
a61af66fc99e Initial load
duke
parents:
diff changeset
200 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // Node management
a61af66fc99e Initial load
duke
parents:
diff changeset
203 uint _unique; // Counter for unique Node indices
a61af66fc99e Initial load
duke
parents:
diff changeset
204 debug_only(static int _debug_idx;) // Monotonic counter (not reset), use -XX:BreakAtNode=<idx>
a61af66fc99e Initial load
duke
parents:
diff changeset
205 Arena _node_arena; // Arena for new-space Nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
206 Arena _old_arena; // Arena for old-space Nodes, lifetime during xform
a61af66fc99e Initial load
duke
parents:
diff changeset
207 RootNode* _root; // Unique root of compilation, or NULL after bail-out.
a61af66fc99e Initial load
duke
parents:
diff changeset
208 Node* _top; // Unique top node. (Reset by various phases.)
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 Node* _immutable_memory; // Initial memory state
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Node* _recent_alloc_obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 Node* _recent_alloc_ctl;
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // Blocked array of debugging and profiling information,
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // tracked per node.
a61af66fc99e Initial load
duke
parents:
diff changeset
217 enum { _log2_node_notes_block_size = 8,
a61af66fc99e Initial load
duke
parents:
diff changeset
218 _node_notes_block_size = (1<<_log2_node_notes_block_size)
a61af66fc99e Initial load
duke
parents:
diff changeset
219 };
a61af66fc99e Initial load
duke
parents:
diff changeset
220 GrowableArray<Node_Notes*>* _node_note_array;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Node_Notes* _default_node_notes; // default notes for new nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // After parsing and every bulk phase we hang onto the Root instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // The RootNode instruction is where the whole program begins. It produces
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // the initial Control and BOTTOM for everybody else.
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // Type management
a61af66fc99e Initial load
duke
parents:
diff changeset
228 Arena _Compile_types; // Arena for all types
a61af66fc99e Initial load
duke
parents:
diff changeset
229 Arena* _type_arena; // Alias for _Compile_types except in Initialize_shared()
a61af66fc99e Initial load
duke
parents:
diff changeset
230 Dict* _type_dict; // Intern table
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void* _type_hwm; // Last allocation (see Type::operator new/delete)
a61af66fc99e Initial load
duke
parents:
diff changeset
232 size_t _type_last_size; // Last allocation size (see Type::operator new/delete)
a61af66fc99e Initial load
duke
parents:
diff changeset
233 ciMethod* _last_tf_m; // Cache for
a61af66fc99e Initial load
duke
parents:
diff changeset
234 const TypeFunc* _last_tf; // TypeFunc::make
a61af66fc99e Initial load
duke
parents:
diff changeset
235 AliasType** _alias_types; // List of alias types seen so far.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 int _num_alias_types; // Logical length of _alias_types
a61af66fc99e Initial load
duke
parents:
diff changeset
237 int _max_alias_types; // Physical length of _alias_types
a61af66fc99e Initial load
duke
parents:
diff changeset
238 AliasCacheEntry _alias_cache[AliasCacheSize]; // Gets aliases w/o data structure walking
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // Parsing, optimization
a61af66fc99e Initial load
duke
parents:
diff changeset
241 PhaseGVN* _initial_gvn; // Results of parse-time PhaseGVN
a61af66fc99e Initial load
duke
parents:
diff changeset
242 Unique_Node_List* _for_igvn; // Initial work-list for next round of Iterative GVN
a61af66fc99e Initial load
duke
parents:
diff changeset
243 WarmCallInfo* _warm_calls; // Sorted work-list for heat-based inlining.
a61af66fc99e Initial load
duke
parents:
diff changeset
244
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
245 GrowableArray<CallGenerator*> _late_inlines; // List of CallGenerators to be revisited after
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
246 // main parsing has finished.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
247
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 // Matching, CFG layout, allocation, code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
249 PhaseCFG* _cfg; // Results of CFG finding
a61af66fc99e Initial load
duke
parents:
diff changeset
250 bool _select_24_bit_instr; // We selected an instruction with a 24-bit result
a61af66fc99e Initial load
duke
parents:
diff changeset
251 bool _in_24_bit_fp_mode; // We are emitting instructions with 24-bit results
859
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
252 int _java_calls; // Number of java calls in the method
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
253 int _inner_loops; // Number of inner loops in the method
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 Matcher* _matcher; // Engine to map ideal to machine instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
255 PhaseRegAlloc* _regalloc; // Results of register allocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
256 int _frame_slots; // Size of total frame in stack slots
a61af66fc99e Initial load
duke
parents:
diff changeset
257 CodeOffsets _code_offsets; // Offsets into the code for various interesting entries
a61af66fc99e Initial load
duke
parents:
diff changeset
258 RegMask _FIRST_STACK_mask; // All stack slots usable for spills (depends on frame layout)
a61af66fc99e Initial load
duke
parents:
diff changeset
259 Arena* _indexSet_arena; // control IndexSet allocation within PhaseChaitin
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void* _indexSet_free_block_list; // free list of IndexSet bit blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 uint _node_bundling_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
263 Bundle* _node_bundling_base; // Information for instruction bundling
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // Instruction bits passed off to the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int _method_size; // Size of nmethod code segment in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
267 CodeBuffer _code_buffer; // Where the code is assembled
a61af66fc99e Initial load
duke
parents:
diff changeset
268 int _first_block_size; // Size of unvalidated entry point code / OSR poison code
a61af66fc99e Initial load
duke
parents:
diff changeset
269 ExceptionHandlerTable _handler_table; // Table of native-code exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
270 ImplicitExceptionTable _inc_table; // Table of implicit null checks in native code
a61af66fc99e Initial load
duke
parents:
diff changeset
271 OopMapSet* _oop_map_set; // Table of oop maps (one for each safepoint location)
a61af66fc99e Initial load
duke
parents:
diff changeset
272 static int _CompiledZap_count; // counter compared against CompileZap[First/Last]
a61af66fc99e Initial load
duke
parents:
diff changeset
273 BufferBlob* _scratch_buffer_blob; // For temporary code buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
274 relocInfo* _scratch_locs_memory; // For temporary code buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
277 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // The Compile instance currently active in this (compiler) thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
280 static Compile* current() {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 return (Compile*) ciEnv::current()->compiler_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // ID for this compilation. Useful for setting breakpoints in the debugger.
a61af66fc99e Initial load
duke
parents:
diff changeset
285 int compile_id() const { return _compile_id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Does this compilation allow instructions to subsume loads? User
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // instructions that subsume a load may result in an unschedulable
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // instruction sequence.
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool subsume_loads() const { return _subsume_loads; }
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
291 // Do escape analysis.
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
292 bool do_escape_analysis() const { return _do_escape_analysis; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 bool save_argument_registers() const { return _save_argument_registers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Other fixed compilation parameters.
a61af66fc99e Initial load
duke
parents:
diff changeset
297 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
298 int entry_bci() const { return _entry_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool is_osr_compilation() const { return _entry_bci != InvocationEntryBci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 bool is_method_compilation() const { return (_method != NULL && !_method->flags().is_native()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 const TypeFunc* tf() const { assert(_tf!=NULL, ""); return _tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 void init_tf(const TypeFunc* tf) { assert(_tf==NULL, ""); _tf = tf; }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 InlineTree* ilt() const { return _ilt; }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 address stub_function() const { return _stub_function; }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 const char* stub_name() const { return _stub_name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
306 address stub_entry_point() const { return _stub_entry_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Control of this compilation.
a61af66fc99e Initial load
duke
parents:
diff changeset
309 int fixed_slots() const { assert(_fixed_slots >= 0, ""); return _fixed_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 void set_fixed_slots(int n) { _fixed_slots = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 int major_progress() const { return _major_progress; }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 void set_major_progress() { _major_progress++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void clear_major_progress() { _major_progress = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 int num_loop_opts() const { return _num_loop_opts; }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void set_num_loop_opts(int n) { _num_loop_opts = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 int max_inline_size() const { return _max_inline_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 void set_freq_inline_size(int n) { _freq_inline_size = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
318 int freq_inline_size() const { return _freq_inline_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
319 void set_max_inline_size(int n) { _max_inline_size = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 bool has_loops() const { return _has_loops; }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 void set_has_loops(bool z) { _has_loops = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 bool has_split_ifs() const { return _has_split_ifs; }
a61af66fc99e Initial load
duke
parents:
diff changeset
323 void set_has_split_ifs(bool z) { _has_split_ifs = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
324 bool has_unsafe_access() const { return _has_unsafe_access; }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 void set_has_unsafe_access(bool z) { _has_unsafe_access = z; }
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
326 bool has_stringbuilder() const { return _has_stringbuilder; }
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
327 void set_has_stringbuilder(bool z) { _has_stringbuilder = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 void set_trap_count(uint r, uint c) { assert(r < trapHistLength, "oob"); _trap_hist[r] = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
329 uint trap_count(uint r) const { assert(r < trapHistLength, "oob"); return _trap_hist[r]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 bool trap_can_recompile() const { return _trap_can_recompile; }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 void set_trap_can_recompile(bool z) { _trap_can_recompile = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 uint decompile_count() const { return _decompile_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
333 void set_decompile_count(uint c) { _decompile_count = c; }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 bool allow_range_check_smearing() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 bool do_inlining() const { return _do_inlining; }
a61af66fc99e Initial load
duke
parents:
diff changeset
336 void set_do_inlining(bool z) { _do_inlining = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
337 bool do_scheduling() const { return _do_scheduling; }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 void set_do_scheduling(bool z) { _do_scheduling = z; }
418
72c5366e5d86 6743900: frequency based block layout
rasbold
parents: 367
diff changeset
339 bool do_freq_based_layout() const{ return _do_freq_based_layout; }
72c5366e5d86 6743900: frequency based block layout
rasbold
parents: 367
diff changeset
340 void set_do_freq_based_layout(bool z){ _do_freq_based_layout = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
341 bool do_count_invocations() const{ return _do_count_invocations; }
a61af66fc99e Initial load
duke
parents:
diff changeset
342 void set_do_count_invocations(bool z){ _do_count_invocations = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 bool do_method_data_update() const { return _do_method_data_update; }
a61af66fc99e Initial load
duke
parents:
diff changeset
344 void set_do_method_data_update(bool z) { _do_method_data_update = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
345 int AliasLevel() const { return _AliasLevel; }
a61af66fc99e Initial load
duke
parents:
diff changeset
346 bool print_assembly() const { return _print_assembly; }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 void set_print_assembly(bool z) { _print_assembly = z; }
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // check the CompilerOracle for special behaviours for this compile
a61af66fc99e Initial load
duke
parents:
diff changeset
349 bool method_has_option(const char * option) {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 return method() != NULL && method()->has_option(option);
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
353 bool trace_opto_output() const { return _trace_opto_output; }
367
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
354 bool parsed_irreducible_loop() const { return _parsed_irreducible_loop; }
194b8e3a2fc4 6384206: Phis which are later unneeded are impairing our ability to inline based on static types
never
parents: 196
diff changeset
355 void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
356 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
357
1265
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
358 // JSR 292
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
359 bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
360 void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
b4b440360f1e 6926782: CodeBuffer size too small after 6921352
twisti
parents: 1172
diff changeset
361
0
a61af66fc99e Initial load
duke
parents:
diff changeset
362 void begin_method() {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
364 if (_printer) _printer->begin_method(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
365 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367 void print_method(const char * name, int level = 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (_printer) _printer->print_method(this, name, level);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 void end_method() {
a61af66fc99e Initial load
duke
parents:
diff changeset
373 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
374 if (_printer) _printer->end_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 int macro_count() { return _macro_nodes->length(); }
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
379 int predicate_count() { return _predicate_opaqs->length();}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 Node* macro_node(int idx) { return _macro_nodes->at(idx); }
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
381 Node* predicate_opaque1_node(int idx) { return _predicate_opaqs->at(idx);}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 ConnectionGraph* congraph() { return _congraph;}
1634
60a14ad85270 6966411: escape.cpp:450 assert(base->Opcode() == Op_ConP
kvn
parents: 1552
diff changeset
383 void set_congraph(ConnectionGraph* congraph) { _congraph = congraph;}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void add_macro_node(Node * n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 //assert(n->is_macro(), "must be a macro node");
a61af66fc99e Initial load
duke
parents:
diff changeset
386 assert(!_macro_nodes->contains(n), " duplicate entry in expand list");
a61af66fc99e Initial load
duke
parents:
diff changeset
387 _macro_nodes->append(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389 void remove_macro_node(Node * n) {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // this function may be called twice for a node so check
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // that the node is in the array before attempting to remove it
a61af66fc99e Initial load
duke
parents:
diff changeset
392 if (_macro_nodes->contains(n))
a61af66fc99e Initial load
duke
parents:
diff changeset
393 _macro_nodes->remove(n);
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
394 // remove from _predicate_opaqs list also if it is there
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
395 if (predicate_count() > 0 && _predicate_opaqs->contains(n)){
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
396 _predicate_opaqs->remove(n);
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
397 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
1172
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
399 void add_predicate_opaq(Node * n) {
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
400 assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1");
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
401 assert(_macro_nodes->contains(n), "should have already been in macro list");
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
402 _predicate_opaqs->append(n);
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
403 }
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
404 // remove the opaque nodes that protect the predicates so that the unused checks and
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
405 // uncommon traps will be eliminated from the graph.
b2b6a9bf6238 6894779: Loop Predication for Loop Optimizer in C2
cfang
parents: 1080
diff changeset
406 void cleanup_loop_predicates(PhaseIterGVN &igvn);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // Compilation environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
409 Arena* comp_arena() { return &_comp_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 ciEnv* env() const { return _env; }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 CompileLog* log() const { return _log; }
a61af66fc99e Initial load
duke
parents:
diff changeset
412 bool failing() const { return _env->failing() || _failure_reason != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
413 const char* failure_reason() { return _failure_reason; }
a61af66fc99e Initial load
duke
parents:
diff changeset
414 bool failure_reason_is(const char* r) { return (r==_failure_reason) || (r!=NULL && _failure_reason!=NULL && strcmp(r, _failure_reason)==0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
415
a61af66fc99e Initial load
duke
parents:
diff changeset
416 void record_failure(const char* reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
417 void record_method_not_compilable(const char* reason, bool all_tiers = false) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // All bailouts cover "all_tiers" when TieredCompilation is off.
a61af66fc99e Initial load
duke
parents:
diff changeset
419 if (!TieredCompilation) all_tiers = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
420 env()->record_method_not_compilable(reason, all_tiers);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // Record failure reason.
a61af66fc99e Initial load
duke
parents:
diff changeset
422 record_failure(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void record_method_not_compilable_all_tiers(const char* reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
425 record_method_not_compilable(reason, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427 bool check_node_count(uint margin, const char* reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 if (unique() + margin > (uint)MaxNodeLimit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 record_method_not_compilable(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
430 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // Node management
a61af66fc99e Initial load
duke
parents:
diff changeset
437 uint unique() const { return _unique; }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 uint next_unique() { return _unique++; }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 void set_unique(uint i) { _unique = i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
440 static int debug_idx() { return debug_only(_debug_idx)+0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
441 static void set_debug_idx(int i) { debug_only(_debug_idx = i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 Arena* node_arena() { return &_node_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
443 Arena* old_arena() { return &_old_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
444 RootNode* root() const { return _root; }
a61af66fc99e Initial load
duke
parents:
diff changeset
445 void set_root(RootNode* r) { _root = r; }
a61af66fc99e Initial load
duke
parents:
diff changeset
446 StartNode* start() const; // (Derived from root.)
a61af66fc99e Initial load
duke
parents:
diff changeset
447 void init_start(StartNode* s);
a61af66fc99e Initial load
duke
parents:
diff changeset
448 Node* immutable_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 Node* recent_alloc_ctl() const { return _recent_alloc_ctl; }
a61af66fc99e Initial load
duke
parents:
diff changeset
451 Node* recent_alloc_obj() const { return _recent_alloc_obj; }
a61af66fc99e Initial load
duke
parents:
diff changeset
452 void set_recent_alloc(Node* ctl, Node* obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
453 _recent_alloc_ctl = ctl;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 _recent_alloc_obj = obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
456
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Handy undefined Node
a61af66fc99e Initial load
duke
parents:
diff changeset
458 Node* top() const { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
459
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // these are used by guys who need to know about creation and transformation of top:
a61af66fc99e Initial load
duke
parents:
diff changeset
461 Node* cached_top_node() { return _top; }
a61af66fc99e Initial load
duke
parents:
diff changeset
462 void set_cached_top_node(Node* tn);
a61af66fc99e Initial load
duke
parents:
diff changeset
463
a61af66fc99e Initial load
duke
parents:
diff changeset
464 GrowableArray<Node_Notes*>* node_note_array() const { return _node_note_array; }
a61af66fc99e Initial load
duke
parents:
diff changeset
465 void set_node_note_array(GrowableArray<Node_Notes*>* arr) { _node_note_array = arr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
466 Node_Notes* default_node_notes() const { return _default_node_notes; }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 void set_default_node_notes(Node_Notes* n) { _default_node_notes = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 Node_Notes* node_notes_at(int idx) {
a61af66fc99e Initial load
duke
parents:
diff changeset
470 return locate_node_notes(_node_note_array, idx, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 inline bool set_node_notes_at(int idx, Node_Notes* value);
a61af66fc99e Initial load
duke
parents:
diff changeset
473
a61af66fc99e Initial load
duke
parents:
diff changeset
474 // Copy notes from source to dest, if they exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Overwrite dest only if source provides something.
a61af66fc99e Initial load
duke
parents:
diff changeset
476 // Return true if information was moved.
a61af66fc99e Initial load
duke
parents:
diff changeset
477 bool copy_node_notes_to(Node* dest, Node* source);
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479 // Workhorse function to sort out the blocked Node_Notes array:
a61af66fc99e Initial load
duke
parents:
diff changeset
480 inline Node_Notes* locate_node_notes(GrowableArray<Node_Notes*>* arr,
a61af66fc99e Initial load
duke
parents:
diff changeset
481 int idx, bool can_grow = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 void grow_node_notes(GrowableArray<Node_Notes*>* arr, int grow_by);
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // Type management
a61af66fc99e Initial load
duke
parents:
diff changeset
486 Arena* type_arena() { return _type_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
487 Dict* type_dict() { return _type_dict; }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void* type_hwm() { return _type_hwm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
489 size_t type_last_size() { return _type_last_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 int num_alias_types() { return _num_alias_types; }
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 void init_type_arena() { _type_arena = &_Compile_types; }
a61af66fc99e Initial load
duke
parents:
diff changeset
493 void set_type_arena(Arena* a) { _type_arena = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
494 void set_type_dict(Dict* d) { _type_dict = d; }
a61af66fc99e Initial load
duke
parents:
diff changeset
495 void set_type_hwm(void* p) { _type_hwm = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void set_type_last_size(size_t sz) { _type_last_size = sz; }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 const TypeFunc* last_tf(ciMethod* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
499 return (m == _last_tf_m) ? _last_tf : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 void set_last_tf(ciMethod* m, const TypeFunc* tf) {
a61af66fc99e Initial load
duke
parents:
diff changeset
502 assert(m != NULL || tf == NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
503 _last_tf_m = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
504 _last_tf = tf;
a61af66fc99e Initial load
duke
parents:
diff changeset
505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 AliasType* alias_type(int idx) { assert(idx < num_alias_types(), "oob"); return _alias_types[idx]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
508 AliasType* alias_type(const TypePtr* adr_type) { return find_alias_type(adr_type, false); }
a61af66fc99e Initial load
duke
parents:
diff changeset
509 bool have_alias_type(const TypePtr* adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
510 AliasType* alias_type(ciField* field);
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 int get_alias_index(const TypePtr* at) { return alias_type(at)->index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
513 const TypePtr* get_adr_type(uint aidx) { return alias_type(aidx)->adr_type(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 int get_general_index(uint aidx) { return alias_type(aidx)->general_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // Building nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
517 void rethrow_exceptions(JVMState* jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
518 void return_values(JVMState* jvms);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 JVMState* build_start_state(StartNode* start, const TypeFunc* tf);
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // Decide how to build a call.
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // The profile factor is a discount to apply to this site's interp. profile.
a61af66fc99e Initial load
duke
parents:
diff changeset
523 CallGenerator* call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, JVMState* jvms, bool allow_inline, float profile_factor);
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
524 bool should_delay_inlining(ciMethod* call_method, JVMState* jvms);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // Report if there were too many traps at a current method and bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
527 // Report if a trap was recorded, and/or PerMethodTrapLimit was exceeded.
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // If there is no MDO at all, report no trap unless told to assume it.
a61af66fc99e Initial load
duke
parents:
diff changeset
529 bool too_many_traps(ciMethod* method, int bci, Deoptimization::DeoptReason reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // This version, unspecific to a particular bci, asks if
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // PerMethodTrapLimit was exceeded for all inlined methods seen so far.
a61af66fc99e Initial load
duke
parents:
diff changeset
532 bool too_many_traps(Deoptimization::DeoptReason reason,
a61af66fc99e Initial load
duke
parents:
diff changeset
533 // Privately used parameter for logging:
a61af66fc99e Initial load
duke
parents:
diff changeset
534 ciMethodData* logmd = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // Report if there were too many recompiles at a method and bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
536 bool too_many_recompiles(ciMethod* method, int bci, Deoptimization::DeoptReason reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 // Parsing, optimization
a61af66fc99e Initial load
duke
parents:
diff changeset
539 PhaseGVN* initial_gvn() { return _initial_gvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
540 Unique_Node_List* for_igvn() { return _for_igvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
541 inline void record_for_igvn(Node* n); // Body is after class Unique_Node_List.
a61af66fc99e Initial load
duke
parents:
diff changeset
542 void set_initial_gvn(PhaseGVN *gvn) { _initial_gvn = gvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
543 void set_for_igvn(Unique_Node_List *for_igvn) { _for_igvn = for_igvn; }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
545 // Replace n by nn using initial_gvn, calling hash_delete and
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
546 // record_for_igvn as needed.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
547 void gvn_replace_by(Node* n, Node* nn);
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
548
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
549
0
a61af66fc99e Initial load
duke
parents:
diff changeset
550 void identify_useful_nodes(Unique_Node_List &useful);
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void remove_useless_nodes (Unique_Node_List &useful);
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 WarmCallInfo* warm_calls() const { return _warm_calls; }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 void set_warm_calls(WarmCallInfo* l) { _warm_calls = l; }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 WarmCallInfo* pop_warm_call();
a61af66fc99e Initial load
duke
parents:
diff changeset
556
1080
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
557 // Record this CallGenerator for inlining at the end of parsing.
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
558 void add_late_inline(CallGenerator* cg) { _late_inlines.push(cg); }
7c57aead6d3e 6892658: C2 should optimize some stringbuilder patterns
never
parents: 948
diff changeset
559
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Matching, CFG layout, allocation, code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
561 PhaseCFG* cfg() { return _cfg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 bool select_24_bit_instr() const { return _select_24_bit_instr; }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 bool in_24_bit_fp_mode() const { return _in_24_bit_fp_mode; }
859
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
564 bool has_java_calls() const { return _java_calls > 0; }
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
565 int java_calls() const { return _java_calls; }
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
566 int inner_loops() const { return _inner_loops; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
567 Matcher* matcher() { return _matcher; }
a61af66fc99e Initial load
duke
parents:
diff changeset
568 PhaseRegAlloc* regalloc() { return _regalloc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
569 int frame_slots() const { return _frame_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
570 int frame_size_in_words() const; // frame_slots in units of the polymorphic 'words'
a61af66fc99e Initial load
duke
parents:
diff changeset
571 RegMask& FIRST_STACK_mask() { return _FIRST_STACK_mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
572 Arena* indexSet_arena() { return _indexSet_arena; }
a61af66fc99e Initial load
duke
parents:
diff changeset
573 void* indexSet_free_block_list() { return _indexSet_free_block_list; }
a61af66fc99e Initial load
duke
parents:
diff changeset
574 uint node_bundling_limit() { return _node_bundling_limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
575 Bundle* node_bundling_base() { return _node_bundling_base; }
a61af66fc99e Initial load
duke
parents:
diff changeset
576 void set_node_bundling_limit(uint n) { _node_bundling_limit = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void set_node_bundling_base(Bundle* b) { _node_bundling_base = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
578 bool starts_bundle(const Node *n) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
579 bool need_stack_bang(int frame_size_in_bytes) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
580 bool need_register_stack_bang() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582 void set_matcher(Matcher* m) { _matcher = m; }
a61af66fc99e Initial load
duke
parents:
diff changeset
583 //void set_regalloc(PhaseRegAlloc* ra) { _regalloc = ra; }
a61af66fc99e Initial load
duke
parents:
diff changeset
584 void set_indexSet_arena(Arena* a) { _indexSet_arena = a; }
a61af66fc99e Initial load
duke
parents:
diff changeset
585 void set_indexSet_free_block_list(void* p) { _indexSet_free_block_list = p; }
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // Remember if this compilation changes hardware mode to 24-bit precision
a61af66fc99e Initial load
duke
parents:
diff changeset
588 void set_24_bit_selection_and_mode(bool selection, bool mode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _select_24_bit_instr = selection;
a61af66fc99e Initial load
duke
parents:
diff changeset
590 _in_24_bit_fp_mode = mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 }
a61af66fc99e Initial load
duke
parents:
diff changeset
592
859
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
593 void set_java_calls(int z) { _java_calls = z; }
ea3f9723b5cf 6860599: nodes limit could be reached during Output phase
kvn
parents: 418
diff changeset
594 void set_inner_loops(int z) { _inner_loops = z; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // Instruction bits passed off to the VM
a61af66fc99e Initial load
duke
parents:
diff changeset
597 int code_size() { return _method_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
598 CodeBuffer* code_buffer() { return &_code_buffer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
599 int first_block_size() { return _first_block_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void set_frame_complete(int off) { _code_offsets.set_value(CodeOffsets::Frame_Complete, off); }
a61af66fc99e Initial load
duke
parents:
diff changeset
601 ExceptionHandlerTable* handler_table() { return &_handler_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 ImplicitExceptionTable* inc_table() { return &_inc_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
603 OopMapSet* oop_map_set() { return _oop_map_set; }
a61af66fc99e Initial load
duke
parents:
diff changeset
604 DebugInformationRecorder* debug_info() { return env()->debug_info(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 Dependencies* dependencies() { return env()->dependencies(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
606 static int CompiledZap_count() { return _CompiledZap_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
607 BufferBlob* scratch_buffer_blob() { return _scratch_buffer_blob; }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 void init_scratch_buffer_blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
609 void set_scratch_buffer_blob(BufferBlob* b) { _scratch_buffer_blob = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
610 relocInfo* scratch_locs_memory() { return _scratch_locs_memory; }
a61af66fc99e Initial load
duke
parents:
diff changeset
611 void set_scratch_locs_memory(relocInfo* b) { _scratch_locs_memory = b; }
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // emit to scratch blob, report resulting size
a61af66fc99e Initial load
duke
parents:
diff changeset
614 uint scratch_emit_size(const Node* n);
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616 enum ScratchBufferBlob {
a61af66fc99e Initial load
duke
parents:
diff changeset
617 MAX_inst_size = 1024,
a61af66fc99e Initial load
duke
parents:
diff changeset
618 MAX_locs_size = 128, // number of relocInfo elements
a61af66fc99e Initial load
duke
parents:
diff changeset
619 MAX_const_size = 128,
a61af66fc99e Initial load
duke
parents:
diff changeset
620 MAX_stubs_size = 128
a61af66fc99e Initial load
duke
parents:
diff changeset
621 };
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Major entry point. Given a Scope, compile the associated method.
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // For normal compilations, entry_bci is InvocationEntryBci. For on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // replacement, entry_bci indicates the bytecode for which to compile a
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // continuation.
a61af66fc99e Initial load
duke
parents:
diff changeset
627 Compile(ciEnv* ci_env, C2Compiler* compiler, ciMethod* target,
38
b789bcaf2dd9 6667610: (Escape Analysis) retry compilation without EA if it fails
kvn
parents: 0
diff changeset
628 int entry_bci, bool subsume_loads, bool do_escape_analysis);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // Second major entry point. From the TypeFunc signature, generate code
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // to pass arguments from the Java calling convention to the C calling
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // convention.
a61af66fc99e Initial load
duke
parents:
diff changeset
633 Compile(ciEnv* ci_env, const TypeFunc *(*gen)(),
a61af66fc99e Initial load
duke
parents:
diff changeset
634 address stub_function, const char *stub_name,
a61af66fc99e Initial load
duke
parents:
diff changeset
635 int is_fancy_jump, bool pass_tls,
a61af66fc99e Initial load
duke
parents:
diff changeset
636 bool save_arg_registers, bool return_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 // From the TypeFunc signature, generate code to pass arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // from Compiled calling convention to Interpreter's calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
640 void Generate_Compiled_To_Interpreter_Graph(const TypeFunc *tf, address interpreter_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
641
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // From the TypeFunc signature, generate code to pass arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // from Interpreter's calling convention to Compiler's calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
644 void Generate_Interpreter_To_Compiled_Graph(const TypeFunc *tf);
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // Are we compiling a method?
a61af66fc99e Initial load
duke
parents:
diff changeset
647 bool has_method() { return method() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
648
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // Maybe print some information about this compile.
a61af66fc99e Initial load
duke
parents:
diff changeset
650 void print_compile_messages();
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // Final graph reshaping, a post-pass after the regular optimizer is done.
a61af66fc99e Initial load
duke
parents:
diff changeset
653 bool final_graph_reshaping();
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // returns true if adr is completely contained in the given alias category
a61af66fc99e Initial load
duke
parents:
diff changeset
656 bool must_alias(const TypePtr* adr, int alias_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // returns true if adr overlaps with the given alias category
a61af66fc99e Initial load
duke
parents:
diff changeset
659 bool can_alias(const TypePtr* adr, int alias_idx);
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // Driver for converting compiler's IR into machine code bits
a61af66fc99e Initial load
duke
parents:
diff changeset
662 void Output();
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // Accessors for node bundling info.
a61af66fc99e Initial load
duke
parents:
diff changeset
665 Bundle* node_bundling(const Node *n);
a61af66fc99e Initial load
duke
parents:
diff changeset
666 bool valid_bundle_info(const Node *n);
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // Schedule and Bundle the instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
669 void ScheduleAndBundle();
a61af66fc99e Initial load
duke
parents:
diff changeset
670
a61af66fc99e Initial load
duke
parents:
diff changeset
671 // Build OopMaps for each GC point
a61af66fc99e Initial load
duke
parents:
diff changeset
672 void BuildOopMaps();
63
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
673
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
674 // Append debug info for the node "local" at safepoint node "sfpt" to the
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
675 // "array", May also consult and add to "objs", which describes the
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
676 // scalar-replaced objects.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
677 void FillLocArray( int idx, MachSafePointNode* sfpt,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
678 Node *local, GrowableArray<ScopeValue*> *array,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
679 GrowableArray<ScopeValue*> *objs );
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
680
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
681 // If "objs" contains an ObjectValue whose id is "id", returns it, else NULL.
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
682 static ObjectValue* sv_for_node_id(GrowableArray<ScopeValue*> *objs, int id);
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
683 // Requres that "objs" does not contains an ObjectValue whose id matches
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
684 // that of "sv. Appends "sv".
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
685 static void set_sv_for_object_node(GrowableArray<ScopeValue*> *objs,
eac007780a58 6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint
kvn
parents: 38
diff changeset
686 ObjectValue* sv );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
687
a61af66fc99e Initial load
duke
parents:
diff changeset
688 // Process an OopMap Element while emitting nodes
a61af66fc99e Initial load
duke
parents:
diff changeset
689 void Process_OopMap_Node(MachNode *mach, int code_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // Write out basic block data to code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
692 void Fill_buffer();
a61af66fc99e Initial load
duke
parents:
diff changeset
693
a61af66fc99e Initial load
duke
parents:
diff changeset
694 // Determine which variable sized branches can be shortened
a61af66fc99e Initial load
duke
parents:
diff changeset
695 void Shorten_branches(Label *labels, int& code_size, int& reloc_size, int& stub_size, int& const_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697 // Compute the size of first NumberOfLoopInstrToAlign instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // at the head of a loop.
a61af66fc99e Initial load
duke
parents:
diff changeset
699 void compute_loop_first_inst_sizes();
a61af66fc99e Initial load
duke
parents:
diff changeset
700
a61af66fc99e Initial load
duke
parents:
diff changeset
701 // Compute the information for the exception tables
a61af66fc99e Initial load
duke
parents:
diff changeset
702 void FillExceptionTables(uint cnt, uint *call_returns, uint *inct_starts, Label *blk_labels);
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // Stack slots that may be unused by the calling convention but must
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // otherwise be preserved. On Intel this includes the return address.
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // On PowerPC it includes the 4 words holding the old TOC & LR glue.
a61af66fc99e Initial load
duke
parents:
diff changeset
707 uint in_preserve_stack_slots();
a61af66fc99e Initial load
duke
parents:
diff changeset
708
a61af66fc99e Initial load
duke
parents:
diff changeset
709 // "Top of Stack" slots that may be unused by the calling convention but must
a61af66fc99e Initial load
duke
parents:
diff changeset
710 // otherwise be preserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // On Intel these are not necessary and the value can be zero.
a61af66fc99e Initial load
duke
parents:
diff changeset
712 // On Sparc this describes the words reserved for storing a register window
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // when an interrupt occurs.
a61af66fc99e Initial load
duke
parents:
diff changeset
714 static uint out_preserve_stack_slots();
a61af66fc99e Initial load
duke
parents:
diff changeset
715
a61af66fc99e Initial load
duke
parents:
diff changeset
716 // Number of outgoing stack slots killed above the out_preserve_stack_slots
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // for calls to C. Supports the var-args backing area for register parms.
a61af66fc99e Initial load
duke
parents:
diff changeset
718 uint varargs_C_out_slots_killed() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // Number of Stack Slots consumed by a synchronization entry
a61af66fc99e Initial load
duke
parents:
diff changeset
721 int sync_stack_slots() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // Compute the name of old_SP. See <arch>.ad for frame layout.
a61af66fc99e Initial load
duke
parents:
diff changeset
724 OptoReg::Name compute_old_SP();
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
727 static bool is_node_getting_a_safepoint(Node*);
a61af66fc99e Initial load
duke
parents:
diff changeset
728 void Insert_zap_nodes();
a61af66fc99e Initial load
duke
parents:
diff changeset
729 Node* call_zap_node(MachSafePointNode* n, int block_no);
a61af66fc99e Initial load
duke
parents:
diff changeset
730 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
733 // Phase control:
a61af66fc99e Initial load
duke
parents:
diff changeset
734 void Init(int aliaslevel); // Prepare for a single compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
735 int Inline_Warm(); // Find more inlining work.
a61af66fc99e Initial load
duke
parents:
diff changeset
736 void Finish_Warm(); // Give up on further inlines.
a61af66fc99e Initial load
duke
parents:
diff changeset
737 void Optimize(); // Given a graph, optimize it
a61af66fc99e Initial load
duke
parents:
diff changeset
738 void Code_Gen(); // Generate code from a graph
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // Management of the AliasType table.
a61af66fc99e Initial load
duke
parents:
diff changeset
741 void grow_alias_types();
a61af66fc99e Initial load
duke
parents:
diff changeset
742 AliasCacheEntry* probe_alias_cache(const TypePtr* adr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
743 const TypePtr *flatten_alias_type(const TypePtr* adr_type) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
744 AliasType* find_alias_type(const TypePtr* adr_type, bool no_create);
a61af66fc99e Initial load
duke
parents:
diff changeset
745
a61af66fc99e Initial load
duke
parents:
diff changeset
746 void verify_top(Node*) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
747
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // Intrinsic setup.
a61af66fc99e Initial load
duke
parents:
diff changeset
749 void register_library_intrinsics(); // initializer
a61af66fc99e Initial load
duke
parents:
diff changeset
750 CallGenerator* make_vm_intrinsic(ciMethod* m, bool is_virtual); // constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
751 int intrinsic_insertion_index(ciMethod* m, bool is_virtual); // helper
a61af66fc99e Initial load
duke
parents:
diff changeset
752 CallGenerator* find_intrinsic(ciMethod* m, bool is_virtual); // query fn
a61af66fc99e Initial load
duke
parents:
diff changeset
753 void register_intrinsic(CallGenerator* cg); // update fn
a61af66fc99e Initial load
duke
parents:
diff changeset
754
a61af66fc99e Initial load
duke
parents:
diff changeset
755 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
756 static juint _intrinsic_hist_count[vmIntrinsics::ID_LIMIT];
a61af66fc99e Initial load
duke
parents:
diff changeset
757 static jubyte _intrinsic_hist_flags[vmIntrinsics::ID_LIMIT];
a61af66fc99e Initial load
duke
parents:
diff changeset
758 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
759
a61af66fc99e Initial load
duke
parents:
diff changeset
760 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
761
a61af66fc99e Initial load
duke
parents:
diff changeset
762 // Note: Histogram array size is about 1 Kb.
a61af66fc99e Initial load
duke
parents:
diff changeset
763 enum { // flag bits:
a61af66fc99e Initial load
duke
parents:
diff changeset
764 _intrinsic_worked = 1, // succeeded at least once
a61af66fc99e Initial load
duke
parents:
diff changeset
765 _intrinsic_failed = 2, // tried it but it failed
a61af66fc99e Initial load
duke
parents:
diff changeset
766 _intrinsic_disabled = 4, // was requested but disabled (e.g., -XX:-InlineUnsafeOps)
a61af66fc99e Initial load
duke
parents:
diff changeset
767 _intrinsic_virtual = 8, // was seen in the virtual form (rare)
a61af66fc99e Initial load
duke
parents:
diff changeset
768 _intrinsic_both = 16 // was seen in the non-virtual form (usual)
a61af66fc99e Initial load
duke
parents:
diff changeset
769 };
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // Update histogram. Return boolean if this is a first-time occurrence.
a61af66fc99e Initial load
duke
parents:
diff changeset
771 static bool gather_intrinsic_statistics(vmIntrinsics::ID id,
a61af66fc99e Initial load
duke
parents:
diff changeset
772 bool is_virtual, int flags) PRODUCT_RETURN0;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 static void print_intrinsic_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
774
a61af66fc99e Initial load
duke
parents:
diff changeset
775 // Graph verification code
a61af66fc99e Initial load
duke
parents:
diff changeset
776 // Walk the node list, verifying that there is a one-to-one
a61af66fc99e Initial load
duke
parents:
diff changeset
777 // correspondence between Use-Def edges and Def-Use edges
a61af66fc99e Initial load
duke
parents:
diff changeset
778 // The option no_dead_code enables stronger checks that the
a61af66fc99e Initial load
duke
parents:
diff changeset
779 // graph is strongly connected from root in both directions.
a61af66fc99e Initial load
duke
parents:
diff changeset
780 void verify_graph_edges(bool no_dead_code = false) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782 // Print bytecodes, including the scope inlining tree
a61af66fc99e Initial load
duke
parents:
diff changeset
783 void print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
784
a61af66fc99e Initial load
duke
parents:
diff changeset
785 // End-of-run dumps.
a61af66fc99e Initial load
duke
parents:
diff changeset
786 static void print_statistics() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Dump formatted assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
789 void dump_asm(int *pcs = NULL, uint pc_limit = 0) PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
790 void dump_pc(int *pcs, int pc_limit, Node *n);
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // Verify ADLC assumptions during startup
a61af66fc99e Initial load
duke
parents:
diff changeset
793 static void adlc_verification() PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // Definitions of pd methods
a61af66fc99e Initial load
duke
parents:
diff changeset
796 static void pd_compiler2_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
797 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
798
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1634
diff changeset
799 #endif // SHARE_VM_OPTO_COMPILE_HPP