diff -r c76c13577460 -r b2cb497dec28 src/share/vm/opto/library_call.cpp --- a/src/share/vm/opto/library_call.cpp Thu May 26 16:39:34 2011 -0700 +++ b/src/share/vm/opto/library_call.cpp Fri May 27 12:47:48 2011 -0700 @@ -5225,15 +5225,16 @@ // Look at the alignment of the starting offsets. int abase = arrayOopDesc::base_offset_in_bytes(basic_elem_type); - const intptr_t BIG_NEG = -128; - assert(BIG_NEG + 2*abase < 0, "neg enough"); - - intptr_t src_off = abase + ((intptr_t) find_int_con(src_offset, -1) << scale); - intptr_t dest_off = abase + ((intptr_t) find_int_con(dest_offset, -1) << scale); - if (src_off < 0 || dest_off < 0) + + intptr_t src_off_con = (intptr_t) find_int_con(src_offset, -1); + intptr_t dest_off_con = (intptr_t) find_int_con(dest_offset, -1); + if (src_off_con < 0 || dest_off_con < 0) // At present, we can only understand constants. return false; + intptr_t src_off = abase + (src_off_con << scale); + intptr_t dest_off = abase + (dest_off_con << scale); + if (((src_off | dest_off) & (BytesPerLong-1)) != 0) { // Non-aligned; too bad. // One more chance: Pick off an initial 32-bit word.