* combine.c (try_combine): Use is_parallel_of_n_reg_sets some more.
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 1 Dec 2014 22:37:34 +0000 (23:37 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 1 Dec 2014 22:37:34 +0000 (23:37 +0100)
From-SVN: r218249

gcc/ChangeLog
gcc/combine.c

index fc5e2db..c42c2e4 100644 (file)
@@ -1,5 +1,9 @@
 2014-12-01  Segher Boessenkool  <segher@kernel.crashing.org>
 
+       * combine.c (try_combine): Use is_parallel_of_n_reg_sets some more.
+
+2014-12-01  Segher Boessenkool  <segher@kernel.crashing.org>
+
        * combine.c (is_parallel_of_n_reg_sets): New function.
        (can_split_parallel_of_n_reg_sets): New function.
        (try_combine): If I2 is a PARALLEL of two SETs, split it into
index b931902..f471920 100644 (file)
@@ -2832,43 +2832,33 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
      This undoes a previous combination and allows us to match a branch-and-
      decrement insn.  */
 
-  if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
-      && XVECLEN (PATTERN (i2), 0) >= 2
-      && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
+  if (i1 == 0
+      && is_parallel_of_n_reg_sets (i2, 2)
       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
          == MODE_CC)
       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
-      && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
-      && REG_P (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)))
       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
                      SET_SRC (XVECEXP (PATTERN (i2), 0, 1)))
       && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)), i2, i3)
       && !reg_used_between_p (SET_DEST (XVECEXP (PATTERN (i2), 0, 1)), i2, i3))
     {
-      for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
-       if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
-         break;
-
-      if (i == 1)
-       {
-         /* We make I1 with the same INSN_UID as I2.  This gives it
-            the same DF_INSN_LUID for value tracking.  Our fake I1 will
-            never appear in the insn stream so giving it the same INSN_UID
-            as I2 will not cause a problem.  */
+      /* We make I1 with the same INSN_UID as I2.  This gives it
+        the same DF_INSN_LUID for value tracking.  Our fake I1 will
+        never appear in the insn stream so giving it the same INSN_UID
+        as I2 will not cause a problem.  */
 
-         i1 = gen_rtx_INSN (VOIDmode, NULL, i2, BLOCK_FOR_INSN (i2),
-                            XVECEXP (PATTERN (i2), 0, 1), INSN_LOCATION (i2),
-                            -1, NULL_RTX);
-         INSN_UID (i1) = INSN_UID (i2);
+      i1 = gen_rtx_INSN (VOIDmode, NULL, i2, BLOCK_FOR_INSN (i2),
+                        XVECEXP (PATTERN (i2), 0, 1), INSN_LOCATION (i2),
+                        -1, NULL_RTX);
+      INSN_UID (i1) = INSN_UID (i2);
 
-         SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
-         SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
-                SET_DEST (PATTERN (i1)));
-         unsigned int regno = REGNO (SET_DEST (PATTERN (i1)));
-         SUBST_LINK (LOG_LINKS (i2),
-                     alloc_insn_link (i1, regno, LOG_LINKS (i2)));
-       }
+      SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
+      SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
+            SET_DEST (PATTERN (i1)));
+      unsigned int regno = REGNO (SET_DEST (PATTERN (i1)));
+      SUBST_LINK (LOG_LINKS (i2),
+                 alloc_insn_link (i1, regno, LOG_LINKS (i2)));
     }
 
   /* If I2 is a PARALLEL of two SETs of REGs (and perhaps some CLOBBERs),