summaryrefslogtreecommitdiff
path: root/gcc/gcse.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-25 11:58:18 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-25 11:58:18 +0000
commitad6cd748f6034a03afff09c37e25d8be617d703a (patch)
tree2ea11ece9f86e4a8241ad5cea1e2da5c18fbd69c /gcc/gcse.c
parenteec9c06d24dabd621190ce6659da7c73512af1e3 (diff)
downloadgcc-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.c17
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))))