Commit bb27eeda by Steve Ellcey Committed by Steve Ellcey

re PR target/31850 (gcc.c-torture/compile/limits-fnargs.c is slow at compiling for spu-elf)

	PR target/31850
	* rtl.h (push_to_sequence2): New.
	* emit-rtl.c (push_to_sequence2): New.
	* function.c (assign_parm_data_all): Add new fields.
	(assign_parm_setup_block): Call push_to_sequence2 instead of 
	push_to_sequence.
	(assign_parm_setup_reg): Ditto.
	(assign_parm_setup_stack): Ditto.
	(assign_parms_unsplit_complex): Ditto.
	(assign_parms): Change field name.

From-SVN: r125532
parent 1b0cfaa6
2007-06-07 Steve Ellcey <sje@cup.hp.com>
PR target/31850
* rtl.h (push_to_sequence2): New.
* emit-rtl.c (push_to_sequence2): New.
* function.c (assign_parm_data_all): Add new fields.
(assign_parm_setup_block): Call push_to_sequence2 instead of
push_to_sequence.
(assign_parm_setup_reg): Ditto.
(assign_parm_setup_stack): Ditto.
(assign_parms_unsplit_complex): Ditto.
(assign_parms): Change field name.
2007-06-07 Zdenek Dvorak <dvorakz@suse.cz> 2007-06-07 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/32220 PR tree-optimization/32220
......
...@@ -4632,6 +4632,18 @@ push_to_sequence (rtx first) ...@@ -4632,6 +4632,18 @@ push_to_sequence (rtx first)
last_insn = last; last_insn = last;
} }
/* Like push_to_sequence, but take the last insn as an argument to avoid
looping through the list. */
void
push_to_sequence2 (rtx first, rtx last)
{
start_sequence ();
first_insn = first;
last_insn = last;
}
/* Set up the outer-level insn chain /* Set up the outer-level insn chain
as the current sequence, saving the previously current one. */ as the current sequence, saving the previously current one. */
......
...@@ -1895,7 +1895,8 @@ struct assign_parm_data_all ...@@ -1895,7 +1895,8 @@ struct assign_parm_data_all
struct args_size stack_args_size; struct args_size stack_args_size;
tree function_result_decl; tree function_result_decl;
tree orig_fnargs; tree orig_fnargs;
rtx conversion_insns; rtx first_conversion_insn;
rtx last_conversion_insn;
HOST_WIDE_INT pretend_args_size; HOST_WIDE_INT pretend_args_size;
HOST_WIDE_INT extra_pretend_bytes; HOST_WIDE_INT extra_pretend_bytes;
int reg_parm_stack_space; int reg_parm_stack_space;
...@@ -2489,7 +2490,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all, ...@@ -2489,7 +2490,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
{ {
rtx parmreg = gen_reg_rtx (data->nominal_mode); rtx parmreg = gen_reg_rtx (data->nominal_mode);
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn,
all->last_conversion_insn);
/* For values returned in multiple registers, handle possible /* For values returned in multiple registers, handle possible
incompatible calls to emit_group_store. incompatible calls to emit_group_store.
...@@ -2514,7 +2516,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all, ...@@ -2514,7 +2516,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
emit_group_store (parmreg, entry_parm, data->nominal_type, emit_group_store (parmreg, entry_parm, data->nominal_type,
int_size_in_bytes (data->nominal_type)); int_size_in_bytes (data->nominal_type));
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
SET_DECL_RTL (parm, parmreg); SET_DECL_RTL (parm, parmreg);
...@@ -2561,9 +2564,11 @@ assign_parm_setup_block (struct assign_parm_data_all *all, ...@@ -2561,9 +2564,11 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
/* Handle values in multiple non-contiguous locations. */ /* Handle values in multiple non-contiguous locations. */
if (GET_CODE (entry_parm) == PARALLEL) if (GET_CODE (entry_parm) == PARALLEL)
{ {
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn,
all->last_conversion_insn);
emit_group_store (mem, entry_parm, data->passed_type, size); emit_group_store (mem, entry_parm, data->passed_type, size);
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
} }
...@@ -2622,10 +2627,11 @@ assign_parm_setup_block (struct assign_parm_data_all *all, ...@@ -2622,10 +2627,11 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
} }
else if (data->stack_parm == 0) else if (data->stack_parm == 0)
{ {
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
emit_block_move (stack_parm, data->entry_parm, GEN_INT (size), emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
BLOCK_OP_NORMAL); BLOCK_OP_NORMAL);
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
} }
...@@ -2698,7 +2704,7 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm, ...@@ -2698,7 +2704,7 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
emit_move_insn (tempreg, validize_mem (data->entry_parm)); emit_move_insn (tempreg, validize_mem (data->entry_parm));
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp); tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp);
if (GET_CODE (tempreg) == SUBREG if (GET_CODE (tempreg) == SUBREG
...@@ -2719,7 +2725,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm, ...@@ -2719,7 +2725,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
save_tree_used = TREE_USED (parm); save_tree_used = TREE_USED (parm);
expand_assignment (parm, make_tree (data->nominal_type, tempreg)); expand_assignment (parm, make_tree (data->nominal_type, tempreg));
TREE_USED (parm) = save_tree_used; TREE_USED (parm) = save_tree_used;
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
did_conversion = true; did_conversion = true;
...@@ -2745,11 +2752,13 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm, ...@@ -2745,11 +2752,13 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm))); rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm)));
int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm)); int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm));
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn,
all->last_conversion_insn);
emit_move_insn (tempreg, DECL_RTL (parm)); emit_move_insn (tempreg, DECL_RTL (parm));
tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p); tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
emit_move_insn (parmreg, tempreg); emit_move_insn (parmreg, tempreg);
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
did_conversion = true; did_conversion = true;
...@@ -2835,7 +2844,7 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm, ...@@ -2835,7 +2844,7 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
emit_move_insn (tempreg, validize_mem (data->entry_parm)); emit_move_insn (tempreg, validize_mem (data->entry_parm));
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
to_conversion = true; to_conversion = true;
data->entry_parm = convert_to_mode (data->nominal_mode, tempreg, data->entry_parm = convert_to_mode (data->nominal_mode, tempreg,
...@@ -2867,7 +2876,8 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm, ...@@ -2867,7 +2876,8 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
{ {
/* Use a block move to handle potentially misaligned entry_parm. */ /* Use a block move to handle potentially misaligned entry_parm. */
if (!to_conversion) if (!to_conversion)
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn,
all->last_conversion_insn);
to_conversion = true; to_conversion = true;
emit_block_move (dest, src, emit_block_move (dest, src,
...@@ -2880,7 +2890,8 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm, ...@@ -2880,7 +2890,8 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
if (to_conversion) if (to_conversion)
{ {
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
} }
...@@ -2924,10 +2935,12 @@ assign_parms_unsplit_complex (struct assign_parm_data_all *all, tree fnargs) ...@@ -2924,10 +2935,12 @@ assign_parms_unsplit_complex (struct assign_parm_data_all *all, tree fnargs)
set_mem_attributes (tmp, parm, 1); set_mem_attributes (tmp, parm, 1);
rmem = adjust_address_nv (tmp, inner, 0); rmem = adjust_address_nv (tmp, inner, 0);
imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner)); imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner));
push_to_sequence (all->conversion_insns); push_to_sequence2 (all->first_conversion_insn,
all->last_conversion_insn);
emit_move_insn (rmem, real); emit_move_insn (rmem, real);
emit_move_insn (imem, imag); emit_move_insn (imem, imag);
all->conversion_insns = get_insns (); all->first_conversion_insn = get_insns ();
all->last_conversion_insn = get_last_insn ();
end_sequence (); end_sequence ();
} }
else else
...@@ -3025,7 +3038,7 @@ assign_parms (tree fndecl) ...@@ -3025,7 +3038,7 @@ assign_parms (tree fndecl)
/* Output all parameter conversion instructions (possibly including calls) /* Output all parameter conversion instructions (possibly including calls)
now that all parameters have been copied out of hard registers. */ now that all parameters have been copied out of hard registers. */
emit_insn (all.conversion_insns); emit_insn (all.first_conversion_insn);
/* If we are receiving a struct value address as the first argument, set up /* If we are receiving a struct value address as the first argument, set up
the RTL for the function result. As this might require code to convert the RTL for the function result. As this might require code to convert
......
...@@ -1494,6 +1494,7 @@ extern rtx get_first_nonnote_insn (void); ...@@ -1494,6 +1494,7 @@ extern rtx get_first_nonnote_insn (void);
extern rtx get_last_nonnote_insn (void); extern rtx get_last_nonnote_insn (void);
extern void start_sequence (void); extern void start_sequence (void);
extern void push_to_sequence (rtx); extern void push_to_sequence (rtx);
extern void push_to_sequence2 (rtx, rtx);
extern void end_sequence (void); extern void end_sequence (void);
extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT, extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
enum machine_mode); enum machine_mode);
......
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