var-tracking.c (insn_stack_adjust_offset_pre_post): If insn has a REG_FRAME_RELATED_E...
authorBob Wilson <bob.wilson@acm.org>
Tue, 21 Oct 2008 18:06:12 +0000 (18:06 +0000)
committerBob Wilson <bwilson@gcc.gnu.org>
Tue, 21 Oct 2008 18:06:12 +0000 (18:06 +0000)
* var-tracking.c (insn_stack_adjust_offset_pre_post): If insn has a
REG_FRAME_RELATED_EXPR note, examine the pattern from the note instead
of from insn.

From-SVN: r141272

gcc/ChangeLog
gcc/var-tracking.c

index 2400d9966b936edb8458ee587b9d697a33b8344e..cf00fef37a8d2212e1e531c4d3d915bdfa9e791e 100644 (file)
@@ -1,3 +1,9 @@
+2008-10-21  Bob Wilson  <bob.wilson@acm.org>
+
+       * var-tracking.c (insn_stack_adjust_offset_pre_post): If insn has a
+       REG_FRAME_RELATED_EXPR note, examine the pattern from the note instead
+       of from insn.
+
 2008-10-21  Adam Nemet  <anemet@caviumnetworks.com>
 
        PR middle-end/37669
index ab4d93cb76b89298a9cfc2aa019a5e84f65d71bf..2b92e403bf251d51336574c543d62e03b426350a 100644 (file)
@@ -466,22 +466,31 @@ static void
 insn_stack_adjust_offset_pre_post (rtx insn, HOST_WIDE_INT *pre,
                                   HOST_WIDE_INT *post)
 {
+  rtx pattern;
+
   *pre = 0;
   *post = 0;
 
-  if (GET_CODE (PATTERN (insn)) == SET)
-    stack_adjust_offset_pre_post (PATTERN (insn), pre, post);
-  else if (GET_CODE (PATTERN (insn)) == PARALLEL
-          || GET_CODE (PATTERN (insn)) == SEQUENCE)
+  pattern = PATTERN (insn);
+  if (RTX_FRAME_RELATED_P (insn))
+    {
+      rtx expr = find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL_RTX);
+      if (expr)
+       pattern = XEXP (expr, 0);
+    }
+
+  if (GET_CODE (pattern) == SET)
+    stack_adjust_offset_pre_post (pattern, pre, post);
+  else if (GET_CODE (pattern) == PARALLEL
+          || GET_CODE (pattern) == SEQUENCE)
     {
       int i;
 
       /* There may be stack adjustments inside compound insns.  Search
         for them.  */
-      for ( i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
-       if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
-         stack_adjust_offset_pre_post (XVECEXP (PATTERN (insn), 0, i),
-                                       pre, post);
+      for ( i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
+       if (GET_CODE (XVECEXP (pattern, 0, i)) == SET)
+         stack_adjust_offset_pre_post (XVECEXP (pattern, 0, i), pre, post);
     }
 }