emit-rtl.c (set_unique_reg_note): Don't create REG_EQUAL or REG_EQUIV notes for ASM_OPERANDS.
* emit-rtl.c (set_unique_reg_note): Don't create REG_EQUAL or REG_EQUIV notes for ASM_OPERANDS. Return the new note (if any). * rtl.h (set_unique_reg_note): Change return value. * gcse.c (try_replace_reg): Use set_unique_reg_note. * cse.c (cse_insn): Likewise. * expr.c (emit_move_insn): Likewise. * explow.c (force_reg): Likewise. * local-alloc (update_equiv_regs): Likewise. * loop.c (move_moveables, load_mems): Likewise. * reload (find_reloads): Likewise. * gcc.dg/20011029-2.c: New test. From-SVN: r46636
This commit is contained in:
parent
53fcdc7677
commit
3d23824843
|
@ -1,3 +1,16 @@
|
|||
2001-10-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* emit-rtl.c (set_unique_reg_note): Don't create REG_EQUAL or
|
||||
REG_EQUIV notes for ASM_OPERANDS. Return the new note (if any).
|
||||
* rtl.h (set_unique_reg_note): Change return value.
|
||||
* gcse.c (try_replace_reg): Use set_unique_reg_note.
|
||||
* cse.c (cse_insn): Likewise.
|
||||
* expr.c (emit_move_insn): Likewise.
|
||||
* explow.c (force_reg): Likewise.
|
||||
* local-alloc (update_equiv_regs): Likewise.
|
||||
* loop.c (move_moveables, load_mems): Likewise.
|
||||
* reload (find_reloads): Likewise.
|
||||
|
||||
2001-10-30 Paolo Bonzini <bonzini@gnu.org>
|
||||
|
||||
Localization fixes.
|
||||
|
|
|
@ -5648,18 +5648,12 @@ cse_insn (insn, libcall_insn)
|
|||
&& GET_CODE (XEXP (XEXP (src_const, 0), 0)) == LABEL_REF
|
||||
&& GET_CODE (XEXP (XEXP (src_const, 0), 1)) == LABEL_REF))
|
||||
{
|
||||
tem = find_reg_note (insn, REG_EQUAL, NULL_RTX);
|
||||
|
||||
/* Make sure that the rtx is not shared with any other insn. */
|
||||
src_const = copy_rtx (src_const);
|
||||
|
||||
/* Record the actual constant value in a REG_EQUAL note, making
|
||||
a new one if one does not already exist. */
|
||||
if (tem)
|
||||
XEXP (tem, 0) = src_const;
|
||||
else
|
||||
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL,
|
||||
src_const, REG_NOTES (insn));
|
||||
set_unique_reg_note (insn, REG_EQUAL, src_const);
|
||||
|
||||
/* If storing a constant value in a register that
|
||||
previously held the constant value 0,
|
||||
|
|
|
@ -3960,7 +3960,7 @@ force_next_line_note ()
|
|||
/* Place a note of KIND on insn INSN with DATUM as the datum. If a
|
||||
note of this type already exists, remove it first. */
|
||||
|
||||
void
|
||||
rtx
|
||||
set_unique_reg_note (insn, kind, datum)
|
||||
rtx insn;
|
||||
enum reg_note kind;
|
||||
|
@ -3968,11 +3968,20 @@ set_unique_reg_note (insn, kind, datum)
|
|||
{
|
||||
rtx note = find_reg_note (insn, kind, NULL_RTX);
|
||||
|
||||
/* First remove the note if there already is one. */
|
||||
/* Don't add ASM_OPERAND REG_EQUAL/REG_EQUIV notes.
|
||||
It serves no useful purpose and breaks eliminate_regs. */
|
||||
if ((kind == REG_EQUAL || kind == REG_EQUIV)
|
||||
&& GET_CODE (datum) == ASM_OPERANDS)
|
||||
return NULL_RTX;
|
||||
|
||||
if (note)
|
||||
remove_note (insn, note);
|
||||
{
|
||||
XEXP (note, 0) = datum;
|
||||
return note;
|
||||
}
|
||||
|
||||
REG_NOTES (insn) = gen_rtx_EXPR_LIST (kind, datum, REG_NOTES (insn));
|
||||
return REG_NOTES (insn);
|
||||
}
|
||||
|
||||
/* Return an indication of which type of insn should have X as a body.
|
||||
|
|
|
@ -743,14 +743,7 @@ force_reg (mode, x)
|
|||
if (CONSTANT_P (x)
|
||||
&& (set = single_set (insn)) != 0
|
||||
&& SET_DEST (set) == temp)
|
||||
{
|
||||
rtx note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
|
||||
|
||||
if (note)
|
||||
XEXP (note, 0) = x;
|
||||
else
|
||||
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, x, REG_NOTES (insn));
|
||||
}
|
||||
set_unique_reg_note (insn, REG_EQUAL, x);
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
|
|
@ -2774,8 +2774,7 @@ emit_move_insn (x, y)
|
|||
last_insn = emit_move_insn_1 (x, y);
|
||||
|
||||
if (y_cst && GET_CODE (x) == REG)
|
||||
REG_NOTES (last_insn)
|
||||
= gen_rtx_EXPR_LIST (REG_EQUAL, y_cst, REG_NOTES (last_insn));
|
||||
set_unique_reg_note (last_insn, REG_EQUAL, y_cst);
|
||||
|
||||
return last_insn;
|
||||
}
|
||||
|
|
|
@ -3929,8 +3929,7 @@ try_replace_reg (from, to, insn)
|
|||
/* If we've failed to do replacement, have a single SET, and don't already
|
||||
have a note, add a REG_EQUAL note to not lose information. */
|
||||
if (!success && note == 0 && set != 0)
|
||||
note = REG_NOTES (insn)
|
||||
= gen_rtx_EXPR_LIST (REG_EQUAL, src, REG_NOTES (insn));
|
||||
note = set_unique_reg_note (insn, REG_EQUAL, src);
|
||||
|
||||
/* If there is already a NOTE, update the expression in it with our
|
||||
replacement. */
|
||||
|
|
|
@ -927,13 +927,9 @@ update_equiv_regs ()
|
|||
|
||||
/* cse sometimes generates function invariants, but doesn't put a
|
||||
REG_EQUAL note on the insn. Since this note would be redundant,
|
||||
there's no point creating it earlier than here. Don't do this
|
||||
for ASM_OPERANDS since eliminate_regs doesn't support it and
|
||||
it serves no useful purpose. */
|
||||
if (! note && ! rtx_varies_p (src, 0)
|
||||
&& GET_CODE (src) != ASM_OPERANDS)
|
||||
REG_NOTES (insn)
|
||||
= note = gen_rtx_EXPR_LIST (REG_EQUAL, src, REG_NOTES (insn));
|
||||
there's no point creating it earlier than here. */
|
||||
if (! note && ! rtx_varies_p (src, 0))
|
||||
note = set_unique_reg_note (insn, REG_EQUAL, src);
|
||||
|
||||
/* Don't bother considering a REG_EQUAL note containing an EXPR_LIST
|
||||
since it represents a function call */
|
||||
|
|
16
gcc/loop.c
16
gcc/loop.c
|
@ -1831,9 +1831,9 @@ move_movables (loop, movables, threshold, insn_count)
|
|||
|
||||
i1 = loop_insn_hoist (loop, seq);
|
||||
if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
|
||||
REG_NOTES (i1)
|
||||
= gen_rtx_EXPR_LIST (m->is_equiv ? REG_EQUIV : REG_EQUAL,
|
||||
m->set_src, REG_NOTES (i1));
|
||||
set_unique_reg_note (i1,
|
||||
m->is_equiv ? REG_EQUIV : REG_EQUAL,
|
||||
m->set_src);
|
||||
|
||||
if (loop_dump_stream)
|
||||
fprintf (loop_dump_stream, " moved to %d", INSN_UID (i1));
|
||||
|
@ -1991,10 +1991,8 @@ move_movables (loop, movables, threshold, insn_count)
|
|||
|
||||
i1 = loop_insn_hoist (loop, seq);
|
||||
if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
|
||||
REG_NOTES (i1)
|
||||
= gen_rtx_EXPR_LIST ((m->is_equiv ? REG_EQUIV
|
||||
: REG_EQUAL),
|
||||
m->set_src, REG_NOTES (i1));
|
||||
set_unique_reg_note (i1, m->is_equiv ? REG_EQUIV
|
||||
: REG_EQUAL, m->set_src);
|
||||
}
|
||||
else
|
||||
i1 = loop_insn_hoist (loop, PATTERN (p));
|
||||
|
@ -9136,9 +9134,7 @@ load_mems (loop)
|
|||
}
|
||||
|
||||
if (const_equiv)
|
||||
REG_NOTES (set) = gen_rtx_EXPR_LIST (REG_EQUAL,
|
||||
copy_rtx (const_equiv->loc),
|
||||
REG_NOTES (set));
|
||||
set_unique_reg_note (set, REG_EQUAL, copy_rtx (const_equiv->loc));
|
||||
|
||||
if (written)
|
||||
{
|
||||
|
|
|
@ -2666,9 +2666,9 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
|
|||
&& GET_CODE (reg) == REG
|
||||
&& (GET_MODE_SIZE (GET_MODE (reg))
|
||||
>= GET_MODE_SIZE (GET_MODE (op))))
|
||||
REG_NOTES (emit_insn_before (gen_rtx_USE (VOIDmode, reg), insn))
|
||||
= gen_rtx_EXPR_LIST (REG_EQUAL,
|
||||
reg_equiv_memory_loc[REGNO (reg)], NULL_RTX);
|
||||
set_unique_reg_note (emit_insn_before (gen_rtx_USE (VOIDmode, reg),
|
||||
insn),
|
||||
REG_EQUAL, reg_equiv_memory_loc[REGNO (reg)]);
|
||||
|
||||
substed_operand[i] = recog_data.operand[i] = op;
|
||||
}
|
||||
|
|
|
@ -1409,7 +1409,7 @@ extern enum machine_mode choose_hard_reg_mode PARAMS ((unsigned int,
|
|||
unsigned int));
|
||||
|
||||
/* In emit-rtl.c */
|
||||
extern void set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx));
|
||||
extern rtx set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx));
|
||||
|
||||
/* Functions in rtlanal.c */
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2001-10-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gcc.dg/20011029-2.c: New test.
|
||||
|
||||
Mon Oct 29 21:19:53 2001 Nicola Pero <n.pero@mi.flashnet.it>
|
||||
|
||||
* objc/execute/class_self-1.m: New test.
|
||||
|
|
Loading…
Reference in New Issue