hotspot/src/share/vm/runtime/deoptimization.cpp
changeset 13728 882756847a04
parent 13391 30245956af37
child 13964 01a2b863cc61
child 13952 e3cf184080bc
equal deleted inserted replaced
13727:caf5eb7dd4a7 13728:882756847a04
    32 #include "interpreter/interpreter.hpp"
    32 #include "interpreter/interpreter.hpp"
    33 #include "interpreter/oopMapCache.hpp"
    33 #include "interpreter/oopMapCache.hpp"
    34 #include "memory/allocation.inline.hpp"
    34 #include "memory/allocation.inline.hpp"
    35 #include "memory/oopFactory.hpp"
    35 #include "memory/oopFactory.hpp"
    36 #include "memory/resourceArea.hpp"
    36 #include "memory/resourceArea.hpp"
    37 #include "oops/methodOop.hpp"
    37 #include "oops/method.hpp"
    38 #include "oops/oop.inline.hpp"
    38 #include "oops/oop.inline.hpp"
    39 #include "prims/jvmtiThreadState.hpp"
    39 #include "prims/jvmtiThreadState.hpp"
    40 #include "runtime/biasedLocking.hpp"
    40 #include "runtime/biasedLocking.hpp"
    41 #include "runtime/compilationPolicy.hpp"
    41 #include "runtime/compilationPolicy.hpp"
    42 #include "runtime/deoptimization.hpp"
    42 #include "runtime/deoptimization.hpp"
   746 
   746 
   747   for (int i = 0; i < objects->length(); i++) {
   747   for (int i = 0; i < objects->length(); i++) {
   748     assert(objects->at(i)->is_object(), "invalid debug information");
   748     assert(objects->at(i)->is_object(), "invalid debug information");
   749     ObjectValue* sv = (ObjectValue*) objects->at(i);
   749     ObjectValue* sv = (ObjectValue*) objects->at(i);
   750 
   750 
   751     KlassHandle k(((ConstantOopReadValue*) sv->klass())->value()());
   751     KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
   752     oop obj = NULL;
   752     oop obj = NULL;
   753 
   753 
   754     if (k->oop_is_instance()) {
   754     if (k->oop_is_instance()) {
   755       instanceKlass* ik = instanceKlass::cast(k());
   755       InstanceKlass* ik = InstanceKlass::cast(k());
   756       obj = ik->allocate_instance(CHECK_(false));
   756       obj = ik->allocate_instance(CHECK_(false));
   757     } else if (k->oop_is_typeArray()) {
   757     } else if (k->oop_is_typeArray()) {
   758       typeArrayKlass* ak = typeArrayKlass::cast(k());
   758       typeArrayKlass* ak = typeArrayKlass::cast(k());
   759       assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length");
   759       assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length");
   760       int len = sv->field_size() / type2size[ak->element_type()];
   760       int len = sv->field_size() / type2size[ak->element_type()];
   780 // they are yielded by do_nonstatic_fields.
   780 // they are yielded by do_nonstatic_fields.
   781 class FieldReassigner: public FieldClosure {
   781 class FieldReassigner: public FieldClosure {
   782   frame* _fr;
   782   frame* _fr;
   783   RegisterMap* _reg_map;
   783   RegisterMap* _reg_map;
   784   ObjectValue* _sv;
   784   ObjectValue* _sv;
   785   instanceKlass* _ik;
   785   InstanceKlass* _ik;
   786   oop _obj;
   786   oop _obj;
   787 
   787 
   788   int _i;
   788   int _i;
   789 public:
   789 public:
   790   FieldReassigner(frame* fr, RegisterMap* reg_map, ObjectValue* sv, oop obj) :
   790   FieldReassigner(frame* fr, RegisterMap* reg_map, ObjectValue* sv, oop obj) :
   912 
   912 
   913 // restore fields of all eliminated objects and arrays
   913 // restore fields of all eliminated objects and arrays
   914 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects) {
   914 void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray<ScopeValue*>* objects) {
   915   for (int i = 0; i < objects->length(); i++) {
   915   for (int i = 0; i < objects->length(); i++) {
   916     ObjectValue* sv = (ObjectValue*) objects->at(i);
   916     ObjectValue* sv = (ObjectValue*) objects->at(i);
   917     KlassHandle k(((ConstantOopReadValue*) sv->klass())->value()());
   917     KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
   918     Handle obj = sv->value();
   918     Handle obj = sv->value();
   919     assert(obj.not_null(), "reallocation was missed");
   919     assert(obj.not_null(), "reallocation was missed");
   920 
   920 
   921     if (k->oop_is_instance()) {
   921     if (k->oop_is_instance()) {
   922       instanceKlass* ik = instanceKlass::cast(k());
   922       InstanceKlass* ik = InstanceKlass::cast(k());
   923       FieldReassigner reassign(fr, reg_map, sv, obj());
   923       FieldReassigner reassign(fr, reg_map, sv, obj());
   924       ik->do_nonstatic_fields(&reassign);
   924       ik->do_nonstatic_fields(&reassign);
   925     } else if (k->oop_is_typeArray()) {
   925     } else if (k->oop_is_typeArray()) {
   926       typeArrayKlass* ak = typeArrayKlass::cast(k());
   926       typeArrayKlass* ak = typeArrayKlass::cast(k());
   927       reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type());
   927       reassign_type_array_elements(fr, reg_map, sv, (typeArrayOop) obj(), ak->element_type());
   963 void Deoptimization::print_objects(GrowableArray<ScopeValue*>* objects) {
   963 void Deoptimization::print_objects(GrowableArray<ScopeValue*>* objects) {
   964   fieldDescriptor fd;
   964   fieldDescriptor fd;
   965 
   965 
   966   for (int i = 0; i < objects->length(); i++) {
   966   for (int i = 0; i < objects->length(); i++) {
   967     ObjectValue* sv = (ObjectValue*) objects->at(i);
   967     ObjectValue* sv = (ObjectValue*) objects->at(i);
   968     KlassHandle k(((ConstantOopReadValue*) sv->klass())->value()());
   968     KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
   969     Handle obj = sv->value();
   969     Handle obj = sv->value();
   970 
   970 
   971     tty->print("     object <" INTPTR_FORMAT "> of type ", sv->value()());
   971     tty->print("     object <" INTPTR_FORMAT "> of type ", sv->value()());
   972     k->as_klassOop()->print_value();
   972     k->print_value();
   973     tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize);
   973     tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize);
   974     tty->cr();
   974     tty->cr();
   975 
   975 
   976     if (Verbose) {
   976     if (Verbose) {
   977       k->oop_print_on(obj(), tty);
   977       k->oop_print_on(obj(), tty);
  1180 
  1180 
  1181 #if defined(COMPILER2) || defined(SHARK)
  1181 #if defined(COMPILER2) || defined(SHARK)
  1182 void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS) {
  1182 void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int index, TRAPS) {
  1183   // in case of an unresolved klass entry, load the class.
  1183   // in case of an unresolved klass entry, load the class.
  1184   if (constant_pool->tag_at(index).is_unresolved_klass()) {
  1184   if (constant_pool->tag_at(index).is_unresolved_klass()) {
  1185     klassOop tk = constant_pool->klass_at(index, CHECK);
  1185     Klass* tk = constant_pool->klass_at(index, CHECK);
  1186     return;
  1186     return;
  1187   }
  1187   }
  1188 
  1188 
  1189   if (!constant_pool->tag_at(index).is_symbol()) return;
  1189   if (!constant_pool->tag_at(index).is_symbol()) return;
  1190 
  1190 
  1191   Handle class_loader (THREAD, instanceKlass::cast(constant_pool->pool_holder())->class_loader());
  1191   Handle class_loader (THREAD, InstanceKlass::cast(constant_pool->pool_holder())->class_loader());
  1192   Symbol*  symbol  = constant_pool->symbol_at(index);
  1192   Symbol*  symbol  = constant_pool->symbol_at(index);
  1193 
  1193 
  1194   // class name?
  1194   // class name?
  1195   if (symbol->byte_at(0) != '(') {
  1195   if (symbol->byte_at(0) != '(') {
  1196     Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain());
  1196     Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain());
  1266     gather_statistics(reason, action, trap_bc);
  1266     gather_statistics(reason, action, trap_bc);
  1267 
  1267 
  1268     // Ensure that we can record deopt. history:
  1268     // Ensure that we can record deopt. history:
  1269     bool create_if_missing = ProfileTraps;
  1269     bool create_if_missing = ProfileTraps;
  1270 
  1270 
  1271     methodDataHandle trap_mdo
  1271     MethodData* trap_mdo =
  1272       (THREAD, get_method_data(thread, trap_method, create_if_missing));
  1272       get_method_data(thread, trap_method, create_if_missing);
  1273 
  1273 
  1274     // Print a bunch of diagnostics, if requested.
  1274     // Print a bunch of diagnostics, if requested.
  1275     if (TraceDeoptimization || LogCompilation) {
  1275     if (TraceDeoptimization || LogCompilation) {
  1276       ResourceMark rm;
  1276       ResourceMark rm;
  1277       ttyLocker ttyl;
  1277       ttyLocker ttyl;
  1295           class_name = constants->symbol_at(unloaded_class_index);
  1295           class_name = constants->symbol_at(unloaded_class_index);
  1296         }
  1296         }
  1297         if (xtty != NULL)
  1297         if (xtty != NULL)
  1298           xtty->name(class_name);
  1298           xtty->name(class_name);
  1299       }
  1299       }
  1300       if (xtty != NULL && trap_mdo.not_null()) {
  1300       if (xtty != NULL && trap_mdo != NULL) {
  1301         // Dump the relevant MDO state.
  1301         // Dump the relevant MDO state.
  1302         // This is the deopt count for the current reason, any previous
  1302         // This is the deopt count for the current reason, any previous
  1303         // reasons or recompiles seen at this point.
  1303         // reasons or recompiles seen at this point.
  1304         int dcnt = trap_mdo->trap_count(reason);
  1304         int dcnt = trap_mdo->trap_count(reason);
  1305         if (dcnt != 0)
  1305         if (dcnt != 0)
  1378     //   3. In parallel with the previous measures, if the total number of
  1378     //   3. In parallel with the previous measures, if the total number of
  1379     //   recompilations of a method exceeds the much larger set limit
  1379     //   recompilations of a method exceeds the much larger set limit
  1380     //   PerMethodRecompilationCutoff, the method is abandoned.
  1380     //   PerMethodRecompilationCutoff, the method is abandoned.
  1381     //   This should only happen if the method is very large and has
  1381     //   This should only happen if the method is very large and has
  1382     //   many "lukewarm" deoptimizations.  The code which enforces this
  1382     //   many "lukewarm" deoptimizations.  The code which enforces this
  1383     //   limit is elsewhere (class nmethod, class methodOopDesc).
  1383     //   limit is elsewhere (class nmethod, class Method).
  1384     //
  1384     //
  1385     // Note that the per-BCI 'is_recompiled' bit gives the compiler one chance
  1385     // Note that the per-BCI 'is_recompiled' bit gives the compiler one chance
  1386     // to recompile at each bytecode independently of the per-BCI cutoff.
  1386     // to recompile at each bytecode independently of the per-BCI cutoff.
  1387     //
  1387     //
  1388     // The decision to update code is up to the compiler, and is encoded
  1388     // The decision to update code is up to the compiler, and is encoded
  1447     }
  1447     }
  1448 
  1448 
  1449     // Setting +ProfileTraps fixes the following, on all platforms:
  1449     // Setting +ProfileTraps fixes the following, on all platforms:
  1450     // 4852688: ProfileInterpreter is off by default for ia64.  The result is
  1450     // 4852688: ProfileInterpreter is off by default for ia64.  The result is
  1451     // infinite heroic-opt-uncommon-trap/deopt/recompile cycles, since the
  1451     // infinite heroic-opt-uncommon-trap/deopt/recompile cycles, since the
  1452     // recompile relies on a methodDataOop to record heroic opt failures.
  1452     // recompile relies on a MethodData* to record heroic opt failures.
  1453 
  1453 
  1454     // Whether the interpreter is producing MDO data or not, we also need
  1454     // Whether the interpreter is producing MDO data or not, we also need
  1455     // to use the MDO to detect hot deoptimization points and control
  1455     // to use the MDO to detect hot deoptimization points and control
  1456     // aggressive optimization.
  1456     // aggressive optimization.
  1457     bool inc_recompile_count = false;
  1457     bool inc_recompile_count = false;
  1458     ProfileData* pdata = NULL;
  1458     ProfileData* pdata = NULL;
  1459     if (ProfileTraps && update_trap_state && trap_mdo.not_null()) {
  1459     if (ProfileTraps && update_trap_state && trap_mdo != NULL) {
  1460       assert(trap_mdo() == get_method_data(thread, trap_method, false), "sanity");
  1460       assert(trap_mdo == get_method_data(thread, trap_method, false), "sanity");
  1461       uint this_trap_count = 0;
  1461       uint this_trap_count = 0;
  1462       bool maybe_prior_trap = false;
  1462       bool maybe_prior_trap = false;
  1463       bool maybe_prior_recompile = false;
  1463       bool maybe_prior_recompile = false;
  1464       pdata = query_update_method_data(trap_mdo, trap_bci, reason,
  1464       pdata = query_update_method_data(trap_mdo, trap_bci, reason,
  1465                                    //outputs:
  1465                                    //outputs:
  1571   } // Free marked resources
  1571   } // Free marked resources
  1572 
  1572 
  1573 }
  1573 }
  1574 JRT_END
  1574 JRT_END
  1575 
  1575 
  1576 methodDataOop
  1576 MethodData*
  1577 Deoptimization::get_method_data(JavaThread* thread, methodHandle m,
  1577 Deoptimization::get_method_data(JavaThread* thread, methodHandle m,
  1578                                 bool create_if_missing) {
  1578                                 bool create_if_missing) {
  1579   Thread* THREAD = thread;
  1579   Thread* THREAD = thread;
  1580   methodDataOop mdo = m()->method_data();
  1580   MethodData* mdo = m()->method_data();
  1581   if (mdo == NULL && create_if_missing && !HAS_PENDING_EXCEPTION) {
  1581   if (mdo == NULL && create_if_missing && !HAS_PENDING_EXCEPTION) {
  1582     // Build an MDO.  Ignore errors like OutOfMemory;
  1582     // Build an MDO.  Ignore errors like OutOfMemory;
  1583     // that simply means we won't have an MDO to update.
  1583     // that simply means we won't have an MDO to update.
  1584     methodOopDesc::build_interpreter_method_data(m, THREAD);
  1584     Method::build_interpreter_method_data(m, THREAD);
  1585     if (HAS_PENDING_EXCEPTION) {
  1585     if (HAS_PENDING_EXCEPTION) {
  1586       assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
  1586       assert((PENDING_EXCEPTION->is_a(SystemDictionary::OutOfMemoryError_klass())), "we expect only an OOM error here");
  1587       CLEAR_PENDING_EXCEPTION;
  1587       CLEAR_PENDING_EXCEPTION;
  1588     }
  1588     }
  1589     mdo = m()->method_data();
  1589     mdo = m()->method_data();
  1590   }
  1590   }
  1591   return mdo;
  1591   return mdo;
  1592 }
  1592 }
  1593 
  1593 
  1594 ProfileData*
  1594 ProfileData*
  1595 Deoptimization::query_update_method_data(methodDataHandle trap_mdo,
  1595 Deoptimization::query_update_method_data(MethodData* trap_mdo,
  1596                                          int trap_bci,
  1596                                          int trap_bci,
  1597                                          Deoptimization::DeoptReason reason,
  1597                                          Deoptimization::DeoptReason reason,
  1598                                          //outputs:
  1598                                          //outputs:
  1599                                          uint& ret_this_trap_count,
  1599                                          uint& ret_this_trap_count,
  1600                                          bool& ret_maybe_prior_trap,
  1600                                          bool& ret_maybe_prior_trap,
  1650   ret_maybe_prior_recompile = maybe_prior_recompile;
  1650   ret_maybe_prior_recompile = maybe_prior_recompile;
  1651   return pdata;
  1651   return pdata;
  1652 }
  1652 }
  1653 
  1653 
  1654 void
  1654 void
  1655 Deoptimization::update_method_data_from_interpreter(methodDataHandle trap_mdo, int trap_bci, int reason) {
  1655 Deoptimization::update_method_data_from_interpreter(MethodData* trap_mdo, int trap_bci, int reason) {
  1656   ResourceMark rm;
  1656   ResourceMark rm;
  1657   // Ignored outputs:
  1657   // Ignored outputs:
  1658   uint ignore_this_trap_count;
  1658   uint ignore_this_trap_count;
  1659   bool ignore_maybe_prior_trap;
  1659   bool ignore_maybe_prior_trap;
  1660   bool ignore_maybe_prior_recompile;
  1660   bool ignore_maybe_prior_recompile;
  1938 void Deoptimization::print_statistics() {
  1938 void Deoptimization::print_statistics() {
  1939   // no output
  1939   // no output
  1940 }
  1940 }
  1941 
  1941 
  1942 void
  1942 void
  1943 Deoptimization::update_method_data_from_interpreter(methodDataHandle trap_mdo, int trap_bci, int reason) {
  1943 Deoptimization::update_method_data_from_interpreter(MethodData* trap_mdo, int trap_bci, int reason) {
  1944   // no udpate
  1944   // no udpate
  1945 }
  1945 }
  1946 
  1946 
  1947 int Deoptimization::trap_state_has_reason(int trap_state, int reason) {
  1947 int Deoptimization::trap_state_has_reason(int trap_state, int reason) {
  1948   return 0;
  1948   return 0;