hotspot/src/share/vm/runtime/deoptimization.hpp
changeset 4754 8aef16f24e16
parent 4643 61c659c91c57
child 5547 f4b087cbb361
equal deleted inserted replaced
4753:9e7bcf214f71 4754:8aef16f24e16
    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;