sibcall: Check partial != 0 for BLKmode argument

The outgoing stack slot size may be different from the BLKmode argument
size due to parameter alignment.  Check partial != 0 for BLKmode argument
passed on stack.

gcc/

	PR middle-end/117098
	* calls.cc (store_one_arg): Check partial != 0 for BLKmode argument
	passed on stack.

gcc/testsuite/

	PR middle-end/117098
	* gcc.dg/sibcall-12.c: New test.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
This commit is contained in:
H.J. Lu 2024-10-13 04:53:14 +08:00
parent 22b13b1d4e
commit c61576d89e
2 changed files with 14 additions and 1 deletions

View File

@ -5245,7 +5245,7 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
they aren't really at the same location. Check for
this by making sure that the incoming size is the
same as the outgoing size. */
if (maybe_ne (arg->locate.size.constant, size_val))
if (partial != 0)
sibcall_failure = true;
}
else if (maybe_in_range_p (arg->locate.offset.constant,

View File

@ -0,0 +1,13 @@
// Test for sibcall optimization with struct aligned on stack.
// { dg-options "-O2" }
// { dg-final { scan-assembler "jmp" { target i?86-*-* x86_64-*-* } } }
struct A { char a[17]; };
int baz (int a, int b, int c, void *p, struct A s, struct A);
int
foo (int a, int b, int c, void *p, struct A s, struct A s2)
{
return baz (a, b, c, p, s, s2);
}