Hi!

The following testcase shows a regression caused by the r10-577 change
made for cris.  Before that change, the MEM holding (in this case 3 byte)
struct parameter was BITS_PER_WORD aligned, now it is just BITS_PER_UNIT
aligned and that causes significantly worse generated code.
So, the MAX (DECL_ALIGN (parm), BITS_PER_WORD) extra alignment clearly
doesn't help just STRICT_ALIGNMENT targets, but other targets as well.
Of course, it isn't worth doing stack realignment in the rare case of
MAX_SUPPORTED_STACK_ALIGNMENT < BITS_PER_WORD targets like cris, so the
patch only bumps the alignment if it won't go the
> MAX_SUPPORTED_STACK_ALIGNMENT path because of that optimization.

The change on the testcase is:
bar:
-       movl    %edi, %eax
-       movzbl  %dil, %r8d
-       movl    %esi, %ecx
-       movzbl  %sil, %r10d
-       movl    %edx, %r9d
-       movzbl  %dl, %r11d
-       shrl    $16, %edi
-       andl    $65280, %ecx
-       shrl    $16, %esi
-       shrl    $16, %edx
-       andl    $65280, %r9d
-       orq     %r10, %rcx
-       movzbl  %dl, %edx
-       movzbl  %sil, %esi
-       andl    $65280, %eax
-       movzbl  %dil, %edi
-       salq    $16, %rdx
-       orq     %r11, %r9
-       salq    $16, %rsi
-       orq     %r8, %rax
-       salq    $16, %rdi
-       orq     %r9, %rdx
-       orq     %rcx, %rsi
-       orq     %rax, %rdi
        jmp     foo

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2025-06-18  Jakub Jelinek  <ja...@redhat.com>

        PR target/120689
        * function.cc (assign_parm_setup_block): Align parm to at least
        word alignment even on !STRICT_ALIGNMENT targets, as long as
        BITS_PER_WORD is not larger than MAX_SUPPORTED_STACK_ALIGNMENT.

        * gcc.target/i386/pr120689.c: New test.

--- gcc/function.cc.jj  2025-05-20 08:14:06.105410349 +0200
+++ gcc/function.cc     2025-06-18 10:25:53.841280559 +0200
@@ -2937,7 +2937,7 @@ assign_parm_setup_block (struct assign_p
   if (stack_parm == 0)
     {
       HOST_WIDE_INT parm_align
-       = (STRICT_ALIGNMENT
+       = ((STRICT_ALIGNMENT || BITS_PER_WORD <= MAX_SUPPORTED_STACK_ALIGNMENT)
           ? MAX (DECL_ALIGN (parm), BITS_PER_WORD) : DECL_ALIGN (parm));
 
       SET_DECL_ALIGN (parm, parm_align);
--- gcc/testsuite/gcc.target/i386/pr120689.c.jj 2025-06-18 10:29:39.744346367 
+0200
+++ gcc/testsuite/gcc.target/i386/pr120689.c    2025-06-18 10:33:53.504111156 
+0200
@@ -0,0 +1,17 @@
+/* PR target/120689 */
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -mtune=generic -fno-stack-protector -masm=att" } */
+/* { dg-final { scan-assembler-not "\t\(movzbl\|shrl\|salq\|orq\)\t" } } */
+
+struct S { char a, b, c; };
+
+[[gnu::noipa]]
+void foo (struct S x, struct S y, struct S z)
+{
+}
+
+void
+bar (struct S x, struct S y, struct S z)
+{
+  [[gnu::musttail]] return foo (x, y, z);
+}

        Jakub

Reply via email to