https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60778

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Uroš Bizjak from comment #3)
> (In reply to Andrew Pinski from comment #2)
> > Trying 7 -> 8:
> >     7: {r87:DI=r89:DI>>0x3;clobber flags:CC;}
> >       REG_DEAD r89:DI
> >       REG_UNUSED flags:CC
> >     8: r88:DF=[r87:DI*0x8+`mem']
> >       REG_DEAD r87:DI
> > Failed to match this instruction:
> > (set (reg:DF 88 [ mem[_1] ])
> >     (mem:DF (plus:DI (and:DI (reg:DI 89)
> >                 (const_int -8 [0xfffffffffffffff8]))
> >             (symbol_ref:DI ("mem") [flags 0x2]  <var_decl 0x7f6b6efd9c60
> > mem>)) [1 mem[_1]+0 S8 A64]))
> > 
> > We have 2->2 combine now but it looks like we don't try to split inside a
> > mem ...
> 
> This address looks similar to how Alpha implemented unaligned load. It looks
> like combine tries to synthesize AND address.

That is from the (x >> 3) * 8.  Perhaps a combine splitter that will tell
combine that it should split it at the AND?  Though, not sure if the cost will
say that it is beneficial.

Reply via email to