31 public: |
31 public: |
32 // What condition caused the deoptimization? |
32 // What condition caused the deoptimization? |
33 enum DeoptReason { |
33 enum DeoptReason { |
34 Reason_many = -1, // indicates presence of several reasons |
34 Reason_many = -1, // indicates presence of several reasons |
35 Reason_none = 0, // indicates absence of a relevant deopt. |
35 Reason_none = 0, // indicates absence of a relevant deopt. |
|
36 // Next 7 reasons are recorded per bytecode in DataLayout::trap_bits |
36 Reason_null_check, // saw unexpected null or zero divisor (@bci) |
37 Reason_null_check, // saw unexpected null or zero divisor (@bci) |
37 Reason_null_assert, // saw unexpected non-null or non-zero (@bci) |
38 Reason_null_assert, // saw unexpected non-null or non-zero (@bci) |
38 Reason_range_check, // saw unexpected array index (@bci) |
39 Reason_range_check, // saw unexpected array index (@bci) |
39 Reason_class_check, // saw unexpected object class (@bci) |
40 Reason_class_check, // saw unexpected object class (@bci) |
40 Reason_array_check, // saw unexpected array class (aastore @bci) |
41 Reason_array_check, // saw unexpected array class (aastore @bci) |
41 Reason_intrinsic, // saw unexpected operand to intrinsic (@bci) |
42 Reason_intrinsic, // saw unexpected operand to intrinsic (@bci) |
|
43 Reason_bimorphic, // saw unexpected object class in bimorphic inlining (@bci) |
|
44 |
42 Reason_unloaded, // unloaded class or constant pool entry |
45 Reason_unloaded, // unloaded class or constant pool entry |
43 Reason_uninitialized, // bad class state (uninitialized) |
46 Reason_uninitialized, // bad class state (uninitialized) |
44 Reason_unreached, // code is not reached, compiler |
47 Reason_unreached, // code is not reached, compiler |
45 Reason_unhandled, // arbitrary compiler limitation |
48 Reason_unhandled, // arbitrary compiler limitation |
46 Reason_constraint, // arbitrary runtime constraint violated |
49 Reason_constraint, // arbitrary runtime constraint violated |
47 Reason_div0_check, // a null_check due to division by zero |
50 Reason_div0_check, // a null_check due to division by zero |
48 Reason_age, // nmethod too old; tier threshold reached |
51 Reason_age, // nmethod too old; tier threshold reached |
49 Reason_predicate, // compiler generated predicate failed |
52 Reason_predicate, // compiler generated predicate failed |
50 Reason_LIMIT, |
53 Reason_LIMIT, |
51 // Note: Keep this enum in sync. with _trap_reason_name. |
54 // Note: Keep this enum in sync. with _trap_reason_name. |
52 Reason_RECORDED_LIMIT = Reason_unloaded // some are not recorded per bc |
55 Reason_RECORDED_LIMIT = Reason_bimorphic // some are not recorded per bc |
53 // Note: Reason_RECORDED_LIMIT should be < 8 to fit into 3 bits of |
56 // Note: Reason_RECORDED_LIMIT should be < 8 to fit into 3 bits of |
54 // DataLayout::trap_bits. This dependency is enforced indirectly |
57 // DataLayout::trap_bits. This dependency is enforced indirectly |
55 // via asserts, to avoid excessive direct header-to-header dependencies. |
58 // via asserts, to avoid excessive direct header-to-header dependencies. |
56 // See Deoptimization::trap_state_reason and class DataLayout. |
59 // See Deoptimization::trap_state_reason and class DataLayout. |
57 }; |
60 }; |
277 static int trap_state_set_recompiled(int trap_state, bool z); |
280 static int trap_state_set_recompiled(int trap_state, bool z); |
278 static const char* format_trap_state(char* buf, size_t buflen, |
281 static const char* format_trap_state(char* buf, size_t buflen, |
279 int trap_state); |
282 int trap_state); |
280 |
283 |
281 static bool reason_is_recorded_per_bytecode(DeoptReason reason) { |
284 static bool reason_is_recorded_per_bytecode(DeoptReason reason) { |
282 return reason > Reason_none && reason < Reason_RECORDED_LIMIT; |
285 return reason > Reason_none && reason <= Reason_RECORDED_LIMIT; |
283 } |
286 } |
284 |
287 |
285 static DeoptReason reason_recorded_per_bytecode_if_any(DeoptReason reason) { |
288 static DeoptReason reason_recorded_per_bytecode_if_any(DeoptReason reason) { |
286 if (reason_is_recorded_per_bytecode(reason)) |
289 if (reason_is_recorded_per_bytecode(reason)) |
287 return reason; |
290 return reason; |