diff options
author | Jan Hubicka <jh@suse.cz> | 2000-04-17 13:00:44 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2000-04-17 13:00:44 +0000 |
commit | 2ce6dc2f6aa48acf42384a35e3ccc565c0677699 (patch) | |
tree | 5c29618c8a861a4968c8e9f96ee5398418ce8dfc /gcc/cse.c | |
parent | 44ee20072859dc8c64da9934b69476fe3d49b0d3 (diff) | |
download | gcc-2ce6dc2f6aa48acf42384a35e3ccc565c0677699.zip gcc-2ce6dc2f6aa48acf42384a35e3ccc565c0677699.tar.gz gcc-2ce6dc2f6aa48acf42384a35e3ccc565c0677699.tar.bz2 |
cse.c (struct check_depdendence_data): New.
* cse.c (struct check_depdendence_data): New.
(check_dependence): New function.
(invalidate): Use check_depdenence.
From-SVN: r33207
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 43 |
1 files changed, 30 insertions, 13 deletions
@@ -705,6 +705,7 @@ static rtx cse_basic_block PARAMS ((rtx, rtx, struct branch_path *, int)); static void count_reg_usage PARAMS ((rtx, int *, rtx, int)); extern void dump_class PARAMS ((struct table_elt*)); static struct cse_reg_info * get_cse_reg_info PARAMS ((unsigned int)); +static int check_dependence PARAMS ((rtx *, void *)); static void flush_hash_table PARAMS ((void)); @@ -1721,6 +1722,24 @@ flush_hash_table () } } +/* Function called for each rtx to check whether true dependence exist. */ +struct check_dependence_data +{ + enum machine_mode mode; + rtx exp; +}; +static int +check_dependence (x, data) + rtx *x; + void *data; +{ + struct check_dependence_data *d = (struct check_dependence_data *) data; + if (*x && GET_CODE (*x) == MEM) + return true_dependence (d->exp, d->mode, *x, cse_rtx_varies_p); + else + return 0; +} + /* Remove from the hash table, or mark as invalid, all expressions whose values could be altered by storing in X. X is a register, a subreg, or a memory reference with nonvarying address (because, when a memory @@ -1846,20 +1865,18 @@ invalidate (x, full_mode) next = p->next_same_hash; if (p->in_memory) { - if (GET_CODE (p->exp) != MEM) + struct check_dependence_data d; + + /* Just canonicalize the expression once; + otherwise each time we call invalidate + true_dependence will canonicalize the + expression again. */ + if (!p->canon_exp) + p->canon_exp = canon_rtx (p->exp); + d.exp = x; + d.mode = full_mode; + if (for_each_rtx (&p->canon_exp, check_dependence, &d)) remove_from_table (p, i); - else - { - /* Just canonicalize the expression once; - otherwise each time we call invalidate - true_dependence will canonicalize the - expression again. */ - if (!p->canon_exp) - p->canon_exp = canon_rtx (p->exp); - if (true_dependence (x, full_mode, p->canon_exp, - cse_rtx_varies_p)) - remove_from_table (p, i); - } } } } |