diff options
author | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-30 17:49:44 +0000 |
---|---|---|
committer | sayle <sayle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-30 17:49:44 +0000 |
commit | 6442675c63f94be8658e8964494db7e6c6e2052f (patch) | |
tree | 82a94f53b3de8865038ee21fdc4560d6ed2c908f /gcc/cse.c | |
parent | b857c2271d155bb122290091f68f15caa3fc9ad3 (diff) | |
download | gcc-6442675c63f94be8658e8964494db7e6c6e2052f.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@67247 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/gcc/cse.c b/gcc/cse.c index 671fd068f96..4f59babbfc9 100644 --- a/gcc/cse.c +++ b/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) == SUBREG || GET_CODE (sets[i].orig_src) == MEM)) - replace_rtx (REG_NOTES (libcall_insn), sets[i].orig_src, - copy_rtx (new)); + simplify_replace_rtx (REG_NOTES (libcall_insn), + sets[i].orig_src, copy_rtx (new)); /* The result of apply_change_group can be ignored; see canon_reg. */ @@ -7632,33 +7632,49 @@ dead_libcall_p (insn, counts) rtx insn; int *counts; { - rtx note; + rtx note, set, new; + /* See if there's a REG_EQUAL note on this insn and try to replace the source with the REG_EQUAL expression. We assume that insns with REG_RETVALs can only be reg->reg copies at this point. */ note = find_reg_note (insn, REG_EQUAL, NULL_RTX); - if (note) - { - rtx set = single_set (insn); - rtx new = simplify_rtx (XEXP (note, 0)); + if (!note) + return false; + + set = single_set (insn); + if (!set) + return false; - if (!new) - new = XEXP (note, 0); + 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); + /* While changing insn, we must update the counts accordingly. */ + count_reg_usage (insn, counts, NULL_RTX, -1); - if (set && validate_change (insn, &SET_SRC (set), new, 0)) + if (validate_change (insn, &SET_SRC (set), new, 0)) + { + count_reg_usage (insn, counts, NULL_RTX, 1); + remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX)); + remove_note (insn, note); + return true; + } + + if (CONSTANT_P (new)) + { + new = force_const_mem (GET_MODE (SET_DEST (set)), new); + if (new && 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, note); return true; } - count_reg_usage (insn, counts, NULL_RTX, 1); } + + count_reg_usage (insn, counts, NULL_RTX, 1); return false; } |