From 69685820b3ac43bcf07ae609b0c1abbadc31753e Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Thu, 6 Jun 1996 18:38:13 -0400 Subject: [PATCH] (assign_parms): Tighten up code that makes REG_EQUIV notes for parms. From-SVN: r12186 --- gcc/function.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/gcc/function.c b/gcc/function.c index ee9ecf3fdec..909b6959add 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. */ -- 2.30.2