comparison src/share/vm/opto/node.cpp @ 2403:1927db75dd85

7024475: loop doesn't terminate when compiled Reviewed-by: kvn
author never
date Sun, 27 Mar 2011 00:00:14 -0700
parents ab42c7e1cf83
children 1d1603768966
comparison
equal deleted inserted replaced
2402:244bf8afbbd3 2403:1927db75dd85
1371 1371
1372 1372
1373 //------------------------------find------------------------------------------ 1373 //------------------------------find------------------------------------------
1374 // Find a neighbor of this Node with the given _idx 1374 // Find a neighbor of this Node with the given _idx
1375 // If idx is negative, find its absolute value, following both _in and _out. 1375 // If idx is negative, find its absolute value, following both _in and _out.
1376 static void find_recur( Node* &result, Node *n, int idx, bool only_ctrl, 1376 static void find_recur(Compile* C, Node* &result, Node *n, int idx, bool only_ctrl,
1377 VectorSet &old_space, VectorSet &new_space ) { 1377 VectorSet* old_space, VectorSet* new_space ) {
1378 int node_idx = (idx >= 0) ? idx : -idx; 1378 int node_idx = (idx >= 0) ? idx : -idx;
1379 if (NotANode(n)) return; // Gracefully handle NULL, -1, 0xabababab, etc. 1379 if (NotANode(n)) return; // Gracefully handle NULL, -1, 0xabababab, etc.
1380 // Contained in new_space or old_space? 1380 // Contained in new_space or old_space? Check old_arena first since it's mostly empty.
1381 VectorSet *v = Compile::current()->node_arena()->contains(n) ? &new_space : &old_space; 1381 VectorSet *v = C->old_arena()->contains(n) ? old_space : new_space;
1382 if( v->test(n->_idx) ) return; 1382 if( v->test(n->_idx) ) return;
1383 if( (int)n->_idx == node_idx 1383 if( (int)n->_idx == node_idx
1384 debug_only(|| n->debug_idx() == node_idx) ) { 1384 debug_only(|| n->debug_idx() == node_idx) ) {
1385 if (result != NULL) 1385 if (result != NULL)
1386 tty->print("find: " INTPTR_FORMAT " and " INTPTR_FORMAT " both have idx==%d\n", 1386 tty->print("find: " INTPTR_FORMAT " and " INTPTR_FORMAT " both have idx==%d\n",
1388 result = n; 1388 result = n;
1389 } 1389 }
1390 v->set(n->_idx); 1390 v->set(n->_idx);
1391 for( uint i=0; i<n->len(); i++ ) { 1391 for( uint i=0; i<n->len(); i++ ) {
1392 if( only_ctrl && !(n->is_Region()) && (n->Opcode() != Op_Root) && (i != TypeFunc::Control) ) continue; 1392 if( only_ctrl && !(n->is_Region()) && (n->Opcode() != Op_Root) && (i != TypeFunc::Control) ) continue;
1393 find_recur( result, n->in(i), idx, only_ctrl, old_space, new_space ); 1393 find_recur(C, result, n->in(i), idx, only_ctrl, old_space, new_space );
1394 } 1394 }
1395 // Search along forward edges also: 1395 // Search along forward edges also:
1396 if (idx < 0 && !only_ctrl) { 1396 if (idx < 0 && !only_ctrl) {
1397 for( uint j=0; j<n->outcnt(); j++ ) { 1397 for( uint j=0; j<n->outcnt(); j++ ) {
1398 find_recur( result, n->raw_out(j), idx, only_ctrl, old_space, new_space ); 1398 find_recur(C, result, n->raw_out(j), idx, only_ctrl, old_space, new_space );
1399 } 1399 }
1400 } 1400 }
1401 #ifdef ASSERT 1401 #ifdef ASSERT
1402 // Search along debug_orig edges last: 1402 // Search along debug_orig edges last, checking for cycles
1403 for (Node* orig = n->debug_orig(); orig != NULL && n != orig; orig = orig->debug_orig()) { 1403 Node* orig = n->debug_orig();
1404 if (NotANode(orig)) break; 1404 if (orig != NULL) {
1405 find_recur( result, orig, idx, only_ctrl, old_space, new_space ); 1405 do {
1406 if (NotANode(orig)) break;
1407 find_recur(C, result, orig, idx, only_ctrl, old_space, new_space );
1408 orig = orig->debug_orig();
1409 } while (orig != NULL && orig != n->debug_orig());
1406 } 1410 }
1407 #endif //ASSERT 1411 #endif //ASSERT
1408 } 1412 }
1409 1413
1410 // call this from debugger: 1414 // call this from debugger:
1415 //------------------------------find------------------------------------------- 1419 //------------------------------find-------------------------------------------
1416 Node* Node::find(int idx) const { 1420 Node* Node::find(int idx) const {
1417 ResourceArea *area = Thread::current()->resource_area(); 1421 ResourceArea *area = Thread::current()->resource_area();
1418 VectorSet old_space(area), new_space(area); 1422 VectorSet old_space(area), new_space(area);
1419 Node* result = NULL; 1423 Node* result = NULL;
1420 find_recur( result, (Node*) this, idx, false, old_space, new_space ); 1424 find_recur(Compile::current(), result, (Node*) this, idx, false, &old_space, &new_space );
1421 return result; 1425 return result;
1422 } 1426 }
1423 1427
1424 //------------------------------find_ctrl-------------------------------------- 1428 //------------------------------find_ctrl--------------------------------------
1425 // Find an ancestor to this node in the control history with given _idx 1429 // Find an ancestor to this node in the control history with given _idx
1426 Node* Node::find_ctrl(int idx) const { 1430 Node* Node::find_ctrl(int idx) const {
1427 ResourceArea *area = Thread::current()->resource_area(); 1431 ResourceArea *area = Thread::current()->resource_area();
1428 VectorSet old_space(area), new_space(area); 1432 VectorSet old_space(area), new_space(area);
1429 Node* result = NULL; 1433 Node* result = NULL;
1430 find_recur( result, (Node*) this, idx, true, old_space, new_space ); 1434 find_recur(Compile::current(), result, (Node*) this, idx, true, &old_space, &new_space );
1431 return result; 1435 return result;
1432 } 1436 }
1433 #endif 1437 #endif
1434 1438
1435 1439