aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgcleanup.c
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-08-28 06:22:20 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-08-28 06:22:20 +0000
commita2250fe993264183c9742431bd518bfcdb7fca67 (patch)
tree73bf9e7d12a4fd961c11b23726f69fcca57fec70 /gcc/cfgcleanup.c
parentf8305d18b8a10fcf63ca8fac1079e619d3b67e10 (diff)
downloadgcc-a2250fe993264183c9742431bd518bfcdb7fca67.zip
gcc-a2250fe993264183c9742431bd518bfcdb7fca67.tar.gz
gcc-a2250fe993264183c9742431bd518bfcdb7fca67.tar.bz2
cfgcleanup.c: Include rtl-iter.h.
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
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r--gcc/cfgcleanup.c40
1 files changed, 21 insertions, 19 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 2264b4b..7dfed09 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -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);
/* 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)