aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/combine.c4
2 files changed, 11 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 55e9bc81e58..afb4a523472 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2017-03-20 Segher Boessenkool <segher@kernel.crashing.org>
+ PR rtl-optimization/79910
+ * combine.c (can_combine_p): Do not allow combining an I0 or I1
+ if its dest is used by an insn before I2 (other than the combined
+ insns themselves, which are properly handled already).
+
+2017-03-20 Segher Boessenkool <segher@kernel.crashing.org>
+
Revert:
2017-03-17 Bernd Schmidt <bschmidt@redhat.com>
diff --git a/gcc/combine.c b/gcc/combine.c
index 66215a607bd..17258f0e0c5 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -1953,6 +1953,10 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
|| (succ2 && FIND_REG_INC_NOTE (succ2, dest))
/* Don't substitute into a non-local goto, this confuses CFG. */
|| (JUMP_P (i3) && find_reg_note (i3, REG_NON_LOCAL_GOTO, NULL_RTX))
+ /* Make sure that DEST is not used after INSN but before SUCC, or
+ between SUCC and SUCC2. */
+ || (succ && reg_used_between_p (dest, insn, succ))
+ || (succ2 && reg_used_between_p (dest, succ, succ2))
/* Make sure that DEST is not used after SUCC but before I3. */
|| (!all_adjacent
&& ((succ2