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
This commit is contained in:
parent
1b0cfaa6a8
commit
bb27eeda7d
4 changed files with 56 additions and 17 deletions
|
@ -1,3 +1,16 @@
|
|||
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>
|
||||
|
||||
PR tree-optimization/32220
|
||||
|
|
|
@ -4632,6 +4632,18 @@ push_to_sequence (rtx first)
|
|||
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
|
||||
as the current sequence, saving the previously current one. */
|
||||
|
||||
|
|
|
@ -1895,7 +1895,8 @@ struct assign_parm_data_all
|
|||
struct args_size stack_args_size;
|
||||
tree function_result_decl;
|
||||
tree orig_fnargs;
|
||||
rtx conversion_insns;
|
||||
rtx first_conversion_insn;
|
||||
rtx last_conversion_insn;
|
||||
HOST_WIDE_INT pretend_args_size;
|
||||
HOST_WIDE_INT extra_pretend_bytes;
|
||||
int reg_parm_stack_space;
|
||||
|
@ -2489,7 +2490,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
|
|||
{
|
||||
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
|
||||
incompatible calls to emit_group_store.
|
||||
|
@ -2514,7 +2516,8 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
|
|||
emit_group_store (parmreg, entry_parm, 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 ();
|
||||
|
||||
SET_DECL_RTL (parm, parmreg);
|
||||
|
@ -2561,9 +2564,11 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
|
|||
/* Handle values in multiple non-contiguous locations. */
|
||||
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);
|
||||
all->conversion_insns = get_insns ();
|
||||
all->first_conversion_insn = get_insns ();
|
||||
all->last_conversion_insn = get_last_insn ();
|
||||
end_sequence ();
|
||||
}
|
||||
|
||||
|
@ -2622,10 +2627,11 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
|
|||
}
|
||||
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),
|
||||
BLOCK_OP_NORMAL);
|
||||
all->conversion_insns = get_insns ();
|
||||
all->first_conversion_insn = get_insns ();
|
||||
all->last_conversion_insn = get_last_insn ();
|
||||
end_sequence ();
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
||||
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);
|
||||
|
||||
if (GET_CODE (tempreg) == SUBREG
|
||||
|
@ -2719,7 +2725,8 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
|
|||
save_tree_used = TREE_USED (parm);
|
||||
expand_assignment (parm, make_tree (data->nominal_type, tempreg));
|
||||
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 ();
|
||||
|
||||
did_conversion = true;
|
||||
|
@ -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)));
|
||||
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));
|
||||
tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
|
||||
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 ();
|
||||
|
||||
did_conversion = true;
|
||||
|
@ -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));
|
||||
|
||||
push_to_sequence (all->conversion_insns);
|
||||
push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
|
||||
to_conversion = true;
|
||||
|
||||
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,
|
|||
{
|
||||
/* Use a block move to handle potentially misaligned entry_parm. */
|
||||
if (!to_conversion)
|
||||
push_to_sequence (all->conversion_insns);
|
||||
push_to_sequence2 (all->first_conversion_insn,
|
||||
all->last_conversion_insn);
|
||||
to_conversion = true;
|
||||
|
||||
emit_block_move (dest, src,
|
||||
|
@ -2880,7 +2890,8 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
|
|||
|
||||
if (to_conversion)
|
||||
{
|
||||
all->conversion_insns = get_insns ();
|
||||
all->first_conversion_insn = get_insns ();
|
||||
all->last_conversion_insn = get_last_insn ();
|
||||
end_sequence ();
|
||||
}
|
||||
|
||||
|
@ -2924,10 +2935,12 @@ assign_parms_unsplit_complex (struct assign_parm_data_all *all, tree fnargs)
|
|||
set_mem_attributes (tmp, parm, 1);
|
||||
rmem = adjust_address_nv (tmp, inner, 0);
|
||||
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 (imem, imag);
|
||||
all->conversion_insns = get_insns ();
|
||||
all->first_conversion_insn = get_insns ();
|
||||
all->last_conversion_insn = get_last_insn ();
|
||||
end_sequence ();
|
||||
}
|
||||
else
|
||||
|
@ -3025,7 +3038,7 @@ assign_parms (tree fndecl)
|
|||
|
||||
/* Output all parameter conversion instructions (possibly including calls)
|
||||
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
|
||||
the RTL for the function result. As this might require code to convert
|
||||
|
|
|
@ -1494,6 +1494,7 @@ extern rtx get_first_nonnote_insn (void);
|
|||
extern rtx get_last_nonnote_insn (void);
|
||||
extern void start_sequence (void);
|
||||
extern void push_to_sequence (rtx);
|
||||
extern void push_to_sequence2 (rtx, rtx);
|
||||
extern void end_sequence (void);
|
||||
extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT,
|
||||
enum machine_mode);
|
||||
|
|
Loading…
Add table
Reference in a new issue