https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102154
--- Comment #7 from Hongtao.liu <crazylht at gmail dot com> --- (In reply to Hongtao.liu from comment #6) > Reproduced with a simple testcase > > > float > foo (long a) > { > union{long a; > float b[2];}c; > c.a = a; > return c.b[1]; > } (subreg:SF (reg:DI) 4) is genrated by extract_bit_field_as_subreg, x86 doesn't have this error because if failed condition lowpart_bit_field_p while ppc64 passed. the difference here is x86 is not BYTES_BIG_ENDIAN but ppc64. static bool lowpart_bit_field_p (poly_uint64 bitnum, poly_uint64 bitsize, machine_mode struct_mode) { poly_uint64 regsize = REGMODE_NATURAL_SIZE (struct_mode); if (BYTES_BIG_ENDIAN) return (multiple_p (bitnum, BITS_PER_UNIT) && (known_eq (bitnum + bitsize, GET_MODE_BITSIZE (struct_mode)) || multiple_p (bitnum + bitsize, regsize * BITS_PER_UNIT))); else return multiple_p (bitnum, regsize * BITS_PER_UNIT); }