hotspot/src/share/vm/opto/gcm.cpp
changeset 2340 cb47f8209cd8
parent 2154 72a9b7284ccf
child 2348 4e71ed4c2709
equal deleted inserted replaced
2339:2c9728eddc81 2340:cb47f8209cd8
  1372 
  1372 
  1373   // Adjust all frequencies to be relative to a single method entry
  1373   // Adjust all frequencies to be relative to a single method entry
  1374   _root_loop->_freq = 1.0;
  1374   _root_loop->_freq = 1.0;
  1375   _root_loop->scale_freq();
  1375   _root_loop->scale_freq();
  1376 
  1376 
       
  1377   // Save outmost loop frequency for LRG frequency threshold
       
  1378   _outer_loop_freq = _root_loop->outer_loop_freq();
       
  1379 
  1377   // force paths ending at uncommon traps to be infrequent
  1380   // force paths ending at uncommon traps to be infrequent
  1378   if (!C->do_freq_based_layout()) {
  1381   if (!C->do_freq_based_layout()) {
  1379     Block_List worklist;
  1382     Block_List worklist;
  1380     Block* root_blk = _blocks[0];
  1383     Block* root_blk = _blocks[0];
  1381     for (uint i = 1; i < root_blk->num_preds(); i++) {
  1384     for (uint i = 1; i < root_blk->num_preds(); i++) {
  1896 //------------------------------scale_freq-------------------------------------
  1899 //------------------------------scale_freq-------------------------------------
  1897 // Scale frequency of loops and blocks by trip counts from outer loops
  1900 // Scale frequency of loops and blocks by trip counts from outer loops
  1898 // Do a top down traversal of loop tree (visit outer loops first.)
  1901 // Do a top down traversal of loop tree (visit outer loops first.)
  1899 void CFGLoop::scale_freq() {
  1902 void CFGLoop::scale_freq() {
  1900   float loop_freq = _freq * trip_count();
  1903   float loop_freq = _freq * trip_count();
       
  1904   _freq = loop_freq;
  1901   for (int i = 0; i < _members.length(); i++) {
  1905   for (int i = 0; i < _members.length(); i++) {
  1902     CFGElement* s = _members.at(i);
  1906     CFGElement* s = _members.at(i);
  1903     float block_freq = s->_freq * loop_freq;
  1907     float block_freq = s->_freq * loop_freq;
  1904     if (g_isnan(block_freq) || block_freq < MIN_BLOCK_FREQUENCY)
  1908     if (g_isnan(block_freq) || block_freq < MIN_BLOCK_FREQUENCY)
  1905       block_freq = MIN_BLOCK_FREQUENCY;
  1909       block_freq = MIN_BLOCK_FREQUENCY;
  1908   CFGLoop* ch = _child;
  1912   CFGLoop* ch = _child;
  1909   while (ch != NULL) {
  1913   while (ch != NULL) {
  1910     ch->scale_freq();
  1914     ch->scale_freq();
  1911     ch = ch->_sibling;
  1915     ch = ch->_sibling;
  1912   }
  1916   }
       
  1917 }
       
  1918 
       
  1919 // Frequency of outer loop
       
  1920 float CFGLoop::outer_loop_freq() const {
       
  1921   if (_child != NULL) {
       
  1922     return _child->_freq;
       
  1923   }
       
  1924   return _freq;
  1913 }
  1925 }
  1914 
  1926 
  1915 #ifndef PRODUCT
  1927 #ifndef PRODUCT
  1916 //------------------------------dump_tree--------------------------------------
  1928 //------------------------------dump_tree--------------------------------------
  1917 void CFGLoop::dump_tree() const {
  1929 void CFGLoop::dump_tree() const {