Hi!

On Wed, Nov 01, 2017 at 04:35:52PM +0000, Segher Boessenkool wrote:
> When we have a REG_DEAD note for a reg that is set in the new I2, we
> drop the note on the floor (we cannot find whether to place it on I2
> or on I3).  But the code I added to do this has a bug and does not
> always actually drop it.  This patch fixes it.
> 
> But that on its own is too pessimistic, it turns out, and we generate
> worse code.  One case where we do know where to place the note is if
> it came from I3 (it should go to I3 again).  Doing this fixes all of
> the regressions.
> 
> Tested on an aarch64 cross-compiler with the PR82683 test; tested on
> powerpc64-linux {-m32,-m64}.  Committing to trunk, will backport later.

I now backported this to 7 and 6.


Segher


> 2017-11-01  Segher Boessenkool  <seg...@kernel.crashing.org>
> 
>       PR rtl-optimization/64682
>       PR rtl-optimization/69567
>       PR rtl-optimization/69737
>       PR rtl-optimization/82683
>       * combine.c (distribute_notes) <REG_DEAD>: If the new I2 sets the same
>       register mentioned in the note, drop the note, unless it came from I3,
>       in which case it should go to I3 again.
> 
> ---
>  gcc/combine.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/gcc/combine.c b/gcc/combine.c
> index 4fba2c1..5782013 100644
> --- a/gcc/combine.c
> +++ b/gcc/combine.c
> @@ -14388,6 +14388,17 @@ distribute_notes (rtx notes, rtx_insn *from_insn, 
> rtx_insn *i3, rtx_insn *i2,
>                 && CALL_P (from_insn)
>                 && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
>               place = from_insn;
> +           else if (i2 && reg_set_p (XEXP (note, 0), PATTERN (i2)))
> +             {
> +               /* If the new I2 sets the same register that is marked
> +                  dead in the note, we do not in general know where to
> +                  put the note.  One important case we _can_ handle is
> +                  when the note comes from I3.  */
> +               if (from_insn == i3)
> +                 place = i3;
> +               else
> +                 break;
> +             }
>             else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
>               place = i3;
>             else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3
> @@ -14401,11 +14412,6 @@ distribute_notes (rtx notes, rtx_insn *from_insn, 
> rtx_insn *i3, rtx_insn *i2,
>                      || rtx_equal_p (XEXP (note, 0), elim_i0))
>               break;
>             tem_insn = i3;
> -           /* If the new I2 sets the same register that is marked dead
> -              in the note, we do not know where to put the note.
> -              Give up.  */
> -           if (i2 != 0 && reg_set_p (XEXP (note, 0), PATTERN (i2)))
> -             break;
>           }
>  
>         if (place == 0)
> -- 
> 1.8.3.1

Reply via email to