combine: Fix PR84780 (more LOG_LINKS trouble)
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 12 Mar 2018 15:26:16 +0000 (16:26 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 12 Mar 2018 15:26:16 +0000 (16:26 +0100)
There still are situations where we have stale LOG_LINKS.  This causes
combine to try two-insn combinations I2->I3 where the register set by
I2 is used before I3 as well.  Not good.

This patch fixes it by checking for this situation in can_combine_p
(similar to what we already do for three and four insn combinations).

From-SVN: r258452

gcc/ChangeLog
gcc/combine.c

index 548de755bb7cfd984c191417af0baa6238c0993a..cbdd4d2002a2ff4592a120757fbb90b0b395cf95 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-12  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/84169
+       PR rtl-optimization/84780
+       * combine.c (can_combine_p): Check for a 2-insn combination whether
+       the destination register is used between the two insns, too.
+
 2018-03-12  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/84803
index c9105ed02b381ae62bec514a06aef9ab74f0f517..06a9ddde8586c0a0dcaf72552a1890feb84318d4 100644 (file)
@@ -1990,6 +1990,7 @@ can_combine_p (rtx_insn *insn, rtx_insn *i3, rtx_insn *pred ATTRIBUTE_UNUSED,
               && (reg_used_between_p (dest, succ2, i3)
                   || reg_used_between_p (dest, succ, succ2)))
              || (!succ2 && succ && reg_used_between_p (dest, succ, i3))
+             || (!succ2 && !succ && reg_used_between_p (dest, insn, i3))
              || (succ
                  /* SUCC and SUCC2 can be split halves from a PARALLEL; in
                     that case SUCC is not in the insn stream, so use SUCC2