https://gcc.gnu.org/g:c61576d89eb0fead37be39fcf0764bb915ea201f

commit r15-5660-gc61576d89eb0fead37be39fcf0764bb915ea201f
Author: H.J. Lu <hjl.to...@gmail.com>
Date:   Sun Oct 13 04:53:14 2024 +0800

    sibcall: Check partial != 0 for BLKmode argument
    
    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 partial != 0 for BLKmode argument
            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>

Diff:
---
 gcc/calls.cc                      |  2 +-
 gcc/testsuite/gcc.dg/sibcall-12.c | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/calls.cc b/gcc/calls.cc
index 648889662c7c..8cf0f29b42c3 100644
--- a/gcc/calls.cc
+++ b/gcc/calls.cc
@@ -5245,7 +5245,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 000000000000..5773c9c1c4a5
--- /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