aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2017-03-21 00:08:16 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2017-03-21 00:08:16 +0100
commite091a0fe0779f788ee11e81f0d3d6f5d7bd0e9f4 (patch)
tree210f18d4a1f6bc25ab025dbe7945ff510192ccfd /gcc
parent366e9446961bf5d8efcb0bc5442e2d112dc17160 (diff)
downloadgcc-e091a0fe0779f788ee11e81f0d3d6f5d7bd0e9f4.zip
gcc-e091a0fe0779f788ee11e81f0d3d6f5d7bd0e9f4.tar.gz
gcc-e091a0fe0779f788ee11e81f0d3d6f5d7bd0e9f4.tar.bz2
combine: Fix 79910
If the dest of an I0 or I1 is used in an insn before I2, as can happen in various uncommon cases, and we manage to do the combination, the set is moved to I2, which is wrong. Don't allow combining the insns in this case. 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). From-SVN: r246297
Diffstat (limited to 'gcc')
-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 55e9bc8..afb4a52 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 66215a6..17258f0 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