On Thu, May 28, 2026 at 11:31 AM Uros Bizjak <[email protected]> wrote:
>
> On Thu, May 28, 2026 at 10:14 AM Uros Bizjak <[email protected]> wrote:
> >
> > On Thu, May 28, 2026 at 9:45 AM Jakub Jelinek <[email protected]> wrote:
> > >
> > > Hi!
> > >
> > > The following testcase ICEs, because combine matches
> > > (set (reg:DI 108) (plus:DI (reg:DI 104 [ s ]) (subreg:DI (reg:TI 103 [ _2 
> > > ]) 8)))
> > > Now, because ix86_validate_address_register has:
> > > 12038         /* Don't allow SUBREGs that span more than a word.  It can
> > > 12039            lead to spill failures when the register is one word out
> > > 12040            of a two word structure.  */
> > > 12041         if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
> > > 12042           return NULL_RTX;
> > > this isn't recognized as *leadi, but is recognized as *adddi_1_nf pattern
> > > instead.  Now, later on the RA turns it into:
> > > (set (reg:DI 2 cx [108]) (plus:DI (reg:DI 0 ax [orig:104 s ] [104]) 
> > > (reg:DI 5 di [ _2+8 ])))
> > > which would be valid *leadi, but given that INSN_CODE is already set to 
> > > the
> > > *adddi_1_nf and that also satisfies it, nothing re-recognizes it as 
> > > *leadi.
> > > But in that case without TARGET_APX_NDD the pattern has return "#";
> > > That is a bug, because there is no splitter to split that
> > > (set (reg:DI 2 cx [108]) (plus:DI (reg:DI 0 ax [orig:104 s ] [104]) 
> > > (reg:DI 5 di [ _2+8 ])))
> > > into itself so that it is re-recognized as *leadi, so it just ICEs.
> > > I think having a splitter to split to the same thing would be just weird, 
> > > so
> > > this just outputs lea insn directly.
> > >
> > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/16/15?
> > >
> > > 2026-05-28  Jakub Jelinek  <[email protected]>
> > >
> > >         PR target/125469
> > >         * config/i386/i386.md (*add<mode>_1<nf_name>): Don't return "#" 
> > > for
> > >         the lea non-TARGET_APX_NDD case, instead emit a lea directly.
> > >
> > >         * gcc.target/i386/apx-nf-pr125469.c: New test.
> >
> > OK. I also wonder if the check in ix86_validate_address_register can
> > be removed, there were many RA improvements in the last ... decade
> > (?).
>
> Hm, OTOH, is this condition correct:
>
>     case TYPE_LEA:
>       if (TARGET_APX_NDD && <nf_applied>)
>     return "%{nf%} add{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}";
>       else
>     return "#";
>
> Should it be "TARGET_APX_NDD || <nf_applied>"?

No, existing condition is OK.

Uros.

Reply via email to