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, ®_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, ®_parm_seen); - if (CALL_EXPR_STATIC_CHAIN (exp)) static_chain_value = expand_normal (CALL_EXPR_STATIC_CHAIN (exp)); else