6384206: Phis which are later unneeded are impairing our ability to inline based on static types

Reviewed-by: rasbold, jrose
This commit is contained in:
Tom Rodriguez 2008-09-17 12:59:52 -07:00
parent eee15b163e
commit 4b1e242299
18 changed files with 1082 additions and 401 deletions

View file

@ -1279,7 +1279,7 @@ void IdealLoopTree::counted_loop( PhaseIdealLoop *phase ) {
// Visit all children, looking for Phis
for (DUIterator i = cl->outs(); cl->has_out(i); i++) {
Node *out = cl->out(i);
if (!out->is_Phi()) continue; // Looking for phis
if (!out->is_Phi() || out == phi) continue; // Looking for other phis
PhiNode* phi2 = out->as_Phi();
Node *incr2 = phi2->in( LoopNode::LoopBackControl );
// Look for induction variables of the form: X += constant
@ -1388,6 +1388,37 @@ void IdealLoopTree::dump( ) const {
#endif
static void log_loop_tree(IdealLoopTree* root, IdealLoopTree* loop, CompileLog* log) {
if (loop == root) {
if (loop->_child != NULL) {
log->begin_head("loop_tree");
log->end_head();
if( loop->_child ) log_loop_tree(root, loop->_child, log);
log->tail("loop_tree");
assert(loop->_next == NULL, "what?");
}
} else {
Node* head = loop->_head;
log->begin_head("loop");
log->print(" idx='%d' ", head->_idx);
if (loop->_irreducible) log->print("irreducible='1' ");
if (head->is_Loop()) {
if (head->as_Loop()->is_inner_loop()) log->print("inner_loop='1' ");
if (head->as_Loop()->is_partial_peel_loop()) log->print("partial_peel_loop='1' ");
}
if (head->is_CountedLoop()) {
CountedLoopNode* cl = head->as_CountedLoop();
if (cl->is_pre_loop()) log->print("pre_loop='%d' ", cl->main_idx());
if (cl->is_main_loop()) log->print("main_loop='%d' ", cl->_idx);
if (cl->is_post_loop()) log->print("post_loop='%d' ", cl->main_idx());
}
log->end_head();
if( loop->_child ) log_loop_tree(root, loop->_child, log);
log->tail("loop");
if( loop->_next ) log_loop_tree(root, loop->_next, log);
}
}
//=============================================================================
//------------------------------PhaseIdealLoop---------------------------------
// Create a PhaseLoop. Build the ideal Loop tree. Map each Ideal Node to
@ -1624,10 +1655,13 @@ PhaseIdealLoop::PhaseIdealLoop( PhaseIterGVN &igvn, const PhaseIdealLoop *verify
// Cleanup any modified bits
_igvn.optimize();
// Do not repeat loop optimizations if irreducible loops are present
// by claiming no-progress.
if( _has_irreducible_loops )
C->clear_major_progress();
// disable assert until issue with split_flow_path is resolved (6742111)
// assert(!_has_irreducible_loops || C->parsed_irreducible_loop() || C->is_osr_compilation(),
// "shouldn't introduce irreducible loops");
if (C->log() != NULL) {
log_loop_tree(_ltree_root, _ltree_root, C->log());
}
}
#ifndef PRODUCT
@ -2732,11 +2766,7 @@ void PhaseIdealLoop::dump( ) const {
}
void PhaseIdealLoop::dump( IdealLoopTree *loop, uint idx, Node_List &rpo_list ) const {
// Indent by loop nesting depth
for( uint x = 0; x < loop->_nest; x++ )
tty->print(" ");
tty->print_cr("---- Loop N%d-N%d ----", loop->_head->_idx,loop->_tail->_idx);
loop->dump_head();
// Now scan for CFG nodes in the same loop
for( uint j=idx; j > 0; j-- ) {