diff options
author | Jakub Jelinek <jakub@redhat.com> | 2010-06-30 08:12:22 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2010-06-30 08:12:22 +0200 |
commit | 9de9cbaf4a18e968a58c5798edb9bf4c37437b0c (patch) | |
tree | 94a5923625f40d69409e2f1f008709fbeff934c4 /gcc/cselib.c | |
parent | d33c89fbcf8aa49ea2c25f0651d6a66472e8536d (diff) | |
download | gcc-9de9cbaf4a18e968a58c5798edb9bf4c37437b0c.zip gcc-9de9cbaf4a18e968a58c5798edb9bf4c37437b0c.tar.gz gcc-9de9cbaf4a18e968a58c5798edb9bf4c37437b0c.tar.bz2 |
re PR debug/44694 (Long var tracking compile time of GiNaC tests)
PR debug/44694
* cselib.h (cselib_preserve_cfa_base_value): Add regno argument.
* cselib.c (cfa_base_preserved_regno): New static variable.
(cselib_reset_table): Don't reset cfa_base_preserved_regno instead
of REGNO (cfa_base_preserved_val->locs->loc).
(cselib_preserve_cfa_base_value): Add regno argument, set
cfa_base_preserved_regno to it.
(cselib_invalidate_regno): Allow removal of registers other than
cfa_base_preserved_regno from cfa_base_preserved_val.
(cselib_finish): Set cfa_base_preserved_regno to INVALID_REGNUM.
* var-tracking.c (adjust_mems): Replace sp or hfp even outside
of MEM addresses, if not on LHS.
(reverse_op): Don't add reverse ops for cfa_base_rtx.
(vt_init_cfa_base): Adjust cselib_preserve_cfa_base_value caller.
From-SVN: r161587
Diffstat (limited to 'gcc/cselib.c')
-rw-r--r-- | gcc/cselib.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/cselib.c b/gcc/cselib.c index 5e819cd..28ed6d7 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -178,6 +178,7 @@ static cselib_val dummy_val; that is constant through the whole function and should never be eliminated. */ static cselib_val *cfa_base_preserved_val; +static unsigned int cfa_base_preserved_regno; /* Used to list all values that contain memory reference. May or may not contain the useless values - the list is compacted @@ -338,7 +339,7 @@ cselib_reset_table (unsigned int num) if (cfa_base_preserved_val) { - unsigned int regno = REGNO (cfa_base_preserved_val->locs->loc); + unsigned int regno = cfa_base_preserved_regno; unsigned int new_used_regs = 0; for (i = 0; i < n_used_regs; i++) if (used_regs[i] == regno) @@ -571,12 +572,15 @@ cselib_preserved_value_p (cselib_val *v) never invalidated and preserved across cselib_reset_table calls. */ void -cselib_preserve_cfa_base_value (cselib_val *v) +cselib_preserve_cfa_base_value (cselib_val *v, unsigned int regno) { if (cselib_preserve_constants && v->locs && REG_P (v->locs->loc)) - cfa_base_preserved_val = v; + { + cfa_base_preserved_val = v; + cfa_base_preserved_regno = regno; + } } /* Clean all non-constant expressions in the hash table, but retain @@ -1783,7 +1787,9 @@ cselib_invalidate_regno (unsigned int regno, enum machine_mode mode) if (i < FIRST_PSEUDO_REGISTER && v != NULL) this_last = end_hard_regno (GET_MODE (v->val_rtx), i) - 1; - if (this_last < regno || v == NULL || v == cfa_base_preserved_val) + if (this_last < regno || v == NULL + || (v == cfa_base_preserved_val + && i == cfa_base_preserved_regno)) { l = &(*l)->next; continue; @@ -2266,6 +2272,7 @@ cselib_finish (void) cselib_discard_hook = NULL; cselib_preserve_constants = false; cfa_base_preserved_val = NULL; + cfa_base_preserved_regno = INVALID_REGNUM; free_alloc_pool (elt_list_pool); free_alloc_pool (elt_loc_list_pool); free_alloc_pool (cselib_val_pool); |