combine: Fix problem with RTL checking
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 16 Feb 2018 14:03:17 +0000 (15:03 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 16 Feb 2018 14:03:17 +0000 (15:03 +0100)
As Jakub found, after my recent combine patch at least on x86 problems
show up with RTL checking enabled.  This is because the I2 generated
by a successful instruction combination can write not only a register
but it can also write a paradoxical subreg of one.

This fixes it.

* combine.c (try_combine): When adjusting LOG_LINKS for the destination
that moved to I2, also allow destinations that are a paradoxical
subreg (instead of a normal reg).

From-SVN: r257736

gcc/ChangeLog
gcc/combine.c

index a5d5fde..332a38f 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-16  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * combine.c (try_combine): When adjusting LOG_LINKS for the destination
+       that moved to I2, also allow destinations that are a paradoxical
+       subreg (instead of a normal reg).
+
 2018-02-16  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/83831
index c4d55eb..6b761c6 100644 (file)
@@ -4283,7 +4283,12 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
       if (GET_CODE (x) == PARALLEL)
        x = XVECEXP (newi2pat, 0, 0);
 
-      unsigned int regno = REGNO (SET_DEST (x));
+      /* It can only be a SET of a REG or of a paradoxical SUBREG of a REG.  */
+      x = SET_DEST (x);
+      if (paradoxical_subreg_p (x))
+       x = SUBREG_REG (x);
+
+      unsigned int regno = REGNO (x);
 
       bool done = false;
       for (rtx_insn *insn = NEXT_INSN (i3);