equal
deleted
inserted
replaced
395 int i; |
395 int i; |
396 for( i= C->unique()-1; i>=0; i-- ) |
396 for( i= C->unique()-1; i>=0; i-- ) |
397 ntarjan[i]._control = NULL; |
397 ntarjan[i]._control = NULL; |
398 |
398 |
399 // Store the DFS order for the main loop |
399 // Store the DFS order for the main loop |
|
400 const uint fill_value = max_juint; |
400 uint *dfsorder = NEW_RESOURCE_ARRAY(uint,C->unique()+1); |
401 uint *dfsorder = NEW_RESOURCE_ARRAY(uint,C->unique()+1); |
401 memset(dfsorder, max_uint, (C->unique()+1) * sizeof(uint)); |
402 memset(dfsorder, fill_value, (C->unique()+1) * sizeof(uint)); |
402 |
403 |
403 // Tarjan's algorithm, almost verbatim: |
404 // Tarjan's algorithm, almost verbatim: |
404 // Step 1: |
405 // Step 1: |
405 VectorSet visited(Thread::current()->resource_area()); |
406 VectorSet visited(Thread::current()->resource_area()); |
406 int dfsnum = NTarjan::DFS( ntarjan, visited, this, dfsorder); |
407 int dfsnum = NTarjan::DFS( ntarjan, visited, this, dfsorder); |
417 Node *whead = w->_control; |
418 Node *whead = w->_control; |
418 for( uint j=0; j < whead->req(); j++ ) { // For each predecessor |
419 for( uint j=0; j < whead->req(); j++ ) { // For each predecessor |
419 if( whead->in(j) == NULL || !whead->in(j)->is_CFG() ) |
420 if( whead->in(j) == NULL || !whead->in(j)->is_CFG() ) |
420 continue; // Only process control nodes |
421 continue; // Only process control nodes |
421 uint b = dfsorder[whead->in(j)->_idx]; |
422 uint b = dfsorder[whead->in(j)->_idx]; |
422 if(b == max_uint) continue; |
423 if(b == fill_value) continue; |
423 NTarjan *vx = &ntarjan[b]; |
424 NTarjan *vx = &ntarjan[b]; |
424 NTarjan *u = vx->EVAL(); |
425 NTarjan *u = vx->EVAL(); |
425 if( u->_semi < w->_semi ) |
426 if( u->_semi < w->_semi ) |
426 w->_semi = u->_semi; |
427 w->_semi = u->_semi; |
427 } |
428 } |