Mercurial > hg > truffle
annotate src/share/vm/runtime/deoptimization.hpp @ 9126:bc26f978b0ce
HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly
don't use the (wrong) cached value, but ask the runtime on each request.
Fixes regression on xml.* benchmarks @ specjvm2008. The problem was:
After the constructor of Object was deoptimized due to an assumption violation,
it was recompiled again after some time. However, on recompilation, the value
of hasFinalizeSubclass for the class was not updated and it was compiled again
with a, now wrong, assumption, which then triggers deoptimization again.
This was repeated until it hit the recompilation limit (defined by
PerMethodRecompilationCutoff), and therefore only executed by the interpreter
from now on, causing the performance regression.
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Mon, 15 Apr 2013 19:54:58 +0200 |
parents | d343737786fe |
children | 359f7e70ae7f |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6197
diff
changeset
|
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1206
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1206
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:
1206
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_RUNTIME_DEOPTIMIZATION_HPP |
26 #define SHARE_VM_RUNTIME_DEOPTIMIZATION_HPP | |
27 | |
28 #include "memory/allocation.hpp" | |
29 #include "runtime/frame.inline.hpp" | |
30 | |
0 | 31 class ProfileData; |
32 class vframeArray; | |
33 class MonitorValue; | |
34 class ObjectValue; | |
35 | |
36 class Deoptimization : AllStatic { | |
3939 | 37 friend class VMStructs; |
38 | |
0 | 39 public: |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7154
diff
changeset
|
40 // What condition caused the deoptimization? |
0 | 41 enum DeoptReason { |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
42 Reason_many = -1, // indicates presence of several reasons |
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
43 Reason_none = 0, // indicates absence of a relevant deopt. |
5114
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
44 // Next 7 reasons are recorded per bytecode in DataLayout::trap_bits. |
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
45 // This is more complicated for Graal as Graal may deoptimize to *some* bytecode before the |
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
46 // bytecode that actually caused the deopt (with inlining, Graal may even deoptimize to a |
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
47 // bytecode in another method): |
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
48 // - bytecode y in method b() causes deopt |
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
49 // - Graal deoptimizes to bytecode x in method a() |
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
50 // -> the deopt reason will be recorded for method a() at bytecode x |
0 | 51 Reason_null_check, // saw unexpected null or zero divisor (@bci) |
52 Reason_null_assert, // saw unexpected non-null or non-zero (@bci) | |
53 Reason_range_check, // saw unexpected array index (@bci) | |
54 Reason_class_check, // saw unexpected object class (@bci) | |
55 Reason_array_check, // saw unexpected array class (aastore @bci) | |
56 Reason_intrinsic, // saw unexpected operand to intrinsic (@bci) | |
1206
87684f1a88b5
6614597: Performance variability in jvm2008 xml.validation
kvn
parents:
1172
diff
changeset
|
57 Reason_bimorphic, // saw unexpected object class in bimorphic inlining (@bci) |
87684f1a88b5
6614597: Performance variability in jvm2008 xml.validation
kvn
parents:
1172
diff
changeset
|
58 |
7154
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
59 #ifdef GRAAL |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
60 Reason_unreached0 = Reason_null_assert, |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
61 Reason_type_checked_inlining = Reason_intrinsic, |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
62 Reason_optimized_type_check = Reason_bimorphic, |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
63 #endif |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
64 |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
65 // recorded per method |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
66 Reason_unloaded, // unloaded or class constant pool entry |
0 | 67 Reason_uninitialized, // bad class state (uninitialized) |
68 Reason_unreached, // code is not reached, compiler | |
69 Reason_unhandled, // arbitrary compiler limitation | |
70 Reason_constraint, // arbitrary runtime constraint violated | |
71 Reason_div0_check, // a null_check due to division by zero | |
72 Reason_age, // nmethod too old; tier threshold reached | |
1172 | 73 Reason_predicate, // compiler generated predicate failed |
3345 | 74 Reason_loop_limit_check, // compiler generated loop limits check failed |
0 | 75 Reason_LIMIT, |
7154
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
76 |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
77 #ifdef GRAAL |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
78 Reason_not_compiled_exception_handler = Reason_unhandled, |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
79 Reason_unresolved = Reason_uninitialized, |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
80 Reason_jsr_mismatch = Reason_age, |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
81 #endif |
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
82 |
1206
87684f1a88b5
6614597: Performance variability in jvm2008 xml.validation
kvn
parents:
1172
diff
changeset
|
83 Reason_RECORDED_LIMIT = Reason_bimorphic // some are not recorded per bc |
0 | 84 // Note: Keep this enum in sync. with _trap_reason_name. |
85 // Note: Reason_RECORDED_LIMIT should be < 8 to fit into 3 bits of | |
86 // DataLayout::trap_bits. This dependency is enforced indirectly | |
87 // via asserts, to avoid excessive direct header-to-header dependencies. | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7154
diff
changeset
|
88 // See Deoptimization::trap_state_reason and class DataLayout. |
0 | 89 }; |
90 | |
91 // What action must be taken by the runtime? | |
92 enum DeoptAction { | |
93 Action_none, // just interpret, do not invalidate nmethod | |
94 Action_maybe_recompile, // recompile the nmethod; need not invalidate | |
95 Action_reinterpret, // invalidate the nmethod, reset IC, maybe recompile | |
96 Action_make_not_entrant, // invalidate the nmethod, recompile (probably) | |
97 Action_make_not_compilable, // invalidate the nmethod and do not compile | |
98 Action_LIMIT | |
99 // Note: Keep this enum in sync. with _trap_action_name. | |
100 }; | |
101 | |
102 enum { | |
103 _action_bits = 3, | |
3345 | 104 _reason_bits = 5, |
0 | 105 _action_shift = 0, |
106 _reason_shift = _action_shift+_action_bits, | |
107 BC_CASE_LIMIT = PRODUCT_ONLY(1) NOT_PRODUCT(4) // for _deoptimization_hist | |
108 }; | |
109 | |
110 enum UnpackType { | |
111 Unpack_deopt = 0, // normal deoptimization, use pc computed in unpack_vframe_on_stack | |
112 Unpack_exception = 1, // exception is pending | |
113 Unpack_uncommon_trap = 2, // redo last byte code (C2 only) | |
114 Unpack_reexecute = 3 // reexecute bytecode (C1 only) | |
115 }; | |
116 | |
117 // Checks all compiled methods. Invalid methods are deleted and | |
118 // corresponding activations are deoptimized. | |
119 static int deoptimize_dependents(); | |
120 | |
121 // Deoptimizes a frame lazily. nmethod gets patched deopt happens on return to the frame | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
122 static void deoptimize(JavaThread* thread, frame fr, RegisterMap *reg_map, DeoptReason reason); |
0 | 123 |
124 private: | |
125 // Does the actual work for deoptimizing a single frame | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
126 static void deoptimize_single_frame(JavaThread* thread, frame fr, DeoptReason reason); |
0 | 127 |
128 // Helper function to revoke biases of all monitors in frame if UseBiasedLocking | |
129 // is enabled | |
130 static void revoke_biases_of_monitors(JavaThread* thread, frame fr, RegisterMap* map); | |
131 // Helper function to revoke biases of all monitors in frames | |
132 // executing in a particular CodeBlob if UseBiasedLocking is enabled | |
133 static void revoke_biases_of_monitors(CodeBlob* cb); | |
134 | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7154
diff
changeset
|
135 #if defined(COMPILER2) || defined(GRAAL) |
0 | 136 // Support for restoring non-escaping objects |
137 static bool realloc_objects(JavaThread* thread, frame* fr, GrowableArray<ScopeValue*>* objects, TRAPS); | |
138 static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type); | |
139 static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj); | |
140 static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects); | |
83
d3cd40645d0d
6681646: Relocking of a scalar replaced object during deoptimization is broken
kvn
parents:
0
diff
changeset
|
141 static void relock_objects(GrowableArray<MonitorInfo*>* monitors, JavaThread* thread); |
0 | 142 NOT_PRODUCT(static void print_objects(GrowableArray<ScopeValue*>* objects);) |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7154
diff
changeset
|
143 #endif // COMPILER2 || GRAAL |
0 | 144 |
145 public: | |
146 static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray<compiledVFrame*>* chunk); | |
147 | |
148 // Interface used for unpacking deoptimized frames | |
149 | |
150 // UnrollBlock is returned by fetch_unroll_info() to the deoptimization handler (blob). | |
151 // This is only a CheapObj to ease debugging after a deopt failure | |
6197 | 152 class UnrollBlock : public CHeapObj<mtCompiler> { |
0 | 153 private: |
154 int _size_of_deoptimized_frame; // Size, in bytes, of current deoptimized frame | |
155 int _caller_adjustment; // Adjustment, in bytes, to caller's SP by initial interpreted frame | |
156 int _number_of_frames; // Number frames to unroll | |
157 int _total_frame_sizes; // Total of number*sizes frames | |
158 intptr_t* _frame_sizes; // Array of frame sizes, in bytes, for unrolling the stack | |
159 address* _frame_pcs; // Array of frame pc's, in bytes, for unrolling the stack | |
160 intptr_t* _register_block; // Block for storing callee-saved registers. | |
161 BasicType _return_type; // Tells if we have to restore double or long return value | |
3931
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3369
diff
changeset
|
162 intptr_t _initial_info; // Platform dependent data for the sender frame (was FP on x86) |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3345
diff
changeset
|
163 int _caller_actual_parameters; // The number of actual arguments at the |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3345
diff
changeset
|
164 // interpreted caller of the deoptimized frame |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3345
diff
changeset
|
165 |
0 | 166 // The following fields are used as temps during the unpacking phase |
167 // (which is tight on registers, especially on x86). They really ought | |
168 // to be PD variables but that involves moving this class into its own | |
169 // file to use the pd include mechanism. Maybe in a later cleanup ... | |
170 intptr_t _counter_temp; // SHOULD BE PD VARIABLE (x86 frame count temp) | |
171 intptr_t _unpack_kind; // SHOULD BE PD VARIABLE (x86 unpack kind) | |
172 intptr_t _sender_sp_temp; // SHOULD BE PD VARIABLE (x86 sender_sp) | |
173 public: | |
174 // Constructor | |
175 UnrollBlock(int size_of_deoptimized_frame, | |
176 int caller_adjustment, | |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3345
diff
changeset
|
177 int caller_actual_parameters, |
0 | 178 int number_of_frames, |
179 intptr_t* frame_sizes, | |
180 address* frames_pcs, | |
181 BasicType return_type); | |
182 ~UnrollBlock(); | |
183 | |
184 // Returns where a register is located. | |
185 intptr_t* value_addr_at(int register_number) const; | |
186 | |
187 // Accessors | |
188 intptr_t* frame_sizes() const { return _frame_sizes; } | |
189 int number_of_frames() const { return _number_of_frames; } | |
190 address* frame_pcs() const { return _frame_pcs ; } | |
191 | |
192 // Returns the total size of frames | |
193 int size_of_frames() const; | |
194 | |
3931
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3369
diff
changeset
|
195 void set_initial_info(intptr_t info) { _initial_info = info; } |
2338
4f148718983e
7025485: leverage shared x86-only deoptimization code
bdelsart
parents:
1972
diff
changeset
|
196 |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3345
diff
changeset
|
197 int caller_actual_parameters() const { return _caller_actual_parameters; } |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3345
diff
changeset
|
198 |
0 | 199 // Accessors used by the code generator for the unpack stub. |
200 static int size_of_deoptimized_frame_offset_in_bytes() { return offset_of(UnrollBlock, _size_of_deoptimized_frame); } | |
201 static int caller_adjustment_offset_in_bytes() { return offset_of(UnrollBlock, _caller_adjustment); } | |
202 static int number_of_frames_offset_in_bytes() { return offset_of(UnrollBlock, _number_of_frames); } | |
203 static int frame_sizes_offset_in_bytes() { return offset_of(UnrollBlock, _frame_sizes); } | |
204 static int total_frame_sizes_offset_in_bytes() { return offset_of(UnrollBlock, _total_frame_sizes); } | |
205 static int frame_pcs_offset_in_bytes() { return offset_of(UnrollBlock, _frame_pcs); } | |
206 static int register_block_offset_in_bytes() { return offset_of(UnrollBlock, _register_block); } | |
207 static int return_type_offset_in_bytes() { return offset_of(UnrollBlock, _return_type); } | |
208 static int counter_temp_offset_in_bytes() { return offset_of(UnrollBlock, _counter_temp); } | |
3931
5432047c7db7
7087445: Improve platform independence of JSR292 shared code
bdelsart
parents:
3369
diff
changeset
|
209 static int initial_info_offset_in_bytes() { return offset_of(UnrollBlock, _initial_info); } |
0 | 210 static int unpack_kind_offset_in_bytes() { return offset_of(UnrollBlock, _unpack_kind); } |
211 static int sender_sp_temp_offset_in_bytes() { return offset_of(UnrollBlock, _sender_sp_temp); } | |
212 | |
213 BasicType return_type() const { return _return_type; } | |
214 void print(); | |
215 }; | |
216 | |
217 //** Returns an UnrollBlock continuing information | |
218 // how to make room for the resulting interpreter frames. | |
219 // Called by assembly stub after execution has returned to | |
220 // deoptimized frame. | |
221 // @argument thread. Thread where stub_frame resides. | |
222 // @see OptoRuntime::deoptimization_fetch_unroll_info_C | |
223 static UnrollBlock* fetch_unroll_info(JavaThread* thread); | |
224 | |
225 //** Unpacks vframeArray onto execution stack | |
226 // Called by assembly stub after execution has returned to | |
227 // deoptimized frame and after the stack unrolling. | |
228 // @argument thread. Thread where stub_frame resides. | |
229 // @argument exec_mode. Determines how execution should be continuted in top frame. | |
230 // 0 means continue after current byte code | |
231 // 1 means exception has happened, handle exception | |
232 // 2 means reexecute current bytecode (for uncommon traps). | |
233 // @see OptoRuntime::deoptimization_unpack_frames_C | |
234 // Return BasicType of call return type, if any | |
235 static BasicType unpack_frames(JavaThread* thread, int exec_mode); | |
236 | |
237 // Cleans up deoptimization bits on thread after unpacking or in the | |
238 // case of an exception. | |
239 static void cleanup_deopt_info(JavaThread *thread, | |
240 vframeArray * array); | |
241 | |
242 // Restores callee saved values from deoptimized frame into oldest interpreter frame | |
243 // so caller of the deoptimized frame will get back the values it expects. | |
244 static void unwind_callee_save_values(frame* f, vframeArray* vframe_array); | |
245 | |
246 //** Performs an uncommon trap for compiled code. | |
247 // The top most compiler frame is converted into interpreter frames | |
248 static UnrollBlock* uncommon_trap(JavaThread* thread, jint unloaded_class_index); | |
249 // Helper routine that enters the VM and may block | |
250 static void uncommon_trap_inner(JavaThread* thread, jint unloaded_class_index); | |
251 | |
252 //** Deoptimizes the frame identified by id. | |
253 // Only called from VMDeoptimizeFrame | |
254 // @argument thread. Thread where stub_frame resides. | |
255 // @argument id. id of frame that should be deoptimized. | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
256 static void deoptimize_frame_internal(JavaThread* thread, intptr_t* id, DeoptReason reason); |
1905
ce6848d0666d
6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents:
1783
diff
changeset
|
257 |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
258 // if thread is not the current thread then execute |
1905
ce6848d0666d
6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents:
1783
diff
changeset
|
259 // VM_DeoptimizeFrame otherwise deoptimize directly. |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
260 static void deoptimize_frame(JavaThread* thread, intptr_t* id, DeoptReason reason); |
0 | 261 |
262 // Statistics | |
263 static void gather_statistics(DeoptReason reason, DeoptAction action, | |
264 Bytecodes::Code bc = Bytecodes::_illegal); | |
265 static void print_statistics(); | |
266 | |
267 // How much room to adjust the last frame's SP by, to make space for | |
268 // the callee's interpreter frame (which expects locals to be next to | |
269 // incoming arguments) | |
270 static int last_frame_adjust(int callee_parameters, int callee_locals); | |
271 | |
272 // trap_request codes | |
273 static DeoptReason trap_request_reason(int trap_request) { | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
274 if (trap_request < 0) { |
0 | 275 return (DeoptReason) |
276 ((~(trap_request) >> _reason_shift) & right_n_bits(_reason_bits)); | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
277 } else { |
0 | 278 // standard reason for unloaded CP entry |
279 return Reason_unloaded; | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
280 } |
0 | 281 } |
282 static DeoptAction trap_request_action(int trap_request) { | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
283 if (trap_request < 0) { |
0 | 284 return (DeoptAction) |
285 ((~(trap_request) >> _action_shift) & right_n_bits(_action_bits)); | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
286 } else { |
0 | 287 // standard action for unloaded CP entry |
288 return _unloaded_action; | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
289 } |
0 | 290 } |
291 static int trap_request_index(int trap_request) { | |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
292 if (trap_request < 0) { |
0 | 293 return -1; |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
294 } else { |
0 | 295 return trap_request; |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
296 } |
0 | 297 } |
298 static int make_trap_request(DeoptReason reason, DeoptAction action, | |
299 int index = -1) { | |
7154
5d0bb7d52783
changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents:
6948
diff
changeset
|
300 #ifdef GRAALVM |
5110
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
301 assert(index == -1, "Graal does not use index"); |
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
302 #endif |
0ebca2e35ca5
more preparations for disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
4137
diff
changeset
|
303 |
0 | 304 assert((1 << _reason_bits) >= Reason_LIMIT, "enough bits"); |
305 assert((1 << _action_bits) >= Action_LIMIT, "enough bits"); | |
306 int trap_request; | |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7154
diff
changeset
|
307 if (index != -1) |
0 | 308 trap_request = index; |
8151
b8f261ba79c6
Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7154
diff
changeset
|
309 else |
0 | 310 trap_request = (~(((reason) << _reason_shift) |
311 + ((action) << _action_shift))); | |
312 assert(reason == trap_request_reason(trap_request), "valid reason"); | |
313 assert(action == trap_request_action(trap_request), "valid action"); | |
314 assert(index == trap_request_index(trap_request), "valid index"); | |
315 return trap_request; | |
316 } | |
317 | |
318 // The trap_state stored in a MDO is decoded here. | |
319 // It records two items of information. | |
320 // reason: If a deoptimization happened here, what its reason was, | |
321 // or if there were multiple deopts with differing reasons. | |
322 // recompiled: If a deoptimization here triggered a recompilation. | |
323 // Note that not all reasons are recorded per-bci. | |
324 static DeoptReason trap_state_reason(int trap_state); | |
325 static int trap_state_has_reason(int trap_state, int reason); | |
326 static int trap_state_add_reason(int trap_state, int reason); | |
327 static bool trap_state_is_recompiled(int trap_state); | |
328 static int trap_state_set_recompiled(int trap_state, bool z); | |
329 static const char* format_trap_state(char* buf, size_t buflen, | |
330 int trap_state); | |
331 | |
332 static bool reason_is_recorded_per_bytecode(DeoptReason reason) { | |
1206
87684f1a88b5
6614597: Performance variability in jvm2008 xml.validation
kvn
parents:
1172
diff
changeset
|
333 return reason > Reason_none && reason <= Reason_RECORDED_LIMIT; |
0 | 334 } |
335 | |
336 static DeoptReason reason_recorded_per_bytecode_if_any(DeoptReason reason) { | |
337 if (reason_is_recorded_per_bytecode(reason)) | |
338 return reason; | |
339 else if (reason == Reason_div0_check) // null check due to divide-by-zero? | |
340 return Reason_null_check; // recorded per BCI as a null check | |
341 else | |
342 return Reason_none; | |
343 } | |
344 | |
345 static const char* trap_reason_name(int reason); | |
346 static const char* trap_action_name(int action); | |
347 // Format like reason='foo' action='bar' index='123'. | |
348 // This is suitable both for XML and for tty output. | |
349 static const char* format_trap_request(char* buf, size_t buflen, | |
350 int trap_request); | |
351 | |
352 static jint total_deoptimization_count(); | |
353 static jint deoptimization_count(DeoptReason reason); | |
354 | |
355 // JVMTI PopFrame support | |
356 | |
357 // Preserves incoming arguments to the popped frame when it is | |
358 // returning to a deoptimized caller | |
359 static void popframe_preserve_args(JavaThread* thread, int bytes_to_save, void* start_address); | |
360 | |
361 private: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6197
diff
changeset
|
362 static MethodData* get_method_data(JavaThread* thread, methodHandle m, bool create_if_missing); |
0 | 363 // Update the mdo's count and per-BCI reason bits, returning previous state: |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6197
diff
changeset
|
364 static ProfileData* query_update_method_data(MethodData* trap_mdo, |
0 | 365 int trap_bci, |
366 DeoptReason reason, | |
5114
dad1ac9dba7d
finished first implementation of disabling runtime feedback selectively based on deoptimization history
Christian Haeubl <christian.haeubl@oracle.com>
parents:
5110
diff
changeset
|
367 bool update_total_trap_count, |
0 | 368 //outputs: |
369 uint& ret_this_trap_count, | |
370 bool& ret_maybe_prior_trap, | |
371 bool& ret_maybe_prior_recompile); | |
372 // class loading support for uncommon trap | |
373 static void load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS); | |
374 static void load_class_by_index(constantPoolHandle constant_pool, int index); | |
375 | |
376 static UnrollBlock* fetch_unroll_info_helper(JavaThread* thread); | |
377 | |
378 static DeoptAction _unloaded_action; // == Action_reinterpret; | |
379 static const char* _trap_reason_name[Reason_LIMIT]; | |
380 static const char* _trap_action_name[Action_LIMIT]; | |
381 | |
382 static juint _deoptimization_hist[Reason_LIMIT][1+Action_LIMIT][BC_CASE_LIMIT]; | |
383 // Note: Histogram array size is 1-2 Kb. | |
384 | |
385 public: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6197
diff
changeset
|
386 static void update_method_data_from_interpreter(MethodData* trap_mdo, int trap_bci, int reason); |
0 | 387 }; |
388 | |
389 class DeoptimizationMarker : StackObj { // for profiling | |
390 static bool _is_active; | |
391 public: | |
392 DeoptimizationMarker() { _is_active = true; } | |
393 ~DeoptimizationMarker() { _is_active = false; } | |
394 static bool is_active() { return _is_active; } | |
395 }; | |
1972 | 396 |
397 #endif // SHARE_VM_RUNTIME_DEOPTIMIZATION_HPP |