aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-im.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r--gcc/tree-ssa-loop-im.c157
1 files changed, 68 insertions, 89 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 4274457..7f4d045 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -105,18 +105,14 @@ typedef struct mem_ref_loc
gimple stmt; /* The statement in that it occurs. */
} *mem_ref_loc_p;
-DEF_VEC_P(mem_ref_loc_p);
-DEF_VEC_ALLOC_P(mem_ref_loc_p, heap);
/* The list of memory reference locations in a loop. */
typedef struct mem_ref_locs
{
- VEC (mem_ref_loc_p, heap) *locs;
+ vec<mem_ref_loc_p> locs;
} *mem_ref_locs_p;
-DEF_VEC_P(mem_ref_locs_p);
-DEF_VEC_ALLOC_P(mem_ref_locs_p, heap);
/* Description of a memory reference. */
@@ -128,7 +124,7 @@ typedef struct mem_ref
hashval_t hash; /* Its hash value. */
bitmap stored; /* The set of loops in that this memory location
is stored to. */
- VEC (mem_ref_locs_p, heap) *accesses_in_loop;
+ vec<mem_ref_locs_p> accesses_in_loop;
/* The locations of the accesses. Vector
indexed by the loop number. */
@@ -149,14 +145,8 @@ typedef struct mem_ref
bitmap dep_ref; /* The complement of INDEP_REF. */
} *mem_ref_p;
-DEF_VEC_P(mem_ref_p);
-DEF_VEC_ALLOC_P(mem_ref_p, heap);
-DEF_VEC_P(bitmap);
-DEF_VEC_ALLOC_P(bitmap, heap);
-DEF_VEC_P(htab_t);
-DEF_VEC_ALLOC_P(htab_t, heap);
/* Description of memory accesses in loops. */
@@ -166,18 +156,18 @@ static struct
htab_t refs;
/* The list of memory references. */
- VEC (mem_ref_p, heap) *refs_list;
+ vec<mem_ref_p> refs_list;
/* The set of memory references accessed in each loop. */
- VEC (bitmap, heap) *refs_in_loop;
+ vec<bitmap> refs_in_loop;
/* The set of memory references accessed in each loop, including
subloops. */
- VEC (bitmap, heap) *all_refs_in_loop;
+ vec<bitmap> all_refs_in_loop;
/* The set of memory references stored in each loop, including
subloops. */
- VEC (bitmap, heap) *all_refs_stored_in_loop;
+ vec<bitmap> all_refs_stored_in_loop;
/* Cache for expanding memory addresses. */
struct pointer_map_t *ttae_cache;
@@ -1473,9 +1463,9 @@ free_mem_ref_locs (mem_ref_locs_p accs)
if (!accs)
return;
- FOR_EACH_VEC_ELT (mem_ref_loc_p, accs->locs, i, loc)
+ FOR_EACH_VEC_ELT (accs->locs, i, loc)
free (loc);
- VEC_free (mem_ref_loc_p, heap, accs->locs);
+ accs->locs.release ();
free (accs);
}
@@ -1487,9 +1477,9 @@ memref_free (struct mem_ref *mem)
unsigned i;
mem_ref_locs_p accs;
- FOR_EACH_VEC_ELT (mem_ref_locs_p, mem->accesses_in_loop, i, accs)
+ FOR_EACH_VEC_ELT (mem->accesses_in_loop, i, accs)
free_mem_ref_locs (accs);
- VEC_free (mem_ref_locs_p, heap, mem->accesses_in_loop);
+ mem->accesses_in_loop.release ();
free (mem);
}
@@ -1509,7 +1499,7 @@ mem_ref_alloc (tree mem, unsigned hash, unsigned id)
ref->dep_loop = BITMAP_ALLOC (&lim_bitmap_obstack);
ref->indep_ref = BITMAP_ALLOC (&lim_bitmap_obstack);
ref->dep_ref = BITMAP_ALLOC (&lim_bitmap_obstack);
- ref->accesses_in_loop = NULL;
+ ref->accesses_in_loop.create (0);
return ref;
}
@@ -1520,7 +1510,7 @@ static mem_ref_locs_p
mem_ref_locs_alloc (void)
{
mem_ref_locs_p accs = XNEW (struct mem_ref_locs);
- accs->locs = NULL;
+ accs->locs.create (0);
return accs;
}
@@ -1532,23 +1522,22 @@ record_mem_ref_loc (mem_ref_p ref, struct loop *loop, gimple stmt, tree *loc)
{
mem_ref_loc_p aref = XNEW (struct mem_ref_loc);
mem_ref_locs_p accs;
- bitmap ril = VEC_index (bitmap, memory_accesses.refs_in_loop, loop->num);
+ bitmap ril = memory_accesses.refs_in_loop[loop->num];
- if (VEC_length (mem_ref_locs_p, ref->accesses_in_loop)
+ if (ref->accesses_in_loop.length ()
<= (unsigned) loop->num)
- VEC_safe_grow_cleared (mem_ref_locs_p, heap, ref->accesses_in_loop,
- loop->num + 1);
- accs = VEC_index (mem_ref_locs_p, ref->accesses_in_loop, loop->num);
+ ref->accesses_in_loop.safe_grow_cleared (loop->num + 1);
+ accs = ref->accesses_in_loop[loop->num];
if (!accs)
{
accs = mem_ref_locs_alloc ();
- VEC_replace (mem_ref_locs_p, ref->accesses_in_loop, loop->num, accs);
+ ref->accesses_in_loop[loop->num] = accs;
}
aref->stmt = stmt;
aref->ref = loc;
- VEC_safe_push (mem_ref_loc_p, heap, accs->locs, aref);
+ accs->locs.safe_push (aref);
bitmap_set_bit (ril, ref->id);
}
@@ -1585,9 +1574,9 @@ gather_mem_refs_stmt (struct loop *loop, gimple stmt)
mem = simple_mem_ref_in_stmt (stmt, &is_stored);
if (!mem)
{
- id = VEC_length (mem_ref_p, memory_accesses.refs_list);
+ id = memory_accesses.refs_list.length ();
ref = mem_ref_alloc (error_mark_node, 0, id);
- VEC_safe_push (mem_ref_p, heap, memory_accesses.refs_list, ref);
+ memory_accesses.refs_list.safe_push (ref);
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "Unanalyzed memory reference %u: ", id);
@@ -1609,9 +1598,9 @@ gather_mem_refs_stmt (struct loop *loop, gimple stmt)
}
else
{
- id = VEC_length (mem_ref_p, memory_accesses.refs_list);
+ id = memory_accesses.refs_list.length ();
ref = mem_ref_alloc (*mem, hash, id);
- VEC_safe_push (mem_ref_p, heap, memory_accesses.refs_list, ref);
+ memory_accesses.refs_list.safe_push (ref);
*slot = ref;
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -1654,15 +1643,14 @@ gather_mem_refs_in_loops (void)
the loop hierarchy. */
FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
{
- lrefs = VEC_index (bitmap, memory_accesses.refs_in_loop, loop->num);
- alrefs = VEC_index (bitmap, memory_accesses.all_refs_in_loop, loop->num);
+ lrefs = memory_accesses.refs_in_loop[loop->num];
+ alrefs = memory_accesses.all_refs_in_loop[loop->num];
bitmap_ior_into (alrefs, lrefs);
if (loop_outer (loop) == current_loops->tree_root)
continue;
- alrefso = VEC_index (bitmap, memory_accesses.all_refs_in_loop,
- loop_outer (loop)->num);
+ alrefso = memory_accesses.all_refs_in_loop[loop_outer (loop)->num];
bitmap_ior_into (alrefso, alrefs);
}
}
@@ -1673,7 +1661,7 @@ gather_mem_refs_in_loops (void)
static void
create_vop_ref_mapping_loop (struct loop *loop)
{
- bitmap refs = VEC_index (bitmap, memory_accesses.refs_in_loop, loop->num);
+ bitmap refs = memory_accesses.refs_in_loop[loop->num];
struct loop *sloop;
bitmap_iterator bi;
unsigned i;
@@ -1681,14 +1669,13 @@ create_vop_ref_mapping_loop (struct loop *loop)
EXECUTE_IF_SET_IN_BITMAP (refs, 0, i, bi)
{
- ref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
+ ref = memory_accesses.refs_list[i];
for (sloop = loop; sloop != current_loops->tree_root;
sloop = loop_outer (sloop))
if (bitmap_bit_p (ref->stored, loop->num))
{
bitmap refs_stored
- = VEC_index (bitmap, memory_accesses.all_refs_stored_in_loop,
- sloop->num);
+ = memory_accesses.all_refs_stored_in_loop[sloop->num];
bitmap_set_bit (refs_stored, ref->id);
}
}
@@ -1718,22 +1705,19 @@ analyze_memory_references (void)
bitmap empty;
memory_accesses.refs = htab_create (100, memref_hash, memref_eq, NULL);
- memory_accesses.refs_list = NULL;
- memory_accesses.refs_in_loop = VEC_alloc (bitmap, heap,
- number_of_loops ());
- memory_accesses.all_refs_in_loop = VEC_alloc (bitmap, heap,
- number_of_loops ());
- memory_accesses.all_refs_stored_in_loop = VEC_alloc (bitmap, heap,
- number_of_loops ());
+ memory_accesses.refs_list.create (0);
+ memory_accesses.refs_in_loop.create (number_of_loops ());
+ memory_accesses.all_refs_in_loop.create (number_of_loops ());
+ memory_accesses.all_refs_stored_in_loop.create (number_of_loops ());
for (i = 0; i < number_of_loops (); i++)
{
empty = BITMAP_ALLOC (&lim_bitmap_obstack);
- VEC_quick_push (bitmap, memory_accesses.refs_in_loop, empty);
+ memory_accesses.refs_in_loop.quick_push (empty);
empty = BITMAP_ALLOC (&lim_bitmap_obstack);
- VEC_quick_push (bitmap, memory_accesses.all_refs_in_loop, empty);
+ memory_accesses.all_refs_in_loop.quick_push (empty);
empty = BITMAP_ALLOC (&lim_bitmap_obstack);
- VEC_quick_push (bitmap, memory_accesses.all_refs_stored_in_loop, empty);
+ memory_accesses.all_refs_stored_in_loop.quick_push (empty);
}
memory_accesses.ttae_cache = NULL;
@@ -1789,26 +1773,25 @@ rewrite_mem_ref_loc (mem_ref_loc_p loc, tree tmp_var)
static void
get_all_locs_in_loop (struct loop *loop, mem_ref_p ref,
- VEC (mem_ref_loc_p, heap) **locs)
+ vec<mem_ref_loc_p> *locs)
{
mem_ref_locs_p accs;
unsigned i;
mem_ref_loc_p loc;
- bitmap refs = VEC_index (bitmap, memory_accesses.all_refs_in_loop,
- loop->num);
+ bitmap refs = memory_accesses.all_refs_in_loop[loop->num];
struct loop *subloop;
if (!bitmap_bit_p (refs, ref->id))
return;
- if (VEC_length (mem_ref_locs_p, ref->accesses_in_loop)
+ if (ref->accesses_in_loop.length ()
> (unsigned) loop->num)
{
- accs = VEC_index (mem_ref_locs_p, ref->accesses_in_loop, loop->num);
+ accs = ref->accesses_in_loop[loop->num];
if (accs)
{
- FOR_EACH_VEC_ELT (mem_ref_loc_p, accs->locs, i, loc)
- VEC_safe_push (mem_ref_loc_p, heap, *locs, loc);
+ FOR_EACH_VEC_ELT (accs->locs, i, loc)
+ locs->safe_push (loc);
}
}
@@ -1823,12 +1806,12 @@ rewrite_mem_refs (struct loop *loop, mem_ref_p ref, tree tmp_var)
{
unsigned i;
mem_ref_loc_p loc;
- VEC (mem_ref_loc_p, heap) *locs = NULL;
+ vec<mem_ref_loc_p> locs = vec<mem_ref_loc_p>();
get_all_locs_in_loop (loop, ref, &locs);
- FOR_EACH_VEC_ELT (mem_ref_loc_p, locs, i, loc)
+ FOR_EACH_VEC_ELT (locs, i, loc)
rewrite_mem_ref_loc (loc, tmp_var);
- VEC_free (mem_ref_loc_p, heap, locs);
+ locs.release ();
}
/* The name and the length of the currently generated variable
@@ -2095,13 +2078,13 @@ execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref)
unsigned i;
mem_ref_loc_p loc;
tree flag;
- VEC (mem_ref_loc_p, heap) *locs = NULL;
+ vec<mem_ref_loc_p> locs = vec<mem_ref_loc_p>();
char *str = get_lsm_tmp_name (ref->mem, ~0);
lsm_tmp_name_add ("_flag");
flag = create_tmp_reg (boolean_type_node, str);
get_all_locs_in_loop (loop, ref, &locs);
- FOR_EACH_VEC_ELT (mem_ref_loc_p, locs, i, loc)
+ FOR_EACH_VEC_ELT (locs, i, loc)
{
gimple_stmt_iterator gsi;
gimple stmt;
@@ -2115,7 +2098,7 @@ execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref)
gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
}
}
- VEC_free (mem_ref_loc_p, heap, locs);
+ locs.release ();
return flag;
}
@@ -2125,7 +2108,7 @@ execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref)
to the reference from the temporary variable are emitted to exits. */
static void
-execute_sm (struct loop *loop, VEC (edge, heap) *exits, mem_ref_p ref)
+execute_sm (struct loop *loop, vec<edge> exits, mem_ref_p ref)
{
tree tmp_var, store_flag;
unsigned i;
@@ -2181,7 +2164,7 @@ execute_sm (struct loop *loop, VEC (edge, heap) *exits, mem_ref_p ref)
}
/* Sink the store to every exit from the loop. */
- FOR_EACH_VEC_ELT (edge, exits, i, ex)
+ FOR_EACH_VEC_ELT (exits, i, ex)
if (!multi_threaded_model_p)
{
gimple store;
@@ -2197,7 +2180,7 @@ execute_sm (struct loop *loop, VEC (edge, heap) *exits, mem_ref_p ref)
static void
hoist_memory_references (struct loop *loop, bitmap mem_refs,
- VEC (edge, heap) *exits)
+ vec<edge> exits)
{
mem_ref_p ref;
unsigned i;
@@ -2205,7 +2188,7 @@ hoist_memory_references (struct loop *loop, bitmap mem_refs,
EXECUTE_IF_SET_IN_BITMAP (mem_refs, 0, i, bi)
{
- ref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
+ ref = memory_accesses.refs_list[i];
execute_sm (loop, exits, ref);
}
}
@@ -2216,7 +2199,7 @@ hoist_memory_references (struct loop *loop, bitmap mem_refs,
static bool
ref_always_accessed_p (struct loop *loop, mem_ref_p ref, bool stored_p)
{
- VEC (mem_ref_loc_p, heap) *locs = NULL;
+ vec<mem_ref_loc_p> locs = vec<mem_ref_loc_p>();
unsigned i;
mem_ref_loc_p loc;
bool ret = false;
@@ -2229,7 +2212,7 @@ ref_always_accessed_p (struct loop *loop, mem_ref_p ref, bool stored_p)
base = TREE_OPERAND (base, 0);
get_all_locs_in_loop (loop, ref, &locs);
- FOR_EACH_VEC_ELT (mem_ref_loc_p, locs, i, loc)
+ FOR_EACH_VEC_ELT (locs, i, loc)
{
if (!get_lim_data (loc->stmt))
continue;
@@ -2262,7 +2245,7 @@ ref_always_accessed_p (struct loop *loop, mem_ref_p ref, bool stored_p)
break;
}
}
- VEC_free (mem_ref_loc_p, heap, locs);
+ locs.release ();
return ret;
}
@@ -2329,16 +2312,13 @@ ref_indep_loop_p_1 (struct loop *loop, mem_ref_p ref)
mem_ref_p aref;
if (stored)
- refs_to_check = VEC_index (bitmap,
- memory_accesses.all_refs_in_loop, loop->num);
+ refs_to_check = memory_accesses.all_refs_in_loop[loop->num];
else
- refs_to_check = VEC_index (bitmap,
- memory_accesses.all_refs_stored_in_loop,
- loop->num);
+ refs_to_check = memory_accesses.all_refs_stored_in_loop[loop->num];
EXECUTE_IF_SET_IN_BITMAP (refs_to_check, 0, i, bi)
{
- aref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
+ aref = memory_accesses.refs_list[i];
if (!MEM_ANALYZABLE (aref)
|| !refs_independent_p (ref, aref))
{
@@ -2425,15 +2405,14 @@ can_sm_ref_p (struct loop *loop, mem_ref_p ref)
static void
find_refs_for_sm (struct loop *loop, bitmap sm_executed, bitmap refs_to_sm)
{
- bitmap refs = VEC_index (bitmap, memory_accesses.all_refs_in_loop,
- loop->num);
+ bitmap refs = memory_accesses.all_refs_in_loop[loop->num];
unsigned i;
bitmap_iterator bi;
mem_ref_p ref;
EXECUTE_IF_AND_COMPL_IN_BITMAP (refs, sm_executed, 0, i, bi)
{
- ref = VEC_index (mem_ref_p, memory_accesses.refs_list, i);
+ ref = memory_accesses.refs_list[i];
if (can_sm_ref_p (loop, ref))
bitmap_set_bit (refs_to_sm, i);
}
@@ -2445,12 +2424,12 @@ find_refs_for_sm (struct loop *loop, bitmap sm_executed, bitmap refs_to_sm)
static bool
loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED,
- VEC (edge, heap) *exits)
+ vec<edge> exits)
{
unsigned i;
edge ex;
- FOR_EACH_VEC_ELT (edge, exits, i, ex)
+ FOR_EACH_VEC_ELT (exits, i, ex)
if (ex->flags & (EDGE_ABNORMAL | EDGE_EH))
return false;
@@ -2464,7 +2443,7 @@ loop_suitable_for_sm (struct loop *loop ATTRIBUTE_UNUSED,
static void
store_motion_loop (struct loop *loop, bitmap sm_executed)
{
- VEC (edge, heap) *exits = get_loop_exit_edges (loop);
+ vec<edge> exits = get_loop_exit_edges (loop);
struct loop *subloop;
bitmap sm_in_loop = BITMAP_ALLOC (NULL);
@@ -2473,7 +2452,7 @@ store_motion_loop (struct loop *loop, bitmap sm_executed)
find_refs_for_sm (loop, sm_executed, sm_in_loop);
hoist_memory_references (loop, sm_in_loop, exits);
}
- VEC_free (edge, heap, exits);
+ exits.release ();
bitmap_ior_into (sm_executed, sm_in_loop);
for (subloop = loop->inner; subloop != NULL; subloop = subloop->next)
@@ -2623,13 +2602,13 @@ tree_ssa_lim_finalize (void)
htab_delete (memory_accesses.refs);
- FOR_EACH_VEC_ELT (mem_ref_p, memory_accesses.refs_list, i, ref)
+ FOR_EACH_VEC_ELT (memory_accesses.refs_list, i, ref)
memref_free (ref);
- VEC_free (mem_ref_p, heap, memory_accesses.refs_list);
+ memory_accesses.refs_list.release ();
- VEC_free (bitmap, heap, memory_accesses.refs_in_loop);
- VEC_free (bitmap, heap, memory_accesses.all_refs_in_loop);
- VEC_free (bitmap, heap, memory_accesses.all_refs_stored_in_loop);
+ memory_accesses.refs_in_loop.release ();
+ memory_accesses.all_refs_in_loop.release ();
+ memory_accesses.all_refs_stored_in_loop.release ();
if (memory_accesses.ttae_cache)
free_affine_expand_cache (&memory_accesses.ttae_cache);