diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2005-12-22 15:23:40 +0100 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2005-12-22 14:23:40 +0000 |
commit | 1052bd544ead1ce3d9d4e43cb3d90fb40a84a890 (patch) | |
tree | 85322ca05abf7b49ec62b5f1ab6e6fd391a10f29 /gcc/df.c | |
parent | ab84748af1b9eb158f6a2cb0d2f8be97f196a5f2 (diff) | |
download | gcc-1052bd544ead1ce3d9d4e43cb3d90fb40a84a890.zip gcc-1052bd544ead1ce3d9d4e43cb3d90fb40a84a890.tar.gz gcc-1052bd544ead1ce3d9d4e43cb3d90fb40a84a890.tar.bz2 |
df.c (df_bitmaps_free): Only work for bbs for that structures are allocated.
* df.c (df_bitmaps_free): Only work for bbs for that structures are
allocated.
(df_bb_modify): Realloc tables to the new index.
(df_find_use): New function.
(df_find_def, df_reg_used): Handle subregs.
* df.h (df_find_use): Declare.
* loop-invariant.c: Include hashtab.h.
(struct invariant): Remove processed field, add eqto and reg fields.
(struct invariant_expr_entry): New.
(invariant_for_use, hash_invariant_expr_1, invariant_expr_equal_p,
hash_invariant_expr, eq_invariant_expr, find_or_insert_inv,
find_identical_invariants, merge_identical_invariants): New functions.
(create_new_invariant): Return the new invariant. Initialize new
fields.
(find_invariants): Call merge_identical_invariants.
(get_inv_cost, best_gain_for_invariant, set_move_mark,
move_invariant_reg): Handle equivalent invariants.
* Makefile.in (loop-invariant.o): Add HASHTAB_H dependency.
Co-Authored-By: Steven Bosscher <stevenb@suse.de>
From-SVN: r108949
Diffstat (limited to 'gcc/df.c')
-rw-r--r-- | gcc/df.c | 42 |
1 files changed, 28 insertions, 14 deletions
@@ -451,14 +451,11 @@ df_bitmaps_alloc (struct df *df, bitmap blocks, int flags) static void df_bitmaps_free (struct df *df, int flags) { - basic_block bb; + unsigned i; - FOR_EACH_BB (bb) + for (i = 0; i < df->n_bbs; i++) { - struct bb_info *bb_info = DF_BB_INFO (df, bb); - - if (!bb_info) - continue; + struct bb_info *bb_info = &df->bbs[i]; if ((flags & DF_RD) && bb_info->rd_in) { @@ -2636,7 +2633,7 @@ static void df_bb_modify (struct df *df, basic_block bb) { if ((unsigned) bb->index >= df->n_bbs) - df_bb_table_realloc (df, df->n_bbs); + df_bb_table_realloc (df, bb->index); bitmap_set_bit (df->bbs_modified, bb->index); } @@ -3032,25 +3029,42 @@ df_find_def (struct df *df, rtx insn, rtx reg) { struct df_link *defs; + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); + gcc_assert (REG_P (reg)); + for (defs = DF_INSN_DEFS (df, insn); defs; defs = defs->next) - if (rtx_equal_p (DF_REF_REG (defs->ref), reg)) + if (rtx_equal_p (DF_REF_REAL_REG (defs->ref), reg)) return defs->ref; return NULL; } -/* Return 1 if REG is referenced in INSN, zero otherwise. */ +/* Finds the reference corresponding to the use of REG in INSN. + DF is the dataflow object. */ -int -df_reg_used (struct df *df, rtx insn, rtx reg) +struct ref * +df_find_use (struct df *df, rtx insn, rtx reg) { struct df_link *uses; + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); + gcc_assert (REG_P (reg)); + for (uses = DF_INSN_USES (df, insn); uses; uses = uses->next) - if (rtx_equal_p (DF_REF_REG (uses->ref), reg)) - return 1; + if (rtx_equal_p (DF_REF_REAL_REG (uses->ref), reg)) + return uses->ref; - return 0; + return NULL; +} + +/* Return 1 if REG is referenced in INSN, zero otherwise. */ + +int +df_reg_used (struct df *df, rtx insn, rtx reg) +{ + return df_find_use (df, insn, reg) != NULL; } static int |