aboutsummaryrefslogtreecommitdiff
path: root/gcc/df-scan.c
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2007-03-20 08:31:13 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2007-03-20 08:31:13 +0000
commitfb4061627b2cd9acb3298d8a7f3ad90ab2615cf7 (patch)
treeac14daea0ef0dd3b428a5ec40c1293f79e2d5e54 /gcc/df-scan.c
parent0a85ec2e8c8a0d0632bbfc16ebe2d9eab4010995 (diff)
downloadgcc-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.c42
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++;