https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99648
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|WAITING |NEW --- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Ok, I can finally reproduce, one needs -m32 -Os -mcpu=power7 (or power8 or power9) to reproduce. And the bug is created in store_bit_field_1 doing: rtx sub; HOST_WIDE_INT regnum; poly_uint64 regsize = REGMODE_NATURAL_SIZE (GET_MODE (op0)); if (known_eq (bitnum, 0U) && known_eq (bitsize, GET_MODE_BITSIZE (GET_MODE (op0)))) { sub = simplify_gen_subreg (GET_MODE (op0), value, fieldmode, 0); if (sub) { if (reverse) sub = flip_storage_order (GET_MODE (op0), sub); emit_move_insn (op0, sub); return true; } } (there is similar code later on). value is (const_vector:V16QI [ (const_int 65 [0x41]) repeated x15 (const_int 0 [0]) ]) simplify_gen_subreg from V16QImode to TFmode makes (const_double:TF 4.5232690196078126318752765655517578125e+6 [0x0.8a0a0a0a0a0904p+23]) out of that and the problem is that this constant doesn't convert back to value when simplify_gen_subreg converted back to V16QImode, instead it yields (const_vector:V16QI [ (const_int 65 [0x41]) (const_int 81 [0x51]) (const_int 65 [0x41]) repeated x5 (const_int 32 [0x20]) (const_int 62 [0x3e]) (const_int 0 [0]) repeated x7 ]) So, to me this looks like a dup of PR95450, except in simplify-rtx.c rather than in fold-const.c. Do we want to do the same thing in simplify_subreg and try to convert back for MODE_COMPOSITE_P?