diff options
author | Mark Mitchell <mark@codesourcery.com> | 2001-05-03 16:14:34 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2001-05-03 16:14:34 +0000 |
commit | c826ae21755f71ba6607714f97fab37ae0cfacae (patch) | |
tree | d15e26ef2c3c3f119a14c3a43cc414d9612c5d2e | |
parent | 371d5d2ef8677d06f8897bfd04bbf3ca0803fca5 (diff) | |
download | gcc-c826ae21755f71ba6607714f97fab37ae0cfacae.zip gcc-c826ae21755f71ba6607714f97fab37ae0cfacae.tar.gz gcc-c826ae21755f71ba6607714f97fab37ae0cfacae.tar.bz2 |
integrate.h (struct inline_remap): Add leaf_reg_map table.
* integrate.h (struct inline_remap): Add leaf_reg_map table.
* integrate.c (expand_inline_function): Use xcalloc to allocate
memory.
(copy_rtx_and_substitute): Use the leaf_reg_map for leaf
registers.
From-SVN: r41791
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/integrate.c | 18 | ||||
-rw-r--r-- | gcc/integrate.h | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20010503-1.c | 17 |
4 files changed, 35 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fecca4f..4aaf478 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2001-05-03 Mark Mitchell <mark@codesourcery.com> + * integrate.h (struct inline_remap): Add leaf_reg_map table. + * integrate.c (expand_inline_function): Use xcalloc to allocate + memory. + (copy_rtx_and_substitute): Use the leaf_reg_map for leaf + registers. + +2001-05-03 Mark Mitchell <mark@codesourcery.com> + * c-dump.c (dequeue_and_dump): Don't look at DECL_ASSEMBLER_NAME if it is not set. diff --git a/gcc/integrate.c b/gcc/integrate.c index ba198b4..a430030 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -758,7 +758,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, /* Allocate the structures we use to remap things. */ - map = (struct inline_remap *) xmalloc (sizeof (struct inline_remap)); + map = (struct inline_remap *) xcalloc (1, sizeof (struct inline_remap)); map->fndecl = fndecl; VARRAY_TREE_INIT (map->block_map, 10, "block_map"); @@ -1753,15 +1753,7 @@ copy_rtx_and_substitute (orig, map, for_lhs) { /* Some hard registers are also mapped, but others are not translated. */ - if (map->reg_map[regno] != 0 - /* We shouldn't usually have reg_map set for return - register, but it may happen if we have leaf-register - remapping and the return register is used in one of - the calling sequences of a call_placeholer. In this - case, we'll end up with a reg_map set for this - register, but we don't want to use for registers - marked as return values. */ - && ! REG_FUNCTION_VALUE_P (orig)) + if (map->reg_map[regno] != 0) return map->reg_map[regno]; /* If this is the virtual frame pointer, make space in current @@ -1879,9 +1871,9 @@ copy_rtx_and_substitute (orig, map, for_lhs) if (map->integrating && regno < FIRST_PSEUDO_REGISTER && LEAF_REGISTERS[regno] && LEAF_REG_REMAP (regno) != regno) { - temp = gen_rtx_REG (mode, regno); - map->reg_map[regno] = temp; - return temp; + if (!map->leaf_reg_map[regno][mode]) + map->leaf_reg_map[regno][mode] = gen_rtx_REG (mode, regno); + return map->leaf_reg_map[regno][mode]; } #endif else diff --git a/gcc/integrate.h b/gcc/integrate.h index 14606a6..52c3004 100644 --- a/gcc/integrate.h +++ b/gcc/integrate.h @@ -1,5 +1,5 @@ /* Function integration definitions for GNU C-Compiler - Copyright (C) 1990, 1995, 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1990, 1995, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of GNU CC. @@ -47,6 +47,10 @@ struct inline_remap /* Mapping from old registers to new registers. It is allocated and deallocated in `expand_inline_function' */ rtx *reg_map; +#if defined (LEAF_REGISTERS) && defined (LEAF_REG_REMAP) + /* Mapping from old leaf registers to new leaf registers. */ + rtx leaf_reg_map[FIRST_PSEUDO_REGISTER][NUM_MACHINE_MODES]; +#endif /* Mapping from old code-labels to new code-labels. The first element of this map is label_map[min_labelno]. */ rtx *label_map; diff --git a/gcc/testsuite/gcc.c-torture/compile/20010503-1.c b/gcc/testsuite/gcc.c-torture/compile/20010503-1.c new file mode 100644 index 0000000..75005f4 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20010503-1.c @@ -0,0 +1,17 @@ +void f1 (double); +void f2 (int); + +void +foo (int type, double xx) +{ + if (type) + f1 (xx); + else + f2 (type); +} + +void +bar (int type) +{ + foo (type, 1.0); +} |