diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-25 11:58:18 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-25 11:58:18 +0000 |
commit | ad6cd748f6034a03afff09c37e25d8be617d703a (patch) | |
tree | 2ea11ece9f86e4a8241ad5cea1e2da5c18fbd69c /gcc/gcse.c | |
parent | eec9c06d24dabd621190ce6659da7c73512af1e3 (diff) | |
download | gcc-ad6cd748f6034a03afff09c37e25d8be617d703a.tar.gz |
2008-05-25 Steven Bosscher <stevenb.gcc@gmail.com>
* gcse.c (hash_scan_set): Do not pick up a REG_EQUAL value if
SRC is a REG.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@135860 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r-- | gcc/gcse.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/gcse.c b/gcc/gcse.c index 77efc44769b..f6837bf1f60 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -1692,12 +1692,25 @@ hash_scan_set (rtx pat, rtx insn, struct hash_table *table) unsigned int regno = REGNO (dest); rtx tmp; - /* See if a REG_NOTE shows this equivalent to a simpler expression. + /* See if a REG_EQUAL note shows this equivalent to a simpler expression. + This allows us to do a single GCSE pass and still eliminate redundant constants, addresses or other expressions that are - constructed with multiple instructions. */ + constructed with multiple instructions. + + However, keep the original SRC if INSN is a simple reg-reg move. In + In this case, there will almost always be a REG_EQUAL note on the + insn that sets SRC. By recording the REG_EQUAL value here as SRC + for INSN, we miss copy propagation opportunities and we perform the + same PRE GCSE operation repeatedly on the same REG_EQUAL value if we + do more than one PRE GCSE pass. + + Note that this does not impede profitale constant propagations. We + "look through" reg-reg sets in lookup_avail_set. */ note = find_reg_equal_equiv_note (insn); if (note != 0 + && REG_NOTE_KIND (note) == REG_EQUAL + && !REG_P (src) && (table->set_p ? gcse_constant_p (XEXP (note, 0)) : want_to_gcse_p (XEXP (note, 0)))) |