re PR debug/63623 (Lots of functions get -fvar-tracking silently turned off unnecessa...
authorJakub Jelinek <jakub@redhat.com>
Thu, 23 Oct 2014 21:58:41 +0000 (23:58 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 23 Oct 2014 21:58:41 +0000 (23:58 +0200)
PR debug/63623
* var-tracking.c (stack_adjust_offset_pre_post_cb): New function.
(stack_adjust_offset_pre_post): Use it through for_each_inc_dec,
instead of only handling autoinc in dest if it is a MEM.
(vt_stack_adjustments): Fix up formatting.

From-SVN: r216600

gcc/ChangeLog
gcc/var-tracking.c

index 33249e5ecb33456b2dec9ffe62e04d12cc904e32..a2bc25cdac0d868c9fbd0384d6f9648bdbf30722 100644 (file)
@@ -1,3 +1,11 @@
+2014-10-23  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/63623
+       * var-tracking.c (stack_adjust_offset_pre_post_cb): New function.
+       (stack_adjust_offset_pre_post): Use it through for_each_inc_dec,
+       instead of only handling autoinc in dest if it is a MEM.
+       (vt_stack_adjustments): Fix up formatting.
+
 2014-10-23  DJ Delorie  <dj@redhat.com>
 
        * config/msp430/msp430.c (msp430_print_operand): 'x' modifier is
index 52b7344458086b40bfa6c468b460e7f8e320eb72..4c5ae41b248e6dd4d67377f269bdc7c5c5bfa1c4 100644 (file)
@@ -700,6 +700,39 @@ static void vt_add_function_parameters (void);
 static bool vt_initialize (void);
 static void vt_finalize (void);
 
+/* Callback for stack_adjust_offset_pre_post, called via for_each_inc_dec.  */
+
+static int
+stack_adjust_offset_pre_post_cb (rtx, rtx op, rtx dest, rtx src, rtx srcoff,
+                                void *arg)
+{
+  if (dest != stack_pointer_rtx)
+    return 0;
+
+  switch (GET_CODE (op))
+    {
+    case PRE_INC:
+    case PRE_DEC:
+      ((HOST_WIDE_INT *)arg)[0] -= INTVAL (srcoff);
+      return 0;
+    case POST_INC:
+    case POST_DEC:
+      ((HOST_WIDE_INT *)arg)[1] -= INTVAL (srcoff);
+      return 0;
+    case PRE_MODIFY:
+    case POST_MODIFY:
+      /* We handle only adjustments by constant amount.  */
+      gcc_assert (GET_CODE (src) == PLUS
+                 && CONST_INT_P (XEXP (src, 1))
+                 && XEXP (src, 0) == stack_pointer_rtx);
+      ((HOST_WIDE_INT *)arg)[GET_CODE (op) == POST_MODIFY]
+       -= INTVAL (XEXP (src, 1));
+      return 0;
+    default:
+      gcc_unreachable ();
+    }
+}
+
 /* Given a SET, calculate the amount of stack adjustment it contains
    PRE- and POST-modifying stack pointer.
    This function is similar to stack_adjust_offset.  */
@@ -725,68 +758,12 @@ stack_adjust_offset_pre_post (rtx pattern, HOST_WIDE_INT *pre,
        *post += INTVAL (XEXP (src, 1));
       else
        *post -= INTVAL (XEXP (src, 1));
+      return;  
     }
-  else if (MEM_P (dest))
-    {
-      /* (set (mem (pre_dec (reg sp))) (foo)) */
-      src = XEXP (dest, 0);
-      code = GET_CODE (src);
-
-      switch (code)
-       {
-       case PRE_MODIFY:
-       case POST_MODIFY:
-         if (XEXP (src, 0) == stack_pointer_rtx)
-           {
-             rtx val = XEXP (XEXP (src, 1), 1);
-             /* We handle only adjustments by constant amount.  */
-             gcc_assert (GET_CODE (XEXP (src, 1)) == PLUS &&
-                         CONST_INT_P (val));
-
-             if (code == PRE_MODIFY)
-               *pre -= INTVAL (val);
-             else
-               *post -= INTVAL (val);
-             break;
-           }
-         return;
-
-       case PRE_DEC:
-         if (XEXP (src, 0) == stack_pointer_rtx)
-           {
-             *pre += GET_MODE_SIZE (GET_MODE (dest));
-             break;
-           }
-         return;
-
-       case POST_DEC:
-         if (XEXP (src, 0) == stack_pointer_rtx)
-           {
-             *post += GET_MODE_SIZE (GET_MODE (dest));
-             break;
-           }
-         return;
-
-       case PRE_INC:
-         if (XEXP (src, 0) == stack_pointer_rtx)
-           {
-             *pre -= GET_MODE_SIZE (GET_MODE (dest));
-             break;
-           }
-         return;
-
-       case POST_INC:
-         if (XEXP (src, 0) == stack_pointer_rtx)
-           {
-             *post -= GET_MODE_SIZE (GET_MODE (dest));
-             break;
-           }
-         return;
-
-       default:
-         return;
-       }
-    }
+  HOST_WIDE_INT res[2] = { 0, 0 };
+  for_each_inc_dec (pattern, stack_adjust_offset_pre_post_cb, res);
+  *pre += res[0];
+  *post += res[1];
 }
 
 /* Given an INSN, calculate the amount of stack adjustment it contains
@@ -836,10 +813,10 @@ vt_stack_adjustments (void)
 
   /* Initialize entry block.  */
   VTI (ENTRY_BLOCK_PTR_FOR_FN (cfun))->visited = true;
-  VTI (ENTRY_BLOCK_PTR_FOR_FN (cfun))->in.stack_adjust =
- INCOMING_FRAME_SP_OFFSET;
-  VTI (ENTRY_BLOCK_PTR_FOR_FN (cfun))->out.stack_adjust =
- INCOMING_FRAME_SP_OFFSET;
+  VTI (ENTRY_BLOCK_PTR_FOR_FN (cfun))->in.stack_adjust
   = INCOMING_FRAME_SP_OFFSET;
+  VTI (ENTRY_BLOCK_PTR_FOR_FN (cfun))->out.stack_adjust
   = INCOMING_FRAME_SP_OFFSET;
 
   /* Allocate stack for back-tracking up CFG.  */
   stack = XNEWVEC (edge_iterator, n_basic_blocks_for_fn (cfun) + 1);