This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
calls.c tidy
- From: Alan Modra <amodra at bigpond dot net dot au>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 9 Jan 2003 18:22:46 +1030
- Subject: calls.c tidy
This patch is mostly a tidy-up. The only functional change is to set
the alignment of stack_area in restore_fixed_argument_area, improving
code generated. On powerpc64-linux, we were doing the restore using
32-bit registers rather than 64-bit.
* calls.c (save_fixed_argument_area): Tidy.
(restore_fixed_argument_area): Tidy. Set alignment of stack_area.
(expand_call): Comment typo fixes. Don't init low_to_save. Start
call chain loop at 1 if !try_tail_call. Formatting.
(emit_library_call_value_1): Don't init low_to_save or high_to_save.
Use save_fixed_argument_area and restore_fixed_argument_area.
Tested powerpc64-linux c,c++,f no new regressions. OK to install
mainline and 3.3 branch?
Index: gcc/calls.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/calls.c,v
retrieving revision 1.247
diff -u -p -r1.247 calls.c
--- gcc/calls.c 18 Dec 2002 05:57:43 -0000 1.247
+++ gcc/calls.c 9 Jan 2003 07:30:09 -0000
@@ -909,66 +909,68 @@ save_fixed_argument_area (reg_parm_stack
int *low_to_save;
int *high_to_save;
{
- int i;
- rtx save_area = NULL_RTX;
+ int low;
+ int high;
- /* Compute the boundary of the that needs to be saved, if any. */
+ /* Compute the boundary of the area that needs to be saved, if any. */
+ high = reg_parm_stack_space;
#ifdef ARGS_GROW_DOWNWARD
- for (i = 0; i < reg_parm_stack_space + 1; i++)
-#else
- for (i = 0; i < reg_parm_stack_space; i++)
+ high += 1;
#endif
- {
- if (i >= highest_outgoing_arg_in_use
- || stack_usage_map[i] == 0)
- continue;
-
- if (*low_to_save == -1)
- *low_to_save = i;
-
- *high_to_save = i;
- }
-
- if (*low_to_save >= 0)
- {
- int num_to_save = *high_to_save - *low_to_save + 1;
- enum machine_mode save_mode
- = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1);
- rtx stack_area;
+ if (high > highest_outgoing_arg_in_use)
+ high = highest_outgoing_arg_in_use;
- /* If we don't have the required alignment, must do this in BLKmode. */
- if ((*low_to_save & (MIN (GET_MODE_SIZE (save_mode),
- BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1)))
- save_mode = BLKmode;
+ for (low = 0; low < high; low++)
+ if (stack_usage_map[low] != 0)
+ {
+ int num_to_save;
+ enum machine_mode save_mode;
+ int delta;
+ rtx stack_area;
+ rtx save_area;
+
+ while (stack_usage_map[--high] == 0)
+ ;
+
+ *low_to_save = low;
+ *high_to_save = high;
+
+ num_to_save = high - low + 1;
+ save_mode = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1);
+
+ /* If we don't have the required alignment, must do this
+ in BLKmode. */
+ if ((low & (MIN (GET_MODE_SIZE (save_mode),
+ BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1)))
+ save_mode = BLKmode;
#ifdef ARGS_GROW_DOWNWARD
- stack_area
- = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- - *high_to_save)));
+ delta = -high;
#else
- stack_area = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- *low_to_save)));
+ delta = low;
#endif
+ stack_area = gen_rtx_MEM (save_mode,
+ memory_address (save_mode,
+ plus_constant (argblock,
+ delta)));
- set_mem_align (stack_area, PARM_BOUNDARY);
- if (save_mode == BLKmode)
- {
- save_area = assign_stack_temp (BLKmode, num_to_save, 0);
- emit_block_move (validize_mem (save_area), stack_area,
- GEN_INT (num_to_save), BLOCK_OP_CALL_PARM);
- }
- else
- {
- save_area = gen_reg_rtx (save_mode);
- emit_move_insn (save_area, stack_area);
- }
- }
+ set_mem_align (stack_area, PARM_BOUNDARY);
+ if (save_mode == BLKmode)
+ {
+ save_area = assign_stack_temp (BLKmode, num_to_save, 0);
+ emit_block_move (validize_mem (save_area), stack_area,
+ GEN_INT (num_to_save), BLOCK_OP_CALL_PARM);
+ }
+ else
+ {
+ save_area = gen_reg_rtx (save_mode);
+ emit_move_insn (save_area, stack_area);
+ }
+
+ return save_area;
+ }
- return save_area;
+ return NULL_RTX;
}
static void
@@ -979,19 +981,18 @@ restore_fixed_argument_area (save_area,
int low_to_save;
{
enum machine_mode save_mode = GET_MODE (save_area);
+ int delta;
+ rtx stack_area;
+
#ifdef ARGS_GROW_DOWNWARD
- rtx stack_area
- = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- - high_to_save)));
+ delta = -high_to_save;
#else
- rtx stack_area
- = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- low_to_save)));
+ delta = low_to_save;
#endif
+ stack_area = gen_rtx_MEM (save_mode,
+ memory_address (save_mode,
+ plus_constant (argblock, delta)));
+ set_mem_align (stack_area, PARM_BOUNDARY);
if (save_mode != BLKmode)
emit_move_insn (stack_area, save_area);
@@ -2143,8 +2144,8 @@ expand_call (exp, target, ignore)
int is_integrable = 0;
#ifdef REG_PARM_STACK_SPACE
/* Define the boundary of the register parm stack space that needs to be
- save, if any. */
- int low_to_save = -1, high_to_save;
+ saved, if any. */
+ int low_to_save, high_to_save;
rtx save_area = 0; /* Place that it is saved */
#endif
@@ -2600,7 +2601,7 @@ expand_call (exp, target, ignore)
/* We want to make two insn chains; one for a sibling call, the other
for a normal call. We will select one of the two chains after
initial RTL generation is complete. */
- for (pass = 0; pass < 2; pass++)
+ for (pass = try_tail_call ? 0 : 1; pass < 2; pass++)
{
int sibcall_failure = 0;
/* We want to emit any pending stack adjustments before the tail
@@ -2614,9 +2615,6 @@ expand_call (exp, target, ignore)
if (pass == 0)
{
- if (! try_tail_call)
- continue;
-
/* Emit any queued insns now; otherwise they would end up in
only one of the alternates. */
emit_queue ();
@@ -3287,10 +3285,8 @@ expand_call (exp, target, ignore)
{
#ifdef REG_PARM_STACK_SPACE
if (save_area)
- {
- restore_fixed_argument_area (save_area, argblock,
- high_to_save, low_to_save);
- }
+ restore_fixed_argument_area (save_area, argblock,
+ high_to_save, low_to_save);
#endif
/* If we saved any argument areas, restore them. */
@@ -3478,7 +3474,7 @@ emit_library_call_value_1 (retval, orgfu
#ifdef REG_PARM_STACK_SPACE
/* Define the boundary of the register parm stack space that needs to be
save, if any. */
- int low_to_save = -1, high_to_save = 0;
+ int low_to_save, high_to_save;
rtx save_area = 0; /* Place that it is saved. */
#endif
@@ -3859,62 +3855,9 @@ emit_library_call_value_1 (retval, orgfu
{
/* The argument list is the property of the called routine and it
may clobber it. If the fixed area has been used for previous
- parameters, we must save and restore it.
-
- Here we compute the boundary of the that needs to be saved, if any. */
-
-#ifdef ARGS_GROW_DOWNWARD
- for (count = 0; count < reg_parm_stack_space + 1; count++)
-#else
- for (count = 0; count < reg_parm_stack_space; count++)
-#endif
- {
- if (count >= highest_outgoing_arg_in_use
- || stack_usage_map[count] == 0)
- continue;
-
- if (low_to_save == -1)
- low_to_save = count;
-
- high_to_save = count;
- }
-
- if (low_to_save >= 0)
- {
- int num_to_save = high_to_save - low_to_save + 1;
- enum machine_mode save_mode
- = mode_for_size (num_to_save * BITS_PER_UNIT, MODE_INT, 1);
- rtx stack_area;
-
- /* If we don't have the required alignment, must do this in BLKmode. */
- if ((low_to_save & (MIN (GET_MODE_SIZE (save_mode),
- BIGGEST_ALIGNMENT / UNITS_PER_WORD) - 1)))
- save_mode = BLKmode;
-
-#ifdef ARGS_GROW_DOWNWARD
- stack_area = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- -high_to_save)));
-#else
- stack_area = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- low_to_save)));
-#endif
- if (save_mode == BLKmode)
- {
- save_area = assign_stack_temp (BLKmode, num_to_save, 0);
- set_mem_align (save_area, PARM_BOUNDARY);
- emit_block_move (save_area, stack_area, GEN_INT (num_to_save),
- BLOCK_OP_CALL_PARM);
- }
- else
- {
- save_area = gen_reg_rtx (save_mode);
- emit_move_insn (save_area, stack_area);
- }
- }
+ parameters, we must save and restore it. */
+ save_area = save_fixed_argument_area (reg_parm_stack_space, argblock,
+ &low_to_save, &high_to_save);
}
#endif
@@ -4159,29 +4102,8 @@ emit_library_call_value_1 (retval, orgfu
{
#ifdef REG_PARM_STACK_SPACE
if (save_area)
- {
- enum machine_mode save_mode = GET_MODE (save_area);
-#ifdef ARGS_GROW_DOWNWARD
- rtx stack_area
- = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock,
- - high_to_save)));
-#else
- rtx stack_area
- = gen_rtx_MEM (save_mode,
- memory_address (save_mode,
- plus_constant (argblock, low_to_save)));
-#endif
-
- set_mem_align (stack_area, PARM_BOUNDARY);
- if (save_mode != BLKmode)
- emit_move_insn (stack_area, save_area);
- else
- emit_block_move (stack_area, save_area,
- GEN_INT (high_to_save - low_to_save + 1),
- BLOCK_OP_CALL_PARM);
- }
+ restore_fixed_argument_area (save_area, argblock,
+ high_to_save, low_to_save);
#endif
/* If we saved any argument areas, restore them. */
--
Alan Modra
IBM OzLabs - Linux Technology Centre