1.1 --- a/src/share/vm/opto/divnode.cpp Fri Jan 08 09:42:31 2010 -0800 1.2 +++ b/src/share/vm/opto/divnode.cpp Fri Jan 08 09:51:24 2010 -0800 1.3 @@ -114,7 +114,8 @@ 1.4 if( andconi_t && andconi_t->is_con() ) { 1.5 jint andconi = andconi_t->get_con(); 1.6 if( andconi < 0 && is_power_of_2(-andconi) && (-andconi) >= d ) { 1.7 - dividend = dividend->in(1); 1.8 + if( (-andconi) == d ) // Remove AND if it clears bits which will be shifted 1.9 + dividend = dividend->in(1); 1.10 needs_rounding = false; 1.11 } 1.12 } 1.13 @@ -356,7 +357,8 @@ 1.14 if( andconl_t && andconl_t->is_con() ) { 1.15 jlong andconl = andconl_t->get_con(); 1.16 if( andconl < 0 && is_power_of_2_long(-andconl) && (-andconl) >= d ) { 1.17 - dividend = dividend->in(1); 1.18 + if( (-andconl) == d ) // Remove AND if it clears bits which will be shifted 1.19 + dividend = dividend->in(1); 1.20 needs_rounding = false; 1.21 } 1.22 }