This is rtl-optimization part of a two-part patch series.

As discussed in the PR, we have to prcompute register parameters
before stack alignment is performed, otherwise eventual call to
__tls_get_addr can be called with unaligned stack. When compiling the
testcase from the PR, anti_adjust_stack is called just before
precompute starts expanding function parameters.

The solution is to move  precomputation before stack pointer is adjusted.

2015-07-13  Uros Bizjak  <ubiz...@gmail.com>

    PR rtl-optimization/58066
    * calls.c (expand_call): Precompute register parameters before stack
    alignment is performed.

Patch was bootstrapped and regression tested on x86_64-linux-gnu
{,-m32} for all default languages, obj-c++ and go.

OK for mainline?

Uros.

Index: calls.c
===================================================================
--- calls.c    (revision 225727)
+++ calls.c    (working copy)
@@ -3144,6 +3144,10 @@ expand_call (tree exp, rtx target, int ignore)

       compute_argument_addresses (args, argblock, num_actuals);

+      /* Precompute all register parameters.  It isn't safe to compute anything
+     once we have started filling any specific hard regs.  */
+      precompute_register_parameters (num_actuals, args, &reg_parm_seen);
+
       /* Perform stack alignment before the first push (the last arg).  */
       if (argblock == 0
           && adjusted_args_size.constant > reg_parm_stack_space
@@ -3184,10 +3188,6 @@ expand_call (tree exp, rtx target, int ignore)

       funexp = rtx_for_function_call (fndecl, addr);

-      /* Precompute all register parameters.  It isn't safe to compute anything
-     once we have started filling any specific hard regs.  */
-      precompute_register_parameters (num_actuals, args, &reg_parm_seen);
-
       if (CALL_EXPR_STATIC_CHAIN (exp))
     static_chain_value = expand_normal (CALL_EXPR_STATIC_CHAIN (exp));
       else

Reply via email to