summaryrefslogtreecommitdiff
path: root/gcc/df-core.c
diff options
context:
space:
mode:
authorKenneth Zadeck <zadeck@naturalbridge.com>2006-01-21 14:58:40 +0000
committerKenneth Zadeck <zadeck@gcc.gnu.org>2006-01-21 14:58:40 +0000
commit30cb87a09beeca0cbdee7347c2d993d1b90446d2 (patch)
tree64b96c5e14360cf5781d231fca9c461727ae0ea7 /gcc/df-core.c
parent68ea355b5d9b51b994e0780d8392f7542262072f (diff)
downloadgcc-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.c48
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