From bb27eeda7dc859c9d1c9a69baea30f9cf273ec4a Mon Sep 17 00:00:00 2001 From: Steve Ellcey Date: Thu, 7 Jun 2007 16:46:26 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 13 +++++++++++++ gcc/emit-rtl.c | 12 ++++++++++++ gcc/function.c | 47 ++++++++++++++++++++++++++++++----------------- gcc/rtl.h | 1 + 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 621396fd1b1..349168b8034 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2007-06-07 Steve Ellcey + + 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 PR tree-optimization/32220 diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 17f8c2d8446..f5cea9a6031 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -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. */ diff --git a/gcc/function.c b/gcc/function.c index 8338894802a..a4782d6e159 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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 diff --git a/gcc/rtl.h b/gcc/rtl.h index 2934eabd192..b993bedc223 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -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);