aboutsummaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-10-16 13:21:20 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2012-10-16 13:21:20 +0200
commit0fe03ac31859b5cdc6760e605dc17ffbccfe1860 (patch)
tree9ba40d70d5d1df4a70c9881287bb8ea4ea5c49b6 /gcc/var-tracking.c
parentcded4e9ed7d9f793d31303def53d999890a0f5a5 (diff)
downloadgcc-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.c18
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);
+ }
+ }
}
}
}