Fri, 22 Jun 2012 10:40:48 -0700
7178280: Failed new vector regression tests
Summary: When looking for the same value in an other register check that all parts of that register has the same value.
Reviewed-by: johnc, twisti
src/share/vm/opto/postaloc.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/opto/postaloc.cpp Thu Jun 21 09:52:38 2012 +0200 1.2 +++ b/src/share/vm/opto/postaloc.cpp Fri Jun 22 10:40:48 2012 -0700 1.3 @@ -308,9 +308,10 @@ 1.4 } 1.5 1.6 Node *vv = value[reg]; 1.7 - if (n_regs > 1) { // Doubles check for aligned-adjacent pair 1.8 - if( (reg&1)==0 ) continue; // Wrong half of a pair 1.9 - if( vv != value[reg-1] ) continue; // Not a complete pair 1.10 + if (n_regs > 1) { // Doubles and vectors check for aligned-adjacent set 1.11 + uint last = (n_regs-1); // Looking for the last part of a set 1.12 + if ((reg&last) != last) continue; // Wrong part of a set 1.13 + if (!register_contains_value(vv, reg, n_regs, value)) continue; // Different value 1.14 } 1.15 if( vv == val || // Got a direct hit? 1.16 (t && vv && vv->bottom_type() == t && vv->is_Mach() && 1.17 @@ -573,7 +574,6 @@ 1.18 // Record other half of doubles 1.19 uint def_ideal_reg = def->ideal_reg(); 1.20 int n_regs = RegMask::num_registers(def_ideal_reg); 1.21 - bool is_vec = RegMask::is_vector(def_ideal_reg); 1.22 for (int l = 1; l < n_regs; l++) { 1.23 OptoReg::Name ureg_lo = OptoReg::add(ureg,-l); 1.24 if (!value[ureg_lo] &&