comparison src/share/vm/opto/output.cpp @ 418:72c5366e5d86

6743900: frequency based block layout Summary: post-register allocation pass that drives block layout by edge frequencies Reviewed-by: never, kvn
author rasbold
date Thu, 06 Nov 2008 14:59:10 -0800
parents 4d9884b01ba6
children 424f9bfe6b96
comparison
equal deleted inserted replaced
417:f4fe12e429a4 418:72c5366e5d86
261 } 261 }
262 262
263 # endif // ENABLE_ZAP_DEAD_LOCALS 263 # endif // ENABLE_ZAP_DEAD_LOCALS
264 264
265 //------------------------------compute_loop_first_inst_sizes------------------ 265 //------------------------------compute_loop_first_inst_sizes------------------
266 // Compute the size of first NumberOfLoopInstrToAlign instructions at head 266 // Compute the size of first NumberOfLoopInstrToAlign instructions at the top
267 // of a loop. When aligning a loop we need to provide enough instructions 267 // of a loop. When aligning a loop we need to provide enough instructions
268 // in cpu's fetch buffer to feed decoders. The loop alignment could be 268 // in cpu's fetch buffer to feed decoders. The loop alignment could be
269 // avoided if we have enough instructions in fetch buffer at the head of a loop. 269 // avoided if we have enough instructions in fetch buffer at the head of a loop.
270 // By default, the size is set to 999999 by Block's constructor so that 270 // By default, the size is set to 999999 by Block's constructor so that
271 // a loop will be aligned if the size is not reset here. 271 // a loop will be aligned if the size is not reset here.
282 if( MaxLoopPad < OptoLoopAlignment-1 ) { 282 if( MaxLoopPad < OptoLoopAlignment-1 ) {
283 uint last_block = _cfg->_num_blocks-1; 283 uint last_block = _cfg->_num_blocks-1;
284 for( uint i=1; i <= last_block; i++ ) { 284 for( uint i=1; i <= last_block; i++ ) {
285 Block *b = _cfg->_blocks[i]; 285 Block *b = _cfg->_blocks[i];
286 // Check the first loop's block which requires an alignment. 286 // Check the first loop's block which requires an alignment.
287 if( b->head()->is_Loop() && 287 if( b->loop_alignment() > (uint)relocInfo::addr_unit() ) {
288 b->code_alignment() > (uint)relocInfo::addr_unit() ) {
289 uint sum_size = 0; 288 uint sum_size = 0;
290 uint inst_cnt = NumberOfLoopInstrToAlign; 289 uint inst_cnt = NumberOfLoopInstrToAlign;
291 inst_cnt = b->compute_first_inst_size(sum_size, inst_cnt, 290 inst_cnt = b->compute_first_inst_size(sum_size, inst_cnt, _regalloc);
292 _regalloc); 291
293 // Check the next fallthrough block if first loop's block does not have 292 // Check subsequent fallthrough blocks if the loop's first
294 // enough instructions. 293 // block(s) does not have enough instructions.
295 if( inst_cnt > 0 && i < last_block ) { 294 Block *nb = b;
296 // First, check if the first loop's block contains whole loop. 295 while( inst_cnt > 0 &&
297 // LoopNode::LoopBackControl == 2. 296 i < last_block &&
298 Block *bx = _cfg->_bbs[b->pred(2)->_idx]; 297 !_cfg->_blocks[i+1]->has_loop_alignment() &&
299 // Skip connector blocks (with limit in case of irreducible loops). 298 !nb->has_successor(b) ) {
300 int search_limit = 16; 299 i++;
301 while( bx->is_connector() && search_limit-- > 0) { 300 nb = _cfg->_blocks[i];
302 bx = _cfg->_bbs[bx->pred(1)->_idx]; 301 inst_cnt = nb->compute_first_inst_size(sum_size, inst_cnt, _regalloc);
303 } 302 } // while( inst_cnt > 0 && i < last_block )
304 if( bx != b ) { // loop body is in several blocks. 303
305 Block *nb = NULL;
306 while( inst_cnt > 0 && i < last_block && nb != bx &&
307 !_cfg->_blocks[i+1]->head()->is_Loop() ) {
308 i++;
309 nb = _cfg->_blocks[i];
310 inst_cnt = nb->compute_first_inst_size(sum_size, inst_cnt,
311 _regalloc);
312 } // while( inst_cnt > 0 && i < last_block )
313 } // if( bx != b )
314 } // if( inst_cnt > 0 && i < last_block )
315 b->set_first_inst_size(sum_size); 304 b->set_first_inst_size(sum_size);
316 } // f( b->head()->is_Loop() ) 305 } // f( b->head()->is_Loop() )
317 } // for( i <= last_block ) 306 } // for( i <= last_block )
318 } // if( MaxLoopPad < OptoLoopAlignment-1 ) 307 } // if( MaxLoopPad < OptoLoopAlignment-1 )
319 } 308 }
510 499
511 if ( i != _cfg->_num_blocks-1) { 500 if ( i != _cfg->_num_blocks-1) {
512 // Get the size of the block 501 // Get the size of the block
513 uint blk_size = adr - blk_starts[i]; 502 uint blk_size = adr - blk_starts[i];
514 503
515 // When the next block starts a loop, we may insert pad NOP 504 // When the next block is the top of a loop, we may insert pad NOP
516 // instructions. 505 // instructions.
517 Block *nb = _cfg->_blocks[i+1]; 506 Block *nb = _cfg->_blocks[i+1];
518 int current_offset = blk_starts[i] + blk_size; 507 int current_offset = blk_starts[i] + blk_size;
519 current_offset += nb->alignment_padding(current_offset); 508 current_offset += nb->alignment_padding(current_offset);
520 // Save block size; update total method size 509 // Save block size; update total method size
1380 delay_slot = NULL; 1369 delay_slot = NULL;
1381 } 1370 }
1382 1371
1383 } // End for all instructions in block 1372 } // End for all instructions in block
1384 1373
1385 // If the next block _starts_ a loop, pad this block out to align 1374 // If the next block is the top of a loop, pad this block out to align
1386 // the loop start a little. Helps prevent pipe stalls at loop starts 1375 // the loop top a little. Helps prevent pipe stalls at loop back branches.
1387 int nop_size = (new (this) MachNopNode())->size(_regalloc); 1376 int nop_size = (new (this) MachNopNode())->size(_regalloc);
1388 if( i<_cfg->_num_blocks-1 ) { 1377 if( i<_cfg->_num_blocks-1 ) {
1389 Block *nb = _cfg->_blocks[i+1]; 1378 Block *nb = _cfg->_blocks[i+1];
1390 uint padding = nb->alignment_padding(current_offset); 1379 uint padding = nb->alignment_padding(current_offset);
1391 if( padding > 0 ) { 1380 if( padding > 0 ) {