aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1993-12-11 08:33:22 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1993-12-11 08:33:22 -0500
commitf231e307b43ec4e99a68363a7ef9ecb1bd32d70e (patch)
treea3af8716acabf618b3c0bf459039166332e74540 /gcc
parent7f34054628176b71579b3f8600380bbdaccf4731 (diff)
downloadgcc-f231e307b43ec4e99a68363a7ef9ecb1bd32d70e.zip
gcc-f231e307b43ec4e99a68363a7ef9ecb1bd32d70e.tar.gz
gcc-f231e307b43ec4e99a68363a7ef9ecb1bd32d70e.tar.bz2
(initialize_for_inline): Handle CONCAT when setting up parmdecl_map.
(expand_inline_function): Make test for overlap of TARGET and args_vals[i] more conservative. From-SVN: r6207
Diffstat (limited to 'gcc')
-rw-r--r--gcc/integrate.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/integrate.c b/gcc/integrate.c
index be439b9..fcba544 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -276,6 +276,17 @@ initialize_for_inline (fndecl, min_labelno, max_labelno, max_reg, copy)
if (GET_CODE (p) == REG)
parmdecl_map[REGNO (p)] = parms;
+ else if (GET_CODE (p) == CONCAT)
+ {
+ rtx preal = gen_realpart (GET_MODE (XEXP (p, 0)), p);
+ rtx pimag = gen_imagpart (GET_MODE (preal), p);
+
+ if (GET_CODE (preal) == REG)
+ parmdecl_map[REGNO (preal)] = parms;
+ if (GET_CODE (pimag) == REG)
+ parmdecl_map[REGNO (pimag)] = parms;
+ }
+
/* This flag is cleared later
if the function ever modifies the value of the parm. */
TREE_READONLY (parms) = 1;
@@ -1273,9 +1284,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
But if ARG_VALS[I] overlaps TARGET, these assumptions are
wrong, so put ARG_VALS[I] into a fresh register. */
|| (target != 0
- && (GET_CODE (arg_vals[i]) == REG
- || GET_CODE (arg_vals[i]) == SUBREG
- || GET_CODE (arg_vals[i]) == MEM)
+ && ! CONSTANT_P (arg_vals[i])
&& reg_overlap_mentioned_p (arg_vals[i], target))
/* ??? We must always copy a SUBREG into a REG, because it might
get substituted into an address, and not all ports correctly