src/share/vm/opto/chaitin.cpp

changeset 4007
f7cd53cedd78
parent 3971
6c5b7a6becc8
child 4019
a1c7f6472621
     1.1 --- a/src/share/vm/opto/chaitin.cpp	Wed Aug 22 11:55:40 2012 -0700
     1.2 +++ b/src/share/vm/opto/chaitin.cpp	Thu Aug 23 09:13:16 2012 -0700
     1.3 @@ -484,24 +484,33 @@
     1.4      if (_names[i]) {           // Live range associated with Node?
     1.5        LRG &lrg = lrgs(_names[i]);
     1.6        if (!lrg.alive()) {
     1.7 -        _node_regs[i].set_bad();
     1.8 +        set_bad(i);
     1.9        } else if (lrg.num_regs() == 1) {
    1.10 -        _node_regs[i].set1(lrg.reg());
    1.11 -      } else {                  // Must be a register-pair
    1.12 -        if (!lrg._fat_proj) {   // Must be aligned adjacent register pair
    1.13 +        set1(i, lrg.reg());
    1.14 +      } else {                  // Must be a register-set
    1.15 +        if (!lrg._fat_proj) {   // Must be aligned adjacent register set
    1.16            // Live ranges record the highest register in their mask.
    1.17            // We want the low register for the AD file writer's convenience.
    1.18 -          _node_regs[i].set2( OptoReg::add(lrg.reg(),(1-lrg.num_regs())) );
    1.19 +          OptoReg::Name hi = lrg.reg(); // Get hi register
    1.20 +          OptoReg::Name lo = OptoReg::add(hi, (1-lrg.num_regs())); // Find lo
    1.21 +          // We have to use pair [lo,lo+1] even for wide vectors because
    1.22 +          // the rest of code generation works only with pairs. It is safe
    1.23 +          // since for registers encoding only 'lo' is used.
    1.24 +          // Second reg from pair is used in ScheduleAndBundle on SPARC where
    1.25 +          // vector max size is 8 which corresponds to registers pair.
    1.26 +          // It is also used in BuildOopMaps but oop operations are not
    1.27 +          // vectorized.
    1.28 +          set2(i, lo);
    1.29          } else {                // Misaligned; extract 2 bits
    1.30            OptoReg::Name hi = lrg.reg(); // Get hi register
    1.31            lrg.Remove(hi);       // Yank from mask
    1.32            int lo = lrg.mask().find_first_elem(); // Find lo
    1.33 -          _node_regs[i].set_pair( hi, lo );
    1.34 +          set_pair(i, hi, lo);
    1.35          }
    1.36        }
    1.37        if( lrg._is_oop ) _node_oops.set(i);
    1.38      } else {
    1.39 -      _node_regs[i].set_bad();
    1.40 +      set_bad(i);
    1.41      }
    1.42    }
    1.43  
    1.44 @@ -1121,6 +1130,33 @@
    1.45  
    1.46  }
    1.47  
    1.48 +//------------------------------is_legal_reg-----------------------------------
    1.49 +// Is 'reg' register legal for 'lrg'?
    1.50 +static bool is_legal_reg(LRG &lrg, OptoReg::Name reg, int chunk) {
    1.51 +  if (reg >= chunk && reg < (chunk + RegMask::CHUNK_SIZE) &&
    1.52 +      lrg.mask().Member(OptoReg::add(reg,-chunk))) {
    1.53 +    // RA uses OptoReg which represent the highest element of a registers set.
    1.54 +    // For example, vectorX (128bit) on x86 uses [XMM,XMMb,XMMc,XMMd] set
    1.55 +    // in which XMMd is used by RA to represent such vectors. A double value
    1.56 +    // uses [XMM,XMMb] pairs and XMMb is used by RA for it.
    1.57 +    // The register mask uses largest bits set of overlapping register sets.
    1.58 +    // On x86 with AVX it uses 8 bits for each XMM registers set.
    1.59 +    //
    1.60 +    // The 'lrg' already has cleared-to-set register mask (done in Select()
    1.61 +    // before calling choose_color()). Passing mask.Member(reg) check above
    1.62 +    // indicates that the size (num_regs) of 'reg' set is less or equal to
    1.63 +    // 'lrg' set size.
    1.64 +    // For set size 1 any register which is member of 'lrg' mask is legal.
    1.65 +    if (lrg.num_regs()==1)
    1.66 +      return true;
    1.67 +    // For larger sets only an aligned register with the same set size is legal.
    1.68 +    int mask = lrg.num_regs()-1;
    1.69 +    if ((reg&mask) == mask)
    1.70 +      return true;
    1.71 +  }
    1.72 +  return false;
    1.73 +}
    1.74 +
    1.75  //------------------------------bias_color-------------------------------------
    1.76  // Choose a color using the biasing heuristic
    1.77  OptoReg::Name PhaseChaitin::bias_color( LRG &lrg, int chunk ) {
    1.78 @@ -1137,10 +1173,7 @@
    1.79      while ((datum = elements.next()) != 0) {
    1.80        OptoReg::Name reg = lrgs(datum).reg();
    1.81        // If this LRG's register is legal for us, choose it
    1.82 -      if( reg >= chunk && reg < chunk + RegMask::CHUNK_SIZE &&
    1.83 -          lrg.mask().Member(OptoReg::add(reg,-chunk)) &&
    1.84 -          (lrg.num_regs()==1 || // either size 1
    1.85 -           (reg&1) == 1) )      // or aligned (adjacent reg is available since we already cleared-to-pairs)
    1.86 +      if (is_legal_reg(lrg, reg, chunk))
    1.87          return reg;
    1.88      }
    1.89    }
    1.90 @@ -1151,10 +1184,7 @@
    1.91      if( !(*(_ifg->_yanked))[copy_lrg] ) {
    1.92        OptoReg::Name reg = lrgs(copy_lrg).reg();
    1.93        //  And it is legal for you,
    1.94 -      if( reg >= chunk && reg < chunk + RegMask::CHUNK_SIZE &&
    1.95 -          lrg.mask().Member(OptoReg::add(reg,-chunk)) &&
    1.96 -          (lrg.num_regs()==1 || // either size 1
    1.97 -           (reg&1) == 1) )      // or aligned (adjacent reg is available since we already cleared-to-pairs)
    1.98 +      if (is_legal_reg(lrg, reg, chunk))
    1.99          return reg;
   1.100      } else if( chunk == 0 ) {
   1.101        // Choose a color which is legal for him

mercurial