aboutsummaryrefslogtreecommitdiff
path: root/gcc/df-scan.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-scan.c
parent68ea355b5d9b51b994e0780d8392f7542262072f (diff)
downloadgcc-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.c28
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;