From 97e3e0acd13a28f678cf3e7926b01a851eca5cbf Mon Sep 17 00:00:00 2001 From: rsandifo Date: Thu, 28 Aug 2014 06:22:20 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@214626 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/cfgcleanup.c | 40 +++++++++++++++++++++------------------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 853d36a1c7b..69331bd79f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-08-28 Richard Sandiford + * 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 + * combine-stack-adj.c: Include rtl-iter.h. (record_stack_refs_data): Delete. (record_stack_refs): Turn from being a for_each_rtx callback diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index 2264b4bfe54..7dfed098eaf 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) -- 2.11.4.GIT