diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1a723feafa5..5ccf583e483 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2005-04-11  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	* fold-const.c (fold_binary_op_with_conditional_arg):
+	use fold_buildN instead of "fold (buildN" in some
+	non obvious places.
+	(fold_unary): Likewise.
+	(fold_binary): Likewise.
+
 2005-04-11  Daniel Berlin  <dberlin@dberlin.org>
 	
 	Fix PR tree-optimization/20612
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 061e92a3b4d..9487d3c4970 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -5519,14 +5519,18 @@ fold_binary_op_with_conditional_arg (enum tree_code code,
   if (lhs == 0)
     {
       true_value = fold_convert (cond_type, true_value);
-      lhs = fold (cond_first_p ? build2 (code, type, true_value, arg)
-			     : build2 (code, type, arg, true_value));
+      if (cond_first_p)
+	lhs = fold_build2 (code, type, true_value, arg);
+      else
+	lhs = fold_build2 (code, type, arg, true_value);
     }
   if (rhs == 0)
     {
       false_value = fold_convert (cond_type, false_value);
-      rhs = fold (cond_first_p ? build2 (code, type, false_value, arg)
-			     : build2 (code, type, arg, false_value));
+      if (cond_first_p)
+	rhs = fold_build2 (code, type, false_value, arg);
+      else
+	rhs = fold_build2 (code, type, arg, false_value);
     }
 
   test = fold_build3 (COND_EXPR, type, test, lhs, rhs);
@@ -6856,9 +6860,9 @@ fold_unary (enum tree_code code, tree type, tree op0)
 	{
 	  /* Don't leave an assignment inside a conversion
 	     unless assigning a bitfield.  */
-	  tem = build1 (code, type, TREE_OPERAND (op0, 1));
+	  tem = fold_build1 (code, type, TREE_OPERAND (op0, 1));
 	  /* First do the assignment, then return converted constant.  */
-	  tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, fold (tem));
+	  tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem), op0, tem);
 	  TREE_NO_WARNING (tem) = 1;
 	  TREE_USED (tem) = 1;
 	  return tem;
@@ -7949,10 +7953,10 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
 	      if (fcode0 == fcode1 && BUILTIN_EXPONENT_P (fcode0))
 		{
 		  tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
-		  tree arg = build2 (PLUS_EXPR, type,
-				     TREE_VALUE (TREE_OPERAND (arg0, 1)),
-				     TREE_VALUE (TREE_OPERAND (arg1, 1)));
-		  tree arglist = build_tree_list (NULL_TREE, fold (arg));
+		  tree arg = fold_build2 (PLUS_EXPR, type,
+					  TREE_VALUE (TREE_OPERAND (arg0, 1)),
+					  TREE_VALUE (TREE_OPERAND (arg1, 1)));
+		  tree arglist = build_tree_list (NULL_TREE, arg);
 		  return build_function_call_expr (expfn, arglist);
 		}
 
@@ -7972,8 +7976,8 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
 		  if (operand_equal_p (arg01, arg11, 0))
 		    {
 		      tree powfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
-		      tree arg = build2 (MULT_EXPR, type, arg00, arg10);
-		      tree arglist = tree_cons (NULL_TREE, fold (arg),
+		      tree arg = fold_build2 (MULT_EXPR, type, arg00, arg10);
+		      tree arglist = tree_cons (NULL_TREE, arg,
 						build_tree_list (NULL_TREE,
 								 arg01));
 		      return build_function_call_expr (powfn, arglist);
@@ -9543,11 +9547,10 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
 		      return omit_one_operand (type, integer_one_node, arg0);
 		    }
 
-		  tem = build2 (code, type, cval1, cval2);
 		  if (save_p)
-		    return save_expr (tem);
+		    return save_expr (build2 (code, type, cval1, cval2));
 		  else
-		    return fold (tem);
+		    return fold_build2 (code, type, cval1, cval2);
 		}
 	    }
 	}