* calls.c (load_register_parameters): Fix zero size sibcall logic.
authorJason Merrill <jason@redhat.com>
Fri, 18 Mar 2016 15:31:18 +0000 (11:31 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 18 Mar 2016 15:31:18 +0000 (11:31 -0400)
From-SVN: r234332

gcc/ChangeLog
gcc/calls.c
gcc/testsuite/gcc.dg/sibcall-11.c [new file with mode: 0644]

index 5be50b76802c271cb1751fccda06149a2b964238..d988be26d676cca5df2e18224b36807501615b38 100644 (file)
@@ -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
index 7b28f4315ab59655d3af67b00bbc42863248e76a..6415e08b28d48a1e708fde827890ae948ae444f6 100644 (file)
@@ -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 (file)
index 0000000..ae58770
--- /dev/null
@@ -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); }