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