Commit af121e82 by Martin Liska Committed by Martin Liska

Fix memory leaks and use a pool_allocator

	* gcc.c (record_temp_file): Release name string.
	* ifcvt.c (noce_convert_multiple_sets): Use auto_vec instead
	of vec.
	* lra-lives.c (free_live_range_list): Utilize
	lra_live_range_pool for allocation and deallocation.
	(create_live_range): Likewise.
	(copy_live_range): Likewise.
	(lra_merge_live_ranges): Likewise.
	(remove_some_program_points_and_update_live_ranges): Likewise.
	(lra_create_live_ranges_1): Release point_freq_vec that can
	be not freed from previous iteration of the function.
	* tree-eh.c (lower_try_finally_switch): Use auto_vec instead of
	vec.
	* tree-sra.c (sra_deinitialize): Release all vectors in
	base_access_vec.
	* tree-ssa-dom.c (free_dom_edge_info): Make the function extern.
	* tree-ssa-threadupdate.c (remove_ctrl_stmt_and_useless_edges):
	Release edge_info for a removed edge.
	(thread_through_all_blocks): Free region vector.
	* tree-ssa.h (free_dom_edge_info): Declare function extern.

From-SVN: r230027
parent fc402eec
2015-11-09 Martin Liska <mliska@suse.cz>
* gcc.c (record_temp_file): Release name string.
* ifcvt.c (noce_convert_multiple_sets): Use auto_vec instead
of vec.
* lra-lives.c (free_live_range_list): Utilize
lra_live_range_pool for allocation and deallocation.
(create_live_range): Likewise.
(copy_live_range): Likewise.
(lra_merge_live_ranges): Likewise.
(remove_some_program_points_and_update_live_ranges): Likewise.
(lra_create_live_ranges_1): Release point_freq_vec that can
be not freed from previous iteration of the function.
* tree-eh.c (lower_try_finally_switch): Use auto_vec instead of
vec.
* tree-sra.c (sra_deinitialize): Release all vectors in
base_access_vec.
* tree-ssa-dom.c (free_dom_edge_info): Make the function extern.
* tree-ssa-threadupdate.c (remove_ctrl_stmt_and_useless_edges):
Release edge_info for a removed edge.
(thread_through_all_blocks): Free region vector.
* tree-ssa.h (free_dom_edge_info): Declare function extern.
2015-11-09 Ilya Enkovich <enkovich.gnu@gmail.com> 2015-11-09 Ilya Enkovich <enkovich.gnu@gmail.com>
* optabs.c (expand_vec_cond_expr): Always get sign from type. * optabs.c (expand_vec_cond_expr): Always get sign from type.
...@@ -2345,7 +2345,10 @@ record_temp_file (const char *filename, int always_delete, int fail_delete) ...@@ -2345,7 +2345,10 @@ record_temp_file (const char *filename, int always_delete, int fail_delete)
struct temp_file *temp; struct temp_file *temp;
for (temp = always_delete_queue; temp; temp = temp->next) for (temp = always_delete_queue; temp; temp = temp->next)
if (! filename_cmp (name, temp->name)) if (! filename_cmp (name, temp->name))
goto already1; {
free (name);
goto already1;
}
temp = XNEW (struct temp_file); temp = XNEW (struct temp_file);
temp->next = always_delete_queue; temp->next = always_delete_queue;
......
...@@ -3101,12 +3101,12 @@ noce_convert_multiple_sets (struct noce_if_info *if_info) ...@@ -3101,12 +3101,12 @@ noce_convert_multiple_sets (struct noce_if_info *if_info)
rtx_code cond_code = GET_CODE (cond); rtx_code cond_code = GET_CODE (cond);
/* The true targets for a conditional move. */ /* The true targets for a conditional move. */
vec<rtx> targets = vNULL; auto_vec<rtx> targets;
/* The temporaries introduced to allow us to not consider register /* The temporaries introduced to allow us to not consider register
overlap. */ overlap. */
vec<rtx> temporaries = vNULL; auto_vec<rtx> temporaries;
/* The insns we've emitted. */ /* The insns we've emitted. */
vec<rtx_insn *> unmodified_insns = vNULL; auto_vec<rtx_insn *> unmodified_insns;
int count = 0; int count = 0;
FOR_BB_INSNS (then_bb, insn) FOR_BB_INSNS (then_bb, insn)
......
...@@ -103,7 +103,7 @@ free_live_range_list (lra_live_range_t lr) ...@@ -103,7 +103,7 @@ free_live_range_list (lra_live_range_t lr)
while (lr != NULL) while (lr != NULL)
{ {
next = lr->next; next = lr->next;
delete lr; lra_live_range_pool.remove (lr);
lr = next; lr = next;
} }
} }
...@@ -112,7 +112,7 @@ free_live_range_list (lra_live_range_t lr) ...@@ -112,7 +112,7 @@ free_live_range_list (lra_live_range_t lr)
static lra_live_range_t static lra_live_range_t
create_live_range (int regno, int start, int finish, lra_live_range_t next) create_live_range (int regno, int start, int finish, lra_live_range_t next)
{ {
lra_live_range_t p = new lra_live_range; lra_live_range_t p = lra_live_range_pool.allocate ();
p->regno = regno; p->regno = regno;
p->start = start; p->start = start;
p->finish = finish; p->finish = finish;
...@@ -124,7 +124,7 @@ create_live_range (int regno, int start, int finish, lra_live_range_t next) ...@@ -124,7 +124,7 @@ create_live_range (int regno, int start, int finish, lra_live_range_t next)
static lra_live_range_t static lra_live_range_t
copy_live_range (lra_live_range_t r) copy_live_range (lra_live_range_t r)
{ {
return new lra_live_range (*r); return new (lra_live_range_pool) lra_live_range (*r);
} }
/* Copy live range list given by its head R and return the result. */ /* Copy live range list given by its head R and return the result. */
...@@ -167,7 +167,7 @@ lra_merge_live_ranges (lra_live_range_t r1, lra_live_range_t r2) ...@@ -167,7 +167,7 @@ lra_merge_live_ranges (lra_live_range_t r1, lra_live_range_t r2)
r1->start = r2->start; r1->start = r2->start;
lra_live_range_t temp = r2; lra_live_range_t temp = r2;
r2 = r2->next; r2 = r2->next;
delete temp; lra_live_range_pool.remove (temp);
} }
else else
{ {
...@@ -1081,7 +1081,7 @@ remove_some_program_points_and_update_live_ranges (void) ...@@ -1081,7 +1081,7 @@ remove_some_program_points_and_update_live_ranges (void)
} }
prev_r->start = r->start; prev_r->start = r->start;
prev_r->next = next_r; prev_r->next = next_r;
delete r; lra_live_range_pool.remove (r);
} }
} }
} }
...@@ -1240,7 +1240,9 @@ lra_create_live_ranges_1 (bool all_p, bool dead_insn_p) ...@@ -1240,7 +1240,9 @@ lra_create_live_ranges_1 (bool all_p, bool dead_insn_p)
dead_set = sparseset_alloc (max_regno); dead_set = sparseset_alloc (max_regno);
unused_set = sparseset_alloc (max_regno); unused_set = sparseset_alloc (max_regno);
curr_point = 0; curr_point = 0;
point_freq_vec.create (get_max_uid () * 2); unsigned new_length = get_max_uid () * 2;
if (point_freq_vec.length () < new_length)
point_freq_vec.safe_grow (new_length);
lra_point_freq = point_freq_vec.address (); lra_point_freq = point_freq_vec.address ();
int *post_order_rev_cfg = XNEWVEC (int, last_basic_block_for_fn (cfun)); int *post_order_rev_cfg = XNEWVEC (int, last_basic_block_for_fn (cfun));
int n_blocks_inverted = inverted_post_order_compute (post_order_rev_cfg); int n_blocks_inverted = inverted_post_order_compute (post_order_rev_cfg);
......
...@@ -1362,7 +1362,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf) ...@@ -1362,7 +1362,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
int return_index, eh_index, fallthru_index; int return_index, eh_index, fallthru_index;
int nlabels, ndests, j, last_case_index; int nlabels, ndests, j, last_case_index;
tree last_case; tree last_case;
vec<tree> case_label_vec; auto_vec<tree> case_label_vec;
gimple_seq switch_body = NULL; gimple_seq switch_body = NULL;
gimple *x; gimple *x;
geh_else *eh_else; geh_else *eh_else;
......
...@@ -674,6 +674,12 @@ sra_deinitialize (void) ...@@ -674,6 +674,12 @@ sra_deinitialize (void)
assign_link_pool.release (); assign_link_pool.release ();
obstack_free (&name_obstack, NULL); obstack_free (&name_obstack, NULL);
/* TODO: hash_map does not support traits that can release
value type of the hash_map. */
for (hash_map<tree, auto_vec<access_p> >::iterator it =
base_access_vec->begin (); it != base_access_vec->end (); ++it)
(*it).second.release ();
delete base_access_vec; delete base_access_vec;
} }
......
...@@ -121,8 +121,8 @@ static void dump_dominator_optimization_stats (FILE *file, ...@@ -121,8 +121,8 @@ static void dump_dominator_optimization_stats (FILE *file,
/* Free the edge_info data attached to E, if it exists. */ /* Free the edge_info data attached to E, if it exists. */
static void void
free_edge_info (edge e) free_dom_edge_info (edge e)
{ {
struct edge_info *edge_info = (struct edge_info *)e->aux; struct edge_info *edge_info = (struct edge_info *)e->aux;
...@@ -142,7 +142,7 @@ allocate_edge_info (edge e) ...@@ -142,7 +142,7 @@ allocate_edge_info (edge e)
struct edge_info *edge_info; struct edge_info *edge_info;
/* Free the old one, if it exists. */ /* Free the old one, if it exists. */
free_edge_info (e); free_dom_edge_info (e);
edge_info = XCNEW (struct edge_info); edge_info = XCNEW (struct edge_info);
...@@ -167,7 +167,7 @@ free_all_edge_infos (void) ...@@ -167,7 +167,7 @@ free_all_edge_infos (void)
{ {
FOR_EACH_EDGE (e, ei, bb->preds) FOR_EACH_EDGE (e, ei, bb->preds)
{ {
free_edge_info (e); free_dom_edge_info (e);
e->aux = NULL; e->aux = NULL;
} }
} }
......
...@@ -290,7 +290,10 @@ remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb) ...@@ -290,7 +290,10 @@ remove_ctrl_stmt_and_useless_edges (basic_block bb, basic_block dest_bb)
for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ) for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
{ {
if (e->dest != dest_bb) if (e->dest != dest_bb)
remove_edge (e); {
free_dom_edge_info (e);
remove_edge (e);
}
else else
ei_next (&ei); ei_next (&ei);
} }
...@@ -2522,6 +2525,7 @@ thread_through_all_blocks (bool may_peel_loop_headers) ...@@ -2522,6 +2525,7 @@ thread_through_all_blocks (bool may_peel_loop_headers)
delete_jump_thread_path (path); delete_jump_thread_path (path);
paths.unordered_remove (i); paths.unordered_remove (i);
free (region);
} }
/* Remove from PATHS all the jump-threads starting with an edge already /* Remove from PATHS all the jump-threads starting with an edge already
......
...@@ -46,4 +46,5 @@ extern void register_jump_thread (vec <class jump_thread_edge *> *); ...@@ -46,4 +46,5 @@ extern void register_jump_thread (vec <class jump_thread_edge *> *);
extern void remove_jump_threads_including (edge); extern void remove_jump_threads_including (edge);
extern void delete_jump_thread_path (vec <class jump_thread_edge *> *); extern void delete_jump_thread_path (vec <class jump_thread_edge *> *);
extern void remove_ctrl_stmt_and_useless_edges (basic_block, basic_block); extern void remove_ctrl_stmt_and_useless_edges (basic_block, basic_block);
extern void free_dom_edge_info (edge);
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment