]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/31850 (gcc.c-torture/compile/limits-fnargs.c is slow at compiling for...
authorSteve Ellcey <sje@cup.hp.com>
Thu, 7 Jun 2007 16:46:26 +0000 (16:46 +0000)
committerSteve Ellcey <sje@gcc.gnu.org>
Thu, 7 Jun 2007 16:46:26 +0000 (16:46 +0000)
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
gcc/emit-rtl.c
gcc/function.c
gcc/rtl.h

index 621396fd1b1ccb31050356b93ba564fdbecc1b3a..349168b80346dff4d559a6a707950a5f9badf229 100644 (file)
@@ -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
index 17f8c2d8446b45c7b91690ab18671a3338dc1e2c..f5cea9a60314192216a0d0ffbb6e87514bc0309f 100644 (file)
@@ -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.  */
 
index 8338894802a8c1ea0974dc7305a5274096220147..a4782d6e1592fc52f3538d423a34be2e47c85763 100644 (file)
@@ -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
index 2934eabd19220c605e65bd63f22068b377613ce5..b993bedc223efb1c9a09cf58013b495c16b0372f 100644 (file)
--- 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);