diff options
author | Kenneth Zadeck <zadeck@naturalbridge.com> | 2006-01-21 14:58:40 +0000 |
---|---|---|
committer | Kenneth Zadeck <zadeck@gcc.gnu.org> | 2006-01-21 14:58:40 +0000 |
commit | 30cb87a09beeca0cbdee7347c2d993d1b90446d2 (patch) | |
tree | 64b96c5e14360cf5781d231fca9c461727ae0ea7 /gcc/df-core.c | |
parent | 68ea355b5d9b51b994e0780d8392f7542262072f (diff) | |
download | gcc-30cb87a09beeca0cbdee7347c2d993d1b90446d2.tar.gz |
df-scan.c (problem_SCAN): Added NULL reset function.
2005-01-21 Kenneth Zadeck <zadeck@naturalbridge.com>
* df-scan.c (problem_SCAN): Added NULL reset function.
(df_scan_reset_blocks): Added code to call reset block function
(df_bb_refs_delete) Fixed comment.
(df_insn_refs_delete): Made tolerant of deleting non existent info
for dataflow problems that need to be reset.
* df-core.c (df_set_blocks): Ditto.
* df.h (struct df_problem): Added reset_fun.
* df-problems.c (problem_RU, problem_RD, problem_LR, problem_UR,
problem_UREC, problem_CHAIN, problem_RI): Initialized reset_fun field.
(df_chain_insn_reset, df_chain_bb_reset, df_chain_reset): New
functions to clear out all references to def-use or use-def chains.
From-SVN: r110066
Diffstat (limited to 'gcc/df-core.c')
-rw-r--r-- | gcc/df-core.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/gcc/df-core.c b/gcc/df-core.c index 87d9324d80f..a0ed23caa16 100644 --- a/gcc/df-core.c +++ b/gcc/df-core.c @@ -292,6 +292,8 @@ are write-only operations. static struct df *ddf = NULL; struct df *shared_df = NULL; +static void * df_get_bb_info (struct dataflow *, unsigned int); +static void df_set_bb_info (struct dataflow *, unsigned int, void *); /*---------------------------------------------------------------------------- Functions to create, destroy and manipulate an instance of df. ----------------------------------------------------------------------------*/ @@ -358,11 +360,14 @@ df_set_blocks (struct df *df, bitmap blocks) { int p; bitmap diff = BITMAP_ALLOC (NULL); + bitmap all = BITMAP_ALLOC (NULL); bitmap_and_compl (diff, df->blocks_to_analyze, blocks); - for (p = 0; p < df->num_problems_defined; p++) + for (p = df->num_problems_defined - 1; p >= 0 ;p--) { struct dataflow *dflow = df->problems_in_order[p]; - if (*dflow->problem->free_bb_fun) + if (*dflow->problem->reset_fun) + (*dflow->problem->reset_fun) (dflow, df->blocks_to_analyze); + else if (*dflow->problem->free_bb_fun) { bitmap_iterator bi; unsigned int bb_index; @@ -370,15 +375,50 @@ df_set_blocks (struct df *df, bitmap blocks) EXECUTE_IF_SET_IN_BITMAP (diff, 0, bb_index, bi) { basic_block bb = BASIC_BLOCK (bb_index); - (*dflow->problem->free_bb_fun) (dflow, bb, diff); + if (bb) + { + (*dflow->problem->free_bb_fun) + (dflow, bb, df_get_bb_info (dflow, bb_index)); + df_set_bb_info (dflow, bb_index, NULL); + } } } } + BITMAP_FREE (all); BITMAP_FREE (diff); } else - df->blocks_to_analyze = BITMAP_ALLOC (NULL); + { + /* If we have not actually run scanning before, do not try + to clear anything. */ + struct dataflow *scan_dflow = df->problems_by_index [DF_SCAN]; + if (scan_dflow->problem_data) + { + bitmap blocks_to_reset = NULL; + int p; + for (p = df->num_problems_defined - 1; p >= 0 ;p--) + { + struct dataflow *dflow = df->problems_in_order[p]; + if (*dflow->problem->reset_fun) + { + if (!blocks_to_reset) + { + basic_block bb; + blocks_to_reset = BITMAP_ALLOC (NULL); + FOR_ALL_BB(bb) + { + bitmap_set_bit (blocks_to_reset, bb->index); + } + } + (*dflow->problem->reset_fun) (dflow, blocks_to_reset); + } + } + if (blocks_to_reset) + BITMAP_FREE (blocks_to_reset); + } + df->blocks_to_analyze = BITMAP_ALLOC (NULL); + } bitmap_copy (df->blocks_to_analyze, blocks); } else |