diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6689e89996e6c0083746b280644cd8c86445fda0..0d063b0e3c854dcb763c871a1662726f01520eed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-01-27 Arend Bayer <arend.bayer@web.de> + Kazu Hirata <kazu@cs.umass.edu> + + * cse.c: (find_best_addr): Don't call copy_rtx before calling + fold_rtx. Save cost recomputation if fold_rtx did nothing. + (fold_rtx) <ASM_OPERANDS>: Don't do anything if INSN is + NULL_RTX. + 2005-01-27 Jeff Law <law@redhat.com> * tree-into-ssa.c (ssa_rewrite_initialize_block): Do not register diff --git a/gcc/cse.c b/gcc/cse.c index febf243f9326832b9e7dff941a1a94012cf45f14..54d184aa29566c929e02616a0e85b2b4cf7070f6 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -2844,18 +2844,21 @@ find_best_addr (rtx insn, rtx *loc, enum machine_mode mode) be valid and produce better code. */ if (!REG_P (addr)) { - rtx folded = fold_rtx (copy_rtx (addr), NULL_RTX); - int addr_folded_cost = address_cost (folded, mode); - int addr_cost = address_cost (addr, mode); - - if ((addr_folded_cost < addr_cost - || (addr_folded_cost == addr_cost - /* ??? The rtx_cost comparison is left over from an older - version of this code. It is probably no longer helpful. */ - && (rtx_cost (folded, MEM) > rtx_cost (addr, MEM) - || approx_reg_cost (folded) < approx_reg_cost (addr)))) - && validate_change (insn, loc, folded, 0)) - addr = folded; + rtx folded = fold_rtx (addr, NULL_RTX); + if (folded != addr) + { + int addr_folded_cost = address_cost (folded, mode); + int addr_cost = address_cost (addr, mode); + + if ((addr_folded_cost < addr_cost + || (addr_folded_cost == addr_cost + /* ??? The rtx_cost comparison is left over from an older + version of this code. It is probably no longer helpful.*/ + && (rtx_cost (folded, MEM) > rtx_cost (addr, MEM) + || approx_reg_cost (folded) < approx_reg_cost (addr)))) + && validate_change (insn, loc, folded, 0)) + addr = folded; + } } /* If this address is not in the hash table, we can't look for equivalences @@ -3608,9 +3611,12 @@ fold_rtx (rtx x, rtx insn) #endif case ASM_OPERANDS: - for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--) - validate_change (insn, &ASM_OPERANDS_INPUT (x, i), - fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0); + if (insn) + { + for (i = ASM_OPERANDS_INPUT_LENGTH (x) - 1; i >= 0; i--) + validate_change (insn, &ASM_OPERANDS_INPUT (x, i), + fold_rtx (ASM_OPERANDS_INPUT (x, i), insn), 0); + } break; default: