diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1996-06-06 18:38:13 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1996-06-06 18:38:13 -0400 |
commit | 69685820b3ac43bcf07ae609b0c1abbadc31753e (patch) | |
tree | 002945e6eb53242361a92783b96765d6e04612d6 /gcc/function.c | |
parent | 5fd7f37d2ea02f34575b9c9d9fc1ca28cda7e2f7 (diff) | |
download | gcc-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.c | 43 |
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. */ |