Hi! On Wed, Nov 01, 2017 at 04:35:52PM +0000, Segher Boessenkool wrote: > When we have a REG_DEAD note for a reg that is set in the new I2, we > drop the note on the floor (we cannot find whether to place it on I2 > or on I3). But the code I added to do this has a bug and does not > always actually drop it. This patch fixes it. > > But that on its own is too pessimistic, it turns out, and we generate > worse code. One case where we do know where to place the note is if > it came from I3 (it should go to I3 again). Doing this fixes all of > the regressions. > > Tested on an aarch64 cross-compiler with the PR82683 test; tested on > powerpc64-linux {-m32,-m64}. Committing to trunk, will backport later.
I now backported this to 7 and 6. Segher > 2017-11-01 Segher Boessenkool <seg...@kernel.crashing.org> > > PR rtl-optimization/64682 > PR rtl-optimization/69567 > PR rtl-optimization/69737 > PR rtl-optimization/82683 > * combine.c (distribute_notes) <REG_DEAD>: If the new I2 sets the same > register mentioned in the note, drop the note, unless it came from I3, > in which case it should go to I3 again. > > --- > gcc/combine.c | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/gcc/combine.c b/gcc/combine.c > index 4fba2c1..5782013 100644 > --- a/gcc/combine.c > +++ b/gcc/combine.c > @@ -14388,6 +14388,17 @@ distribute_notes (rtx notes, rtx_insn *from_insn, > rtx_insn *i3, rtx_insn *i2, > && CALL_P (from_insn) > && find_reg_fusage (from_insn, USE, XEXP (note, 0))) > place = from_insn; > + else if (i2 && reg_set_p (XEXP (note, 0), PATTERN (i2))) > + { > + /* If the new I2 sets the same register that is marked > + dead in the note, we do not in general know where to > + put the note. One important case we _can_ handle is > + when the note comes from I3. */ > + if (from_insn == i3) > + place = i3; > + else > + break; > + } > else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))) > place = i3; > else if (i2 != 0 && next_nonnote_nondebug_insn (i2) == i3 > @@ -14401,11 +14412,6 @@ distribute_notes (rtx notes, rtx_insn *from_insn, > rtx_insn *i3, rtx_insn *i2, > || rtx_equal_p (XEXP (note, 0), elim_i0)) > break; > tem_insn = i3; > - /* If the new I2 sets the same register that is marked dead > - in the note, we do not know where to put the note. > - Give up. */ > - if (i2 != 0 && reg_set_p (XEXP (note, 0), PATTERN (i2))) > - break; > } > > if (place == 0) > -- > 1.8.3.1