From 62b735c8b5c580f7bda1bc81e248c7d5b5e98729 Mon Sep 17 00:00:00 2001 From: mmitchel Date: Thu, 3 May 2001 16:14:34 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41791 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/integrate.c | 18 +++++------------- gcc/integrate.h | 6 +++++- gcc/testsuite/gcc.c-torture/compile/20010503-1.c | 17 +++++++++++++++++ 4 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20010503-1.c 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 + * 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 + * 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); +} -- 2.7.4