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

src/share/vm/opto/cfgnode.cpp

Print this page

        

*** 1347,1367 **** //------------------------------split_once------------------------------------- // Helper for split_flow_path static void split_once(PhaseIterGVN *igvn, Node *phi, Node *val, Node *n, Node *newn) { igvn->hash_delete(n); // Remove from hash before hacking edges - Node* predicate_proj = NULL; uint j = 1; for (uint i = phi->req()-1; i > 0; i--) { if (phi->in(i) == val) { // Found a path with val? - if (n->is_Region()) { - Node* proj = PhaseIdealLoop::find_predicate(n->in(i)); - if (proj != NULL) { - assert(predicate_proj == NULL, "only one predicate entry expected"); - predicate_proj = proj; - } - } // Add to NEW Region/Phi, no DU info newn->set_req( j++, n->in(i) ); // Remove from OLD Region/Phi n->del_req(i); } --- 1347,1359 ----
*** 1369,1383 **** // Register the new node but do not transform it. Cannot transform until the // entire Region/Phi conglomerate has been hacked as a single huge transform. igvn->register_new_node_with_optimizer( newn ); - // Clone loop predicates - if (predicate_proj != NULL) { - newn = igvn->clone_loop_predicates(predicate_proj, newn, !n->is_CountedLoop()); - } - // Now I can point to the new node. n->add_req(newn); igvn->_worklist.push(n); } --- 1361,1370 ----
*** 1402,1428 **** if( i >= phi->req() ) // Only split for constants return NULL; Node *val = phi->in(i); // Constant to split for uint hit = 0; // Number of times it occurs for( ; i < phi->req(); i++ ){ // Count occurrences of constant Node *n = phi->in(i); if( !n ) return NULL; if( phase->type(n) == Type::TOP ) return NULL; ! if( phi->in(i) == val ) hit++; } if( hit <= 1 || // Make sure we find 2 or more hit == phi->req()-1 ) // and not ALL the same value return NULL; // Now start splitting out the flow paths that merge the same value. // Split first the RegionNode. PhaseIterGVN *igvn = phase->is_IterGVN(); - Node *r = phi->region(); RegionNode *newr = new (phase->C, hit+1) RegionNode(hit+1); split_once(igvn, phi, val, r, newr); // Now split all other Phis than this one for (DUIterator_Fast kmax, k = r->fast_outs(kmax); k < kmax; k++) { --- 1389,1419 ---- if( i >= phi->req() ) // Only split for constants return NULL; Node *val = phi->in(i); // Constant to split for uint hit = 0; // Number of times it occurs + Node *r = phi->region(); for( ; i < phi->req(); i++ ){ // Count occurrences of constant Node *n = phi->in(i); if( !n ) return NULL; if( phase->type(n) == Type::TOP ) return NULL; ! if( phi->in(i) == val ) { hit++; + if (PhaseIdealLoop::find_predicate(r->in(i)) != NULL) { + return NULL; // don't split loop entry path } + } + } if( hit <= 1 || // Make sure we find 2 or more hit == phi->req()-1 ) // and not ALL the same value return NULL; // Now start splitting out the flow paths that merge the same value. // Split first the RegionNode. PhaseIterGVN *igvn = phase->is_IterGVN(); RegionNode *newr = new (phase->C, hit+1) RegionNode(hit+1); split_once(igvn, phi, val, r, newr); // Now split all other Phis than this one for (DUIterator_Fast kmax, k = r->fast_outs(kmax); k < kmax; k++) {
src/share/vm/opto/cfgnode.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File