public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-9423] i386: Require just 32-bit alignment for SLOT_FLOATxFDI_387 -m32 -mpreferred-stack-boundary=2 DImode
@ 2023-04-18  7:15 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2023-04-18  7:15 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:429a5143d17bd83d4662cd6c7a2c30d065c8f65b

commit r12-9423-g429a5143d17bd83d4662cd6c7a2c30d065c8f65b
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Mar 28 10:43:08 2023 +0200

    i386: Require just 32-bit alignment for SLOT_FLOATxFDI_387 -m32 -mpreferred-stack-boundary=2 DImode temporaries [PR109276]
    
    The following testcase ICEs since r11-2259 because assign_386_stack_local
    -> assign_stack_local -> ix86_local_alignment now uses 64-bit alignment
    for DImode temporaries rather than 32-bit as before.
    Most of the spots in the backend which ask for DImode temporaries are during
    expansion and those apparently are handled fine with -m32
    -mpreferred-stack-boundary=2, we dynamically realign the stack in that case
    (most of the spots actually don't need that alignment but at least one
    does), then 2 spots are in STV which I assume also work correctly.
    But during splitting we can create a DImode slot which doesn't need to be
    64-bit alignment (it is nicer for performance though), when we apparently
    aren't able to detect it for dynamic stack realignment purposes.
    
    The following patch just makes the slot 32-bit aligned in that rare case.
    
    2023-03-28  Jakub Jelinek  <jakub@redhat.com>
    
            PR target/109276
            * config/i386/i386.cc (assign_386_stack_local): For DImode
            with SLOT_FLOATxFDI_387 and -m32 -mpreferred-stack-boundary=2 pass
            align 32 rather than 0 to assign_stack_local.
    
            * gcc.target/i386/pr109276.c: New test.
    
    (cherry picked from commit 4b5ef857f5faf09f274c0a95c67faaa80d198124)

Diff:
---
 gcc/config/i386/i386.cc                  | 10 +++++++++-
 gcc/testsuite/gcc.target/i386/pr109276.c | 13 +++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 669b1efdb62..85402f851bf 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -16557,10 +16557,18 @@ assign_386_stack_local (machine_mode mode, enum ix86_stack_slot n)
     if (s->mode == mode && s->n == n)
       return validize_mem (copy_rtx (s->rtl));
 
+  int align = 0;
+  /* For DImode with SLOT_FLOATxFDI_387 use 32-bit
+     alignment with -m32 -mpreferred-stack-boundary=2.  */
+  if (mode == DImode
+      && !TARGET_64BIT
+      && n == SLOT_FLOATxFDI_387
+      && ix86_preferred_stack_boundary < GET_MODE_ALIGNMENT (DImode))
+    align = 32;
   s = ggc_alloc<stack_local_entry> ();
   s->n = n;
   s->mode = mode;
-  s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), 0);
+  s->rtl = assign_stack_local (mode, GET_MODE_SIZE (mode), align);
 
   s->next = ix86_stack_locals;
   ix86_stack_locals = s;
diff --git a/gcc/testsuite/gcc.target/i386/pr109276.c b/gcc/testsuite/gcc.target/i386/pr109276.c
new file mode 100644
index 00000000000..5d0827aa280
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr109276.c
@@ -0,0 +1,13 @@
+/* PR target/109276 */
+/* { dg-do compile } */
+/* { dg-options "-march=x86-64" } */
+/* { dg-additional-options "-mpreferred-stack-boundary=2" { target ia32 } } */
+
+long long a;
+long double b;
+
+void
+foo (void)
+{
+  b += a;
+}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-18  7:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-18  7:15 [gcc r12-9423] i386: Require just 32-bit alignment for SLOT_FLOATxFDI_387 -m32 -mpreferred-stack-boundary=2 DImode Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).