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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |hjl.tools at gmail dot com,
                   |                            |jakub at gcc dot gnu.org,
                   |                            |uros at gcc dot gnu.org,
                   |                            |vmakarov at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Started with r233107.

Slightly adjusted testcase:

__int128 a;
int b;

void
bar (__int128 *x)
{
  if (*x != 0)
    {
      a = 0;
      b = b <= *x;
    }
}

void
foo (unsigned int x)
{
  bar (x + 1);
}

This is on
(mem:TI (zero_extend:DI (plus:SI (reg/v:SI 91 [ x ]) (const_int 1 [0x1]))))
which matches the predicate of the *movti_internal instruction -
general_operand, but the selected alternative needs offsettable memory.
LRA attempts:
(mem:DI (plus:DI (zero_extend:DI (plus:SI (reg/v:SI 91 [ x ])
                (const_int 1 [0x1])))
        (const_int 8 [0x8])) [1 *_3+8 S8 A64])
but that isn't a valid offsettable address, it should have instead forced the
zero_extend into a register.

Or should some reload hook in the backend tell LRA that it should do that if it
wants an offsettable address out of that?

Reply via email to