comparison src/share/vm/runtime/deoptimization.cpp @ 1783:d5d065957597

6953144: Tiered compilation Summary: Infrastructure for tiered compilation support (interpreter + c1 + c2) for 32 and 64 bit. Simple tiered policy implementation. Reviewed-by: kvn, never, phh, twisti
author iveresov
date Fri, 03 Sep 2010 17:51:07 -0700
parents d2ede61b7a12
children fd5d4527cdf5
comparison
equal deleted inserted replaced
1782:f353275af40e 1783:d5d065957597
1299 // The other actions cause immediate removal of the present code. 1299 // The other actions cause immediate removal of the present code.
1300 1300
1301 bool update_trap_state = true; 1301 bool update_trap_state = true;
1302 bool make_not_entrant = false; 1302 bool make_not_entrant = false;
1303 bool make_not_compilable = false; 1303 bool make_not_compilable = false;
1304 bool reset_counters = false; 1304 bool reprofile = false;
1305 switch (action) { 1305 switch (action) {
1306 case Action_none: 1306 case Action_none:
1307 // Keep the old code. 1307 // Keep the old code.
1308 update_trap_state = false; 1308 update_trap_state = false;
1309 break; 1309 break;
1326 // Note that the compiler will track null_check, null_assert, 1326 // Note that the compiler will track null_check, null_assert,
1327 // range_check, and class_check events and log them as if they 1327 // range_check, and class_check events and log them as if they
1328 // had been traps taken from compiled code. This will update 1328 // had been traps taken from compiled code. This will update
1329 // the MDO trap history so that the next compilation will 1329 // the MDO trap history so that the next compilation will
1330 // properly detect hot trap sites. 1330 // properly detect hot trap sites.
1331 reset_counters = true; 1331 reprofile = true;
1332 break; 1332 break;
1333 case Action_make_not_entrant: 1333 case Action_make_not_entrant:
1334 // Request immediate recompilation, and get rid of the old code. 1334 // Request immediate recompilation, and get rid of the old code.
1335 // Make them not entrant, so next time they are called they get 1335 // Make them not entrant, so next time they are called they get
1336 // recompiled. Unloaded classes are loaded now so recompile before next 1336 // recompiled. Unloaded classes are loaded now so recompile before next
1420 1420
1421 // Here's more hysteresis: If there has been a recompile at 1421 // Here's more hysteresis: If there has been a recompile at
1422 // this trap point already, run the method in the interpreter 1422 // this trap point already, run the method in the interpreter
1423 // for a while to exercise it more thoroughly. 1423 // for a while to exercise it more thoroughly.
1424 if (make_not_entrant && maybe_prior_recompile && maybe_prior_trap) { 1424 if (make_not_entrant && maybe_prior_recompile && maybe_prior_trap) {
1425 reset_counters = true; 1425 reprofile = true;
1426 } 1426 }
1427 1427
1428 } 1428 }
1429 1429
1430 // Take requested actions on the method: 1430 // Take requested actions on the method:
1450 (uint)PerBytecodeRecompilationCutoff) { 1450 (uint)PerBytecodeRecompilationCutoff) {
1451 // Give up on the method containing the bad BCI. 1451 // Give up on the method containing the bad BCI.
1452 if (trap_method() == nm->method()) { 1452 if (trap_method() == nm->method()) {
1453 make_not_compilable = true; 1453 make_not_compilable = true;
1454 } else { 1454 } else {
1455 trap_method->set_not_compilable(); 1455 trap_method->set_not_compilable(CompLevel_full_optimization);
1456 // But give grace to the enclosing nm->method(). 1456 // But give grace to the enclosing nm->method().
1457 } 1457 }
1458 } 1458 }
1459 } 1459 }
1460 1460
1461 // Reset invocation counters 1461 // Reprofile
1462 if (reset_counters) { 1462 if (reprofile) {
1463 if (nm->is_osr_method()) 1463 CompilationPolicy::policy()->reprofile(trap_scope, nm->is_osr_method());
1464 reset_invocation_counter(trap_scope, CompileThreshold);
1465 else
1466 reset_invocation_counter(trap_scope);
1467 } 1464 }
1468 1465
1469 // Give up compiling 1466 // Give up compiling
1470 if (make_not_compilable && !nm->method()->is_not_compilable()) { 1467 if (make_not_compilable && !nm->method()->is_not_compilable(CompLevel_full_optimization)) {
1471 assert(make_not_entrant, "consistent"); 1468 assert(make_not_entrant, "consistent");
1472 nm->method()->set_not_compilable(); 1469 nm->method()->set_not_compilable(CompLevel_full_optimization);
1473 } 1470 }
1474 1471
1475 } // Free marked resources 1472 } // Free marked resources
1476 1473
1477 } 1474 }
1565 query_update_method_data(trap_mdo, trap_bci, 1562 query_update_method_data(trap_mdo, trap_bci,
1566 (DeoptReason)reason, 1563 (DeoptReason)reason,
1567 ignore_this_trap_count, 1564 ignore_this_trap_count,
1568 ignore_maybe_prior_trap, 1565 ignore_maybe_prior_trap,
1569 ignore_maybe_prior_recompile); 1566 ignore_maybe_prior_recompile);
1570 }
1571
1572 void Deoptimization::reset_invocation_counter(ScopeDesc* trap_scope, jint top_count) {
1573 ScopeDesc* sd = trap_scope;
1574 for (; !sd->is_top(); sd = sd->sender()) {
1575 // Reset ICs of inlined methods, since they can trigger compilations also.
1576 sd->method()->invocation_counter()->reset();
1577 }
1578 InvocationCounter* c = sd->method()->invocation_counter();
1579 if (top_count != _no_count) {
1580 // It was an OSR method, so bump the count higher.
1581 c->set(c->state(), top_count);
1582 } else {
1583 c->reset();
1584 }
1585 sd->method()->backedge_counter()->reset();
1586 } 1567 }
1587 1568
1588 Deoptimization::UnrollBlock* Deoptimization::uncommon_trap(JavaThread* thread, jint trap_request) { 1569 Deoptimization::UnrollBlock* Deoptimization::uncommon_trap(JavaThread* thread, jint trap_request) {
1589 1570
1590 // Still in Java no safepoints 1571 // Still in Java no safepoints