"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);
> +}

Reply via email to