comparison src/share/vm/opto/cfgnode.cpp @ 3845:c96c3eb1efae

7068051: SIGSEGV in PhaseIdealLoop::build_loop_late_post Summary: Removed predicate cloning from loop peeling optimization and from split fall-in paths. Reviewed-by: never
author kvn
date Fri, 29 Jul 2011 09:16:29 -0700
parents b55f5bd7ec66
children 8c57262447d3
comparison
equal deleted inserted replaced
3844:ce3e1d4dc416 3845:c96c3eb1efae
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;
1353 uint j = 1; 1352 uint j = 1;
1354 for (uint i = phi->req()-1; i > 0; i--) { 1353 for (uint i = phi->req()-1; i > 0; i--) {
1355 if (phi->in(i) == val) { // Found a path with val? 1354 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 }
1363 // Add to NEW Region/Phi, no DU info 1355 // Add to NEW Region/Phi, no DU info
1364 newn->set_req( j++, n->in(i) ); 1356 newn->set_req( j++, n->in(i) );
1365 // Remove from OLD Region/Phi 1357 // Remove from OLD Region/Phi
1366 n->del_req(i); 1358 n->del_req(i);
1367 } 1359 }
1368 } 1360 }
1369 1361
1370 // Register the new node but do not transform it. Cannot transform until the 1362 // Register the new node but do not transform it. Cannot transform until the
1371 // entire Region/Phi conglomerate has been hacked as a single huge transform. 1363 // entire Region/Phi conglomerate has been hacked as a single huge transform.
1372 igvn->register_new_node_with_optimizer( newn ); 1364 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, !n->is_CountedLoop());
1377 }
1378 1365
1379 // Now I can point to the new node. 1366 // Now I can point to the new node.
1380 n->add_req(newn); 1367 n->add_req(newn);
1381 igvn->_worklist.push(n); 1368 igvn->_worklist.push(n);
1382 } 1369 }
1402 if( i >= phi->req() ) // Only split for constants 1389 if( i >= phi->req() ) // Only split for constants
1403 return NULL; 1390 return NULL;
1404 1391
1405 Node *val = phi->in(i); // Constant to split for 1392 Node *val = phi->in(i); // Constant to split for
1406 uint hit = 0; // Number of times it occurs 1393 uint hit = 0; // Number of times it occurs
1394 Node *r = phi->region();
1407 1395
1408 for( ; i < phi->req(); i++ ){ // Count occurrences of constant 1396 for( ; i < phi->req(); i++ ){ // Count occurrences of constant
1409 Node *n = phi->in(i); 1397 Node *n = phi->in(i);
1410 if( !n ) return NULL; 1398 if( !n ) return NULL;
1411 if( phase->type(n) == Type::TOP ) return NULL; 1399 if( phase->type(n) == Type::TOP ) return NULL;
1412 if( phi->in(i) == val ) 1400 if( phi->in(i) == val ) {
1413 hit++; 1401 hit++;
1402 if (PhaseIdealLoop::find_predicate(r->in(i)) != NULL) {
1403 return NULL; // don't split loop entry path
1404 }
1405 }
1414 } 1406 }
1415 1407
1416 if( hit <= 1 || // Make sure we find 2 or more 1408 if( hit <= 1 || // Make sure we find 2 or more
1417 hit == phi->req()-1 ) // and not ALL the same value 1409 hit == phi->req()-1 ) // and not ALL the same value
1418 return NULL; 1410 return NULL;
1419 1411
1420 // Now start splitting out the flow paths that merge the same value. 1412 // Now start splitting out the flow paths that merge the same value.
1421 // Split first the RegionNode. 1413 // Split first the RegionNode.
1422 PhaseIterGVN *igvn = phase->is_IterGVN(); 1414 PhaseIterGVN *igvn = phase->is_IterGVN();
1423 Node *r = phi->region();
1424 RegionNode *newr = new (phase->C, hit+1) RegionNode(hit+1); 1415 RegionNode *newr = new (phase->C, hit+1) RegionNode(hit+1);
1425 split_once(igvn, phi, val, r, newr); 1416 split_once(igvn, phi, val, r, newr);
1426 1417
1427 // Now split all other Phis than this one 1418 // Now split all other Phis than this one
1428 for (DUIterator_Fast kmax, k = r->fast_outs(kmax); k < kmax; k++) { 1419 for (DUIterator_Fast kmax, k = r->fast_outs(kmax); k < kmax; k++) {