From 750a330e3c5ea0ee3a0ba6991939d9387d100727 Mon Sep 17 00:00:00 2001 From: steven Date: Sun, 11 Feb 2007 19:53:11 +0000 Subject: [PATCH] * fwprop.c (try_fwprop_subst): Use set_unique_reg_note to add the REG_EQ* note. * see.c (see_merge_one_use_extension): Likewise. * local-alloc.c (update_equiv_regs): Likewise. Also don't turn REG_EQUAL notes into REG_EQUIV notes if the target register may have more than one set. * function.c (assign_parm_setup_reg): Use set_unique_reg_note. * gcse.c (try_replace_reg): Likewise. * alias.c (init_alias_analysis): Use find_reg_equal_equiv_note. * calls.c (fixup_tail_calls): Likewise. Abort if there is more than one REG_EQUIV note. * reload1.c (gen_reload): Use set_unique_reg_note. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@121821 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/alias.c | 10 ++++++---- gcc/calls.c | 19 +++++++------------ gcc/function.c | 12 +++--------- gcc/fwprop.c | 5 +++-- gcc/gcse.c | 3 ++- gcc/local-alloc.c | 18 ++++++++++-------- gcc/reload1.c | 8 +++----- gcc/see.c | 3 ++- 9 files changed, 51 insertions(+), 42 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bd05c7ff2fc..75cec2a33be 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2007-02-11 Steven Bosscher + + * fwprop.c (try_fwprop_subst): Use set_unique_reg_note + to add the REG_EQ* note. + * see.c (see_merge_one_use_extension): Likewise. + * local-alloc.c (update_equiv_regs): Likewise. Also don't + turn REG_EQUAL notes into REG_EQUIV notes if the target + register may have more than one set. + * function.c (assign_parm_setup_reg): Use set_unique_reg_note. + * gcse.c (try_replace_reg): Likewise. + * alias.c (init_alias_analysis): Use find_reg_equal_equiv_note. + * calls.c (fixup_tail_calls): Likewise. Abort if there is + more than one REG_EQUIV note. + * reload1.c (gen_reload): Use set_unique_reg_note. + 2007-02-11 Uros Bizjak * config/i386/i386.c (TARGET_VECTORIZE_BUILTIN_CONVERSION): Define. diff --git a/gcc/alias.c b/gcc/alias.c index 8b9254caa19..b873e9743bf 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -2546,10 +2546,12 @@ init_alias_analysis (void) rtx src = SET_SRC (set); rtx t; - if (REG_NOTES (insn) != 0 - && (((note = find_reg_note (insn, REG_EQUAL, 0)) != 0 - && REG_N_SETS (regno) == 1) - || (note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0) + note = find_reg_equal_equiv_note (insn); + if (note && REG_NOTE_KIND (note) == REG_EQUAL + && REG_N_SETS (regno) != 1) + note = NULL_RTX; + + if (note != NULL_RTX && GET_CODE (XEXP (note, 0)) != EXPR_LIST && ! rtx_varies_p (XEXP (note, 0), 1) && ! reg_overlap_mentioned_p (SET_DEST (set), diff --git a/gcc/calls.c b/gcc/calls.c index ab51d17a1dd..53e4d3f073d 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3130,24 +3130,19 @@ fixup_tail_calls (void) for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) { + rtx note; + /* There are never REG_EQUIV notes for the incoming arguments after the NOTE_INSN_FUNCTION_BEG note, so stop if we see it. */ if (NOTE_P (insn) && NOTE_LINE_NUMBER (insn) == NOTE_INSN_FUNCTION_BEG) break; - while (1) - { - rtx note = find_reg_note (insn, REG_EQUIV, 0); - if (note) - { - /* Remove the note and keep looking at the notes for - this insn. */ - remove_note (insn, note); - continue; - } - break; - } + note = find_reg_note (insn, REG_EQUIV, 0); + if (note) + remove_note (insn, note); + note = find_reg_note (insn, REG_EQUIV, 0); + gcc_assert (!note); } } diff --git a/gcc/function.c b/gcc/function.c index b80176c304f..31958b1cf8b 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2800,20 +2800,14 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm, continue; if (SET_DEST (set) == regno_reg_rtx [regnoi]) - REG_NOTES (sinsn) - = gen_rtx_EXPR_LIST (REG_EQUIV, stacki, - REG_NOTES (sinsn)); + set_unique_reg_note (sinsn, REG_EQUIV, stacki); else if (SET_DEST (set) == regno_reg_rtx [regnor]) - REG_NOTES (sinsn) - = gen_rtx_EXPR_LIST (REG_EQUIV, stackr, - REG_NOTES (sinsn)); + set_unique_reg_note (sinsn, REG_EQUIV, stackr); } } else if ((set = single_set (linsn)) != 0 && SET_DEST (set) == parmreg) - REG_NOTES (linsn) - = gen_rtx_EXPR_LIST (REG_EQUIV, - data->stack_parm, REG_NOTES (linsn)); + set_unique_reg_note (linsn, REG_EQUIV, data->stack_parm); } /* For pointer data type, suggest pointer register. */ diff --git a/gcc/fwprop.c b/gcc/fwprop.c index 46e1a553ad5..1ab3e525138 100644 --- a/gcc/fwprop.c +++ b/gcc/fwprop.c @@ -691,9 +691,10 @@ try_fwprop_subst (struct df_ref *use, rtx *loc, rtx new, rtx def_insn, bool set_ if (dump_file) fprintf (dump_file, " Setting REG_EQUAL note\n"); - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (new), - REG_NOTES (insn)); + set_unique_reg_note (insn, REG_EQUAL, copy_rtx (new)); + /* ??? Is this still necessary if we add the note through + set_unique_reg_note? */ if (!CONSTANT_P (new)) update_df (insn, loc, DF_INSN_USES (df, def_insn), type, DF_REF_IN_NOTE); diff --git a/gcc/gcse.c b/gcc/gcse.c index 485e53ddaa0..36b2c8f9db4 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -2668,7 +2668,8 @@ try_replace_reg (rtx from, rtx to, rtx insn) /* If there is already a REG_EQUAL note, update the expression in it with our replacement. */ if (note != 0 && REG_NOTE_KIND (note) == REG_EQUAL) - XEXP (note, 0) = simplify_replace_rtx (XEXP (note, 0), from, to); + set_unique_reg_note (insn, REG_EQUAL, + simplify_replace_rtx (XEXP (note, 0), from, to)); if (!success && set && reg_mentioned_p (from, SET_SRC (set))) { diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c index e6ff69e48a5..6f24968f10c 100644 --- a/gcc/local-alloc.c +++ b/gcc/local-alloc.c @@ -930,8 +930,13 @@ update_equiv_regs (void) /* If this register is known to be equal to a constant, record that it is always equivalent to the constant. */ - if (note && ! rtx_varies_p (XEXP (note, 0), 0)) - PUT_MODE (note, (enum machine_mode) REG_EQUIV); + if (REG_N_SETS (regno) == 1 + && note && ! rtx_varies_p (XEXP (note, 0), 0)) + { + rtx note_value = XEXP (note, 0); + remove_note (insn, note); + set_unique_reg_note (insn, REG_EQUIV, note_value); + } /* If this insn introduces a "constant" register, decrease the priority of that register. Record this insn if the register is only used once @@ -953,9 +958,7 @@ update_equiv_regs (void) if (note == 0 && REG_BASIC_BLOCK (regno) >= 0 && MEM_P (SET_SRC (set)) && validate_equiv_mem (insn, dest, SET_SRC (set))) - REG_NOTES (insn) = note = gen_rtx_EXPR_LIST (REG_EQUIV, - copy_rtx (SET_SRC (set)), - REG_NOTES (insn)); + note = set_unique_reg_note (insn, REG_EQUIV, copy_rtx (SET_SRC (set))); if (note) { @@ -1061,9 +1064,8 @@ update_equiv_regs (void) if (validate_equiv_mem (init_insn, src, dest) && ! memref_used_between_p (dest, init_insn, insn)) { - REG_NOTES (init_insn) - = gen_rtx_EXPR_LIST (REG_EQUIV, copy_rtx (dest), - REG_NOTES (init_insn)); + set_unique_reg_note (init_insn, REG_EQUIV, copy_rtx (dest)); + /* This insn makes the equivalence, not the one initializing the register. */ reg_equiv_init[regno] diff --git a/gcc/reload1.c b/gcc/reload1.c index 01e0657a448..1ea559e368b 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -7832,8 +7832,7 @@ gen_reload (rtx out, rtx in, int opnum, enum reload_type type) if (insn) { /* Add a REG_EQUIV note so that find_equiv_reg can find it. */ - REG_NOTES (insn) - = gen_rtx_EXPR_LIST (REG_EQUIV, in, REG_NOTES (insn)); + set_unique_reg_note (insn, REG_EQUIV, in); return insn; } @@ -7842,7 +7841,7 @@ gen_reload (rtx out, rtx in, int opnum, enum reload_type type) gen_reload (out, op1, opnum, type); insn = emit_insn (gen_add2_insn (out, op0)); - REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUIV, in, REG_NOTES (insn)); + set_unique_reg_note (insn, REG_EQUIV, in); } #ifdef SECONDARY_MEMORY_NEEDED @@ -7902,8 +7901,7 @@ gen_reload (rtx out, rtx in, int opnum, enum reload_type type) insn = emit_insn_if_valid_for_reload (insn); if (insn) { - REG_NOTES (insn) - = gen_rtx_EXPR_LIST (REG_EQUIV, in, REG_NOTES (insn)); + set_unique_reg_note (insn, REG_EQUIV, in); return insn; } diff --git a/gcc/see.c b/gcc/see.c index d20cdf4be28..4664faaa9ee 100644 --- a/gcc/see.c +++ b/gcc/see.c @@ -2612,7 +2612,8 @@ see_merge_one_use_extension (void **slot, void *b) /* Replacement failed. Remove the note. */ remove_note (ref_copy, note); else - XEXP (note, 0) = simplified_note; + set_unique_reg_note (ref_copy, REG_NOTE_KIND (note), + simplified_note); } if (!see_want_to_be_merged_with_extension (ref, use_se, USE_EXTENSION)) -- 2.11.0