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])))

Reply via email to