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: