In the process of factoring out the "lowpart bit field" check from an earlier patch, I somehow managed to drop an "== 0" condition. It seems I then compounded that by screwing up the powerpc64 testing (still not sure how :-().
Anyway, fixed with the patch below, tested on powerpc64-linux-gnu. Sorry for the breakage, and thanks to Segher for the heads-up. Richard gcc/ * expmed.c (lowpart_bit_field_p): Add missing == 0 check. Index: gcc/expmed.c =================================================================== --- gcc/expmed.c 2012-10-24 11:32:33.000000000 +0100 +++ gcc/expmed.c 2012-10-24 18:52:58.303570945 +0100 @@ -402,7 +402,7 @@ lowpart_bit_field_p (unsigned HOST_WIDE_ enum machine_mode struct_mode) { if (BYTES_BIG_ENDIAN) - return (bitnum % BITS_PER_UNIT + return (bitnum % BITS_PER_UNIT == 0 && (bitnum + bitsize == GET_MODE_BITSIZE (struct_mode) || (bitnum + bitsize) % BITS_PER_WORD == 0)); else