https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61225
--- Comment #30 from Segher Boessenkool <segher at gcc dot gnu.org> --- Trying to combine the load+add+store, combine is trying insns like Failed to match this instruction: (parallel [ (set (mem:SI (reg/v/f:SI 90 [ x ]) [1 *x_5(D)+0 S4 A32]) (plus:SI (mem:SI (reg/v/f:SI 90 [ x ]) [1 *x_5(D)+0 S4 A32]) (const_int -1 [0xffffffffffffffff]))) (set (reg:SI 88 [ _2 ]) (plus:SI (mem:SI (reg/v/f:SI 90 [ x ]) [1 *x_5(D)+0 S4 A32]) (const_int -1 [0xffffffffffffffff]))) ]) and it does not know how to split that into two (make the second SET just a load). If it could do that -- and costs work out for the target -- all would work fine as far as I see. Alternatively, the target could use a define_split for this pattern.