Mercurial > hg > truffle
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 { |