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/var-tracking.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/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 8786a7d..a90ca38 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -798,8 +798,9 @@ adjust_mems (rtx loc, const_rtx old_rtx, void *data) switch (GET_CODE (loc)) { case REG: - /* Don't do any sp or fp replacements outside of MEM addresses. */ - if (amd->mem_mode == VOIDmode) + /* Don't do any sp or fp replacements outside of MEM addresses + on the LHS. */ + if (amd->mem_mode == VOIDmode && amd->store) return loc; if (loc == stack_pointer_rtx && !frame_pointer_needed) @@ -5193,7 +5194,9 @@ reverse_op (rtx val, const_rtx expr) return NULL_RTX; } - if (!REG_P (XEXP (src, 0)) || !SCALAR_INT_MODE_P (GET_MODE (src))) + if (!REG_P (XEXP (src, 0)) + || !SCALAR_INT_MODE_P (GET_MODE (src)) + || XEXP (src, 0) == cfa_base_rtx) return NULL_RTX; v = cselib_lookup (XEXP (src, 0), GET_MODE (XEXP (src, 0)), 0); @@ -8163,7 +8166,7 @@ vt_init_cfa_base (void) val = cselib_lookup_from_insn (cfa_base_rtx, GET_MODE (cfa_base_rtx), 1, get_insns ()); preserve_value (val); - cselib_preserve_cfa_base_value (val); + cselib_preserve_cfa_base_value (val, REGNO (cfa_base_rtx)); var_reg_decl_set (&VTI (ENTRY_BLOCK_PTR)->out, cfa_base_rtx, VAR_INIT_STATUS_INITIALIZED, dv_from_value (val->val_rtx), 0, NULL_RTX, INSERT); |