aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1996-06-06 18:38:13 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1996-06-06 18:38:13 -0400
commit69685820b3ac43bcf07ae609b0c1abbadc31753e (patch)
tree002945e6eb53242361a92783b96765d6e04612d6 /gcc/function.c
parent5fd7f37d2ea02f34575b9c9d9fc1ca28cda7e2f7 (diff)
downloadgcc-69685820b3ac43bcf07ae609b0c1abbadc31753e.zip
gcc-69685820b3ac43bcf07ae609b0c1abbadc31753e.tar.gz
gcc-69685820b3ac43bcf07ae609b0c1abbadc31753e.tar.bz2
(assign_parms): Tighten up code that makes REG_EQUIV notes for parms.
From-SVN: r12186
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/gcc/function.c b/gcc/function.c
index ee9ecf3..909b695 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3869,29 +3869,34 @@ assign_parms (fndecl, second_time)
XEXP (entry_parm, 0)))
{
rtx linsn = get_last_insn ();
+ rtx sinsn, set;
/* Mark complex types separately. */
if (GET_CODE (parmreg) == CONCAT)
- {
- REG_NOTES (linsn)
- = gen_rtx (EXPR_LIST, REG_EQUIV,
- parm_reg_stack_loc[regnoi], REG_NOTES (linsn));
-
- /* Now search backward for where we set the real part. */
- for (; linsn != 0
- && ! reg_referenced_p (parm_reg_stack_loc[regnor],
- PATTERN (linsn));
- linsn = prev_nonnote_insn (linsn))
- ;
-
- REG_NOTES (linsn)
- = gen_rtx (EXPR_LIST, REG_EQUIV,
- parm_reg_stack_loc[regnor], REG_NOTES (linsn));
- }
- else
+ /* Scan backwards for the set of the real and
+ imaginary parts. */
+ for (sinsn = linsn; sinsn != 0;
+ sinsn = prev_nonnote_insn (sinsn))
+ {
+ set = single_set (sinsn);
+ if (set != 0
+ && SET_DEST (set) == regno_reg_rtx [regnoi])
+ REG_NOTES (sinsn)
+ = gen_rtx (EXPR_LIST, REG_EQUIV,
+ parm_reg_stack_loc[regnoi],
+ REG_NOTES (sinsn));
+ else if (set != 0
+ && SET_DEST (set) == regno_reg_rtx [regnor])
+ REG_NOTES (sinsn)
+ = gen_rtx (EXPR_LIST, REG_EQUIV,
+ parm_reg_stack_loc[regnor],
+ REG_NOTES (sinsn));
+ }
+ else if ((set = single_set (linsn)) != 0
+ && SET_DEST (set) == parmreg)
REG_NOTES (linsn)
- = gen_rtx (EXPR_LIST, REG_EQUIV,
- entry_parm, REG_NOTES (linsn));
+ = gen_rtx (EXPR_LIST, REG_EQUIV,
+ entry_parm, REG_NOTES (linsn));
}
/* For pointer data type, suggest pointer register. */