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 a5d5fdefe8a7fbb26cbe18c49e3e8818175c25e8..332a38f69fc802abf6c9a46f6a3743b2a5223e00 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 c4d55eb85a4fc638b760ecd441681223650ec079..6b761c609ae9f0db0b7cb5a4a567372ea7332280 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);