From c66e0741f8dfaa31c50aad9821d149023eb85cbf Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Wed, 15 Jan 1992 16:34:28 -0500 Subject: [PATCH] *** empty log message *** From-SVN: r191 --- gcc/genrecog.c | 2 +- gcc/integrate.c | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/gcc/genrecog.c b/gcc/genrecog.c index a8b0372558a..984cc8b8149 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 faad181bdcb..72170a8b534 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; + 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. - map->const_equiv_map = (rtx *)alloca (equiv_map_size * sizeof (rtx)); - bzero (map->const_equiv_map, equiv_map_size * sizeof (rtx)); + ??? 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_age_map = (unsigned *)alloca (equiv_map_size * sizeof (unsigned)); - bzero (map->const_age_map, equiv_map_size * sizeof (unsigned)); + 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);