OSDN Git Service

* integrate.c (get_label_from_map): New function.
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Dec 1997 22:42:41 +0000 (22:42 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 18 Dec 1997 22:42:41 +0000 (22:42 +0000)
        (expand_inline_function): Use it.  Initialize the label_map to
        NULL_RTX instead of gen_label_rtx.
        (copy_rtx_and_substitute): Use get_label_from_map.
        * integrate.h (get_label_from_map): New function.
        (set_label_from_map): New macro.
        * unroll.c (unroll_loop): Use them.
        (copy_loop_body): Ditto.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@17139 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/integrate.c
gcc/integrate.h
gcc/unroll.c

index 70aaf16..e88f16a 100644 (file)
@@ -77,6 +77,25 @@ static void set_block_abstract_flags PROTO((tree, int));
 
 void set_decl_abstract_flags   PROTO((tree, int));
 \f
+/* Returns the Ith entry in the label_map contained in MAP.  If the
+   Ith entry has not yet been set, it is assumed to be a fresh label.
+   Essentially, we use this function to perform a lazy initialization
+   of label_map, thereby avoiding huge memory explosions when the
+   label_map gets very large.  */
+rtx
+get_label_from_map (map, i)
+     struct inline_remap* map;
+     int i;
+{
+  rtx x = map->label_map[i];
+
+  if (x == NULL_RTX)
+    x = map->label_map[i] = gen_label_rtx();
+
+  return x;
+}
+
+
 /* Zero if the current function (whose FUNCTION_DECL is FNDECL)
    is safe and reasonable to integrate into other functions.
    Nonzero means value is a warning message with a single %s
@@ -1767,7 +1786,7 @@ expand_inline_function (fndecl, parms, target, ignore, type,
 
   /* Make new label equivalences for the labels in the called function.  */
   for (i = min_labelno; i < max_labelno; i++)
-    map->label_map[i] = gen_label_rtx ();
+    map->label_map[i] = NULL_RTX;
 
   /* Perform postincrements before actually calling the function.  */
   emit_queue ();
@@ -1966,7 +1985,9 @@ expand_inline_function (fndecl, parms, target, ignore, type,
          break;
 
        case CODE_LABEL:
-         copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]);
+         copy = 
+           emit_label (get_label_from_map(map,
+                                          CODE_LABEL_NUMBER (insn)));
          LABEL_NAME (copy) = LABEL_NAME (insn);
          map->const_age++;
          break;
@@ -1989,7 +2010,8 @@ expand_inline_function (fndecl, parms, target, ignore, type,
              if (copy && (NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_BEG
                           || NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_END))
                {
-                 rtx label = map->label_map[NOTE_BLOCK_NUMBER (copy)];
+                 rtx label =
+                   get_label_from_map (map, NOTE_BLOCK_NUMBER (copy));
 
                  /* We have to forward these both to match the new exception
                     region.  */
@@ -2404,14 +2426,15 @@ copy_rtx_and_substitute (orig, map)
       return gen_rtx (code, VOIDmode, copy);
 
     case CODE_LABEL:
-      LABEL_PRESERVE_P (map->label_map[CODE_LABEL_NUMBER (orig)])
+      LABEL_PRESERVE_P (get_label_from_map (map, CODE_LABEL_NUMBER (orig)))
        = LABEL_PRESERVE_P (orig);
-      return map->label_map[CODE_LABEL_NUMBER (orig)];
+      return get_label_from_map (map, CODE_LABEL_NUMBER (orig));
 
     case LABEL_REF:
       copy = gen_rtx (LABEL_REF, mode,
                      LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0)
-                     : map->label_map[CODE_LABEL_NUMBER (XEXP (orig, 0))]);
+                     : get_label_from_map (map, 
+                                           CODE_LABEL_NUMBER (XEXP (orig, 0))));
       LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig);
 
       /* The fact that this label was previously nonlocal does not mean
index b2acf5e..f0c46ff 100644 (file)
@@ -122,6 +122,13 @@ extern void try_constants PROTO((rtx, struct inline_remap *));
 
 extern void mark_stores PROTO((rtx, rtx));
 
+/* Return the label indicated.  */
+extern rtx get_label_from_map PROTO((struct inline_remap *, int));
+
+/* Set the label indicated.  */
+#define set_label_in_map(map, i, x) \
+  ((map)->label_map[i] = (x))
+
 /* Unfortunately, we need a global copy of const_equiv map for communication
    with a function called from note_stores.  Be *very* careful that this
    is used properly in the presence of recursion.  */
index 6681ada..f796c59 100644 (file)
@@ -691,8 +691,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
       else if (GET_CODE (insn) == JUMP_INSN)
        {
          if (JUMP_LABEL (insn))
-           map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))]
-             = JUMP_LABEL (insn);
+           set_label_in_map (map,
+                             CODE_LABEL_NUMBER (JUMP_LABEL (insn)),
+                             JUMP_LABEL (insn));
          else if (GET_CODE (PATTERN (insn)) == ADDR_VEC
                   || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC)
            {
@@ -704,7 +705,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
              for (i = 0; i < len; i++)
                {
                  label = XEXP (XVECEXP (pat, diff_vec_p, i), 0);
-                 map->label_map[CODE_LABEL_NUMBER (label)] = label;
+                 set_label_in_map (map,
+                                   CODE_LABEL_NUMBER (label),
+                                   label);
                }
            }
        }
@@ -1043,7 +1046,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
 
              for (j = 0; j < max_labelno; j++)
                if (local_label[j])
-                 map->label_map[j] = gen_label_rtx ();
+                 set_label_in_map (map, j, gen_label_rtx ());
 
              for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
                if (local_regno[j])
@@ -1205,7 +1208,7 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
 
       for (j = 0; j < max_labelno; j++)
        if (local_label[j])
-         map->label_map[j] = gen_label_rtx ();
+         set_label_in_map (map, j, gen_label_rtx ());
 
       for (j = FIRST_PSEUDO_REGISTER; j < max_reg_before_loop; j++)
        if (local_regno[j])
@@ -1222,8 +1225,9 @@ unroll_loop (loop_end, insn_count, loop_start, end_insert_before,
          insn = PREV_INSN (copy_start);
          pattern = PATTERN (insn);
          
-         tem = map->label_map[CODE_LABEL_NUMBER
-                              (XEXP (SET_SRC (pattern), 0))];
+         tem = get_label_from_map (map,
+                                   CODE_LABEL_NUMBER
+                                   (XEXP (SET_SRC (pattern), 0)));
          SET_SRC (pattern) = gen_rtx (LABEL_REF, VOIDmode, tem);
 
          /* Set the jump label so that it can be used by later loop unrolling
@@ -1640,10 +1644,11 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
   if (! last_iteration)
     {
       final_label = gen_label_rtx ();
-      map->label_map[CODE_LABEL_NUMBER (start_label)] = final_label;
+      set_label_in_map (map, CODE_LABEL_NUMBER (start_label),
+                       final_label); 
     }
   else
-    map->label_map[CODE_LABEL_NUMBER (start_label)] = start_label;
+    set_label_in_map (map, CODE_LABEL_NUMBER (start_label), start_label);
 
   start_sequence ();
   
@@ -1928,8 +1933,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
              if (invert_exp (pattern, copy))
                {
                  if (! redirect_exp (&pattern,
-                                     map->label_map[CODE_LABEL_NUMBER
-                                                    (JUMP_LABEL (insn))],
+                                     get_label_from_map (map,
+                                                         CODE_LABEL_NUMBER
+                                                         (JUMP_LABEL (insn))),
                                      exit_label, copy))
                    abort ();
                }
@@ -1946,8 +1952,9 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
                  emit_label_after (lab, jmp);
                  LABEL_NUSES (lab) = 0;
                  if (! redirect_exp (&pattern,
-                                     map->label_map[CODE_LABEL_NUMBER
-                                                    (JUMP_LABEL (insn))],
+                                     get_label_from_map (map,
+                                                         CODE_LABEL_NUMBER
+                                                         (JUMP_LABEL (insn))),
                                      lab, copy))
                    abort ();
                }
@@ -1990,7 +1997,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
                     for a switch statement.  This label must have been mapped,
                     so just use the label_map to get the new jump label.  */
                  JUMP_LABEL (copy)
-                   = map->label_map[CODE_LABEL_NUMBER (JUMP_LABEL (insn))];
+                   = get_label_from_map (map, 
+                                         CODE_LABEL_NUMBER (JUMP_LABEL (insn))); 
                }
          
              /* If this is a non-local jump, then must increase the label
@@ -2068,7 +2076,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
 
          if (insn != start_label)
            {
-             copy = emit_label (map->label_map[CODE_LABEL_NUMBER (insn)]);
+             copy = emit_label (get_label_from_map (map,
+                                                    CODE_LABEL_NUMBER (insn)));
              map->const_age++;
            }
          break;