Commit 957ed738 by H.J. Lu Committed by H.J. Lu

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
parent 84d38abb
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 PR target/90877
* config/i386/i386-features.c * config/i386/i386-features.c
......
...@@ -3226,6 +3226,19 @@ can_implement_as_sibling_call_p (tree exp, ...@@ -3226,6 +3226,19 @@ can_implement_as_sibling_call_p (tree exp,
return true; 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 /* Generate all the code for a CALL_EXPR exp
and return an rtx for its value. and return an rtx for its value.
Store the value in TARGET (specified as an rtx) if convenient. Store the value in TARGET (specified as an rtx) if convenient.
...@@ -3703,6 +3716,12 @@ expand_call (tree exp, rtx target, int ignore) ...@@ -3703,6 +3716,12 @@ expand_call (tree exp, rtx target, int ignore)
/* Ensure current function's preferred stack boundary is at least /* Ensure current function's preferred stack boundary is at least
what we need. Stack alignment may also increase preferred stack what we need. Stack alignment may also increase preferred stack
boundary. */ 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) if (crtl->preferred_stack_boundary < preferred_stack_boundary)
crtl->preferred_stack_boundary = preferred_stack_boundary; crtl->preferred_stack_boundary = preferred_stack_boundary;
else else
...@@ -4961,6 +4980,12 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, ...@@ -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); 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 /* If this machine requires an external definition for library
functions, write one out. */ functions, write one out. */
assemble_external_libcall (fun); assemble_external_libcall (fun);
......
...@@ -4021,13 +4021,6 @@ locate_and_pad_parm (machine_mode passed_mode, tree type, int in_regs, ...@@ -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) if (ARGS_GROW_DOWNWARD)
{ {
locate->slot_offset.constant = -initial_offset_ptr->constant; locate->slot_offset.constant = -initial_offset_ptr->constant;
......
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> 2019-06-14 Marek Polacek <polacek@redhat.com>
PR c++/90884 - stray note with -Wctor-dtor-privacy. PR c++/90884 - stray note with -Wctor-dtor-privacy.
......
/* { 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;
}
/* { 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment