mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 15:40:55 +08:00
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
This commit is contained in:
parent
d33c89fbcf
commit
9de9cbaf4a
@ -1,3 +1,20 @@
|
||||
2010-06-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
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.
|
||||
|
||||
2010-06-30 Bernd Schmidt <bernds@codesourcery.com>
|
||||
|
||||
* recog.c (peep2_do_rebuild_jump_labels, peep2_do_cleanup_cfg): New
|
||||
|
15
gcc/cselib.c
15
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);
|
||||
|
@ -99,6 +99,6 @@ extern unsigned int cselib_get_next_uid (void);
|
||||
extern void cselib_preserve_value (cselib_val *);
|
||||
extern bool cselib_preserved_value_p (cselib_val *);
|
||||
extern void cselib_preserve_only_values (void);
|
||||
extern void cselib_preserve_cfa_base_value (cselib_val *);
|
||||
extern void cselib_preserve_cfa_base_value (cselib_val *, unsigned int);
|
||||
|
||||
extern void dump_cselib_table (FILE *);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user