src/share/vm/opto/phaseX.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/phaseX.cpp	Fri Aug 14 14:06:42 2009
--- new/src/share/vm/opto/phaseX.cpp	Fri Aug 14 14:06:42 2009

*** 981,990 **** --- 981,1001 ---- _table.hash_delete(n); if( VerifyIterativeGVN ) { assert( !_table.find_index(n->_idx), "found duplicate entry in table"); } + // If n computes a constant, replace it with a constant now to skip unneeded + // ideal transformations + const Type* t_n = type_or_null(n); + if( t_n != NULL && t_n->singleton() && !n->is_Con() ) { + NOT_PRODUCT( set_progress(); ) + Node *con = makecon(t_n); // Make a constant + add_users_to_worklist( n ); + subsume_node( n, con ); // Everybody using n now uses con + return con; + } + // Apply the Ideal call in a loop until it no longer applies Node *k = n; DEBUG_ONLY(dead_loop_check(k);) DEBUG_ONLY(bool is_new = (k->outcnt() == 0);) Node *i = k->Ideal(this, /*can_reshape=*/true);
*** 1620,1632 **** --- 1631,1645 ---- set_req(i, n); // old goes dead? if( old ) { switch (old->outcnt()) { - case 0: // Kill all his inputs, and recursively kill other dead nodes. + // Put into the worklist to kill later. We do not kill it now because the + // recursive kill will delete the current node (this) if dead-loop exists if (!old->is_top()) ! igvn->remove_dead_node( old ); ! igvn->_worklist.push( old ); break; case 1: if( old->is_Store() || old->has_special_unique_user() ) igvn->add_users_to_worklist( old ); break;

src/share/vm/opto/phaseX.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File