1347 //------------------------------split_once------------------------------------- |
1347 //------------------------------split_once------------------------------------- |
1348 // Helper for split_flow_path |
1348 // Helper for split_flow_path |
1349 static void split_once(PhaseIterGVN *igvn, Node *phi, Node *val, Node *n, Node *newn) { |
1349 static void split_once(PhaseIterGVN *igvn, Node *phi, Node *val, Node *n, Node *newn) { |
1350 igvn->hash_delete(n); // Remove from hash before hacking edges |
1350 igvn->hash_delete(n); // Remove from hash before hacking edges |
1351 |
1351 |
|
1352 Node* predicate_proj = NULL; |
1352 uint j = 1; |
1353 uint j = 1; |
1353 for( uint i = phi->req()-1; i > 0; i-- ) { |
1354 for (uint i = phi->req()-1; i > 0; i--) { |
1354 if( phi->in(i) == val ) { // Found a path with val? |
1355 if (phi->in(i) == val) { // Found a path with val? |
|
1356 if (n->is_Region()) { |
|
1357 Node* proj = PhaseIdealLoop::find_predicate(n->in(i)); |
|
1358 if (proj != NULL) { |
|
1359 assert(predicate_proj == NULL, "only one predicate entry expected"); |
|
1360 predicate_proj = proj; |
|
1361 } |
|
1362 } |
1355 // Add to NEW Region/Phi, no DU info |
1363 // Add to NEW Region/Phi, no DU info |
1356 newn->set_req( j++, n->in(i) ); |
1364 newn->set_req( j++, n->in(i) ); |
1357 // Remove from OLD Region/Phi |
1365 // Remove from OLD Region/Phi |
1358 n->del_req(i); |
1366 n->del_req(i); |
1359 } |
1367 } |
1360 } |
1368 } |
1361 |
1369 |
1362 // Register the new node but do not transform it. Cannot transform until the |
1370 // Register the new node but do not transform it. Cannot transform until the |
1363 // entire Region/Phi conglomerate has been hacked as a single huge transform. |
1371 // entire Region/Phi conglomerate has been hacked as a single huge transform. |
1364 igvn->register_new_node_with_optimizer( newn ); |
1372 igvn->register_new_node_with_optimizer( newn ); |
|
1373 |
|
1374 // Clone loop predicates |
|
1375 if (predicate_proj != NULL) { |
|
1376 newn = igvn->clone_loop_predicates(predicate_proj, newn); |
|
1377 } |
|
1378 |
1365 // Now I can point to the new node. |
1379 // Now I can point to the new node. |
1366 n->add_req(newn); |
1380 n->add_req(newn); |
1367 igvn->_worklist.push(n); |
1381 igvn->_worklist.push(n); |
1368 } |
1382 } |
1369 |
1383 |