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
|
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,
|
||||||
|
|
|
@ -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