aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1992-01-15 16:34:28 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1992-01-15 16:34:28 -0500
commitc66e0741f8dfaa31c50aad9821d149023eb85cbf (patch)
tree37fa8a4be636905df421c8037bd5823a5a867ce0
parentd7429b6aeb5a4167e3bcaf8153387ba9509da0b0 (diff)
downloadgcc-c66e0741f8dfaa31c50aad9821d149023eb85cbf.zip
gcc-c66e0741f8dfaa31c50aad9821d149023eb85cbf.tar.gz
gcc-c66e0741f8dfaa31c50aad9821d149023eb85cbf.tar.bz2
*** empty log message ***
From-SVN: r191
-rw-r--r--gcc/genrecog.c2
-rw-r--r--gcc/integrate.c35
2 files changed, 24 insertions, 13 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index a8b0372..984cc8b 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -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.
diff --git a/gcc/integrate.c b/gcc/integrate.c
index faad181..72170a8 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -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);