OSDN Git Service

*** empty log message ***
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Jan 1992 21:34:28 +0000 (21:34 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Jan 1992 21:34:28 +0000 (21:34 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/genrecog.c
gcc/integrate.c

index a8b0372..984cc8b 100644 (file)
@@ -1,5 +1,5 @@
 /* Generate code from machine description to recognize rtl as insns.
-   Copyright (C) 1987, 1988, 1991 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1992 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
index faad181..72170a8 100644 (file)
@@ -1,5 +1,5 @@
 /* Procedure integration for GNU CC.
-   Copyright (C) 1988-1991 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1992 Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
@@ -1042,7 +1042,6 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
   rtx *arg_vals;
   rtx insn;
   int max_regno;
-  int equiv_map_size;
   register int i;
   int min_labelno = FIRST_LABELNO (header);
   int max_labelno = LAST_LABELNO (header);
@@ -1173,16 +1172,26 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
 
   /* const_equiv_map maps pseudos in our routine to constants, so it needs to
      be large enough for all our pseudos.  This is the number we are currently
-     using plus the number in the called routine, plus one for each arg and
-     one for the return value.  */
-  equiv_map_size
-    = max_reg_num () + (max_regno - FIRST_PSEUDO_REGISTER) + nargs + 1;
-
-  map->const_equiv_map = (rtx *)alloca (equiv_map_size * sizeof (rtx));
-  bzero (map->const_equiv_map, equiv_map_size * sizeof (rtx));
-
-  map->const_age_map = (unsigned *)alloca (equiv_map_size * sizeof (unsigned));
-  bzero (map->const_age_map, equiv_map_size * sizeof (unsigned));
+     using plus the number in the called routine, plus 15 for each arg,
+     five to compute the virtual frame pointer, and five for the return value.
+     This should be enough for most cases.  We do not reference entries
+     outside the range of the map.
+
+     ??? These numbers are quite arbitrary and were obtained by
+     experimentation.  At some point, we should try to allocate the
+     table after all the parameters are set up so we an more accurately
+     estimate the number of pseudos we will need.  */
+
+  map->const_equiv_map_size
+    = max_reg_num () + (max_regno - FIRST_PSEUDO_REGISTER) + 15 * nargs + 10;
+
+  map->const_equiv_map
+    = (rtx *)alloca (map->const_equiv_map_size * sizeof (rtx));
+  bzero (map->const_equiv_map, map->const_equiv_map_size * sizeof (rtx));
+
+  map->const_age_map
+    = (unsigned *)alloca (map->const_equiv_map_size * sizeof (unsigned));
+  bzero (map->const_age_map, map->const_equiv_map_size * sizeof (unsigned));
   map->const_age = 0;
 
   /* Record the current insn in case we have to set up pointers to frame
@@ -2139,7 +2148,9 @@ subst_constants (loc, insn, map)
         hard regs used as user variables with constants.  */
       {
        int regno = REGNO (x);
+
        if (! (regno < FIRST_PSEUDO_REGISTER && REG_USERVAR_P (x))
+           && regno < map->const_equiv_map_size
            && map->const_equiv_map[regno] != 0
            && map->const_age_map[regno] >= map->const_age)
          validate_change (insn, loc, map->const_equiv_map[regno], 1);