cse.c (cse_insn): Simplify REG_EQUAL note on libcalls when making a substitution.
* cse.c (cse_insn): Simplify REG_EQUAL note on libcalls when making a substitution. (dead_libcall_p): If directly replacing a libcall with a constant value produces an invalid instruction, also try forcing the constant into the constant pool. * expr.c (emit_move_insn): Add a REG_EQUAL note when it is not obvious that the source is a constant. (compress_float_constant): Use set_unique_reg_note to place REG_EQUAL notes on instructions. From-SVN: r67247
This commit is contained in:
parent
9a38893aa7
commit
0c19a26f77
3 changed files with 51 additions and 20 deletions
|
@ -1,3 +1,15 @@
|
||||||
|
2003-05-30 Roger Sayle <roger@eyesopen.com>
|
||||||
|
|
||||||
|
* cse.c (cse_insn): Simplify REG_EQUAL note on libcalls when
|
||||||
|
making a substitution.
|
||||||
|
(dead_libcall_p): If directly replacing a libcall with a
|
||||||
|
constant value produces an invalid instruction, also try forcing
|
||||||
|
the constant into the constant pool.
|
||||||
|
* expr.c (emit_move_insn): Add a REG_EQUAL note when it is not
|
||||||
|
obvious that the source is a constant.
|
||||||
|
(compress_float_constant): Use set_unique_reg_note to place
|
||||||
|
REG_EQUAL notes on instructions.
|
||||||
|
|
||||||
2003-05-30 Eric Christopher <echristo@redhat.com>
|
2003-05-30 Eric Christopher <echristo@redhat.com>
|
||||||
|
|
||||||
* config/mips/mips.c (extern_list): Add GTY marker.
|
* config/mips/mips.c (extern_list): Add GTY marker.
|
||||||
|
|
46
gcc/cse.c
46
gcc/cse.c
|
@ -5550,8 +5550,8 @@ cse_insn (insn, libcall_insn)
|
||||||
&& (GET_CODE (sets[i].orig_src) == REG
|
&& (GET_CODE (sets[i].orig_src) == REG
|
||||||
|| GET_CODE (sets[i].orig_src) == SUBREG
|
|| GET_CODE (sets[i].orig_src) == SUBREG
|
||||||
|| GET_CODE (sets[i].orig_src) == MEM))
|
|| GET_CODE (sets[i].orig_src) == MEM))
|
||||||
replace_rtx (REG_NOTES (libcall_insn), sets[i].orig_src,
|
simplify_replace_rtx (REG_NOTES (libcall_insn),
|
||||||
copy_rtx (new));
|
sets[i].orig_src, copy_rtx (new));
|
||||||
|
|
||||||
/* The result of apply_change_group can be ignored; see
|
/* The result of apply_change_group can be ignored; see
|
||||||
canon_reg. */
|
canon_reg. */
|
||||||
|
@ -7632,33 +7632,49 @@ dead_libcall_p (insn, counts)
|
||||||
rtx insn;
|
rtx insn;
|
||||||
int *counts;
|
int *counts;
|
||||||
{
|
{
|
||||||
rtx note;
|
rtx note, set, new;
|
||||||
|
|
||||||
/* See if there's a REG_EQUAL note on this insn and try to
|
/* See if there's a REG_EQUAL note on this insn and try to
|
||||||
replace the source with the REG_EQUAL expression.
|
replace the source with the REG_EQUAL expression.
|
||||||
|
|
||||||
We assume that insns with REG_RETVALs can only be reg->reg
|
We assume that insns with REG_RETVALs can only be reg->reg
|
||||||
copies at this point. */
|
copies at this point. */
|
||||||
note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
|
note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
|
||||||
if (note)
|
if (!note)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
set = single_set (insn);
|
||||||
|
if (!set)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
new = simplify_rtx (XEXP (note, 0));
|
||||||
|
if (!new)
|
||||||
|
new = XEXP (note, 0);
|
||||||
|
|
||||||
|
/* While changing insn, we must update the counts accordingly. */
|
||||||
|
count_reg_usage (insn, counts, NULL_RTX, -1);
|
||||||
|
|
||||||
|
if (validate_change (insn, &SET_SRC (set), new, 0))
|
||||||
{
|
{
|
||||||
rtx set = single_set (insn);
|
count_reg_usage (insn, counts, NULL_RTX, 1);
|
||||||
rtx new = simplify_rtx (XEXP (note, 0));
|
remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX));
|
||||||
|
remove_note (insn, note);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!new)
|
if (CONSTANT_P (new))
|
||||||
new = XEXP (note, 0);
|
{
|
||||||
|
new = force_const_mem (GET_MODE (SET_DEST (set)), new);
|
||||||
/* While changing insn, we must update the counts accordingly. */
|
if (new && validate_change (insn, &SET_SRC (set), new, 0))
|
||||||
count_reg_usage (insn, counts, NULL_RTX, -1);
|
|
||||||
|
|
||||||
if (set && validate_change (insn, &SET_SRC (set), new, 0))
|
|
||||||
{
|
{
|
||||||
count_reg_usage (insn, counts, NULL_RTX, 1);
|
count_reg_usage (insn, counts, NULL_RTX, 1);
|
||||||
remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX));
|
remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX));
|
||||||
remove_note (insn, note);
|
remove_note (insn, note);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
count_reg_usage (insn, counts, NULL_RTX, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count_reg_usage (insn, counts, NULL_RTX, 1);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
gcc/expr.c
13
gcc/expr.c
|
@ -3166,7 +3166,7 @@ emit_move_insn (x, y)
|
||||||
{
|
{
|
||||||
enum machine_mode mode = GET_MODE (x);
|
enum machine_mode mode = GET_MODE (x);
|
||||||
rtx y_cst = NULL_RTX;
|
rtx y_cst = NULL_RTX;
|
||||||
rtx last_insn;
|
rtx last_insn, set;
|
||||||
|
|
||||||
x = protect_from_queue (x, 1);
|
x = protect_from_queue (x, 1);
|
||||||
y = protect_from_queue (y, 0);
|
y = protect_from_queue (y, 0);
|
||||||
|
@ -3184,9 +3184,10 @@ emit_move_insn (x, y)
|
||||||
&& (last_insn = compress_float_constant (x, y)))
|
&& (last_insn = compress_float_constant (x, y)))
|
||||||
return last_insn;
|
return last_insn;
|
||||||
|
|
||||||
|
y_cst = y;
|
||||||
|
|
||||||
if (!LEGITIMATE_CONSTANT_P (y))
|
if (!LEGITIMATE_CONSTANT_P (y))
|
||||||
{
|
{
|
||||||
y_cst = y;
|
|
||||||
y = force_const_mem (mode, y);
|
y = force_const_mem (mode, y);
|
||||||
|
|
||||||
/* If the target's cannot_force_const_mem prevented the spill,
|
/* If the target's cannot_force_const_mem prevented the spill,
|
||||||
|
@ -3217,7 +3218,10 @@ emit_move_insn (x, y)
|
||||||
|
|
||||||
last_insn = emit_move_insn_1 (x, y);
|
last_insn = emit_move_insn_1 (x, y);
|
||||||
|
|
||||||
if (y_cst && GET_CODE (x) == REG)
|
if (y_cst && GET_CODE (x) == REG
|
||||||
|
&& (set = single_set (last_insn)) != NULL_RTX
|
||||||
|
&& SET_DEST (set) == x
|
||||||
|
&& ! rtx_equal_p (y_cst, SET_SRC (set)))
|
||||||
set_unique_reg_note (last_insn, REG_EQUAL, y_cst);
|
set_unique_reg_note (last_insn, REG_EQUAL, y_cst);
|
||||||
|
|
||||||
return last_insn;
|
return last_insn;
|
||||||
|
@ -3621,8 +3625,7 @@ compress_float_constant (x, y)
|
||||||
last_insn = get_last_insn ();
|
last_insn = get_last_insn ();
|
||||||
|
|
||||||
if (GET_CODE (x) == REG)
|
if (GET_CODE (x) == REG)
|
||||||
REG_NOTES (last_insn)
|
set_unique_reg_note (last_insn, REG_EQUAL, y);
|
||||||
= gen_rtx_EXPR_LIST (REG_EQUAL, y, REG_NOTES (last_insn));
|
|
||||||
|
|
||||||
return last_insn;
|
return last_insn;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue