< prev index next >
src/share/vm/opto/parse1.cpp
Print this page
rev 10293 : 8150720: Cleanup code around PrintOptoStatistics
Reviewed-by: kvn, shade, vlivanov
*** 43,96 ****
// Static array so we can figure out which bytecodes stop us from compiling
// the most. Some of the non-static variables are needed in bytecodeInfo.cpp
// and eventually should be encapsulated in a proper class (gri 8/18/98).
int nodes_created = 0;
int methods_parsed = 0;
int methods_seen = 0;
int blocks_parsed = 0;
int blocks_seen = 0;
int explicit_null_checks_inserted = 0;
int explicit_null_checks_elided = 0;
! int all_null_checks_found = 0, implicit_null_checks = 0;
! int implicit_null_throws = 0;
!
! int reclaim_idx = 0;
! int reclaim_in = 0;
! int reclaim_node = 0;
- #ifndef PRODUCT
bool Parse::BytecodeParseHistogram::_initialized = false;
uint Parse::BytecodeParseHistogram::_bytecodes_parsed [Bytecodes::number_of_codes];
uint Parse::BytecodeParseHistogram::_nodes_constructed[Bytecodes::number_of_codes];
uint Parse::BytecodeParseHistogram::_nodes_transformed[Bytecodes::number_of_codes];
uint Parse::BytecodeParseHistogram::_new_values [Bytecodes::number_of_codes];
- #endif
//------------------------------print_statistics-------------------------------
- #ifndef PRODUCT
void Parse::print_statistics() {
tty->print_cr("--- Compiler Statistics ---");
tty->print("Methods seen: %d Methods parsed: %d", methods_seen, methods_parsed);
tty->print(" Nodes created: %d", nodes_created);
tty->cr();
! if (methods_seen != methods_parsed)
tty->print_cr("Reasons for parse failures (NOT cumulative):");
tty->print_cr("Blocks parsed: %d Blocks seen: %d", blocks_parsed, blocks_seen);
! if( explicit_null_checks_inserted )
! tty->print_cr("%d original NULL checks - %d elided (%2d%%); optimizer leaves %d,", explicit_null_checks_inserted, explicit_null_checks_elided, (100*explicit_null_checks_elided)/explicit_null_checks_inserted, all_null_checks_found);
! if( all_null_checks_found )
tty->print_cr("%d made implicit (%2d%%)", implicit_null_checks,
(100*implicit_null_checks)/all_null_checks_found);
! if( implicit_null_throws )
tty->print_cr("%d implicit null exceptions at runtime",
! implicit_null_throws);
! if( PrintParseStatistics && BytecodeParseHistogram::initialized() ) {
BytecodeParseHistogram::print();
}
}
#endif
--- 43,97 ----
// Static array so we can figure out which bytecodes stop us from compiling
// the most. Some of the non-static variables are needed in bytecodeInfo.cpp
// and eventually should be encapsulated in a proper class (gri 8/18/98).
+ #ifndef PRODUCT
int nodes_created = 0;
int methods_parsed = 0;
int methods_seen = 0;
int blocks_parsed = 0;
int blocks_seen = 0;
int explicit_null_checks_inserted = 0;
int explicit_null_checks_elided = 0;
! int all_null_checks_found = 0;
! int implicit_null_checks = 0;
bool Parse::BytecodeParseHistogram::_initialized = false;
uint Parse::BytecodeParseHistogram::_bytecodes_parsed [Bytecodes::number_of_codes];
uint Parse::BytecodeParseHistogram::_nodes_constructed[Bytecodes::number_of_codes];
uint Parse::BytecodeParseHistogram::_nodes_transformed[Bytecodes::number_of_codes];
uint Parse::BytecodeParseHistogram::_new_values [Bytecodes::number_of_codes];
//------------------------------print_statistics-------------------------------
void Parse::print_statistics() {
tty->print_cr("--- Compiler Statistics ---");
tty->print("Methods seen: %d Methods parsed: %d", methods_seen, methods_parsed);
tty->print(" Nodes created: %d", nodes_created);
tty->cr();
! if (methods_seen != methods_parsed) {
tty->print_cr("Reasons for parse failures (NOT cumulative):");
+ }
tty->print_cr("Blocks parsed: %d Blocks seen: %d", blocks_parsed, blocks_seen);
! if (explicit_null_checks_inserted) {
! tty->print_cr("%d original NULL checks - %d elided (%2d%%); optimizer leaves %d,",
! explicit_null_checks_inserted, explicit_null_checks_elided,
! (100*explicit_null_checks_elided)/explicit_null_checks_inserted,
! all_null_checks_found);
! }
! if (all_null_checks_found) {
tty->print_cr("%d made implicit (%2d%%)", implicit_null_checks,
(100*implicit_null_checks)/all_null_checks_found);
! }
! if (SharedRuntime::_implicit_null_throws) {
tty->print_cr("%d implicit null exceptions at runtime",
! SharedRuntime::_implicit_null_throws);
! }
! if (PrintParseStatistics && BytecodeParseHistogram::initialized()) {
BytecodeParseHistogram::print();
}
}
#endif
*** 493,503 ****
// cause deoptimization.
if (C->env()->jvmti_can_hotswap_or_post_breakpoint()) {
C->dependencies()->assert_evol_method(method());
}
! methods_seen++;
// Do some special top-level things.
if (depth() == 1 && C->is_osr_compilation()) {
_entry_bci = C->entry_bci();
_flow = method()->get_osr_flow_analysis(osr_bci());
--- 494,504 ----
// cause deoptimization.
if (C->env()->jvmti_can_hotswap_or_post_breakpoint()) {
C->dependencies()->assert_evol_method(method());
}
! NOT_PRODUCT(methods_seen++);
// Do some special top-level things.
if (depth() == 1 && C->is_osr_compilation()) {
_entry_bci = C->entry_bci();
_flow = method()->get_osr_flow_analysis(osr_bci());
*** 528,539 ****
} else {
assert(!this->is_osr_parse(), "no recursive OSR");
}
#endif
- methods_parsed++;
#ifndef PRODUCT
// add method size here to guarantee that inlined methods are added too
if (CITime)
_total_bytes_compiled += method()->code_size();
show_parse_info();
--- 529,540 ----
} else {
assert(!this->is_osr_parse(), "no recursive OSR");
}
#endif
#ifndef PRODUCT
+ methods_parsed++;
// add method size here to guarantee that inlined methods are added too
if (CITime)
_total_bytes_compiled += method()->code_size();
show_parse_info();
*** 650,660 ****
if (stopped()) {
// Block is dead.
continue;
}
! blocks_parsed++;
progress = true;
if (block->is_loop_head() || block->is_handler() || has_irreducible && !block->is_ready()) {
// Not all preds have been parsed. We must build phis everywhere.
// (Note that dead locals do not get phis built, ever.)
--- 651,661 ----
if (stopped()) {
// Block is dead.
continue;
}
! NOT_PRODUCT(blocks_parsed++);
progress = true;
if (block->is_loop_head() || block->is_handler() || has_irreducible && !block->is_ready()) {
// Not all preds have been parsed. We must build phis everywhere.
// (Note that dead locals do not get phis built, ever.)
*** 710,722 ****
if (!has_irreducible || !progress) {
break;
}
}
blocks_seen += block_count();
- #ifndef PRODUCT
// Make sure there are no half-processed blocks remaining.
// Every remaining unprocessed block is dead and may be ignored now.
for (int rpo = 0; rpo < block_count(); rpo++) {
Block* block = rpo_at(rpo);
if (!block->is_parsed()) {
--- 711,723 ----
if (!has_irreducible || !progress) {
break;
}
}
+ #ifndef PRODUCT
blocks_seen += block_count();
// Make sure there are no half-processed blocks remaining.
// Every remaining unprocessed block is dead and may be ignored now.
for (int rpo = 0; rpo < block_count(); rpo++) {
Block* block = rpo_at(rpo);
if (!block->is_parsed()) {
*** 1444,1454 ****
tty->cr();
}
assert(block()->is_merged(), "must be merged before being parsed");
block()->mark_parsed();
- ++_blocks_parsed;
// Set iterator to start of block.
iter().reset_to_bci(block()->start());
CompileLog* log = C->log();
--- 1445,1454 ----
*** 1594,1606 ****
if (stopped()) {
if (TraceOptoParse) tty->print_cr(", but path is dead and doesn't count");
return;
}
- // Record that a new block has been merged.
- ++_blocks_merged;
-
// Make a region if we know there are multiple or unpredictable inputs.
// (Also, if this is a plain fall-through, we might see another region,
// which must not be allowed into this block's map.)
if (pnum > PhiNode::Input // Known multiple inputs.
|| target->is_handler() // These have unpredictable inputs.
--- 1594,1603 ----
< prev index next >