aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2001-05-03 16:14:34 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2001-05-03 16:14:34 +0000
commitc826ae21755f71ba6607714f97fab37ae0cfacae (patch)
treed15e26ef2c3c3f119a14c3a43cc414d9612c5d2e
parent371d5d2ef8677d06f8897bfd04bbf3ca0803fca5 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/integrate.c18
-rw-r--r--gcc/integrate.h6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20010503-1.c17
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);
+}