Commit c66e0741 by Richard Kenner

*** empty log message ***

From-SVN: r191
parent d7429b6a
/* 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.
......
/* 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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment