On Fri, Nov 02, 2018 at 06:03:20PM -0500, Segher Boessenkool wrote: > > The original rtx is generated by expand_builtin_setjmp_receiver to adjust > > the frame pointer. > > > > And later in LRA, it will try to eliminate frame_pointer with hard frame > > pointer which is > > defined the ELIMINABLE_REGS. > > > > Your change split the insn into two. > > This makes it doesn't match the "from" and "to" regs defined in > > ELIMINABLE_REGS. > > The if statement to generate the adjustment insn is been skipt. > > And the original instruction is just been deleted! > > I don't follow why, or what should have prevented it from being deleted. > > > Probably, we don't want to split the move rtx if they are related to > > entries defined in ELIMINABLE_REGS? > > One thing I can easily do is not making an intermediate pseudo when copying > *to* a fixed reg, which sfp is. Let me try if that helps the testcase I'm > looking at (setjmp-4.c).
This indeed helps, see patch below. Could you try that on the whole testsuite? Thanks, Segher p.s. It still is a problem in the arm backend, but this won't hurt combine, so why not. >From 814ca23ce05384d017b3c2bff41ab61cf5446e46 Mon Sep 17 00:00:00 2001 Message-Id: <814ca23ce05384d017b3c2bff41ab61cf5446e46.1541202704.git.seg...@kernel.crashing.org> From: Segher Boessenkool <seg...@kernel.crashing.org> Date: Fri, 2 Nov 2018 23:33:32 +0000 Subject: [PATCH] combine: Don't break up copy from hard to fixed reg --- gcc/combine.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gcc/combine.c b/gcc/combine.c index dfb0b44..15e941a 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -14998,6 +14998,8 @@ make_more_copies (void) continue; if (TEST_HARD_REG_BIT (fixed_reg_set, REGNO (src))) continue; + if (REG_P (dest) && TEST_HARD_REG_BIT (fixed_reg_set, REGNO (dest))) + continue; rtx new_reg = gen_reg_rtx (GET_MODE (dest)); rtx_insn *new_insn = gen_move_insn (new_reg, src); -- 1.8.3.1