48 // Initialize the space for the BufferBlob used to find and verify |
48 // Initialize the space for the BufferBlob used to find and verify |
49 // instruction size in MachNode::emit_size() |
49 // instruction size in MachNode::emit_size() |
50 init_scratch_buffer_blob(); |
50 init_scratch_buffer_blob(); |
51 if (failing()) return; // Out of memory |
51 if (failing()) return; // Out of memory |
52 |
52 |
|
53 // The number of new nodes (mostly MachNop) is proportional to |
|
54 // the number of java calls and inner loops which are aligned. |
|
55 if ( C->check_node_count((NodeLimitFudgeFactor + C->java_calls()*3 + |
|
56 C->inner_loops()*(OptoLoopAlignment-1)), |
|
57 "out of nodes before code generation" ) ) { |
|
58 return; |
|
59 } |
53 // Make sure I can find the Start Node |
60 // Make sure I can find the Start Node |
54 Block_Array& bbs = _cfg->_bbs; |
61 Block_Array& bbs = _cfg->_bbs; |
55 Block *entry = _cfg->_blocks[1]; |
62 Block *entry = _cfg->_blocks[1]; |
56 Block *broot = _cfg->_broot; |
63 Block *broot = _cfg->_broot; |
57 |
64 |
1103 |
1110 |
1104 // Count and start of calls |
1111 // Count and start of calls |
1105 uint *call_returns = NEW_RESOURCE_ARRAY(uint, _cfg->_num_blocks+1); |
1112 uint *call_returns = NEW_RESOURCE_ARRAY(uint, _cfg->_num_blocks+1); |
1106 |
1113 |
1107 uint return_offset = 0; |
1114 uint return_offset = 0; |
1108 MachNode *nop = new (this) MachNopNode(); |
1115 int nop_size = (new (this) MachNopNode())->size(_regalloc); |
1109 |
1116 |
1110 int previous_offset = 0; |
1117 int previous_offset = 0; |
1111 int current_offset = 0; |
1118 int current_offset = 0; |
1112 int last_call_offset = -1; |
1119 int last_call_offset = -1; |
1113 |
1120 |
1186 cb->flush_bundle(true); |
1193 cb->flush_bundle(true); |
1187 current_offset = cb->code_size(); |
1194 current_offset = cb->code_size(); |
1188 } |
1195 } |
1189 |
1196 |
1190 // align the instruction if necessary |
1197 // align the instruction if necessary |
1191 int nop_size = nop->size(_regalloc); |
|
1192 int padding = mach->compute_padding(current_offset); |
1198 int padding = mach->compute_padding(current_offset); |
1193 // Make sure safepoint node for polling is distinct from a call's |
1199 // Make sure safepoint node for polling is distinct from a call's |
1194 // return by adding a nop if needed. |
1200 // return by adding a nop if needed. |
1195 if (is_sfn && !is_mcall && padding == 0 && current_offset == last_call_offset ) { |
1201 if (is_sfn && !is_mcall && padding == 0 && current_offset == last_call_offset ) { |
1196 padding = nop_size; |
1202 padding = nop_size; |
1370 |
1376 |
1371 } // End for all instructions in block |
1377 } // End for all instructions in block |
1372 |
1378 |
1373 // If the next block is the top of a loop, pad this block out to align |
1379 // If the next block is the top of a loop, pad this block out to align |
1374 // the loop top a little. Helps prevent pipe stalls at loop back branches. |
1380 // the loop top a little. Helps prevent pipe stalls at loop back branches. |
1375 int nop_size = (new (this) MachNopNode())->size(_regalloc); |
|
1376 if( i<_cfg->_num_blocks-1 ) { |
1381 if( i<_cfg->_num_blocks-1 ) { |
1377 Block *nb = _cfg->_blocks[i+1]; |
1382 Block *nb = _cfg->_blocks[i+1]; |
1378 uint padding = nb->alignment_padding(current_offset); |
1383 uint padding = nb->alignment_padding(current_offset); |
1379 if( padding > 0 ) { |
1384 if( padding > 0 ) { |
1380 MachNode *nop = new (this) MachNopNode(padding / nop_size); |
1385 MachNode *nop = new (this) MachNopNode(padding / nop_size); |