@@ -870,6 +870,21 @@ print_simple_rtl (FILE *outf, const_rtx x)
flag_simple = 0;
}
+void
+print_rtx_insn_vec (FILE *file, const vec<rtx_insn *> &vec)
+{
+ fputc('{', file);
+
+ unsigned int len = vec.length ();
+ for (unsigned int i = 0; i < len; i++)
+ {
+ print_rtl (file, vec[i]);
+ if (i < (len - 1))
+ fputs (", ", file);
+ }
+ fputc ('}', file);
+}
+
#ifndef GENERATOR_FILE
/* The functions below try to print RTL in a form resembling assembler
mnemonics. Because this form is more concise than the "traditional" form
@@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see
#ifdef BUFSIZ
extern void print_rtl (FILE *, const_rtx);
#endif
+extern void print_rtx_insn_vec (FILE *file, const vec<rtx_insn *> &vec);
extern void dump_value_slim (FILE *, const_rtx, int);
extern void dump_insn_slim (FILE *, const rtx_insn *);
@@ -3572,6 +3572,7 @@ extern void print_simple_rtl (FILE *, const_rtx);
extern int print_rtl_single (FILE *, const_rtx);
extern int print_rtl_single_with_indent (FILE *, const_rtx, int);
extern void print_inline_rtx (FILE *, const_rtx, int);
+extern void print_rtx_insn_vec (FILE *file, const vec<rtx_insn *> &vec);
/* In stmt.c */
extern void expand_null_return (void);
@@ -67,7 +67,7 @@ struct st_expr
/* INSN list of stores that are locally anticipatable. */
rtx_insn_list *antic_stores;
/* INSN list of stores that are locally available. */
- rtx_insn_list *avail_stores;
+ vec<rtx_insn *> avail_stores;
/* Next in the list. */
struct st_expr * next;
/* Store ID in the dataflow bitmaps. */
@@ -148,7 +148,7 @@ st_expr_entry (rtx x)
ptr->pattern = x;
ptr->pattern_regs = NULL_RTX;
ptr->antic_stores = NULL;
- ptr->avail_stores = NULL;
+ ptr->avail_stores.create (0);
ptr->reaching_reg = NULL_RTX;
ptr->index = 0;
ptr->hash_index = hash;
@@ -164,7 +164,7 @@ static void
free_st_expr_entry (struct st_expr * ptr)
{
free_INSN_LIST_list (& ptr->antic_stores);
- free_INSN_LIST_list (& ptr->avail_stores);
+ ptr->avail_stores.release ();
free (ptr);
}
@@ -240,10 +240,7 @@ print_store_motion_mems (FILE * file)
fprintf (file, "\n AVAIL stores : ");
- if (ptr->avail_stores)
- print_rtl (file, ptr->avail_stores);
- else
- fprintf (file, "(nil)");
+ print_rtx_insn_vec (file, ptr->avail_stores);
fprintf (file, "\n\n");
}
@@ -591,11 +588,11 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
it successfully before; if we failed before, do not bother to check
until we reach the insn that caused us to fail. */
check_available = 0;
- if (!ptr->avail_stores)
+ if (ptr->avail_stores.is_empty ())
check_available = 1;
else
{
- rtx_insn *tmp = ptr->avail_stores->insn ();
+ rtx_insn *tmp = ptr->avail_stores.last ();
if (BLOCK_FOR_INSN (tmp) != bb)
check_available = 1;
}
@@ -619,7 +616,7 @@ find_moveable_store (rtx_insn *insn, int *regs_set_before, int *regs_set_after)
&LAST_AVAIL_CHECK_FAILURE (ptr));
}
if (!check_available)
- ptr->avail_stores = alloc_INSN_LIST (insn, ptr->avail_stores);
+ ptr->avail_stores.safe_push (insn);
}
/* Find available and anticipatable stores. */
@@ -697,7 +694,7 @@ compute_store_table (void)
ptr != NULL;
ptr = *prev_next_ptr_ptr)
{
- if (! ptr->avail_stores)
+ if ( ptr->avail_stores.is_empty ())
{
*prev_next_ptr_ptr = ptr->next;
store_motion_mems_table->remove_elt_with_hash (ptr, ptr->hash_index);
@@ -981,9 +978,10 @@ delete_store (struct st_expr * expr, basic_block bb)
reg = expr->reaching_reg;
- for (rtx_insn_list *i = expr->avail_stores; i; i = i->next ())
+ unsigned int len = expr->avail_stores.length ();
+ for (unsigned int i = len - 1; i < len; i--)
{
- rtx_insn *del = i->insn ();
+ rtx_insn *del = expr->avail_stores[i];
if (BLOCK_FOR_INSN (del) == bb)
{
/* We know there is only one since we deleted redundant
@@ -1018,9 +1016,10 @@ build_store_vectors (void)
for (ptr = first_st_expr (); ptr != NULL; ptr = next_st_expr (ptr))
{
- for (st = ptr->avail_stores; st != NULL; st = st->next ())
+ unsigned int len = ptr->avail_stores.length ();
+ for (unsigned int i = len - 1; i < len; i--)
{
- insn = st->insn ();
+ insn = ptr->avail_stores[i];
bb = BLOCK_FOR_INSN (insn);
/* If we've already seen an available expression in this block,
@@ -1032,7 +1031,7 @@ build_store_vectors (void)
rtx r = gen_reg_rtx_and_attrs (ptr->pattern);
if (dump_file)
fprintf (dump_file, "Removing redundant store:\n");
- replace_store_insn (r, st->insn (), bb, ptr);
+ replace_store_insn (r, insn, bb, ptr);
continue;
}
bitmap_set_bit (st_avloc[bb->index], ptr->index);
From: Trevor Saunders <tbsaunde+gcc@tbsaunde.org> gcc/ChangeLog: 2016-04-19 Trevor Saunders <tbsaunde+gcc@tbsaunde.org> * print-rtl.c (print_rtx_insn_vec): New function. * print-rtl.h: New prototype. * rtl.h: Likewise. * store-motion.c (struct st_expr): Make avail_stores a vector. (st_expr_entry): Adjust. (free_st_expr_entry): Likewise. (print_store_motion_mems): Likewise. (find_moveable_store): Likewise. (compute_store_table): Likewise. (delete_store): Likewise. (build_store_vectors): Likewise. --- gcc/print-rtl.c | 15 +++++++++++++++ gcc/print-rtl.h | 1 + gcc/rtl.h | 1 + gcc/store-motion.c | 31 +++++++++++++++---------------- 4 files changed, 32 insertions(+), 16 deletions(-)