diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-11-05 08:58:48 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-11-05 08:58:48 +0100 |
commit | d459f8707b857168c25f4eddd2fc28c98534970f (patch) | |
tree | 71aba7d9cd9d78f25062116b9d09ffdc69135348 | |
parent | ead4af4fb64a9255fa5d056b63f1c522099e170e (diff) | |
download | gcc-d459f8707b857168c25f4eddd2fc28c98534970f.zip gcc-d459f8707b857168c25f4eddd2fc28c98534970f.tar.gz gcc-d459f8707b857168c25f4eddd2fc28c98534970f.tar.bz2 |
re PR debug/54402 (var-tracking does not scale)
PR debug/54402
* var-tracking.c (fp_setter): Return false if there is REG_CFA_RESTORE
hfp note.
(vt_initialize): Look for fp_setter in any bb, not just successor of
entry bb.
From-SVN: r193152
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/var-tracking.c | 20 |
2 files changed, 22 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 94c9acc..16f3a65 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-11-05 Jakub Jelinek <jakub@redhat.com> + + PR debug/54402 + * var-tracking.c (fp_setter): Return false if there is REG_CFA_RESTORE + hfp note. + (vt_initialize): Look for fp_setter in any bb, not just successor of + entry bb. + 2012-11-05 Oleg Endo <olegendo@gcc.gnu.org> * config/sh/sh.h (TARGET_CACHE32, TARGET_HARVARD): Delete macro. diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index e0daa83..adccf7c 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -9543,16 +9543,25 @@ fp_setter (rtx insn) pat = XEXP (expr, 0); } if (GET_CODE (pat) == SET) - return SET_DEST (pat) == hard_frame_pointer_rtx; + { + if (SET_DEST (pat) != hard_frame_pointer_rtx) + return false; + } else if (GET_CODE (pat) == PARALLEL) { int i; for (i = XVECLEN (pat, 0) - 1; i >= 0; i--) if (GET_CODE (XVECEXP (pat, 0, i)) == SET && SET_DEST (XVECEXP (pat, 0, i)) == hard_frame_pointer_rtx) - return true; + break; + if (i < 0) + return false; } - return false; + else + return false; + if (find_reg_note (insn, REG_CFA_RESTORE, hard_frame_pointer_rtx)) + return false; + return true; } /* Initialize cfa_base_rtx, create a preserved VALUE for it and @@ -9600,7 +9609,7 @@ vt_init_cfa_base (void) static bool vt_initialize (void) { - basic_block bb, prologue_bb = single_succ (ENTRY_BLOCK_PTR); + basic_block bb; HOST_WIDE_INT fp_cfa_offset = -1; alloc_aux_for_blocks (sizeof (struct variable_tracking_info_def)); @@ -9858,8 +9867,7 @@ vt_initialize (void) VTI (bb)->out.stack_adjust += post; } - if (bb == prologue_bb - && fp_cfa_offset != -1 + if (fp_cfa_offset != -1 && hard_frame_pointer_adjustment == -1 && RTX_FRAME_RELATED_P (insn) && fp_setter (insn)) |