Mercurial > hg > graal-compiler
comparison src/share/vm/opto/block.cpp @ 12171:4b078f877b56
8023988: Move local scheduling of nodes to the CFG creation and code motion phase (PhaseCFG)
Summary: Moved local scheduling code from class Block to class PhaseCFG
Reviewed-by: kvn, roland
author | adlertz |
---|---|
date | Sun, 01 Sep 2013 19:21:05 +0200 |
parents | 650868c062a9 |
children | de6a9e811145 044b28168e20 |
comparison
equal
deleted
inserted
replaced
12169:29aa8936f03c | 12171:4b078f877b56 |
---|---|
207 return op == Op_Halt; | 207 return op == Op_Halt; |
208 } | 208 } |
209 | 209 |
210 // True if block is low enough frequency or guarded by a test which | 210 // True if block is low enough frequency or guarded by a test which |
211 // mostly does not go here. | 211 // mostly does not go here. |
212 bool Block::is_uncommon(PhaseCFG* cfg) const { | 212 bool PhaseCFG::is_uncommon(const Block* block) { |
213 // Initial blocks must never be moved, so are never uncommon. | 213 // Initial blocks must never be moved, so are never uncommon. |
214 if (head()->is_Root() || head()->is_Start()) return false; | 214 if (block->head()->is_Root() || block->head()->is_Start()) return false; |
215 | 215 |
216 // Check for way-low freq | 216 // Check for way-low freq |
217 if( _freq < BLOCK_FREQUENCY(0.00001f) ) return true; | 217 if(block->_freq < BLOCK_FREQUENCY(0.00001f) ) return true; |
218 | 218 |
219 // Look for code shape indicating uncommon_trap or slow path | 219 // Look for code shape indicating uncommon_trap or slow path |
220 if (has_uncommon_code()) return true; | 220 if (block->has_uncommon_code()) return true; |
221 | 221 |
222 const float epsilon = 0.05f; | 222 const float epsilon = 0.05f; |
223 const float guard_factor = PROB_UNLIKELY_MAG(4) / (1.f - epsilon); | 223 const float guard_factor = PROB_UNLIKELY_MAG(4) / (1.f - epsilon); |
224 uint uncommon_preds = 0; | 224 uint uncommon_preds = 0; |
225 uint freq_preds = 0; | 225 uint freq_preds = 0; |
226 uint uncommon_for_freq_preds = 0; | 226 uint uncommon_for_freq_preds = 0; |
227 | 227 |
228 for( uint i=1; i<num_preds(); i++ ) { | 228 for( uint i=1; i< block->num_preds(); i++ ) { |
229 Block* guard = cfg->get_block_for_node(pred(i)); | 229 Block* guard = get_block_for_node(block->pred(i)); |
230 // Check to see if this block follows its guard 1 time out of 10000 | 230 // Check to see if this block follows its guard 1 time out of 10000 |
231 // or less. | 231 // or less. |
232 // | 232 // |
233 // See list of magnitude-4 unlikely probabilities in cfgnode.hpp which | 233 // See list of magnitude-4 unlikely probabilities in cfgnode.hpp which |
234 // we intend to be "uncommon", such as slow-path TLE allocation, | 234 // we intend to be "uncommon", such as slow-path TLE allocation, |
242 // The next check is (guard->_freq < 1.e-5 * 9500.). | 242 // The next check is (guard->_freq < 1.e-5 * 9500.). |
243 if(guard->_freq*BLOCK_FREQUENCY(guard_factor) < BLOCK_FREQUENCY(0.00001f)) { | 243 if(guard->_freq*BLOCK_FREQUENCY(guard_factor) < BLOCK_FREQUENCY(0.00001f)) { |
244 uncommon_preds++; | 244 uncommon_preds++; |
245 } else { | 245 } else { |
246 freq_preds++; | 246 freq_preds++; |
247 if( _freq < guard->_freq * guard_factor ) { | 247 if(block->_freq < guard->_freq * guard_factor ) { |
248 uncommon_for_freq_preds++; | 248 uncommon_for_freq_preds++; |
249 } | 249 } |
250 } | 250 } |
251 } | 251 } |
252 if( num_preds() > 1 && | 252 if( block->num_preds() > 1 && |
253 // The block is uncommon if all preds are uncommon or | 253 // The block is uncommon if all preds are uncommon or |
254 (uncommon_preds == (num_preds()-1) || | 254 (uncommon_preds == (block->num_preds()-1) || |
255 // it is uncommon for all frequent preds. | 255 // it is uncommon for all frequent preds. |
256 uncommon_for_freq_preds == freq_preds) ) { | 256 uncommon_for_freq_preds == freq_preds) ) { |
257 return true; | 257 return true; |
258 } | 258 } |
259 return false; | 259 return false; |
667 convert_NeverBranch_to_Goto(block); | 667 convert_NeverBranch_to_Goto(block); |
668 } | 668 } |
669 | 669 |
670 // Look for uncommon blocks and move to end. | 670 // Look for uncommon blocks and move to end. |
671 if (!C->do_freq_based_layout()) { | 671 if (!C->do_freq_based_layout()) { |
672 if (block->is_uncommon(this)) { | 672 if (is_uncommon(block)) { |
673 move_to_end(block, i); | 673 move_to_end(block, i); |
674 last--; // No longer check for being uncommon! | 674 last--; // No longer check for being uncommon! |
675 if (no_flip_branch(block)) { // Fall-thru case must follow? | 675 if (no_flip_branch(block)) { // Fall-thru case must follow? |
676 // Find the fall-thru block | 676 // Find the fall-thru block |
677 block = get_block(i); | 677 block = get_block(i); |