Adjust BLKmode argument size for parameter alignment for sibcall check.

gcc/

PR middle-end/117098
* calls.cc (store_one_arg): Adjust BLKmode argument size for
alignment padding for sibcall check.

gcc/testsuite/

PR middle-end/117098
* gcc.dg/sibcall-12.c: New test.

OK for master?


H.J.
From 8b0518906cb23a9b5e77b04d6132c49047daebd2 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Sun, 13 Oct 2024 04:53:14 +0800
Subject: [PATCH] sibcall: Adjust BLKmode argument size for alignment padding

Adjust BLKmode argument size for parameter alignment for sibcall check.

gcc/

	PR middle-end/117098
	* calls.cc (store_one_arg): Adjust BLKmode argument size for
	alignment padding for sibcall check.

gcc/testsuite/

	PR middle-end/117098
	* gcc.dg/sibcall-12.c: New test.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
---
 gcc/calls.cc                      |  4 +++-
 gcc/testsuite/gcc.dg/sibcall-12.c | 13 +++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/sibcall-12.c

diff --git a/gcc/calls.cc b/gcc/calls.cc
index c5c26f65280..163c7e509d9 100644
--- a/gcc/calls.cc
+++ b/gcc/calls.cc
@@ -5236,7 +5236,9 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
 	      /* expand_call should ensure this.  */
 	      gcc_assert (!arg->locate.offset.var
 			  && arg->locate.size.var == 0);
-	      poly_int64 size_val = rtx_to_poly_int64 (size_rtx);
+	      /* Adjust for argument alignment padding.  */
+	      poly_int64 size_val = ROUND_UP (UINTVAL (size_rtx),
+					      parm_align / BITS_PER_UNIT);
 
 	      if (known_eq (arg->locate.offset.constant, i))
 		{
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);
+}
-- 
2.47.0

Reply via email to