diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1995-12-27 20:25:35 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1995-12-27 20:25:35 +0000 |
commit | 5ce7a146b86564a9552c4a0c822552423f1ed46b (patch) | |
tree | 17a05e7405285b9216834c4e1a84e81c1a4f40ee /gcc/cse.c | |
parent | d1b3a94da1b2834245104caccbb687fbe952ef6b (diff) | |
download | gcc-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.c | 18 |
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. */ |