combine: Fix various shortcomings in make_more_copies (PR87701, PR87780)
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 29 Oct 2018 07:36:45 +0000 (08:36 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 29 Oct 2018 07:36:45 +0000 (08:36 +0100)
This rewrites most of make_more_copies, in the process fixing a few PRs
and some other bugs, and working around a few target problems.  Certain
notes turn out to actually change the meaning of the RTL, so we cannot
drop them; and i386 takes subregs of hard regs.

PR rtl-optimization/87701
PR rtl-optimization/87780
* combine.c (make_more_copies): Rewrite.

From-SVN: r265582

gcc/ChangeLog
gcc/combine.c

index e1b641fc005a5752915660cb5ba62d4993f1e58f..0dd2c511fe26b1264fcc4103ba539e7d965665c7 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-29  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/87701
+       PR rtl-optimization/87780
+       * combine.c (make_more_copies): Rewrite.
+
 2018-10-28  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        * doc/generic.texi (ABSU_EXPR): Document.
index 2b9332893922c7dc68ec3bcc522748ac6ab4a6a9..3e2042886d59816476c9f83a825aa2e907416cf5 100644 (file)
@@ -14956,25 +14956,20 @@ make_more_copies (void)
          rtx set = single_set (insn);
          if (!set)
            continue;
-         rtx src = SET_SRC (set);
          rtx dest = SET_DEST (set);
          if (dest == pc_rtx)
            continue;
-         if (GET_CODE (src) == SUBREG)
-           src = SUBREG_REG (src);
+         rtx src = SET_SRC (set);
          if (!(REG_P (src) && HARD_REGISTER_P (src)))
            continue;
          if (TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src)))
            continue;
 
          rtx new_reg = gen_reg_rtx (GET_MODE (dest));
-         rtx_insn *insn1 = gen_move_insn (new_reg, src);
-         rtx_insn *insn2 = gen_move_insn (dest, new_reg);
-         emit_insn_after (insn1, insn);
-         emit_insn_after (insn2, insn1);
-         delete_insn (insn);
-
-         insn = insn2;
+         rtx_insn *new_insn = gen_move_insn (new_reg, src);
+         SET_SRC (set) = new_reg;
+         emit_insn_before (new_insn, insn);
+         df_insn_rescan (insn);
        }
     }
 }