Update preferred_stack_boundary only when expanding function call

locate_and_pad_parm is called when expanding function call from
initialize_argument_information and when generating function body
from assign_parm_find_entry_rtl:

  /* Remember if the outgoing parameter requires extra alignment on the
     calling function side.  */
  if (crtl->stack_alignment_needed < boundary)
    crtl->stack_alignment_needed = boundary;
  if (crtl->preferred_stack_boundary < boundary)
    crtl->preferred_stack_boundary = boundary;

stack_alignment_needed and preferred_stack_boundary should be updated
only when expanding function call, not when generating function body.

Add update_stack_alignment_for_call to update stack alignment when
outgoing parameter is passed in the stack.

gcc/

	PR rtl-optimization/90765
	* calls.c (update_stack_alignment_for_call): New function.
	(expand_call): Call update_stack_alignment_for_call when
	outgoing parameter is passed in the stack.
	(emit_library_call_value_1): Likewise.
	* function.c (locate_and_pad_parm): Don't update
	stack_alignment_needed and preferred_stack_boundary.

gcc/testsuite/

	PR rtl-optimization/90765
	* gcc.target/i386/pr90765-1.c: New test.
	* gcc.target/i386/pr90765-2.c: Likewise.

From-SVN: r272296
This commit is contained in:
H.J. Lu 2019-06-14 16:24:56 +00:00 committed by H.J. Lu
parent 84d38abbc9
commit 957ed73861
6 changed files with 71 additions and 8 deletions

View File

@ -1,4 +1,14 @@
2019-06-14 Hongtao Liu <hongtao.liu@intel.com>
2019-06-14 H.J. Lu <hongjiu.lu@intel.com>
PR rtl-optimization/90765
* calls.c (update_stack_alignment_for_call): New function.
(expand_call): Call update_stack_alignment_for_call when
outgoing parameter is passed in the stack.
(emit_library_call_value_1): Likewise.
* function.c (locate_and_pad_parm): Don't update
stack_alignment_needed and preferred_stack_boundary.
2019-06-14 H.J. Lu <hongjiu.lu@intel.com>
PR target/90877
* config/i386/i386-features.c

View File

@ -3226,6 +3226,19 @@ can_implement_as_sibling_call_p (tree exp,
return true;
}
/* Update stack alignment when the parameter is passed in the stack
since the outgoing parameter requires extra alignment on the calling
function side. */
static void
update_stack_alignment_for_call (struct locate_and_pad_arg_data *locate)
{
if (crtl->stack_alignment_needed < locate->boundary)
crtl->stack_alignment_needed = locate->boundary;
if (crtl->preferred_stack_boundary < locate->boundary)
crtl->preferred_stack_boundary = locate->boundary;
}
/* Generate all the code for a CALL_EXPR exp
and return an rtx for its value.
Store the value in TARGET (specified as an rtx) if convenient.
@ -3703,6 +3716,12 @@ expand_call (tree exp, rtx target, int ignore)
/* Ensure current function's preferred stack boundary is at least
what we need. Stack alignment may also increase preferred stack
boundary. */
for (i = 0; i < num_actuals; i++)
if (reg_parm_stack_space > 0
|| args[i].reg == 0
|| args[i].partial != 0
|| args[i].pass_on_stack)
update_stack_alignment_for_call (&args[i].locate);
if (crtl->preferred_stack_boundary < preferred_stack_boundary)
crtl->preferred_stack_boundary = preferred_stack_boundary;
else
@ -4961,6 +4980,12 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
targetm.calls.function_arg_advance (args_so_far, mode, (tree) 0, true);
}
for (int i = 0; i < nargs; i++)
if (reg_parm_stack_space > 0
|| argvec[i].reg == 0
|| argvec[i].partial != 0)
update_stack_alignment_for_call (&argvec[i].locate);
/* If this machine requires an external definition for library
functions, write one out. */
assemble_external_libcall (fun);

View File

@ -4021,13 +4021,6 @@ locate_and_pad_parm (machine_mode passed_mode, tree type, int in_regs,
}
}
/* Remember if the outgoing parameter requires extra alignment on the
calling function side. */
if (crtl->stack_alignment_needed < boundary)
crtl->stack_alignment_needed = boundary;
if (crtl->preferred_stack_boundary < boundary)
crtl->preferred_stack_boundary = boundary;
if (ARGS_GROW_DOWNWARD)
{
locate->slot_offset.constant = -initial_offset_ptr->constant;

View File

@ -1,3 +1,9 @@
2019-06-14 H.J. Lu <hongjiu.lu@intel.com>
PR rtl-optimization/90765
* gcc.target/i386/pr90765-1.c: New test.
* gcc.target/i386/pr90765-2.c: Likewise.
2019-06-14 Marek Polacek <polacek@redhat.com>
PR c++/90884 - stray note with -Wctor-dtor-privacy.

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-O2 -mavx512f" } */
/* { dg-final { scan-assembler-not "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
typedef int __v16si __attribute__ ((__vector_size__ (64)));
void
foo (__v16si x, int i0, int i1, int i2, int i3, int i4, int i5, __v16si *p)
{
*p = x;
}

View File

@ -0,0 +1,18 @@
/* { dg-do compile } */
/* { dg-options "-O2 -mavx512f" } */
/* { dg-final { scan-assembler "and\[lq\]?\[\\t \]*\\$-64,\[\\t \]*%\[re\]?sp" } } */
/* { dg-skip-if "" { x86_64-*-mingw* } } */
typedef int __v16si __attribute__ ((__vector_size__ (64)));
extern void foo (__v16si, __v16si, __v16si, __v16si, __v16si, __v16si,
__v16si, __v16si, __v16si, int, int, int, int, int,
int, __v16si *);
extern __v16si x, y;
void
bar (void)
{
foo (x, x, x, x, x, x, x, x, x, 0, 1, 2, 3, 4, 5, &y);
}