i386: Align stack frame if argument is passed on stack
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 11 Jan 2018 20:44:46 +0000 (20:44 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 11 Jan 2018 20:44:46 +0000 (12:44 -0800)
When a function call is removed, it may become a leaf function.  But if
argument may be passed on stack, we need to align the stack frame when
there is no tail call.

Tested on Linux/i686 and Linux/x86-64.

gcc/

PR target/83330
* config/i386/i386.c (ix86_compute_frame_layout): Align stack
frame if argument is passed on stack.

gcc/testsuite/

PR target/83330
* gcc.target/i386/pr83330.c: New test.

From-SVN: r256555

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

index e676fec8025e611c1a4ccfa5cc5c90e6133b4326..2b939fb10f90c4768e85ec3cc71bbdf4b9886130 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/83330
+       * config/i386/i386.c (ix86_compute_frame_layout): Align stack
+       frame if argument is passed on stack.
+
 2018-01-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/82682
index 5e17b694d7fa1a5fdfad596d4cc77c845d679a09..d6ff096d466c09e799e9f7a8a281548e679e38b8 100644 (file)
@@ -11339,11 +11339,16 @@ ix86_compute_frame_layout (void)
       offset += frame->va_arg_size;
     }
 
-  /* Align start of frame for local function.  */
+  /* Align start of frame for local function.  When a function call
+     is removed, it may become a leaf function.  But if argument may
+     be passed on stack, we need to align the stack when there is no
+     tail call.  */
   if (m->call_ms2sysv
       || frame->va_arg_size != 0
       || size != 0
       || !crtl->is_leaf
+      || (!crtl->tail_call_emit
+         && cfun->machine->outgoing_args_on_stack)
       || cfun->calls_alloca
       || ix86_current_function_calls_tls_descriptor)
     offset = ROUND_UP (offset, stack_alignment_needed);
index b44ad56c27c5a35d6aceb2f46fd7f2ccb3caece1..31ed14c16bd50e7316729d6e55008fe7c4650571 100644 (file)
@@ -1,3 +1,8 @@
+2018-01-11  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR target/83330
+       * gcc.target/i386/pr83330.c: New test.
+
 2018-01-11  Steven G. Kargl <kargl@gcc.gnu.org>
 
        PR fortran/79383
diff --git a/gcc/testsuite/gcc.target/i386/pr83330.c b/gcc/testsuite/gcc.target/i386/pr83330.c
new file mode 100644 (file)
index 0000000..8a63fbd
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do run { target int128 } } */
+/* { dg-options "-O2 -fno-tree-dce -mno-push-args" } */
+
+typedef unsigned long long u64;
+typedef unsigned __int128 u128;
+
+u64 v;
+u64 g;
+
+u64 __attribute__ ((noinline, noclone))
+bar (u128 d, u64 e, u64 f, u64 g, u128 h)
+{
+  (void)d, (void)e, (void)f, (void)g, (void)h;
+  return 0;
+}
+
+static u64 __attribute__ ((noipa))
+foo (void)
+{
+  (void)(v - bar (0, 0, 0, 0, 0));
+  return g;
+}
+
+int
+main (void)
+{
+  (void)foo ();
+  return 0;
+}