On Thu, Jan 04, 2018 at 10:31:16PM +0100, Jakub Jelinek wrote:
> While debugging PR target/83554, I first thought the bug is that
> regrename creates a new raw REG each time and when the insn uses
> match_dup that it would be a problem.
> 
> While that is not the case, for match_dup we actually check it with
> rtx_equal_p, the patch I wrote can be IMHO still useful to cheaply
> decrease compile time memory a little bit, the original registers are
> often pointer equal and seems they can be replaced by the same new
> REG too.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
> 
> 2018-01-04  Jakub Jelinek  <ja...@redhat.com>
> 
>       * regrename.c (regrename_do_replace): If replacing the same
>       reg multiple times, try to reuse last created gen_raw_REG.

I'd like to ping this patch (for some reason it didn't make it into
gcc-patches archive).

> --- gcc/regrename.c.jj        2018-01-04 00:43:15.077702454 +0100
> +++ gcc/regrename.c   2018-01-04 11:19:36.975798717 +0100
> @@ -963,6 +963,7 @@ regrename_do_replace (struct du_head *he
>    struct du_chain *chain;
>    unsigned int base_regno = head->regno;
>    machine_mode mode;
> +  rtx last_reg = NULL_RTX, last_repl = NULL_RTX;
>  
>    for (chain = head->first; chain; chain = chain->next_use)
>      {
> @@ -975,12 +976,16 @@ regrename_do_replace (struct du_head *he
>                        gen_rtx_UNKNOWN_VAR_LOC (), true);
>        else
>       {
> -       validate_change (chain->insn, chain->loc, 
> -                        gen_raw_REG (GET_MODE (*chain->loc), reg), true);
> -       if (regno >= FIRST_PSEUDO_REGISTER)
> -         ORIGINAL_REGNO (*chain->loc) = regno;
> -       REG_ATTRS (*chain->loc) = attr;
> -       REG_POINTER (*chain->loc) = reg_ptr;
> +       if (*chain->loc != last_reg)
> +         {
> +           last_repl = gen_raw_REG (GET_MODE (*chain->loc), reg);
> +           if (regno >= FIRST_PSEUDO_REGISTER)
> +             ORIGINAL_REGNO (last_repl) = regno;
> +           REG_ATTRS (last_repl) = attr;
> +           REG_POINTER (last_repl) = reg_ptr;
> +           last_reg = *chain->loc;
> +         }
> +       validate_change (chain->insn, chain->loc, last_repl, true);
>       }
>      }
>  
> 

        Jakub

Reply via email to