aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2023-03-28 10:43:08 +0200
committerJakub Jelinek <jakub@redhat.com>2023-03-28 10:43:08 +0200
commit4b5ef857f5faf09f274c0a95c67faaa80d198124 (patch)
tree548066d9669ab3225dbbf31fb3536ea825958e70 /gcc
parenta21bd7faba67997a6da457dbda16f15bca1a9156 (diff)
downloadgcc-4b5ef857f5faf09f274c0a95c67faaa80d198124.zip
gcc-4b5ef857f5faf09f274c0a95c67faaa80d198124.tar.gz
gcc-4b5ef857f5faf09f274c0a95c67faaa80d198124.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/i386/i386.cc10
-rw-r--r--gcc/testsuite/gcc.target/i386/pr109276.c13
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 6a8734c..2cc8e95 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -16682,10 +16682,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 0000000..5d0827a
--- /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;
+}