diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2014-11-10 19:52:05 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-11-10 19:52:05 +0000 |
commit | cc6b9196c7799d6096ea8b304928dd25b8d0156e (patch) | |
tree | e7f1d6f0ea68a7875e1c4c3a0a9269268f60579e /gcc | |
parent | cc665e5670eee5d0a1170bb93f74e3f58be325cb (diff) | |
download | gcc-cc6b9196c7799d6096ea8b304928dd25b8d0156e.zip gcc-cc6b9196c7799d6096ea8b304928dd25b8d0156e.tar.gz gcc-cc6b9196c7799d6096ea8b304928dd25b8d0156e.tar.bz2 |
frv.c (frv_registers_conflict_p_1): Take an rtx rather than an rtx *.
gcc/
* config/frv/frv.c (frv_registers_conflict_p_1): Take an rtx rather
than an rtx *. Take the regstate_t directly rather than via a void *.
Return a bool rather than an int. Iterate over all subrtxes here.
(frv_registers_conflict_p): Update accordingly.
From-SVN: r217310
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/frv/frv.c | 81 |
2 files changed, 45 insertions, 43 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 505d8cf..bb2876e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-11-10 Richard Sandiford <richard.sandiford@arm.com> + * config/frv/frv.c (frv_registers_conflict_p_1): Take an rtx rather + than an rtx *. Take the regstate_t directly rather than via a void *. + Return a bool rather than an int. Iterate over all subrtxes here. + (frv_registers_conflict_p): Update accordingly. + +2014-11-10 Richard Sandiford <richard.sandiford@arm.com> + * config/frv/frv.c: Include rtl-iter.h. (frv_acc_group_1): Delete. (frv_acc_group): Use FOR_EACH_SUBRTX. diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c index 46ada4c..7b38f77 100644 --- a/gcc/config/frv/frv.c +++ b/gcc/config/frv/frv.c @@ -343,7 +343,6 @@ static unsigned int frv_insn_unit (rtx_insn *); static bool frv_issues_to_branch_unit_p (rtx_insn *); static int frv_cond_flags (rtx); static bool frv_regstate_conflict_p (regstate_t, regstate_t); -static int frv_registers_conflict_p_1 (rtx *, void *); static bool frv_registers_conflict_p (rtx); static void frv_registers_update_1 (rtx, const_rtx, void *); static void frv_registers_update (rtx); @@ -7171,53 +7170,49 @@ frv_regstate_conflict_p (regstate_t cond1, regstate_t cond2) } -/* A for_each_rtx callback. Return 1 if *X depends on an instruction in - the current packet. DATA points to a regstate_t that describes the - condition under which *X might be set or used. */ +/* Return true if an instruction with pattern PAT depends on an + instruction in the current packet. COND describes the condition + under which PAT might be set or used. */ -static int -frv_registers_conflict_p_1 (rtx *x, void *data) +static bool +frv_registers_conflict_p_1 (rtx pat, regstate_t cond) { - unsigned int regno, i; - regstate_t cond; - - cond = *(regstate_t *) data; - - if (GET_CODE (*x) == REG) - FOR_EACH_REGNO (regno, *x) - if ((frv_packet.regstate[regno] & REGSTATE_MODIFIED) != 0) - if (frv_regstate_conflict_p (frv_packet.regstate[regno], cond)) - return 1; - - if (GET_CODE (*x) == MEM) + subrtx_var_iterator::array_type array; + FOR_EACH_SUBRTX_VAR (iter, array, pat, NONCONST) { - /* If we ran out of memory slots, assume a conflict. */ - if (frv_packet.num_mems > ARRAY_SIZE (frv_packet.mems)) - return 1; + rtx x = *iter; + if (GET_CODE (x) == REG) + { + unsigned int regno; + FOR_EACH_REGNO (regno, x) + if ((frv_packet.regstate[regno] & REGSTATE_MODIFIED) != 0) + if (frv_regstate_conflict_p (frv_packet.regstate[regno], cond)) + return true; + } + else if (GET_CODE (x) == MEM) + { + /* If we ran out of memory slots, assume a conflict. */ + if (frv_packet.num_mems > ARRAY_SIZE (frv_packet.mems)) + return 1; - /* Check for output or true dependencies with earlier MEMs. */ - for (i = 0; i < frv_packet.num_mems; i++) - if (frv_regstate_conflict_p (frv_packet.mems[i].cond, cond)) - { - if (true_dependence (frv_packet.mems[i].mem, VOIDmode, *x)) - return 1; + /* Check for output or true dependencies with earlier MEMs. */ + for (unsigned int i = 0; i < frv_packet.num_mems; i++) + if (frv_regstate_conflict_p (frv_packet.mems[i].cond, cond)) + { + if (true_dependence (frv_packet.mems[i].mem, VOIDmode, x)) + return true; - if (output_dependence (frv_packet.mems[i].mem, *x)) - return 1; - } - } + if (output_dependence (frv_packet.mems[i].mem, x)) + return true; + } + } - /* The return values of calls aren't significant: they describe - the effect of the call as a whole, not of the insn itself. */ - if (GET_CODE (*x) == SET && GET_CODE (SET_SRC (*x)) == CALL) - { - if (for_each_rtx (&SET_SRC (*x), frv_registers_conflict_p_1, data)) - return 1; - return -1; + /* The return values of calls aren't significant: they describe + the effect of the call as a whole, not of the insn itself. */ + else if (GET_CODE (x) == SET && GET_CODE (SET_SRC (x)) == CALL) + iter.substitute (SET_SRC (x)); } - - /* Check subexpressions. */ - return 0; + return false; } @@ -7232,13 +7227,13 @@ frv_registers_conflict_p (rtx x) flags = 0; if (GET_CODE (x) == COND_EXEC) { - if (for_each_rtx (&XEXP (x, 0), frv_registers_conflict_p_1, &flags)) + if (frv_registers_conflict_p_1 (XEXP (x, 0), flags)) return true; flags |= frv_cond_flags (XEXP (x, 0)); x = XEXP (x, 1); } - return for_each_rtx (&x, frv_registers_conflict_p_1, &flags); + return frv_registers_conflict_p_1 (x, flags); } |