src/share/vm/opto/cfgnode.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/opto/cfgnode.cpp Wed Jul 20 14:06:31 2011
--- new/src/share/vm/opto/cfgnode.cpp Wed Jul 20 14:06:31 2011
*** 1347,1367 ****
--- 1347,1359 ----
//------------------------------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);
}
*** 1369,1383 ****
--- 1361,1370 ----
// 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);
}
*** 1402,1428 ****
--- 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();
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++) {
src/share/vm/opto/cfgnode.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File