annotate src/share/vm/c1/c1_Compilation.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 0bf37f737702
children 52b4284cb496
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
12146
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 8860
diff changeset
2 * Copyright (c) 1999, 2013, 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: 1899
diff changeset
25 #ifndef SHARE_VM_C1_C1_COMPILATION_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
26 #define SHARE_VM_C1_C1_COMPILATION_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
28 #include "ci/ciEnv.hpp"
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
29 #include "ci/ciMethodData.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
30 #include "code/exceptionHandlerTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
31 #include "memory/resourceArea.hpp"
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
32 #include "runtime/deoptimization.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
33
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34 class CompilationResourceObj;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class XHandlers;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class ExceptionInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class DebugInformationRecorder;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class FrameMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class IR;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class IRScope;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class Instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class LinearScan;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 class OopMap;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class LIR_Emitter;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 class LIR_Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 class CodeEmitInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ciEnv;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 class ciMethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 class ValueStack;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 class C1_MacroAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class CFGPrinter;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 typedef LIR_OprDesc* LIR_Opr;
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 define_array(BasicTypeArray, BasicType)
a61af66fc99e Initial load
duke
parents:
diff changeset
57 define_stack(BasicTypeList, BasicTypeArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 define_array(ExceptionInfoArray, ExceptionInfo*)
a61af66fc99e Initial load
duke
parents:
diff changeset
60 define_stack(ExceptionInfoList, ExceptionInfoArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class Compilation: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 friend class CompilationResourceObj;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // compilation specifics
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
66 Arena* _arena;
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
67 int _next_id;
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
68 int _next_block_id;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
69 AbstractCompiler* _compiler;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 ciEnv* _env;
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6792
diff changeset
71 CompileLog* _log;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 ciMethod* _method;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 int _osr_bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 IR* _hir;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 int _max_spills;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 FrameMap* _frame_map;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 C1_MacroAssembler* _masm;
a61af66fc99e Initial load
duke
parents:
diff changeset
78 bool _has_exception_handlers;
a61af66fc99e Initial load
duke
parents:
diff changeset
79 bool _has_fpu_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 bool _has_unsafe_access;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
81 bool _would_profile;
1691
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1681
diff changeset
82 bool _has_method_handle_invokes; // True if this method has MethodHandle invokes.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 const char* _bailout_msg;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 ExceptionInfoList* _exception_info_list;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 ExceptionHandlerTable _exception_handler_table;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 ImplicitExceptionTable _implicit_exception_table;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 LinearScan* _allocator;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 CodeOffsets _offsets;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 CodeBuffer _code;
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
90 bool _has_access_indexed;
17980
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
91 int _interpreter_frame_size; // Stack space needed in case of a deoptimization
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // compilation helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
94 void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
95 void build_hir();
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void emit_lir();
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void emit_code_epilog(LIR_Assembler* assembler);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 int emit_code_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 int compile_java_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void install_code(int frame_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 void compile_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void generate_exception_handler_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 ExceptionInfoList* exception_info_list() const { return _exception_info_list; }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 ExceptionHandlerTable* exception_handler_table() { return &_exception_handler_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 LinearScan* allocator() { return _allocator; }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 void set_allocator(LinearScan* allocator) { _allocator = allocator; }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 Instruction* _current_instruction; // the instruction currently being processed
a61af66fc99e Initial load
duke
parents:
diff changeset
114 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
115 Instruction* _last_instruction_printed; // the last instruction printed during traversal
a61af66fc99e Initial load
duke
parents:
diff changeset
116 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
119 // creation
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
120 Compilation(AbstractCompiler* compiler, ciEnv* env, ciMethod* method,
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
121 int osr_bci, BufferBlob* buffer_blob);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ~Compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
123
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
124
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
125 static Compilation* current() {
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
126 return (Compilation*) ciEnv::current()->compiler_data();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
127 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
130 ciEnv* env() const { return _env; }
6843
c3e799c37717 7177003: C1: LogCompilation support
vlivanov
parents: 6792
diff changeset
131 CompileLog* log() const { return _log; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 AbstractCompiler* compiler() const { return _compiler; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133 bool has_exception_handlers() const { return _has_exception_handlers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
134 bool has_fpu_code() const { return _has_fpu_code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
135 bool has_unsafe_access() const { return _has_unsafe_access; }
6792
137868b7aa6f 7196199: java/text/Bidi/Bug6665028.java failed: Bidi run count incorrect
kvn
parents: 2426
diff changeset
136 int max_vector_size() const { return 0; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 ciMethod* method() const { return _method; }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int osr_bci() const { return _osr_bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 bool is_osr_compile() const { return osr_bci() >= 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
140 IR* hir() const { return _hir; }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 int max_spills() const { return _max_spills; }
a61af66fc99e Initial load
duke
parents:
diff changeset
142 FrameMap* frame_map() const { return _frame_map; }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 CodeBuffer* code() { return &_code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 C1_MacroAssembler* masm() const { return _masm; }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 CodeOffsets* offsets() { return &_offsets; }
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
146 Arena* arena() { return _arena; }
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
147 bool has_access_indexed() { return _has_access_indexed; }
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
148
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
149 // Instruction ids
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
150 int get_next_id() { return _next_id++; }
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
151 int number_of_instructions() const { return _next_id; }
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
152
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
153 // BlockBegin ids
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
154 int get_next_block_id() { return _next_block_id++; }
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
155 int number_of_blocks() const { return _next_block_id; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // setters
a61af66fc99e Initial load
duke
parents:
diff changeset
158 void set_has_exception_handlers(bool f) { _has_exception_handlers = f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void set_has_fpu_code(bool f) { _has_fpu_code = f; }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 void set_has_unsafe_access(bool f) { _has_unsafe_access = f; }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
161 void set_would_profile(bool f) { _would_profile = f; }
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
162 void set_has_access_indexed(bool f) { _has_access_indexed = f; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163 // Add a set of exception handlers covering the given PC offset
a61af66fc99e Initial load
duke
parents:
diff changeset
164 void add_exception_handlers_for_pco(int pco, XHandlers* exception_handlers);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Statistics gathering
a61af66fc99e Initial load
duke
parents:
diff changeset
166 void notice_inlined_method(ciMethod* method);
a61af66fc99e Initial load
duke
parents:
diff changeset
167
1691
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1681
diff changeset
168 // JSR 292
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1681
diff changeset
169 bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1681
diff changeset
170 void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
4a665be40fd3 6975855: don't emit deopt MH handler in C1 if not required
twisti
parents: 1681
diff changeset
171
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 DebugInformationRecorder* debug_info_recorder() const; // = _env->debug_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
173 Dependencies* dependency_recorder() const; // = _env->dependencies()
a61af66fc99e Initial load
duke
parents:
diff changeset
174 ImplicitExceptionTable* implicit_exception_table() { return &_implicit_exception_table; }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Instruction* current_instruction() const { return _current_instruction; }
a61af66fc99e Initial load
duke
parents:
diff changeset
177 Instruction* set_current_instruction(Instruction* instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 Instruction* previous = _current_instruction;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 _current_instruction = instr;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return previous;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
184 void maybe_print_current_instruction();
a61af66fc99e Initial load
duke
parents:
diff changeset
185 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // error handling
a61af66fc99e Initial load
duke
parents:
diff changeset
188 void bailout(const char* msg);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 bool bailed_out() const { return _bailout_msg != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 const char* bailout_msg() const { return _bailout_msg; }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
192 static int desired_max_code_buffer_size() {
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1584
diff changeset
193 #ifndef PPC
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
194 return (int) NMethodSizeLimit; // default 256K or 512K
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1584
diff changeset
195 #else
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1584
diff changeset
196 // conditional branches on PPC are restricted to 16 bit signed
1899
42a10fc37986 6991577: add IfOp optimization to C1
roland
parents: 1819
diff changeset
197 return MIN2((unsigned int)NMethodSizeLimit,32*K);
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1584
diff changeset
198 #endif
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
199 }
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
200 static int desired_max_constant_size() {
1899
42a10fc37986 6991577: add IfOp optimization to C1
roland
parents: 1819
diff changeset
201 return desired_max_code_buffer_size() / 10;
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
202 }
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
203
2098
2f9d59b0fa5c 7009268: guarantee(middle - slop > start) failed: need enough space to divide up
bobv
parents: 1972
diff changeset
204 static bool setup_code_buffer(CodeBuffer* cb, int call_stub_estimate);
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
205
0
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // timers
a61af66fc99e Initial load
duke
parents:
diff changeset
207 static void print_timers();
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // debugging support.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // produces a file named c1compileonly in the current directory with
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // directives to compile only the current method and it's inlines.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // The file can be passed to the command line option -XX:Flags=<filename>
a61af66fc99e Initial load
duke
parents:
diff changeset
214 void compile_only_this_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 void compile_only_this_scope(outputStream* st, IRScope* scope);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void exclude_this_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
217 #endif // PRODUCT
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
218
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
219 bool is_profiling() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
220 return env()->comp_level() == CompLevel_full_profile ||
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
221 env()->comp_level() == CompLevel_limited_profile;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
222 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
223 bool count_invocations() { return is_profiling(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
224 bool count_backedges() { return is_profiling(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
225
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
226 // Helpers for generation of profile information
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
227 bool profile_branches() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
228 return env()->comp_level() == CompLevel_full_profile &&
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
229 C1UpdateMethodData && C1ProfileBranches;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
230 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
231 bool profile_calls() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
232 return env()->comp_level() == CompLevel_full_profile &&
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
233 C1UpdateMethodData && C1ProfileCalls;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
234 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
235 bool profile_inlined_calls() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
236 return profile_calls() && C1ProfileInlinedCalls;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
237 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
238 bool profile_checkcasts() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
239 return env()->comp_level() == CompLevel_full_profile &&
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
240 C1UpdateMethodData && C1ProfileCheckcasts;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1691
diff changeset
241 }
12962
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
242 bool profile_parameters() {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
243 return env()->comp_level() == CompLevel_full_profile &&
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
244 C1UpdateMethodData && MethodData::profile_parameters();
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
245 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
246 bool profile_arguments() {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
247 return env()->comp_level() == CompLevel_full_profile &&
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
248 C1UpdateMethodData && MethodData::profile_arguments();
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
249 }
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
250 bool profile_return() {
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
251 return env()->comp_level() == CompLevel_full_profile &&
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
252 C1UpdateMethodData && MethodData::profile_return();
5ccbab1c69f3 8026251: New type profiling points: parameters to methods
roland
parents: 12875
diff changeset
253 }
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
254 // will compilation make optimistic assumptions that might lead to
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
255 // deoptimization and that the runtime will account for?
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
256 bool is_optimistic() const {
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
257 return !TieredCompilation &&
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
258 (RangeCheckElimination || UseLoopInvariantCodeMotion) &&
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
259 method()->method_data()->trap_count(Deoptimization::Reason_none) == 0;
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 6853
diff changeset
260 }
12875
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12146
diff changeset
261
d13d7aba8c12 8023657: New type profiling points: arguments to call
roland
parents: 12146
diff changeset
262 ciKlass* cha_exact_type(ciType* type);
17622
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12962
diff changeset
263
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12962
diff changeset
264 // Dump inlining replay data to the stream.
849eb7bfceac 8028468: Add inlining information into ciReplay
kvn
parents: 12962
diff changeset
265 void dump_inline_data(outputStream* out) { /* do nothing now */ }
17980
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
266
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
267 // How much stack space would the interpreter need in case of a
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
268 // deoptimization (worst case)
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
269 void update_interpreter_frame_size(int size) {
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
270 if (_interpreter_frame_size < size) {
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
271 _interpreter_frame_size = size;
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
272 }
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
273 }
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
274
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
275 int interpreter_frame_size() const {
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
276 return _interpreter_frame_size;
0bf37f737702 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 17622
diff changeset
277 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 };
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // Macro definitions for unified bailout-support
a61af66fc99e Initial load
duke
parents:
diff changeset
282 // The methods bailout() and bailed_out() are present in all classes
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // that might bailout, but forward all calls to Compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
284 #define BAILOUT(msg) { bailout(msg); return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 #define BAILOUT_(msg, res) { bailout(msg); return res; }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 #define CHECK_BAILOUT() { if (bailed_out()) return; }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 #define CHECK_BAILOUT_(res) { if (bailed_out()) return res; }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 class InstructionMark: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
293 Compilation* _compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
294 Instruction* _previous;
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
297 InstructionMark(Compilation* compilation, Instruction* instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 _compilation = compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 _previous = _compilation->set_current_instruction(instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 ~InstructionMark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 _compilation->set_current_instruction(_previous);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 };
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 //----------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // Base class for objects allocated by the compiler in the compilation arena
a61af66fc99e Initial load
duke
parents:
diff changeset
309 class CompilationResourceObj ALLOCATION_SUPER_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 public:
12146
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 8860
diff changeset
311 void* operator new(size_t size) throw() { return Compilation::current()->arena()->Amalloc(size); }
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 8860
diff changeset
312 void* operator new(size_t size, Arena* arena) throw() {
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
313 return arena->Amalloc(size);
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
314 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void operator delete(void* p) {} // nothing to do
a61af66fc99e Initial load
duke
parents:
diff changeset
316 };
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 //----------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // Class for aggregating exception handler information.
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // Effectively extends XHandlers class with PC offset of
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // potentially exception-throwing instruction.
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // This class is used at the end of the compilation to build the
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // ExceptionHandlerTable.
a61af66fc99e Initial load
duke
parents:
diff changeset
326 class ExceptionInfo: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
328 int _pco; // PC of potentially exception-throwing instruction
a61af66fc99e Initial load
duke
parents:
diff changeset
329 XHandlers* _exception_handlers; // flat list of exception handlers covering this PC
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
332 ExceptionInfo(int pco, XHandlers* exception_handlers)
a61af66fc99e Initial load
duke
parents:
diff changeset
333 : _pco(pco)
a61af66fc99e Initial load
duke
parents:
diff changeset
334 , _exception_handlers(exception_handlers)
a61af66fc99e Initial load
duke
parents:
diff changeset
335 { }
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 int pco() { return _pco; }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 XHandlers* exception_handlers() { return _exception_handlers; }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
340
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1899
diff changeset
341 #endif // SHARE_VM_C1_C1_COMPILATION_HPP