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.
Committing. Segher 2018-10-29 Segher Boessenkool <seg...@kernel.crashing.org> PR rtl-optimization/87701 PR rtl-optimization/87780 * combine.c (make_more_copies): Rewrite. --- gcc/combine.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/gcc/combine.c b/gcc/combine.c index bd593bdc..dfb0b44 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -14990,25 +14990,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); } } } -- 1.8.3.1