regrename.c (regrename_do_replace): If replacing the same reg multiple times, try...
authorJakub Jelinek <jakub@redhat.com>
Fri, 12 Jan 2018 20:04:14 +0000 (21:04 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 12 Jan 2018 20:04:14 +0000 (21:04 +0100)
* regrename.c (regrename_do_replace): If replacing the same
reg multiple times, try to reuse last created gen_raw_REG.

From-SVN: r256596

gcc/ChangeLog
gcc/regrename.c

index 4b4b57783be1792018ae8c2bc8e084de3c8b371d..d3bd144258842d0e32e3abde43c3611149822628 100644 (file)
@@ -1,5 +1,8 @@
 2018-01-12  Jakub Jelinek  <jakub@redhat.com>
 
+       * regrename.c (regrename_do_replace): If replacing the same
+       reg multiple times, try to reuse last created gen_raw_REG.
+
        PR debug/81155
        * bb-reorder.c (pass_partition_blocks::gate): In lto don't partition
        main to workaround a bug in GDB.
 2018-01-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/83666
-       * cfgexpand.c (expand_dbeug_expr) <case BIT_FIELD_REF>: Punt if mode
+       * cfgexpand.c (expand_debug_expr) <case BIT_FIELD_REF>: Punt if mode
        is BLKmode and bitpos not zero or mode change is needed.
 
 2018-01-04  Richard Sandiford  <richard.sandiford@linaro.org>
index f930a65e0c1cddc782e6b4431bf8fc55d64ef325..dcec77adf75e94584c8e5b5fcfcb419675096656 100644 (file)
@@ -963,6 +963,7 @@ regrename_do_replace (struct du_head *head, int reg)
   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 *head, int reg)
                         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);
        }
     }