ia64.c (ia64_compute_frame_size): Allocate the scratch area if the function allocates...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 4 Dec 2012 09:05:49 +0000 (09:05 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 4 Dec 2012 09:05:49 +0000 (09:05 +0000)
* config/ia64/ia64.c (ia64_compute_frame_size): Allocate the scratch
area if the function allocates dynamic stack space.
(ia64_initial_elimination_offset): Adjust offsets to above change.

From-SVN: r194121

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 65dfd9a..74cd0bc 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/ia64/ia64.c (ia64_compute_frame_size): Allocate the scratch
+       area if the function allocates dynamic stack space.
+       (ia64_initial_elimination_offset): Adjust offsets to above change.
+
 2012-12-03  Steven Bosscher  <steven@gcc.gnu.org>
 
        * gcse.c (struct reg_use): Remove unused struct.
index 9a7528f..3b19b98 100644 (file)
@@ -2885,8 +2885,10 @@ ia64_compute_frame_size (HOST_WIDE_INT size)
 
   /* We always use the 16-byte scratch area provided by the caller, but
      if we are a leaf function, there's no one to which we need to provide
-     a scratch area.  */
-  if (crtl->is_leaf)
+     a scratch area.  However, if the function allocates dynamic stack space,
+     the dynamic offset is computed early and contains STACK_POINTER_OFFSET,
+     so we need to cope.  */
+  if (crtl->is_leaf && !cfun->calls_alloca)
     total_size = MAX (0, total_size - 16);
 
   current_frame_info.total_size = total_size;
@@ -2920,18 +2922,15 @@ ia64_initial_elimination_offset (int from, int to)
       switch (to)
        {
        case HARD_FRAME_POINTER_REGNUM:
-         if (crtl->is_leaf)
-           offset = -current_frame_info.total_size;
-         else
-           offset = -(current_frame_info.total_size
-                      - crtl->outgoing_args_size - 16);
+         offset = -current_frame_info.total_size;
+         if (!crtl->is_leaf || cfun->calls_alloca)
+           offset += 16 + crtl->outgoing_args_size;
          break;
 
        case STACK_POINTER_REGNUM:
-         if (crtl->is_leaf)
-           offset = 0;
-         else
-           offset = 16 + crtl->outgoing_args_size;
+         offset = 0;
+         if (!crtl->is_leaf || cfun->calls_alloca)
+           offset += 16 + crtl->outgoing_args_size;
          break;
 
        default: