Commit 87d0d6c4 by Richard Biener Committed by Richard Biener

re PR middle-end/64928 (Inordinate cpu time and memory usage in "phase opt and…

re PR middle-end/64928 (Inordinate cpu time and memory usage in "phase opt and generate" with -ftest-coverage -fprofile-arcs)

2015-03-06  Richard Biener  <rguenther@suse.de>

	PR middle-end/64928
	* tree-ssa-live.h (struct tree_live_info_d): Add livein_obstack
	and liveout_obstack members.
	(calculate_live_on_exit): Remove.
	(calculate_live_ranges): Change declaration.
	* tree-ssa-live.c (liveness_bitmap_obstack): Remove global var.
	(new_tree_live_info): Adjust.
	(calculate_live_ranges): Delete livein when not wanted.
	(calculate_live_ranges): Do not initialize liveness_bitmap_obstack.
	Deal with partly deleted live info.
	(loe_visit_block): Remove temporary bitmap by using
	bitmap_ior_and_compl_into.
	(live_worklist): Adjust accordingly.
	(calculate_live_on_exit): Make static.
	* tree-ssa-coalesce.c (coalesce_ssa_name): Tell calculate_live_ranges
	we do not need livein.

From-SVN: r221237
parent 664e99ea
2015-03-06 Richard Biener <rguenther@suse.de>
PR middle-end/64928
* tree-ssa-live.h (struct tree_live_info_d): Add livein_obstack
and liveout_obstack members.
(calculate_live_on_exit): Remove.
(calculate_live_ranges): Change declaration.
* tree-ssa-live.c (liveness_bitmap_obstack): Remove global var.
(new_tree_live_info): Adjust.
(calculate_live_ranges): Delete livein when not wanted.
(calculate_live_ranges): Do not initialize liveness_bitmap_obstack.
Deal with partly deleted live info.
(loe_visit_block): Remove temporary bitmap by using
bitmap_ior_and_compl_into.
(live_worklist): Adjust accordingly.
(calculate_live_on_exit): Make static.
* tree-ssa-coalesce.c (coalesce_ssa_name): Tell calculate_live_ranges
we do not need livein.
2015-03-06 Jonathan Wakely <jwakely@redhat.com> 2015-03-06 Jonathan Wakely <jwakely@redhat.com>
* real.c (real_from_string): Fix typo in assertion. * real.c (real_from_string): Fix typo in assertion.
......
...@@ -1344,7 +1344,7 @@ coalesce_ssa_name (void) ...@@ -1344,7 +1344,7 @@ coalesce_ssa_name (void)
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
dump_var_map (dump_file, map); dump_var_map (dump_file, map);
liveinfo = calculate_live_ranges (map); liveinfo = calculate_live_ranges (map, false);
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
dump_live_info (dump_file, liveinfo, LIVEDUMP_ENTRY); dump_live_info (dump_file, liveinfo, LIVEDUMP_ENTRY);
......
...@@ -973,13 +973,6 @@ remove_unused_locals (void) ...@@ -973,13 +973,6 @@ remove_unused_locals (void)
timevar_pop (TV_REMOVE_UNUSED); timevar_pop (TV_REMOVE_UNUSED);
} }
/* Obstack for globale liveness info bitmaps. We don't want to put these
on the default obstack because these bitmaps can grow quite large and
we'll hold on to all that memory until the end of the compiler run.
As a bonus, delete_tree_live_info can destroy all the bitmaps by just
releasing the whole obstack. */
static bitmap_obstack liveness_bitmap_obstack;
/* Allocate and return a new live range information object base on MAP. */ /* Allocate and return a new live range information object base on MAP. */
static tree_live_info_p static tree_live_info_p
...@@ -992,18 +985,20 @@ new_tree_live_info (var_map map) ...@@ -992,18 +985,20 @@ new_tree_live_info (var_map map)
live->map = map; live->map = map;
live->num_blocks = last_basic_block_for_fn (cfun); live->num_blocks = last_basic_block_for_fn (cfun);
bitmap_obstack_initialize (&live->livein_obstack);
bitmap_obstack_initialize (&live->liveout_obstack);
live->livein = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun)); live->livein = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
bitmap_initialize (&live->livein[bb->index], &liveness_bitmap_obstack); bitmap_initialize (&live->livein[bb->index], &live->livein_obstack);
live->liveout = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun)); live->liveout = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
bitmap_initialize (&live->liveout[bb->index], &liveness_bitmap_obstack); bitmap_initialize (&live->liveout[bb->index], &live->liveout_obstack);
live->work_stack = XNEWVEC (int, last_basic_block_for_fn (cfun)); live->work_stack = XNEWVEC (int, last_basic_block_for_fn (cfun));
live->stack_top = live->work_stack; live->stack_top = live->work_stack;
live->global = BITMAP_ALLOC (&liveness_bitmap_obstack); live->global = BITMAP_ALLOC (NULL);
return live; return live;
} }
...@@ -1013,10 +1008,18 @@ new_tree_live_info (var_map map) ...@@ -1013,10 +1008,18 @@ new_tree_live_info (var_map map)
void void
delete_tree_live_info (tree_live_info_p live) delete_tree_live_info (tree_live_info_p live)
{ {
bitmap_obstack_release (&liveness_bitmap_obstack); if (live->livein)
{
bitmap_obstack_release (&live->livein_obstack);
free (live->livein);
}
if (live->liveout)
{
bitmap_obstack_release (&live->liveout_obstack);
free (live->liveout);
}
BITMAP_FREE (live->global);
free (live->work_stack); free (live->work_stack);
free (live->liveout);
free (live->livein);
free (live); free (live);
} }
...@@ -1027,8 +1030,7 @@ delete_tree_live_info (tree_live_info_p live) ...@@ -1027,8 +1030,7 @@ delete_tree_live_info (tree_live_info_p live)
it each time. */ it each time. */
static void static void
loe_visit_block (tree_live_info_p live, basic_block bb, sbitmap visited, loe_visit_block (tree_live_info_p live, basic_block bb, sbitmap visited)
bitmap tmp)
{ {
edge e; edge e;
bool change; bool change;
...@@ -1046,17 +1048,17 @@ loe_visit_block (tree_live_info_p live, basic_block bb, sbitmap visited, ...@@ -1046,17 +1048,17 @@ loe_visit_block (tree_live_info_p live, basic_block bb, sbitmap visited,
pred_bb = e->src; pred_bb = e->src;
if (pred_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)) if (pred_bb == ENTRY_BLOCK_PTR_FOR_FN (cfun))
continue; continue;
/* TMP is variables live-on-entry from BB that aren't defined in the /* Variables live-on-entry from BB that aren't defined in the
predecessor block. This should be the live on entry vars to pred. predecessor block. This should be the live on entry vars to pred.
Note that liveout is the DEFs in a block while live on entry is Note that liveout is the DEFs in a block while live on entry is
being calculated. */ being calculated.
bitmap_and_compl (tmp, loe, &live->liveout[pred_bb->index]); Add these bits to live-on-entry for the pred. if there are any
/* Add these bits to live-on-entry for the pred. if there are any
changes, and pred_bb has been visited already, add it to the changes, and pred_bb has been visited already, add it to the
revisit stack. */ revisit stack. */
change = bitmap_ior_into (live_on_entry (live, pred_bb), tmp); change = bitmap_ior_and_compl_into (live_on_entry (live, pred_bb),
if (bitmap_bit_p (visited, pred_bb->index) && change) loe, &live->liveout[pred_bb->index]);
if (change
&& bitmap_bit_p (visited, pred_bb->index))
{ {
bitmap_clear_bit (visited, pred_bb->index); bitmap_clear_bit (visited, pred_bb->index);
*(live->stack_top)++ = pred_bb->index; *(live->stack_top)++ = pred_bb->index;
...@@ -1074,23 +1076,21 @@ live_worklist (tree_live_info_p live) ...@@ -1074,23 +1076,21 @@ live_worklist (tree_live_info_p live)
unsigned b; unsigned b;
basic_block bb; basic_block bb;
sbitmap visited = sbitmap_alloc (last_basic_block_for_fn (cfun) + 1); sbitmap visited = sbitmap_alloc (last_basic_block_for_fn (cfun) + 1);
bitmap tmp = BITMAP_ALLOC (&liveness_bitmap_obstack);
bitmap_clear (visited); bitmap_clear (visited);
/* Visit all the blocks in reverse order and propagate live on entry values /* Visit all the blocks in reverse order and propagate live on entry values
into the predecessors blocks. */ into the predecessors blocks. */
FOR_EACH_BB_REVERSE_FN (bb, cfun) FOR_EACH_BB_REVERSE_FN (bb, cfun)
loe_visit_block (live, bb, visited, tmp); loe_visit_block (live, bb, visited);
/* Process any blocks which require further iteration. */ /* Process any blocks which require further iteration. */
while (live->stack_top != live->work_stack) while (live->stack_top != live->work_stack)
{ {
b = *--(live->stack_top); b = *--(live->stack_top);
loe_visit_block (live, BASIC_BLOCK_FOR_FN (cfun, b), visited, tmp); loe_visit_block (live, BASIC_BLOCK_FOR_FN (cfun, b), visited);
} }
BITMAP_FREE (tmp);
sbitmap_free (visited); sbitmap_free (visited);
} }
...@@ -1175,7 +1175,7 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p live) ...@@ -1175,7 +1175,7 @@ set_var_live_on_entry (tree ssa_name, tree_live_info_p live)
/* Calculate the live on exit vectors based on the entry info in LIVEINFO. */ /* Calculate the live on exit vectors based on the entry info in LIVEINFO. */
void static void
calculate_live_on_exit (tree_live_info_p liveinfo) calculate_live_on_exit (tree_live_info_p liveinfo)
{ {
basic_block bb; basic_block bb;
...@@ -1226,13 +1226,12 @@ calculate_live_on_exit (tree_live_info_p liveinfo) ...@@ -1226,13 +1226,12 @@ calculate_live_on_exit (tree_live_info_p liveinfo)
each partition. Return a new live info object. */ each partition. Return a new live info object. */
tree_live_info_p tree_live_info_p
calculate_live_ranges (var_map map) calculate_live_ranges (var_map map, bool want_livein)
{ {
tree var; tree var;
unsigned i; unsigned i;
tree_live_info_p live; tree_live_info_p live;
bitmap_obstack_initialize (&liveness_bitmap_obstack);
live = new_tree_live_info (map); live = new_tree_live_info (map);
for (i = 0; i < num_var_partitions (map); i++) for (i = 0; i < num_var_partitions (map); i++)
{ {
...@@ -1248,6 +1247,14 @@ calculate_live_ranges (var_map map) ...@@ -1248,6 +1247,14 @@ calculate_live_ranges (var_map map)
#endif #endif
calculate_live_on_exit (live); calculate_live_on_exit (live);
if (!want_livein)
{
bitmap_obstack_release (&live->livein_obstack);
free (live->livein);
live->livein = NULL;
}
return live; return live;
} }
......
...@@ -242,6 +242,10 @@ typedef struct tree_live_info_d ...@@ -242,6 +242,10 @@ typedef struct tree_live_info_d
/* Top of workstack. */ /* Top of workstack. */
int *stack_top; int *stack_top;
/* Obstacks to allocate the bitmaps on. */
bitmap_obstack livein_obstack;
bitmap_obstack liveout_obstack;
} *tree_live_info_p; } *tree_live_info_p;
...@@ -249,8 +253,7 @@ typedef struct tree_live_info_d ...@@ -249,8 +253,7 @@ typedef struct tree_live_info_d
#define LIVEDUMP_EXIT 0x02 #define LIVEDUMP_EXIT 0x02
#define LIVEDUMP_ALL (LIVEDUMP_ENTRY | LIVEDUMP_EXIT) #define LIVEDUMP_ALL (LIVEDUMP_ENTRY | LIVEDUMP_EXIT)
extern void delete_tree_live_info (tree_live_info_p); extern void delete_tree_live_info (tree_live_info_p);
extern void calculate_live_on_exit (tree_live_info_p); extern tree_live_info_p calculate_live_ranges (var_map, bool);
extern tree_live_info_p calculate_live_ranges (var_map);
extern void debug (tree_live_info_d &ref); extern void debug (tree_live_info_d &ref);
extern void debug (tree_live_info_d *ptr); extern void debug (tree_live_info_d *ptr);
extern void dump_live_info (FILE *, tree_live_info_p, int); extern void dump_live_info (FILE *, tree_live_info_p, int);
......
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