From aef7647f4a0a5a344ca7c3b5e2a9f18123949411 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Mon, 29 Oct 2018 08:36:45 +0100 Subject: [PATCH] combine: Fix various shortcomings in make_more_copies (PR87701, PR87780) 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 | 6 ++++++ gcc/combine.c | 15 +++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e1b641fc005..0dd2c511fe2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-10-29 Segher Boessenkool + + PR rtl-optimization/87701 + PR rtl-optimization/87780 + * combine.c (make_more_copies): Rewrite. + 2018-10-28 Kugan Vivekanandarajah * doc/generic.texi (ABSU_EXPR): Document. diff --git a/gcc/combine.c b/gcc/combine.c index 2b933289392..3e2042886d5 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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); } } } -- 2.30.2