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 /gcc/var-tracking.c | |
parent | ead4af4fb64a9255fa5d056b63f1c522099e170e (diff) | |
download | gcc-d459f8707b857168c25f4eddd2fc28c98534970f.tar.gz |
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
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r-- | gcc/var-tracking.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index e0daa830cf3..adccf7caa0d 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)) |