diff options
author | Jason Merrill <jason@redhat.com> | 2016-03-18 11:31:18 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-03-18 11:31:18 -0400 |
commit | 07c10d8f2e8454b623cb8b30c093caa97299de6b (patch) | |
tree | cd5ed786bd145577e3f779c789666215ac38bce8 | |
parent | 09d8f35943a2c7f921e5e37513db2d5c85e6c69f (diff) | |
download | gcc-07c10d8f2e8454b623cb8b30c093caa97299de6b.zip gcc-07c10d8f2e8454b623cb8b30c093caa97299de6b.tar.gz gcc-07c10d8f2e8454b623cb8b30c093caa97299de6b.tar.bz2 |
* calls.c (load_register_parameters): Fix zero size sibcall logic.
From-SVN: r234332
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/calls.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/sibcall-11.c | 7 |
3 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5be50b7..d988be2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-03-18 Jason Merrill <jason@redhat.com> + + * calls.c (load_register_parameters): Fix zero size sibcall logic. + 2016-03-18 Kirill Yukhin <kirill.yukhin@intel.com> * config/i386/sse.md: Use vpbroadcastq for broadcasting DF diff --git a/gcc/calls.c b/gcc/calls.c index 7b28f43..6415e08 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2083,9 +2083,9 @@ load_register_parameters (struct arg_data *args, int num_actuals, /* Check for overlap with already clobbered argument area, providing that this has non-zero size. */ if (is_sibcall - && (size == 0 - || mem_overlaps_already_clobbered_arg_p - (XEXP (args[i].value, 0), size))) + && size != 0 + && (mem_overlaps_already_clobbered_arg_p + (XEXP (args[i].value, 0), size))) *sibcall_failure = 1; if (size % UNITS_PER_WORD == 0 diff --git a/gcc/testsuite/gcc.dg/sibcall-11.c b/gcc/testsuite/gcc.dg/sibcall-11.c new file mode 100644 index 0000000..ae58770 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sibcall-11.c @@ -0,0 +1,7 @@ +// Test for sibcall optimization with empty struct. +// { dg-options "-O2" } +// { dg-final { scan-assembler "jmp" { target i?86-*-* x86_64-*-* } } } + +struct A { }; +void f(struct A); +void g(struct A a) { f(a); } |