function.c (assign_parms): Don't recombine complex args if fnargs is unchanged from orig_fnargs.

* function.c (assign_parms): Don't recombine complex args if
        fnargs is unchanged from orig_fnargs.
        (split_complex_args): Return args without complex before copying.
        Re-layout the modified parameters.

From-SVN: r69236
This commit is contained in:
Richard Henderson 2003-07-11 09:28:22 -07:00 committed by Richard Henderson
parent e2fcbaa3e4
commit 48144cd490
2 changed files with 33 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2003-07-11 Richard Henderson <rth@redhat.com>
* function.c (assign_parms): Don't recombine complex args if
fnargs is unchanged from orig_fnargs.
(split_complex_args): Return args without complex before copying.
Re-layout the modified parameters.
2003-07-11 J"orn Rennecke <joern.rennecke@superh.com>
* regclass.c (choose_hard_reg_mode): Add third argument.

View File

@ -5072,15 +5072,11 @@ assign_parms (tree fndecl)
}
}
if (SPLIT_COMPLEX_ARGS)
if (SPLIT_COMPLEX_ARGS && fnargs != orig_fnargs)
{
parm = orig_fnargs;
for (; parm; parm = TREE_CHAIN (parm))
for (parm = orig_fnargs; parm; parm = TREE_CHAIN (parm))
{
tree type = TREE_TYPE (parm);
if (TREE_CODE (type) == COMPLEX_TYPE)
if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE)
{
SET_DECL_RTL (parm,
gen_rtx_CONCAT (DECL_MODE (parm),
@ -5205,30 +5201,49 @@ assign_parms (tree fndecl)
}
}
/* If ARGS contains entries with complex types, split the entry into two
entries of the component type. Return a new list of substitutions are
needed, else the old list. */
static tree
split_complex_args (tree args)
{
tree p;
/* Before allocating memory, check for the common case of no complex. */
for (p = args; p; p = TREE_CHAIN (p))
if (TREE_CODE (TREE_TYPE (p)) == COMPLEX_TYPE)
goto found;
return args;
found:
args = copy_list (args);
for (p = args; p; p = TREE_CHAIN (p))
{
tree complex_type = TREE_TYPE (p);
if (TREE_CODE (complex_type) == COMPLEX_TYPE)
tree type = TREE_TYPE (p);
if (TREE_CODE (type) == COMPLEX_TYPE)
{
tree decl;
tree subtype = TREE_TYPE (complex_type);
tree subtype = TREE_TYPE (type);
/* Rewrite the PARM_DECL's type with its component. */
TREE_TYPE (p) = subtype;
DECL_ARG_TYPE (p) = TREE_TYPE (DECL_ARG_TYPE (p));
DECL_MODE (p) = VOIDmode;
DECL_SIZE (p) = NULL;
DECL_SIZE_UNIT (p) = NULL;
layout_decl (p, 0);
/* Build a second synthetic decl. */
decl = build_decl (PARM_DECL, NULL_TREE, subtype);
DECL_ARG_TYPE (decl) = DECL_ARG_TYPE (p);
layout_decl (decl, 0);
/* Splice it in; skip the new decl. */
TREE_CHAIN (decl) = TREE_CHAIN (p);
TREE_CHAIN (p) = decl;
p = decl;
}
}