From e089ee65c978b37dd79577688885b2affd2cdea4 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Tue, 4 Dec 2012 09:05:49 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194121 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/ia64/ia64.c | 21 ++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65dfd9a9a75..74cd0bcb866 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-12-03 Eric Botcazou + + * 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 * gcse.c (struct reg_use): Remove unused struct. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 9a7528f346a..3b19b98b5ce 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -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: -- 2.11.4.GIT