Commit a00fe3b7 by Richard Sandiford Committed by Richard Sandiford

PR 69246: Invalid REG_ARGS_SIZE for sibcalls

The problem in this PR was that we were treating a sibcall as popping
arguments, leading to a negative REG_ARGS_SIZE.

It doesn't really make sense to treat sibcalls as popping since
(a) they're deallocating the caller's stack, not ours, and
(b) there are no optabs for popping sibcalls (any more).

Tested on x86_64-linux-gnu.

gcc/
	PR middle-end/69246
	* calls.c (emit_call_1): Force n_popped to zero for sibcalls.

gcc/testsuite/
	PR middle-end/69246
	* gcc.target/i386/pr69246.c: New test.

From-SVN: r232428
parent aea40b08
2016-01-15 Richard Sandiford <richard.sandiford@arm.com>
PR middle-end/69246
* calls.c (emit_call_1): Force n_popped to zero for sibcalls.
2016-01-15 Ilya Enkovich <enkovich.gnu@gmail.com>
* config/i386/i386.c (scalar_chain::compute_convert_gain): Fix typo.
......
......@@ -272,12 +272,19 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
rtx rounded_stack_size_rtx = GEN_INT (rounded_stack_size);
rtx call, funmem, pat;
int already_popped = 0;
HOST_WIDE_INT n_popped
= targetm.calls.return_pops_args (fndecl, funtype, stack_size);
HOST_WIDE_INT n_popped = 0;
/* Sibling call patterns never pop arguments (no sibcall(_value)_pop
patterns exist). Any popping that the callee does on return will
be from our caller's frame rather than ours. */
if (!(ecf_flags & ECF_SIBCALL))
{
n_popped += targetm.calls.return_pops_args (fndecl, funtype, stack_size);
#ifdef CALL_POPS_ARGS
n_popped += CALL_POPS_ARGS (*get_cumulative_args (args_so_far));
n_popped += CALL_POPS_ARGS (*get_cumulative_args (args_so_far));
#endif
}
/* Ensure address is valid. SYMBOL_REF is already valid, so no need,
and we don't want to load it into a register as an optimization,
......
2016-01-15 Richard Sandiford <richard.sandiford@arm.com>
PR middle-end/69246
* gcc.target/i386/pr69246.c: New test.
2016-01-15 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gfortran.dg/bind_c_array_params_2.f90: Fix test patterns for
......
/* { dg-do compile { target ia32 } } */
/* { dg-options "-O2" } */
void (__attribute__ ((stdcall)) *a) (int);
void __attribute__ ((stdcall))
foo (int x)
{
a (x);
}
int (__attribute__ ((stdcall)) *b) (int);
int __attribute__ ((stdcall))
bar (int x)
{
return b (x);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment