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 they aren't really at the same location. Check for
this by making sure that the incoming size is the this by making sure that the incoming size is the
same as the outgoing size. */ same as the outgoing size. */
if (maybe_ne (arg->locate.size.constant, size_val)) if (partial != 0)
sibcall_failure = true; sibcall_failure = true;
} }
else if (maybe_in_range_p (arg->locate.offset.constant, 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);
}