"H.J. Lu" <hjl.to...@gmail.com> writes: > 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 artial != 0 for BLKmode argument
partial OK with that change. I wouldn't be surprised if there's fallout, but it should at least be educational fallout. Thanks, Richard > passed on stack. > > gcc/testsuite/ > > PR middle-end/117098 > * gcc.dg/sibcall-12.c: New test. > > Signed-off-by: H.J. Lu <hjl.to...@gmail.com> > --- > gcc/calls.cc | 2 +- > gcc/testsuite/gcc.dg/sibcall-12.c | 13 +++++++++++++ > 2 files changed, 14 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/sibcall-12.c > > diff --git a/gcc/calls.cc b/gcc/calls.cc > index f67067acad4..01c4ef51545 100644 > --- a/gcc/calls.cc > +++ b/gcc/calls.cc > @@ -5246,7 +5246,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, > diff --git a/gcc/testsuite/gcc.dg/sibcall-12.c > b/gcc/testsuite/gcc.dg/sibcall-12.c > new file mode 100644 > index 00000000000..5773c9c1c4a > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/sibcall-12.c > @@ -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); > +}