https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97144
rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2020-12-30 Ever confirmed|0 |1 --- Comment #1 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> --- Confirmed. Seems to be a bug in constrain_operands (which was a surprise, given how much of a workhorse it is). Alternative 5 of adddi3_poly_1 allows (and requires) a matching operand but alternative 6 has an earlyclobber. When enforcing the earlyclobber, constrain_operands tries to check whether a match is explicitly allowed for the pair of operands that it's considering, but it wrongly picks up the matching constraint for alternative 5. As a result, postreload makes the invalid transformation from: (set (reg/f:DI 0 x0 [orig:96 _15 ] [96]) (plus:DI (reg/f:DI 2 x2 [110]) (const_poly_int:DI [32, 16]))) to: (set (reg/f:DI 0 x0 [orig:96 _15 ] [96]) (plus:DI (reg/f:DI 0 x0 [139]) (const_poly_int:DI [48, 16])))