From d459f8707b857168c25f4eddd2fc28c98534970f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 5 Nov 2012 08:58:48 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/var-tracking.c | 20 ++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 94c9acc25eb..16f3a655ad8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-11-05 Jakub Jelinek + + 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 * config/sh/sh.h (TARGET_CACHE32, TARGET_HARVARD): Delete macro. 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))