diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-10-16 13:21:20 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-10-16 13:21:20 +0200 |
commit | 0fe03ac31859b5cdc6760e605dc17ffbccfe1860 (patch) | |
tree | 9ba40d70d5d1df4a70c9881287bb8ea4ea5c49b6 /gcc/cselib.c | |
parent | cded4e9ed7d9f793d31303def53d999890a0f5a5 (diff) |
re PR debug/54796 (Non-addressable stack parameter debug quality regression)
PR debug/54796
* rtl.h: Document jump flag on VALUE.
* cselib.h (cselib_set_value_sp_based,
cselib_sp_based_value_p): New prototypes.
* alias.c (find_base_term): For cselib_sp_based_value_p
return static_reg_base_value[STACK_POINTER_REGNUM].
* cselib.c (SP_BASED_VALUE_P): Define.
(cselib_set_value_sp_based, cselib_sp_based_value_p): New functions.
* var-tracking.c (add_stores): Call cselib_set_value_sp_based
for not yet preserved VALUEs of sp on sp assignments if
hard_frame_pointer_adjustment != -1.
(vt_initialize): When setting hard_frame_pointer_adjustment,
disassociate sp from its previous value and call
cselib_set_value_sp_based on a new VALUE created for sp.
* gcc.dg/guality/pr54796.c: New test.
From-SVN: r192494
Diffstat (limited to 'gcc/cselib.c')
-rw-r--r-- | gcc/cselib.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gcc/cselib.c b/gcc/cselib.c index e7c4221df3e..1f9f97efc5d 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -210,6 +210,9 @@ void (*cselib_record_sets_hook) (rtx insn, struct cselib_set *sets, #define PRESERVED_VALUE_P(RTX) \ (RTL_FLAG_CHECK1("PRESERVED_VALUE_P", (RTX), VALUE)->unchanging) +#define SP_BASED_VALUE_P(RTX) \ + (RTL_FLAG_CHECK1("SP_BASED_VALUE_P", (RTX), VALUE)->jump) + /* Allocate a struct elt_list and fill in its two elements with the @@ -739,6 +742,24 @@ cselib_preserve_only_values (void) gcc_assert (first_containing_mem == &dummy_val); } +/* Arrange for a value to be marked as based on stack pointer + for find_base_term purposes. */ + +void +cselib_set_value_sp_based (cselib_val *v) +{ + SP_BASED_VALUE_P (v->val_rtx) = 1; +} + +/* Test whether a value is based on stack pointer for + find_base_term purposes. */ + +bool +cselib_sp_based_value_p (cselib_val *v) +{ + return SP_BASED_VALUE_P (v->val_rtx); +} + /* Return the mode in which a register was last set. If X is not a register, return its mode. If the mode in which the register was set is not known, or the value was already clobbered, return |