i386: Set cfun->machine->max_used_stack_alignment if needed
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 5 Aug 2018 12:46:13 +0000 (12:46 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 5 Aug 2018 12:46:13 +0000 (05:46 -0700)
cfun->machine->max_used_stack_alignment is used to decide how stack frame
should be aligned.  This is independent of any psABIs nor 32-bit vs 64-bit.
It is always safe to compute max_used_stack_alignment.  We compute it only
if 128-bit aligned load/store may be generated on misaligned stack slot
which will lead to segfault.

gcc/

PR target/86386
* config/i386/i386.c (ix86_finalize_stack_frame_flags): Set
cfun->machine->max_used_stack_alignment if needed.

gcc/testsuite/

PR target/86386
* gcc.target/i386/pr86386.c: New file.

From-SVN: r263317

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr86386.c [new file with mode: 0644]

index 7d2323983ec26aab89715e685708b3d93e59d5be..720ce32a6ca4b76b209f8af6560574c8a6144f56 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/86386
+       * config/i386/i386.c (ix86_finalize_stack_frame_flags): Set
+       cfun->machine->max_used_stack_alignment if needed.
+
 2018-08-04  Martin Sebor  <msebor@redhat.com>
 
        PR tree-optimization/86571
index ee409cfe7e486c2524266c4ef14ef6e3de87a7ba..7554fd1f65997fbaec8950d9683f5432a7bacb02 100644 (file)
@@ -13281,12 +13281,14 @@ ix86_finalize_stack_frame_flags (void)
          recompute_frame_layout_p = true;
        }
     }
-  else if (crtl->max_used_stack_slot_alignment
-          > crtl->preferred_stack_boundary)
-    {
-      /* We don't need to realign stack.  But we still need to keep
-        stack frame properly aligned to satisfy the largest alignment
-        of stack slots.  */
+  else if (crtl->max_used_stack_slot_alignment >= 128)
+    {
+      /* We don't need to realign stack.  max_used_stack_alignment is
+        used to decide how stack frame should be aligned.  This is
+        independent of any psABIs nor 32-bit vs 64-bit.  It is always
+        safe to compute max_used_stack_alignment.  We compute it only
+        if 128-bit aligned load/store may be generated on misaligned
+        stack slot which will lead to segfault.   */
       if (ix86_find_max_used_stack_alignment (stack_alignment, true))
        cfun->machine->max_used_stack_alignment
          = stack_alignment / BITS_PER_UNIT;
index a1f3b5bdcadc31326a6506cab6c3f67311e4ff45..fb65bd04effa3ad96670e966280faca81b398e6c 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/86386
+       * gcc.target/i386/pr86386.c: New file.
+
 2018-08-04  Tom de Vries  <tdevries@suse.de>
 
        * lib/gcc-gdb-test.exp: Use absolute line number in pass/fail line.
diff --git a/gcc/testsuite/gcc.target/i386/pr86386.c b/gcc/testsuite/gcc.target/i386/pr86386.c
new file mode 100644 (file)
index 0000000..a67cf45
--- /dev/null
@@ -0,0 +1,26 @@
+/* PR target/86386 */
+/* { dg-do run { target { avx_runtime && int128 } } } */
+/* { dg-options "-Os -fno-tree-dce -mstringop-strategy=vector_loop -mavx" } */
+
+unsigned c, d, e, f;
+
+unsigned __attribute__((noipa))
+foo (unsigned char g, unsigned short h, unsigned i, unsigned long long j,
+     unsigned char k, unsigned short l, unsigned m, unsigned __int128 n)
+{
+  __builtin_memset (&e, 0, 3);
+  n <<= m;
+  __builtin_memcpy (&m, 2 + (char *) &n, 1);
+  m >>= 0;
+  d ^= __builtin_mul_overflow (l, n, &m);
+  return m;
+}
+
+int
+main ()
+{
+  unsigned __int128 x = foo (0, 0, 0, 0, 0, 4, 1, 3);
+  if (x != 24)
+    __builtin_abort ();
+  return 0;
+}