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-scan.c | |
parent | 68ea355b5d9b51b994e0780d8392f7542262072f (diff) | |
download | gcc-30cb87a09beeca0cbdee7347c2d993d1b90446d2.zip gcc-30cb87a09beeca0cbdee7347c2d993d1b90446d2.tar.gz gcc-30cb87a09beeca0cbdee7347c2d993d1b90446d2.tar.bz2 |
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-scan.c')
-rw-r--r-- | gcc/df-scan.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c index 8f19956..bba89e7 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -304,6 +304,7 @@ static struct df_problem problem_SCAN = DF_SCAN, /* Problem id. */ DF_NONE, /* Direction. */ df_scan_alloc, /* Allocate the problem specific data. */ + NULL, /* Reset global information. */ df_scan_free_bb_info, /* Free basic block info. */ NULL, /* Local compute function. */ NULL, /* Init the solution specific data. */ @@ -426,6 +427,8 @@ df_rescan_blocks (struct df *df, bitmap blocks) if (blocks) { + int i; + /* Need to assure that there are space in all of the tables. */ unsigned int insn_num = get_max_uid () + 1; insn_num += insn_num / 4; @@ -443,6 +446,24 @@ df_rescan_blocks (struct df *df, bitmap blocks) df->def_info.add_refs_inline = true; df->use_info.add_refs_inline = true; + for (i = df->num_problems_defined; i; i--) + { + bitmap blocks_to_reset = NULL; + if (*dflow->problem->reset_fun) + { + if (!blocks_to_reset) + { + blocks_to_reset = BITMAP_ALLOC (NULL); + bitmap_copy (blocks_to_reset, local_blocks_to_scan); + if (df->blocks_to_scan) + bitmap_ior_into (blocks_to_reset, df->blocks_to_scan); + } + (*dflow->problem->reset_fun) (dflow, blocks_to_reset); + } + if (blocks_to_reset) + BITMAP_FREE (blocks_to_reset); + } + df_refs_delete (dflow, local_blocks_to_scan); /* This may be a mistake, but if an explicit blocks is passed in @@ -727,11 +748,14 @@ df_insn_refs_delete (struct dataflow *dflow, rtx insn) { struct df *df = dflow->df; unsigned int uid = INSN_UID (insn); - struct df_insn_info *insn_info = DF_INSN_UID_GET (df, uid); + struct df_insn_info *insn_info = NULL; struct df_ref *ref; struct df_scan_problem_data *problem_data = (struct df_scan_problem_data *) dflow->problem_data; + if (uid < df->insns_size) + insn_info = DF_INSN_UID_GET (df, uid); + if (insn_info) { ref = insn_info->defs; @@ -769,7 +793,7 @@ df_bb_refs_delete (struct dataflow *dflow, int bb_index) } } - /* Get rid of any artifical uses. */ + /* Get rid of any artifical uses or defs. */ if (bb_info) { def = bb_info->artificial_defs; |