diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-08-28 06:22:20 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-08-28 06:22:20 +0000 |
commit | a2250fe993264183c9742431bd518bfcdb7fca67 (patch) | |
tree | 73bf9e7d12a4fd961c11b23726f69fcca57fec70 /gcc/cfgcleanup.c | |
parent | f8305d18b8a10fcf63ca8fac1079e619d3b67e10 (diff) | |
download | gcc-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.c | 40 |
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) |