aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-18 15:31:18 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2016-03-18 15:31:18 +0000
commit77478042715db2070afd7fa06c9e8fda2b578382 (patch)
treecd5ed786bd145577e3f779c789666215ac38bce8
parentf41d1eba0575bf128409377062fb157d9d4e8fbf (diff)
* calls.c (load_register_parameters): Fix zero size sibcall logic.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234332 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/calls.c6
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-11.c7
3 files changed, 14 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5be50b76802..d988be26d67 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 7b28f4315ab..6415e08b28d 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 00000000000..ae587708236
--- /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); }