cfgcleanup.c: Include rtl-iter.h.
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 28 Aug 2014 06:22:20 +0000 (06:22 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 28 Aug 2014 06:22:20 +0000 (06:22 +0000)
gcc/
* cfgcleanup.c: Include rtl-iter.h.
(mentions_nonequal_regs): Turn from being a for_each_rtx callback
to being a function that examines each subrtx itself.
(thread_jump): Update accordingly.

From-SVN: r214626

gcc/ChangeLog
gcc/cfgcleanup.c

index 853d36a1c7bbdf0cda5808beb6fec7fe9bc421ed..69331bd79f3a2d7d6f5c53ede58a9bffa7865f99 100644 (file)
@@ -1,3 +1,10 @@
+2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * cfgcleanup.c: Include rtl-iter.h.
+       (mentions_nonequal_regs): Turn from being a for_each_rtx callback
+       to being a function that examines each subrtx itself.
+       (thread_jump): Update accordingly.
+
 2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * combine-stack-adj.c: Include rtl-iter.h.
index 2264b4bfe54acdd90688381691a2063e88efd6a4..7dfed098eaf868d4e6b35286d8732e6ae669ab51 100644 (file)
@@ -54,6 +54,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "dce.h"
 #include "dbgcnt.h"
 #include "emit-rtl.h"
+#include "rtl-iter.h"
 
 #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK)
 
@@ -81,7 +82,6 @@ static edge thread_jump (edge, basic_block);
 static bool mark_effect (rtx, bitmap);
 static void notice_new_block (basic_block);
 static void update_forwarder_flag (basic_block);
-static int mentions_nonequal_regs (rtx *, void *);
 static void merge_memattrs (rtx, rtx);
 \f
 /* Set flags for newly created block.  */
@@ -235,29 +235,31 @@ mark_effect (rtx exp, regset nonequal)
     }
 }
 
-/* Return nonzero if X is a register set in regset DATA.
-   Called via for_each_rtx.  */
-static int
-mentions_nonequal_regs (rtx *x, void *data)
+/* Return true if X contains a register in NONEQUAL.  */
+static bool
+mentions_nonequal_regs (const_rtx x, regset nonequal)
 {
-  regset nonequal = (regset) data;
-  if (REG_P (*x))
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, x, NONCONST)
     {
-      int regno;
-
-      regno = REGNO (*x);
-      if (REGNO_REG_SET_P (nonequal, regno))
-       return 1;
-      if (regno < FIRST_PSEUDO_REGISTER)
+      const_rtx x = *iter;
+      if (REG_P (x))
        {
-         int n = hard_regno_nregs[regno][GET_MODE (*x)];
-         while (--n > 0)
-           if (REGNO_REG_SET_P (nonequal, regno + n))
-             return 1;
+         unsigned int regno = REGNO (x);
+         if (REGNO_REG_SET_P (nonequal, regno))
+           return true;
+         if (regno < FIRST_PSEUDO_REGISTER)
+           {
+             int n = hard_regno_nregs[regno][GET_MODE (x)];
+             while (--n > 0)
+               if (REGNO_REG_SET_P (nonequal, regno + n))
+                 return true;
+           }
        }
     }
-  return 0;
+  return false;
 }
+
 /* Attempt to prove that the basic block B will have no side effects and
    always continues in the same edge if reached via E.  Return the edge
    if exist, NULL otherwise.  */
@@ -381,7 +383,7 @@ thread_jump (edge e, basic_block b)
 
   /* cond2 must not mention any register that is not equal to the
      former block.  */
-  if (for_each_rtx (&cond2, mentions_nonequal_regs, nonequal))
+  if (mentions_nonequal_regs (cond2, nonequal))
     goto failed_exit;
 
   EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi)