calls.c (compute_argument_block_size): New argument preferred_stack_boundary.

* calls.c (compute_argument_block_size): New argument
	preferred_stack_boundary.
	(expand_call): update cfun->preferred_stack_boundary, update call of
	compute_argument_block_size
	(emit_library_call): Increate cfun->preferred_stack_boundary
	to PREFERRED_STACK_BOUNDARY
	(emit_library_call_value): Likewise.
	* explow.c (allocate_dynamic_stack_spave): Likewise.
	* function.c (prepare_function_start): Set
	cfun->preferred_stack_boundary
	* function.h (struct function): Add preferred_stack_boundary field.
	* integrate.c (expand_inline_function): Update
	cfun->preferred_stack_boundary and cfun->stack_alignment_needed.
	(copy_rtx_and_substitute): Align frame to stack_alignment_needed only.
	* i386.c (compute_frame_size): Use cfun->preferred_stack_boundary.

From-SVN: r31831
This commit is contained in:
Jan Hubicka 2000-02-07 18:39:40 +01:00 committed by Jan Hubicka
parent 08a75be26c
commit c2f8b49149
7 changed files with 85 additions and 9 deletions

View File

@ -1,3 +1,21 @@
Mon Feb 7 18:36:41 MET 2000 Jan Hubicka <jh@suse.cz>
* calls.c (compute_argument_block_size): New argument
preferred_stack_boundary.
(expand_call): update cfun->preferred_stack_boundary, update call of
compute_argument_block_size
(emit_library_call): Increate cfun->preferred_stack_boundary
to PREFERRED_STACK_BOUNDARY
(emit_library_call_value): Likewise.
* explow.c (allocate_dynamic_stack_spave): Likewise.
* function.c (prepare_function_start): Set
cfun->preferred_stack_boundary
* function.h (struct function): Add preferred_stack_boundary field.
* integrate.c (expand_inline_function): Update
cfun->preferred_stack_boundary and cfun->stack_alignment_needed.
(copy_rtx_and_substitute): Align frame to stack_alignment_needed only.
* i386.c (compute_frame_size): Use cfun->preferred_stack_boundary.
2000-02-06 Zack Weinberg <zack@wolery.cumb.org> 2000-02-06 Zack Weinberg <zack@wolery.cumb.org>
* cpplib.c (my_strerror, cpp_error, cpp_error_with_line, * cpplib.c (my_strerror, cpp_error, cpp_error_with_line,

View File

@ -148,7 +148,8 @@ static void precompute_arguments PARAMS ((int, int, int,
struct arg_data *, struct arg_data *,
struct args_size *)); struct args_size *));
static int compute_argument_block_size PARAMS ((int, static int compute_argument_block_size PARAMS ((int,
struct args_size *)); struct args_size *,
int));
static void initialize_argument_information PARAMS ((int, static void initialize_argument_information PARAMS ((int,
struct arg_data *, struct arg_data *,
struct args_size *, struct args_size *,
@ -1176,9 +1177,11 @@ initialize_argument_information (num_actuals, args, args_size, n_named_args,
for arguments passed in registers. */ for arguments passed in registers. */
static int static int
compute_argument_block_size (reg_parm_stack_space, args_size) compute_argument_block_size (reg_parm_stack_space, args_size,
preferred_stack_boundary)
int reg_parm_stack_space; int reg_parm_stack_space;
struct args_size *args_size; struct args_size *args_size;
int preferred_stack_boundary ATTRIBUTE_UNUSED;
{ {
int unadjusted_args_size = args_size->constant; int unadjusted_args_size = args_size->constant;
@ -1192,8 +1195,9 @@ compute_argument_block_size (reg_parm_stack_space, args_size)
args_size->constant = 0; args_size->constant = 0;
#ifdef PREFERRED_STACK_BOUNDARY #ifdef PREFERRED_STACK_BOUNDARY
if (PREFERRED_STACK_BOUNDARY != BITS_PER_UNIT) preferred_stack_boundary /= BITS_PER_UNIT;
args_size->var = round_up (args_size->var, STACK_BYTES); if (preferred_stack_boundary > 1)
args_size->var = round_up (args_size->var, preferred_stack_boundary);
#endif #endif
if (reg_parm_stack_space > 0) if (reg_parm_stack_space > 0)
@ -1214,10 +1218,12 @@ compute_argument_block_size (reg_parm_stack_space, args_size)
else else
{ {
#ifdef PREFERRED_STACK_BOUNDARY #ifdef PREFERRED_STACK_BOUNDARY
preferred_stack_boundary /= BITS_PER_UNIT;
args_size->constant = (((args_size->constant args_size->constant = (((args_size->constant
+ pending_stack_adjust + pending_stack_adjust
+ STACK_BYTES - 1) + preferred_stack_boundary - 1)
/ STACK_BYTES * STACK_BYTES) / preferred_stack_boundary
* preferred_stack_boundary)
- pending_stack_adjust); - pending_stack_adjust);
#endif #endif
@ -1692,6 +1698,14 @@ expand_call (exp, target, ignore)
rtx call_fusage = 0; rtx call_fusage = 0;
register tree p; register tree p;
register int i; register int i;
#ifdef PREFERRED_STACK_BOUNDARY
int preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
#else
/* In this case preferred_stack_boundary variable is meaningless.
It is used only in order to keep ifdef noise down when calling
compute_argument_block_size. */
int preferred_stack_boundary = 0;
#endif
/* The value of the function call can be put in a hard register. But /* The value of the function call can be put in a hard register. But
if -fcheck-memory-usage, code which invokes functions (and thus if -fcheck-memory-usage, code which invokes functions (and thus
@ -1921,6 +1935,13 @@ expand_call (exp, target, ignore)
if (fndecl && DECL_NAME (fndecl)) if (fndecl && DECL_NAME (fndecl))
name = IDENTIFIER_POINTER (DECL_NAME (fndecl)); name = IDENTIFIER_POINTER (DECL_NAME (fndecl));
/* Ensure current function's preferred stack boundary is at least
what we need. We don't have to increase alignment for recursive
functions. */
if (cfun->preferred_stack_boundary < preferred_stack_boundary
&& fndecl != current_function_decl)
cfun->preferred_stack_boundary = preferred_stack_boundary;
/* See if this is a call to a function that can return more than once /* See if this is a call to a function that can return more than once
or a call to longjmp or malloc. */ or a call to longjmp or malloc. */
special_function_p (fndecl, &returns_twice, &is_longjmp, &fork_or_exec, special_function_p (fndecl, &returns_twice, &is_longjmp, &fork_or_exec,
@ -2062,7 +2083,8 @@ expand_call (exp, target, ignore)
and constant sizes must be combined, the size may have to be rounded, and constant sizes must be combined, the size may have to be rounded,
and there may be a minimum required size. */ and there may be a minimum required size. */
unadjusted_args_size unadjusted_args_size
= compute_argument_block_size (reg_parm_stack_space, &args_size); = compute_argument_block_size (reg_parm_stack_space, &args_size,
preferred_stack_boundary);
/* Now make final decision about preallocating stack space. */ /* Now make final decision about preallocating stack space. */
must_preallocate = finalize_must_preallocate (must_preallocate, must_preallocate = finalize_must_preallocate (must_preallocate,
@ -2703,6 +2725,13 @@ emit_library_call VPARAMS((rtx orgfun, int no_queue, enum machine_mode outmode,
push_temp_slots (); push_temp_slots ();
#ifdef PREFERRED_STACK_BOUNDARY
/* Ensure current function's preferred stack boundary is at least
what we need. */
if (cfun->preferred_stack_boundary < PREFERRED_STACK_BOUNDARY)
cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
#endif
for (count = 0; count < nargs; count++) for (count = 0; count < nargs; count++)
{ {
rtx val = va_arg (p, rtx); rtx val = va_arg (p, rtx);
@ -3192,6 +3221,13 @@ emit_library_call_value VPARAMS((rtx orgfun, rtx value, int no_queue,
is_const = no_queue; is_const = no_queue;
fun = orgfun; fun = orgfun;
#ifdef PREFERRED_STACK_BOUNDARY
/* Ensure current function's preferred stack boundary is at least
what we need. */
if (cfun->preferred_stack_boundary < PREFERRED_STACK_BOUNDARY)
cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
#endif
/* If this kind of value comes back in memory, /* If this kind of value comes back in memory,
decide where in memory it should come back. */ decide where in memory it should come back. */
if (aggregate_value_p (type_for_mode (outmode, 0))) if (aggregate_value_p (type_for_mode (outmode, 0)))

View File

@ -1776,7 +1776,7 @@ ix86_compute_frame_size (size, nregs_on_stack, rpadding1, rpadding2)
#ifdef PREFERRED_STACK_BOUNDARY #ifdef PREFERRED_STACK_BOUNDARY
{ {
int offset; int offset;
int preferred_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT; int preferred_alignment = cfun->preferred_stack_boundary / BITS_PER_UNIT;
offset = frame_pointer_needed ? 8 : 4; offset = frame_pointer_needed ? 8 : 4;

View File

@ -1178,6 +1178,13 @@ allocate_dynamic_stack_space (size, target, known_align)
if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode) if (GET_MODE (size) != VOIDmode && GET_MODE (size) != Pmode)
size = convert_to_mode (Pmode, size, 1); size = convert_to_mode (Pmode, size, 1);
/* We can't attempt to minimize alignment necessary, because we don't
know the final value of preferred_stack_boundary yet while executing
this code. */
#ifdef PREFERRED_STACK_BOUNDARY
cfun->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
#endif
/* We will need to ensure that the address we return is aligned to /* We will need to ensure that the address we return is aligned to
BIGGEST_ALIGNMENT. If STACK_DYNAMIC_OFFSET is defined, we don't BIGGEST_ALIGNMENT. If STACK_DYNAMIC_OFFSET is defined, we don't
always know its final value at this point in the compilation (it always know its final value at this point in the compilation (it

View File

@ -5686,6 +5686,9 @@ prepare_function_start ()
cfun->original_arg_vector = 0; cfun->original_arg_vector = 0;
cfun->stack_alignment_needed = 0; cfun->stack_alignment_needed = 0;
#ifdef STACK_BOUNDARY
cfun->preferred_stack_boundary = STACK_BOUNDARY;
#endif
/* Set if a call to setjmp is seen. */ /* Set if a call to setjmp is seen. */
current_function_calls_setjmp = 0; current_function_calls_setjmp = 0;

View File

@ -456,6 +456,8 @@ struct function
struct machine_function *machine; struct machine_function *machine;
/* The largest alignment of slot allocated on the stack. */ /* The largest alignment of slot allocated on the stack. */
int stack_alignment_needed; int stack_alignment_needed;
/* Preferred alignment of the end of stack frame. */
int preferred_stack_boundary;
/* Language-specific code can use this to store whatever it likes. */ /* Language-specific code can use this to store whatever it likes. */
struct language_function *language; struct language_function *language;

View File

@ -602,6 +602,12 @@ expand_inline_function (fndecl, parms, target, ignore, type,
nargs = list_length (DECL_ARGUMENTS (fndecl)); nargs = list_length (DECL_ARGUMENTS (fndecl));
if (cfun->preferred_stack_boundary < inl_f->preferred_stack_boundary)
cfun->preferred_stack_boundary = inl_f->preferred_stack_boundary;
if (cfun->stack_alignment_needed < inl_f->stack_alignment_needed)
cfun->stack_alignment_needed = inl_f->stack_alignment_needed;
/* Check that the parms type match and that sufficient arguments were /* Check that the parms type match and that sufficient arguments were
passed. Since the appropriate conversions or default promotions have passed. Since the appropriate conversions or default promotions have
already been applied, the machine modes should match exactly. */ already been applied, the machine modes should match exactly. */
@ -1619,13 +1625,17 @@ copy_rtx_and_substitute (orig, map, for_lhs)
{ {
rtx loc, seq; rtx loc, seq;
int size = get_func_frame_size (DECL_SAVED_INSNS (map->fndecl)); int size = get_func_frame_size (DECL_SAVED_INSNS (map->fndecl));
int alignment
= (DECL_SAVED_INSNS (map->fndecl)->stack_alignment_needed
/ BITS_PER_UNIT);
#ifdef FRAME_GROWS_DOWNWARD #ifdef FRAME_GROWS_DOWNWARD
/* In this case, virtual_stack_vars_rtx points to one byte /* In this case, virtual_stack_vars_rtx points to one byte
higher than the top of the frame area. So make sure we higher than the top of the frame area. So make sure we
allocate a big enough chunk to keep the frame pointer allocate a big enough chunk to keep the frame pointer
aligned like a real one. */ aligned like a real one. */
size = CEIL_ROUND (size, BIGGEST_ALIGNMENT / BITS_PER_UNIT); if (alignment)
size = CEIL_ROUND (size, alignment);
#endif #endif
start_sequence (); start_sequence ();
loc = assign_stack_temp (BLKmode, size, 1); loc = assign_stack_temp (BLKmode, size, 1);