comparison src/share/vm/opto/gcm.cpp @ 673:fbc12e71c476

6810845: Performance regression in mpegaudio on x64 Summary: Used the outer loop frequency in frequencies checks in RA. Reviewed-by: never, twisti
author kvn
date Thu, 26 Mar 2009 15:04:55 -0700
parents 7bb995fbd3c0
children fbde8ec322d0
comparison
equal deleted inserted replaced
672:afd8dfb5c2a6 673:fbc12e71c476
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 {