summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-11 19:53:11 +0000
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-11 19:53:11 +0000
commit750a330e3c5ea0ee3a0ba6991939d9387d100727 (patch)
treeb8e43a1106916133f6889b90922be4c1b0c3b737 /gcc
parent647e9f063f0f3df989bf6b81e5416009fa73822a (diff)
downloadgcc-750a330e3c5ea0ee3a0ba6991939d9387d100727.tar.gz
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/alias.c10
-rw-r--r--gcc/calls.c19
-rw-r--r--gcc/function.c12
-rw-r--r--gcc/fwprop.c5
-rw-r--r--gcc/gcse.c3
-rw-r--r--gcc/local-alloc.c18
-rw-r--r--gcc/reload1.c8
-rw-r--r--gcc/see.c3
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 <steven@gcc.gnu.org>
+
+ * 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 <ubizjak@gmail.com>
* 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))