1.1 --- a/src/share/vm/opto/gcm.cpp Wed Jan 07 11:23:28 2009 -0800 1.2 +++ b/src/share/vm/opto/gcm.cpp Tue Jan 13 11:10:00 2009 -0800 1.3 @@ -29,6 +29,9 @@ 1.4 #include "incls/_precompiled.incl" 1.5 #include "incls/_gcm.cpp.incl" 1.6 1.7 +// To avoid float value underflow 1.8 +#define MIN_BLOCK_FREQUENCY 1.e-35f 1.9 + 1.10 //----------------------------schedule_node_into_block------------------------- 1.11 // Insert node n into block b. Look for projections of n and make sure they 1.12 // are in b also. 1.13 @@ -1380,6 +1383,13 @@ 1.14 } 1.15 } 1.16 1.17 +#ifdef ASSERT 1.18 + for (uint i = 0; i < _num_blocks; i++ ) { 1.19 + Block *b = _blocks[i]; 1.20 + assert(b->_freq >= MIN_BLOCK_FREQUENCY, "Register Allocator requiers meaningful block frequency"); 1.21 + } 1.22 +#endif 1.23 + 1.24 #ifndef PRODUCT 1.25 if (PrintCFGBlockFreq) { 1.26 tty->print_cr("CFG Block Frequencies"); 1.27 @@ -1877,7 +1887,9 @@ 1.28 float loop_freq = _freq * trip_count(); 1.29 for (int i = 0; i < _members.length(); i++) { 1.30 CFGElement* s = _members.at(i); 1.31 - s->_freq *= loop_freq; 1.32 + float block_freq = s->_freq * loop_freq; 1.33 + if (block_freq < MIN_BLOCK_FREQUENCY) block_freq = MIN_BLOCK_FREQUENCY; 1.34 + s->_freq = block_freq; 1.35 } 1.36 CFGLoop* ch = _child; 1.37 while (ch != NULL) {