aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-07-11 09:28:22 -0700
committerRichard Henderson <rth@gcc.gnu.org>2003-07-11 09:28:22 -0700
commit48144cd4904ba629b34bc41389b98578b0822153 (patch)
tree026381820acdf6cc5ea79c7634d784bd0aba2fbd /gcc/function.c
parente2fcbaa3e4dbd4eb5184bb03e570c44a5d0c52ab (diff)
downloadgcc-48144cd4904ba629b34bc41389b98578b0822153.zip
gcc-48144cd4904ba629b34bc41389b98578b0822153.tar.gz
gcc-48144cd4904ba629b34bc41389b98578b0822153.tar.bz2
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 742ad2f..301d59d 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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;
}
}