i386: Align stack frame if argument is passed on stack
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
This commit is contained in:
parent
278e902c24
commit
c7a61831d6
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue