summaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1995-12-27 20:25:35 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1995-12-27 20:25:35 +0000
commit5ce7a146b86564a9552c4a0c822552423f1ed46b (patch)
tree17a05e7405285b9216834c4e1a84e81c1a4f40ee /gcc/cse.c
parentd1b3a94da1b2834245104caccbb687fbe952ef6b (diff)
downloadgcc-5ce7a146b86564a9552c4a0c822552423f1ed46b.tar.gz
(find_best_addr): Make sure folded address better before using.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@10873 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index efd05dedaf9..fd086c5f778 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2660,9 +2660,21 @@ find_best_addr (insn, loc)
sometimes simplify the expression. Many simplifications
will not be valid, but some, usually applying the associative rule, will
be valid and produce better code. */
- if (GET_CODE (addr) != REG
- && validate_change (insn, loc, fold_rtx (addr, insn), 0))
- addr = *loc;
+ if (GET_CODE (addr) != REG)
+ {
+ rtx folded = fold_rtx (copy_rtx (addr), NULL_RTX);
+
+ if (1
+#ifdef ADDRESS_COST
+ && (ADDRESS_COST (folded) < ADDRESS_COST (addr)
+ || (ADDRESS_COST (folded) == ADDRESS_COST (addr)
+ && rtx_cost (folded) > rtx_cost (addr)))
+#else
+ && rtx_cost (folded) < rtx_cost (addr)
+#endif
+ && validate_change (insn, loc, folded, 0))
+ addr = folded;
+ }
/* If this address is not in the hash table, we can't look for equivalences
of the whole address. Also, ignore if volatile. */