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.
Index: gcc/cfgcleanup.c =================================================================== --- gcc/cfgcleanup.c 2014-08-03 11:25:10.407959076 +0100 +++ gcc/cfgcleanup.c 2014-08-03 11:25:22.602079634 +0100 @@ -53,6 +53,7 @@ Software Foundation; either version 3, o #include "df.h" #include "dce.h" #include "dbgcnt.h" +#include "rtl-iter.h" #define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK) @@ -80,7 +81,6 @@ static edge thread_jump (edge, basic_blo 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. */ @@ -234,29 +234,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. */ @@ -379,7 +381,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)