This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
More lr problem bitmaps into its own obstack
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org, bonzini at gnu dot org
- Date: Mon, 7 Jun 2010 15:11:50 +0200
- Subject: More lr problem bitmaps into its own obstack
Hi,
this patch moves the lr bitmaps into specific obstack. rd bitmaps
are already allocated this way and other dataflow problems don't
seem to be that important though I will probably move live and
others too.
Bootstrapped/regtested x86_64-linux, OK?
Honza
* df-problems.c (df_lr_problem_data): Add lr_bitmaps.
(df_lr_alloc): Initialize problem data; move bitmaps to
lr_bitmaps obstack.
(df_lr_finalize): Free problem data; do not bother to free bitmaps.
(df_lr_verify_solution_start): Do not initialize problem data;
allocate bitmaps in lr_bitmaps.
(df_lr_verify_solution_end): Do not free problem data.
Index: df-problems.c
===================================================================
--- df-problems.c (revision 160348)
+++ df-problems.c (working copy)
@@ -734,6 +734,8 @@ struct df_lr_problem_data
{
bitmap_head *in;
bitmap_head *out;
+ /* An obstack for the bitmaps we need for this problem. */
+ bitmap_obstack lr_bitmaps;
};
@@ -775,12 +777,22 @@ df_lr_alloc (bitmap all_blocks ATTRIBUTE
{
unsigned int bb_index;
bitmap_iterator bi;
+ struct df_lr_problem_data *problem_data;
if (!df_lr->block_pool)
df_lr->block_pool = create_alloc_pool ("df_lr_block pool",
sizeof (struct df_lr_bb_info), 50);
df_grow_bb_info (df_lr);
+ if (df_lr->problem_data)
+ problem_data = (struct df_lr_problem_data *) df_lr->problem_data;
+ else
+ {
+ problem_data = XNEW (struct df_lr_problem_data);
+ df_lr->problem_data = problem_data;
+
+ bitmap_obstack_initialize (&problem_data->lr_bitmaps);
+ }
EXECUTE_IF_SET_IN_BITMAP (df_lr->out_of_date_transfer_functions, 0, bb_index, bi)
{
@@ -794,10 +806,10 @@ df_lr_alloc (bitmap all_blocks ATTRIBUTE
{
bb_info = (struct df_lr_bb_info *) pool_alloc (df_lr->block_pool);
df_lr_set_bb_info (bb_index, bb_info);
- bitmap_initialize (&bb_info->use, &bitmap_default_obstack);
- bitmap_initialize (&bb_info->def, &bitmap_default_obstack);
- bitmap_initialize (&bb_info->in, &bitmap_default_obstack);
- bitmap_initialize (&bb_info->out, &bitmap_default_obstack);
+ bitmap_initialize (&bb_info->use, &problem_data->lr_bitmaps);
+ bitmap_initialize (&bb_info->def, &problem_data->lr_bitmaps);
+ bitmap_initialize (&bb_info->in, &problem_data->lr_bitmaps);
+ bitmap_initialize (&bb_info->out, &problem_data->lr_bitmaps);
}
}
@@ -1073,24 +1085,16 @@ df_lr_finalize (bitmap all_blocks)
static void
df_lr_free (void)
{
+ struct df_lr_problem_data *problem_data
+ = (struct df_lr_problem_data *) df_lr->problem_data;
if (df_lr->block_info)
{
- unsigned int i;
- for (i = 0; i < df_lr->block_info_size; i++)
- {
- struct df_lr_bb_info *bb_info = df_lr_get_bb_info (i);
- if (bb_info)
- {
- bitmap_clear (&bb_info->use);
- bitmap_clear (&bb_info->def);
- bitmap_clear (&bb_info->in);
- bitmap_clear (&bb_info->out);
- }
- }
free_alloc_pool (df_lr->block_pool);
df_lr->block_info_size = 0;
free (df_lr->block_info);
+ bitmap_obstack_release (&problem_data->lr_bitmaps);
+ free (df_lr->problem_data);
}
BITMAP_FREE (df_lr->out_of_date_transfer_functions);
@@ -1153,23 +1157,19 @@ df_lr_verify_solution_start (void)
basic_block bb;
struct df_lr_problem_data *problem_data;
if (df_lr->solutions_dirty)
- {
- df_lr->problem_data = NULL;
- return;
- }
+ return;
/* Set it true so that the solution is recomputed. */
df_lr->solutions_dirty = true;
- problem_data = XNEW (struct df_lr_problem_data);
- df_lr->problem_data = problem_data;
+ problem_data = (struct df_lr_problem_data *)df_lr->problem_data;
problem_data->in = XNEWVEC (bitmap_head, last_basic_block);
problem_data->out = XNEWVEC (bitmap_head, last_basic_block);
FOR_ALL_BB (bb)
{
- bitmap_initialize (&problem_data->in[bb->index], &bitmap_default_obstack);
- bitmap_initialize (&problem_data->out[bb->index], &bitmap_default_obstack);
+ bitmap_initialize (&problem_data->in[bb->index], &problem_data->lr_bitmaps);
+ bitmap_initialize (&problem_data->out[bb->index], &problem_data->lr_bitmaps);
bitmap_copy (&problem_data->in[bb->index], DF_LR_IN (bb));
bitmap_copy (&problem_data->out[bb->index], DF_LR_OUT (bb));
}
@@ -1185,9 +1185,6 @@ df_lr_verify_solution_end (void)
struct df_lr_problem_data *problem_data;
basic_block bb;
- if (df_lr->problem_data == NULL)
- return;
-
problem_data = (struct df_lr_problem_data *)df_lr->problem_data;
if (df_lr->solutions_dirty)
@@ -1215,8 +1212,8 @@ df_lr_verify_solution_end (void)
free (problem_data->in);
free (problem_data->out);
- free (problem_data);
- df_lr->problem_data = NULL;
+ problem_data->in = NULL;
+ problem_data->out = NULL;
}