On Wed, Apr 10, 2013 at 10:15 PM, Vladimir Makarov <vmaka...@redhat.com> wrote:
> The following patch fixes
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56903
>
> In this test case reload pass gets correct value HARD_REGNO_MODE_OK because
> it can not create pseudos (can_create_pseudo) and this was actually used
> that we are in reload (or after reload).  LRA can create pseudos therefore
> it got the wrong answer.  The patch fixes it.

Actually, the problem was with *lea_general_2 that allows QImode
values in non-QImode registers. This is OK, since these registers will
be split to paradoxical SImode registers and handled with lea insn.
Apparently, LRA checks if registers can hold this mode through
ix86_hard_regno_mode_ok, which fails in this particular case. BTW:
there are many insn where QImode can live in non-QImode reg, e.g. the
last alternative of *addqi_1, and similar insn patterns, that are
split to lea after reload.

The proposed patch is OK, although I'd propose to change it a bit with
a more descriptive comment:

       if (!TARGET_PARTIAL_REG_STALL)
        return true;
+      /* LRA checks if the hard register is OK for the given mode.
+        QImode values can live in non-QI regs, so we
+        allow all registers here.  */
+      if (lra_in_progress)
+       return true;
       return !can_create_pseudo_p ();


> 2013-04-10  Vladimir Makarov  <vmaka...@redhat.com>
>
>         PR tree-optimization/56903

This is target issue, so PR target/56903.

>         * config/i386/i386.c (ix86_hard_regno_mode_ok): Add
>         lra_in_progress for return.
>
> 2013-04-10  Vladimir Makarov  <vmaka...@redhat.com>
>
>         PR tree-optimization/56903

And here.

>         * gcc.target/i386/pr56903.c: New test.
>
>
> OK for the trunk?
>

The patch is OK with these changes for mainline and 4.8 branch.

Thanks,
Uros.

Reply via email to