mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
22b13b1d4e
commit
c61576d89e
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue