diff options
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index e0c328f3959..6d7fe772fe7 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2215,7 +2215,7 @@ static void expand_stack_alignment (void) { rtx drap_rtx; - unsigned int preferred_stack_boundary, incoming_stack_boundary; + unsigned int preferred_stack_boundary; if (! SUPPORTS_STACK_ALIGNMENT) return; @@ -2228,10 +2228,6 @@ expand_stack_alignment (void) gcc_assert (crtl->stack_alignment_needed <= crtl->stack_alignment_estimated); - /* Update stack boundary if needed. */ - if (targetm.calls.update_stack_boundary) - targetm.calls.update_stack_boundary (); - /* Update crtl->stack_alignment_estimated and use it later to align stack. We check PREFERRED_STACK_BOUNDARY if there may be non-call exceptions since callgraph doesn't collect incoming stack alignment @@ -2246,15 +2242,8 @@ expand_stack_alignment (void) if (preferred_stack_boundary > crtl->stack_alignment_needed) crtl->stack_alignment_needed = preferred_stack_boundary; - /* The incoming stack frame has to be aligned at least at - parm_stack_boundary. */ - if (crtl->parm_stack_boundary > INCOMING_STACK_BOUNDARY) - incoming_stack_boundary = crtl->parm_stack_boundary; - else - incoming_stack_boundary = INCOMING_STACK_BOUNDARY; - crtl->stack_realign_needed - = incoming_stack_boundary < crtl->stack_alignment_estimated; + = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated; crtl->stack_realign_tried = crtl->stack_realign_needed; crtl->stack_realign_processed = true; @@ -2359,6 +2348,23 @@ gimple_expand_cfg (void) if (crtl->stack_protect_guard) stack_protect_prologue (); + /* Update stack boundary if needed. */ + if (SUPPORTS_STACK_ALIGNMENT) + { + /* Call update_stack_boundary here to update incoming stack + boundary before TARGET_FUNCTION_OK_FOR_SIBCALL is called. + TARGET_FUNCTION_OK_FOR_SIBCALL needs to know the accurate + incoming stack alignment to check if it is OK to perform + sibcall optimization since sibcall optimization will only + align the outgoing stack to incoming stack boundary. */ + if (targetm.calls.update_stack_boundary) + targetm.calls.update_stack_boundary (); + + /* The incoming stack frame has to be aligned at least at + parm_stack_boundary. */ + gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY); + } + /* Register rtl specific functions for cfg. */ rtl_register_cfg_hooks (); |