From 462f33cb6d596caaec0182a4a98ffd02b07aa890 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Thu, 9 Nov 2017 11:23:30 +0100 Subject: [PATCH] Backport PRs 64682, 69567, 69737, 82683 Backport from mainline 2017-11-01 Segher Boessenkool PR rtl-optimization/64682 PR rtl-optimization/69567 PR rtl-optimization/69737 PR rtl-optimization/82683 * combine.c (distribute_notes) : 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. From-SVN: r254565 --- gcc/ChangeLog | 13 +++++++++++++ gcc/combine.c | 16 +++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8c980ab700be..32ad2d585d19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2017-11-09 Segher Boessenkool + + Backport from mainline + 2017-11-01 Segher Boessenkool + + PR rtl-optimization/64682 + PR rtl-optimization/69567 + PR rtl-optimization/69737 + PR rtl-optimization/82683 + * combine.c (distribute_notes) : 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. + 2017-10-31 Uros Bizjak PR target/82772 diff --git a/gcc/combine.c b/gcc/combine.c index 5e33746a83eb..a989659f2888 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -13941,6 +13941,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 @@ -13954,11 +13965,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) -- 2.47.2