equal
deleted
inserted
replaced
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 { |