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?