diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2007-03-20 08:31:13 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2007-03-20 08:31:13 +0000 |
commit | fb4061627b2cd9acb3298d8a7f3ad90ab2615cf7 (patch) | |
tree | ac14daea0ef0dd3b428a5ec40c1293f79e2d5e54 /gcc/df-scan.c | |
parent | 0a85ec2e8c8a0d0632bbfc16ebe2d9eab4010995 (diff) | |
download | gcc-fb4061627b2cd9acb3298d8a7f3ad90ab2615cf7.zip gcc-fb4061627b2cd9acb3298d8a7f3ad90ab2615cf7.tar.gz gcc-fb4061627b2cd9acb3298d8a7f3ad90ab2615cf7.tar.bz2 |
re PR middle-end/30907 (Propagation of addresses within loops pessimizes code)
2007-03-19 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/30907
* fwprop.c (forward_propagate_into): Never propagate inside a loop.
(fwprop_init): Always call loop_optimizer_initialize.
(fwprop_done): Always call loop_optimizer_finalize.
(fwprop): We always have loop info now.
(gate_fwprop_addr): Remove.
(pass_fwprop_addr): Use gate_fwprop as gate.
PR rtl-optimization/30841
* df-problems.c (df_ru_local_compute, df_rd_local_compute,
df_chain_alloc): Call df_reorganize_refs unconditionally.
* df-scan.c (df_rescan_blocks, df_reorganize_refs): Change
refs_organized to refs_organized_size.
(df_ref_create_structure): Use refs_organized_size instead of
bitmap_size if refs had been organized, and keep refs_organized_size
up-to-date.
* df.h (struct df_ref_info): Change refs_organized to
refs_organized_size.
(DF_DEFS_SIZE, DF_USES_SIZE): Use refs_organized_size instead of
bitmap_size.
From-SVN: r123084
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r-- | gcc/df-scan.c | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c index fea786c..d88da8a 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -435,8 +435,8 @@ df_rescan_blocks (struct df *df, bitmap blocks) struct dataflow *dflow = df->problems_by_index[DF_SCAN]; basic_block bb; - df->def_info.refs_organized = false; - df->use_info.refs_organized = false; + df->def_info.refs_organized_size = 0; + df->use_info.refs_organized_size = 0; if (blocks) { @@ -882,7 +882,7 @@ df_reorganize_refs (struct df_ref_info *ref_info) unsigned int offset = 0; unsigned int size = 0; - if (ref_info->refs_organized) + if (ref_info->refs_organized_size) return; if (ref_info->refs_size < ref_info->bitmap_size) @@ -915,7 +915,7 @@ df_reorganize_refs (struct df_ref_info *ref_info) reset it now that we have squished out all of the empty slots. */ ref_info->bitmap_size = size; - ref_info->refs_organized = true; + ref_info->refs_organized_size = size; ref_info->add_refs_inline = true; } @@ -957,22 +957,25 @@ df_ref_create_structure (struct dataflow *dflow, rtx reg, rtx *loc, case DF_REF_REG_DEF: { struct df_reg_info *reg_info = DF_REG_DEF_GET (df, regno); - reg_info->n_refs++; + unsigned int size = df->def_info.refs_organized_size + ? df->def_info.refs_organized_size + : df->def_info.bitmap_size; /* Add the ref to the reg_def chain. */ + reg_info->n_refs++; df_reg_chain_create (reg_info, this_ref); - DF_REF_ID (this_ref) = df->def_info.bitmap_size; + DF_REF_ID (this_ref) = size; if (df->def_info.add_refs_inline) { - if (DF_DEFS_SIZE (df) >= df->def_info.refs_size) + if (size >= df->def_info.refs_size) { - int new_size = df->def_info.bitmap_size - + df->def_info.bitmap_size / 4; + int new_size = size + size / 4; df_grow_ref_info (&df->def_info, new_size); } /* Add the ref to the big array of defs. */ - DF_DEFS_SET (df, df->def_info.bitmap_size, this_ref); - df->def_info.refs_organized = false; + DF_DEFS_SET (df, size, this_ref); + if (df->def_info.refs_organized_size) + df->def_info.refs_organized_size++; } df->def_info.bitmap_size++; @@ -997,22 +1000,25 @@ df_ref_create_structure (struct dataflow *dflow, rtx reg, rtx *loc, case DF_REF_REG_USE: { struct df_reg_info *reg_info = DF_REG_USE_GET (df, regno); - reg_info->n_refs++; + unsigned int size = df->use_info.refs_organized_size + ? df->use_info.refs_organized_size + : df->use_info.bitmap_size; /* Add the ref to the reg_use chain. */ + reg_info->n_refs++; df_reg_chain_create (reg_info, this_ref); - DF_REF_ID (this_ref) = df->use_info.bitmap_size; + DF_REF_ID (this_ref) = size; if (df->use_info.add_refs_inline) { - if (DF_USES_SIZE (df) >= df->use_info.refs_size) + if (size >= df->use_info.refs_size) { - int new_size = df->use_info.bitmap_size - + df->use_info.bitmap_size / 4; + int new_size = size + size / 4; df_grow_ref_info (&df->use_info, new_size); } /* Add the ref to the big array of defs. */ - DF_USES_SET (df, df->use_info.bitmap_size, this_ref); - df->use_info.refs_organized = false; + DF_USES_SET (df, size, this_ref); + if (df->def_info.refs_organized_size) + df->def_info.refs_organized_size++; } df->use_info.bitmap_size++; |