From: Trevor Saunders <tbsaunde+...@tbsaunde.org> gcc/ChangeLog:
2016-04-19 Trevor Saunders <tbsaunde+...@tbsaunde.org> * store-motion.c (struct st_expr): Make pattern_regs a vector. (st_expr_entry): Adjust. (store_ops_ok): Likewise. (extract_mentioned_regs): Likewise. (store_killed_in_insn): Likewise. (find_moveable_store): Likewise. --- gcc/store-motion.c | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/gcc/store-motion.c b/gcc/store-motion.c index a349180..fbc737d 100644 --- a/gcc/store-motion.c +++ b/gcc/store-motion.c @@ -62,7 +62,7 @@ struct st_expr /* Pattern of this mem. */ rtx pattern; /* List of registers mentioned by the mem. */ - rtx pattern_regs; + vec<rtx> pattern_regs; /* INSN list of stores that are locally anticipatable. */ vec<rtx_insn *> antic_stores; /* INSN list of stores that are locally available. */ @@ -145,7 +145,7 @@ st_expr_entry (rtx x) ptr->next = store_motion_mems; ptr->pattern = x; - ptr->pattern_regs = NULL_RTX; + ptr->pattern_regs.create (0); ptr->antic_stores.create (0); ptr->avail_stores.create (0); ptr->reaching_reg = NULL_RTX; @@ -247,16 +247,12 @@ print_store_motion_mems (FILE * file) due to set of registers in bitmap REGS_SET. */ static bool -store_ops_ok (const_rtx x, int *regs_set) +store_ops_ok (const vec<rtx> &x, int *regs_set) { - const_rtx reg; - - for (; x; x = XEXP (x, 1)) - { - reg = XEXP (x, 0); - if (regs_set[REGNO (reg)]) - return false; - } + unsigned int len = x.length (); + for (unsigned int i = 0; i < len; i++) + if (regs_set[REGNO (x[i])]) + return false; return true; } @@ -264,16 +260,16 @@ store_ops_ok (const_rtx x, int *regs_set) /* Returns a list of registers mentioned in X. FIXME: A regset would be prettier and less expensive. */ -static rtx_expr_list * +static vec<rtx> extract_mentioned_regs (rtx x) { - rtx_expr_list *mentioned_regs = NULL; + vec<rtx> mentioned_regs = vNULL; subrtx_var_iterator::array_type array; FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST) { rtx x = *iter; if (REG_P (x)) - mentioned_regs = alloc_EXPR_LIST (0, x, mentioned_regs); + mentioned_regs.safe_push (x); } return mentioned_regs; } @@ -372,9 +368,10 @@ store_killed_in_pat (const_rtx x, const_rtx pat, int after) after the insn. Return true if it does. */ static bool -store_killed_in_insn (const_rtx x, const_rtx x_regs, const rtx_insn *insn, int after) +store_killed_in_insn (const_rtx x, const vec<rtx> &x_regs, + const rtx_insn *insn, int after) { - const_rtx reg, note, pat; + const_rtx note, pat; if (! NONDEBUG_INSN_P (insn)) return false; @@ -388,8 +385,9 @@ store_killed_in_insn (const_rtx x, const_rtx x_regs, const rtx_insn *insn, int a /* But even a const call reads its parameters. Check whether the base of some of registers used in mem is stack pointer. */ - for (reg = x_regs; reg; reg = XEXP (reg, 1)) - if (may_be_sp_based_p (XEXP (reg, 0))) + unsigned int len = x_regs.length (); + for (unsigned int i = 0; i < len; i++) + if (may_be_sp_based_p (x_regs[i])) return true; return false; @@ -434,8 +432,8 @@ store_killed_in_insn (const_rtx x, const_rtx x_regs, const rtx_insn *insn, int a is killed, return the last insn in that it occurs in FAIL_INSN. */ static bool -store_killed_after (const_rtx x, const_rtx x_regs, const rtx_insn *insn, - const_basic_block bb, +store_killed_after (const_rtx x, const vec<rtx> &x_regs, + const rtx_insn *insn, const_basic_block bb, int *regs_set_after, rtx *fail_insn) { rtx_insn *last = BB_END (bb), *act; @@ -464,8 +462,9 @@ store_killed_after (const_rtx x, const_rtx x_regs, const rtx_insn *insn, within basic block BB. X_REGS is list of registers mentioned in X. REGS_SET_BEFORE is bitmap of registers set before or in this insn. */ static bool -store_killed_before (const_rtx x, const_rtx x_regs, const rtx_insn *insn, - const_basic_block bb, int *regs_set_before) +store_killed_before (const_rtx x, const vec<rtx> &x_regs, + const rtx_insn *insn, const_basic_block bb, + int *regs_set_before) { rtx_insn *first = BB_HEAD (bb); @@ -554,7 +553,7 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after) return; ptr = st_expr_entry (dest); - if (!ptr->pattern_regs) + if (ptr->pattern_regs.is_empty ()) ptr->pattern_regs = extract_mentioned_regs (dest); /* Do not check for anticipatability if we either found one anticipatable -- 2.7.4