combine: Fix 79910
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 20 Mar 2017 23:08:16 +0000 (00:08 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 20 Mar 2017 23:08:16 +0000 (00:08 +0100)
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

gcc/ChangeLog
gcc/combine.c

index 55e9bc81e582ea3384287036785798f4660ada7d..afb4a52347224814f2326a12797548518ac7638b 100644 (file)
@@ -1,3 +1,10 @@
+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:
index 66215a607bd9c968f1e5a736fb1fd738cec70989..17258f0e0c5ac27916cd59617dffa31df42dd6b7 100644 (file)
@@ -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