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/var-tracking.c | |
parent | cded4e9ed7d9f793d31303def53d999890a0f5a5 (diff) | |
download | gcc-0fe03ac31859b5cdc6760e605dc17ffbccfe1860.zip gcc-0fe03ac31859b5cdc6760e605dc17ffbccfe1860.tar.gz gcc-0fe03ac31859b5cdc6760e605dc17ffbccfe1860.tar.bz2 |
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/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 7e6bee3..65116c2 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -5769,6 +5769,11 @@ add_stores (rtx loc, const_rtx expr, void *cuip) resolve = preserve = !cselib_preserved_value_p (v); + if (loc == stack_pointer_rtx + && hard_frame_pointer_adjustment != -1 + && preserve) + cselib_set_value_sp_based (v); + nloc = replace_expr_with_values (oloc); if (nloc) oloc = nloc; @@ -9867,6 +9872,19 @@ vt_initialize (void) { vt_init_cfa_base (); hard_frame_pointer_adjustment = fp_cfa_offset; + /* Disassociate sp from fp now. */ + if (MAY_HAVE_DEBUG_INSNS) + { + cselib_val *v; + cselib_invalidate_rtx (stack_pointer_rtx); + v = cselib_lookup (stack_pointer_rtx, Pmode, 1, + VOIDmode); + if (v && !cselib_preserved_value_p (v)) + { + cselib_set_value_sp_based (v); + preserve_value (v); + } + } } } } |