cse.c: (find_best_addr): Don't call copy_rtx before calling fold_rtx.
authorArend Bayer <arend.bayer@web.de>
Thu, 27 Jan 2005 23:00:19 +0000 (23:00 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Thu, 27 Jan 2005 23:00:19 +0000 (23:00 +0000)
* 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.

Co-Authored-By: Kazu Hirata <kazu@cs.umass.edu>
From-SVN: r94345

gcc/ChangeLog
gcc/cse.c

index 6689e89996e6c0083746b280644cd8c86445fda0..0d063b0e3c854dcb763c871a1662726f01520eed 100644 (file)
@@ -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
index febf243f9326832b9e7dff941a1a94012cf45f14..54d184aa29566c929e02616a0e85b2b4cf7070f6 100644 (file)
--- 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: