hotspot/src/share/vm/opto/gcm.cpp
changeset 22915 231c85af5482
parent 22872 b6902ee5bc8d
child 24424 2658d7834c6e
equal deleted inserted replaced
22914:0712db174bbb 22915:231c85af5482
  1659     ch->compute_freq();
  1659     ch->compute_freq();
  1660     ch = ch->_sibling;
  1660     ch = ch->_sibling;
  1661   }
  1661   }
  1662   assert (_members.length() > 0, "no empty loops");
  1662   assert (_members.length() > 0, "no empty loops");
  1663   Block* hd = head();
  1663   Block* hd = head();
  1664   hd->_freq = 1.0f;
  1664   hd->_freq = 1.0;
  1665   for (int i = 0; i < _members.length(); i++) {
  1665   for (int i = 0; i < _members.length(); i++) {
  1666     CFGElement* s = _members.at(i);
  1666     CFGElement* s = _members.at(i);
  1667     float freq = s->_freq;
  1667     double freq = s->_freq;
  1668     if (s->is_block()) {
  1668     if (s->is_block()) {
  1669       Block* b = s->as_Block();
  1669       Block* b = s->as_Block();
  1670       for (uint j = 0; j < b->_num_succs; j++) {
  1670       for (uint j = 0; j < b->_num_succs; j++) {
  1671         Block* sb = b->_succs[j];
  1671         Block* sb = b->_succs[j];
  1672         update_succ_freq(sb, freq * b->succ_prob(j));
  1672         update_succ_freq(sb, freq * b->succ_prob(j));
  1674     } else {
  1674     } else {
  1675       CFGLoop* lp = s->as_CFGLoop();
  1675       CFGLoop* lp = s->as_CFGLoop();
  1676       assert(lp->_parent == this, "immediate child");
  1676       assert(lp->_parent == this, "immediate child");
  1677       for (int k = 0; k < lp->_exits.length(); k++) {
  1677       for (int k = 0; k < lp->_exits.length(); k++) {
  1678         Block* eb = lp->_exits.at(k).get_target();
  1678         Block* eb = lp->_exits.at(k).get_target();
  1679         float prob = lp->_exits.at(k).get_prob();
  1679         double prob = lp->_exits.at(k).get_prob();
  1680         update_succ_freq(eb, freq * prob);
  1680         update_succ_freq(eb, freq * prob);
  1681       }
  1681       }
  1682     }
  1682     }
  1683   }
  1683   }
  1684 
  1684 
  1686   // sum and normalize the exit probability. The "method" loop
  1686   // sum and normalize the exit probability. The "method" loop
  1687   // should keep the initial exit probability of 1, so that
  1687   // should keep the initial exit probability of 1, so that
  1688   // inner blocks do not get erroneously scaled.
  1688   // inner blocks do not get erroneously scaled.
  1689   if (_depth != 0) {
  1689   if (_depth != 0) {
  1690     // Total the exit probabilities for this loop.
  1690     // Total the exit probabilities for this loop.
  1691     float exits_sum = 0.0f;
  1691     double exits_sum = 0.0f;
  1692     for (int i = 0; i < _exits.length(); i++) {
  1692     for (int i = 0; i < _exits.length(); i++) {
  1693       exits_sum += _exits.at(i).get_prob();
  1693       exits_sum += _exits.at(i).get_prob();
  1694     }
  1694     }
  1695 
  1695 
  1696     // Normalize the exit probabilities. Until now, the
  1696     // Normalize the exit probabilities. Until now, the
  1933 }
  1933 }
  1934 
  1934 
  1935 //------------------------------update_succ_freq-------------------------------
  1935 //------------------------------update_succ_freq-------------------------------
  1936 // Update the appropriate frequency associated with block 'b', a successor of
  1936 // Update the appropriate frequency associated with block 'b', a successor of
  1937 // a block in this loop.
  1937 // a block in this loop.
  1938 void CFGLoop::update_succ_freq(Block* b, float freq) {
  1938 void CFGLoop::update_succ_freq(Block* b, double freq) {
  1939   if (b->_loop == this) {
  1939   if (b->_loop == this) {
  1940     if (b == head()) {
  1940     if (b == head()) {
  1941       // back branch within the loop
  1941       // back branch within the loop
  1942       // Do nothing now, the loop carried frequency will be
  1942       // Do nothing now, the loop carried frequency will be
  1943       // adjust later in scale_freq().
  1943       // adjust later in scale_freq().
  1974 
  1974 
  1975 //------------------------------scale_freq-------------------------------------
  1975 //------------------------------scale_freq-------------------------------------
  1976 // Scale frequency of loops and blocks by trip counts from outer loops
  1976 // Scale frequency of loops and blocks by trip counts from outer loops
  1977 // Do a top down traversal of loop tree (visit outer loops first.)
  1977 // Do a top down traversal of loop tree (visit outer loops first.)
  1978 void CFGLoop::scale_freq() {
  1978 void CFGLoop::scale_freq() {
  1979   float loop_freq = _freq * trip_count();
  1979   double loop_freq = _freq * trip_count();
  1980   _freq = loop_freq;
  1980   _freq = loop_freq;
  1981   for (int i = 0; i < _members.length(); i++) {
  1981   for (int i = 0; i < _members.length(); i++) {
  1982     CFGElement* s = _members.at(i);
  1982     CFGElement* s = _members.at(i);
  1983     float block_freq = s->_freq * loop_freq;
  1983     double block_freq = s->_freq * loop_freq;
  1984     if (g_isnan(block_freq) || block_freq < MIN_BLOCK_FREQUENCY)
  1984     if (g_isnan(block_freq) || block_freq < MIN_BLOCK_FREQUENCY)
  1985       block_freq = MIN_BLOCK_FREQUENCY;
  1985       block_freq = MIN_BLOCK_FREQUENCY;
  1986     s->_freq = block_freq;
  1986     s->_freq = block_freq;
  1987   }
  1987   }
  1988   CFGLoop* ch = _child;
  1988   CFGLoop* ch = _child;
  1991     ch = ch->_sibling;
  1991     ch = ch->_sibling;
  1992   }
  1992   }
  1993 }
  1993 }
  1994 
  1994 
  1995 // Frequency of outer loop
  1995 // Frequency of outer loop
  1996 float CFGLoop::outer_loop_freq() const {
  1996 double CFGLoop::outer_loop_freq() const {
  1997   if (_child != NULL) {
  1997   if (_child != NULL) {
  1998     return _child->_freq;
  1998     return _child->_freq;
  1999   }
  1999   }
  2000   return _freq;
  2000   return _freq;
  2001 }
  2001 }
  2040       tty->print("\n              ");
  2040       tty->print("\n              ");
  2041       for (int j = 0; j < _depth+1; j++) tty->print("   ");
  2041       for (int j = 0; j < _depth+1; j++) tty->print("   ");
  2042       k = 0;
  2042       k = 0;
  2043     }
  2043     }
  2044     Block *blk = _exits.at(i).get_target();
  2044     Block *blk = _exits.at(i).get_target();
  2045     float prob = _exits.at(i).get_prob();
  2045     double prob = _exits.at(i).get_prob();
  2046     tty->print(" ->%d@%d%%", blk->_pre_order, (int)(prob*100));
  2046     tty->print(" ->%d@%d%%", blk->_pre_order, (int)(prob*100));
  2047   }
  2047   }
  2048   tty->print("\n");
  2048   tty->print("\n");
  2049 }
  2049 }
  2050 #endif
  2050 #endif