IRA: Don't create new regs for debug insns (PR80429)
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 19 Apr 2017 10:03:35 +0000 (12:03 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 19 Apr 2017 10:03:35 +0000 (12:03 +0200)
In split_live_ranges_for_shrink_wrap IRA also splits regs that are
only used in debug insns, leading to -fcompare-debug failures.

PR rtl-optimization/80429
* ira.c (split_live_ranges_for_shrink_wrap): Don't split regs that
are only used in debug insns.

From-SVN: r246991

gcc/ChangeLog
gcc/ira.c

index d52db8a..15cc6c8 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/80429
+       * ira.c (split_live_ranges_for_shrink_wrap): Don't split regs that
+       are only used in debug insns.
+
 2017-04-19  Eric Botcazou  <ebotcazou@adacore.com>
             Vladimir Makarov  <vmakarov@redhat.com>
 
index 7079573..bfb0508 100644 (file)
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -4992,25 +4992,40 @@ split_live_ranges_for_shrink_wrap (void)
       if (!dest || dest == pic_offset_table_rtx)
        continue;
 
-      rtx newreg = NULL_RTX;
+      bool need_newreg = false;
       df_ref use, next;
       for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next)
        {
          rtx_insn *uin = DF_REF_INSN (use);
          next = DF_REF_NEXT_REG (use);
 
+         if (DEBUG_INSN_P (uin))
+           continue;
+
          basic_block ubb = BLOCK_FOR_INSN (uin);
          if (ubb == call_dom
              || dominated_by_p (CDI_DOMINATORS, ubb, call_dom))
            {
-             if (!newreg)
-               newreg = ira_create_new_reg (dest);
-             validate_change (uin, DF_REF_REAL_LOC (use), newreg, true);
+             need_newreg = true;
+             break;
            }
        }
 
-      if (newreg)
+      if (need_newreg)
        {
+         rtx newreg = ira_create_new_reg (dest);
+
+         for (use = DF_REG_USE_CHAIN (REGNO (dest)); use; use = next)
+           {
+             rtx_insn *uin = DF_REF_INSN (use);
+             next = DF_REF_NEXT_REG (use);
+
+             basic_block ubb = BLOCK_FOR_INSN (uin);
+             if (ubb == call_dom
+                 || dominated_by_p (CDI_DOMINATORS, ubb, call_dom))
+               validate_change (uin, DF_REF_REAL_LOC (use), newreg, true);
+           }
+
          rtx_insn *new_move = gen_move_insn (newreg, dest);
          emit_insn_after (new_move, bb_note (call_dom));
          if (dump_file)