summaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-11-05 08:58:48 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-11-05 08:58:48 +0100
commitd459f8707b857168c25f4eddd2fc28c98534970f (patch)
tree71aba7d9cd9d78f25062116b9d09ffdc69135348 /gcc/var-tracking.c
parentead4af4fb64a9255fa5d056b63f1c522099e170e (diff)
downloadgcc-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.c20
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))