Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c	(revision 214097)
+++ gcc/gimple-fold.c	(working copy)
@@ -5156,11 +5224,12 @@ gimple_build (gimple_seq *seq, location_
   return res;
 }
 
-/* Build the expression CODE OP0 of type TYPE with location LOC,
+/* Build the call FN (ARG0) with a result of type TYPE
+   (or no result if TYPE is void) with location LOC,
    simplifying it first if possible using VALUEIZE if not NULL.
-   OP0 is expected to be valueized already.  Returns the built
-   expression value and appends statements possibly defining it
-   to SEQ.  */
+   ARG0 is expected to be valueized already.  Returns the built
+   expression value (or NULL_TREE if TYPE is void) and appends
+   statements possibly defining it to SEQ.  */
 
 tree
 gimple_build (gimple_seq *seq, location_t loc,
@@ -5170,13 +5239,79 @@ gimple_build (gimple_seq *seq, location_
   tree res = gimple_simplify (fn, type, arg0, seq, valueize);
   if (!res)
     {
-      if (gimple_in_ssa_p (cfun))
-	res = make_ssa_name (type, NULL);
-      else
-	res = create_tmp_reg (type, NULL);
       tree decl = builtin_decl_implicit (fn);
       gimple stmt = gimple_build_call (decl, 1, arg0);
-      gimple_call_set_lhs (stmt, res);
+      if (!VOID_TYPE_P (type))
+	{
+	  if (gimple_in_ssa_p (cfun))
+	    res = make_ssa_name (type, NULL);
+	  else
+	    res = create_tmp_reg (type, NULL);
+	  gimple_call_set_lhs (stmt, res);
+	}
+      gimple_set_location (stmt, loc);
+      gimple_seq_add_stmt_without_update (seq, stmt);
+    }
+  return res;
+}
+
+/* Build the call FN (ARG0, ARG1) with a result of type TYPE
+   (or no result if TYPE is void) with location LOC,
+   simplifying it first if possible using VALUEIZE if not NULL.
+   ARG0 is expected to be valueized already.  Returns the built
+   expression value (or NULL_TREE if TYPE is void) and appends
+   statements possibly defining it to SEQ.  */
+
+tree
+gimple_build (gimple_seq *seq, location_t loc,
+	      enum built_in_function fn, tree type, tree arg0, tree arg1,
+	      tree (*valueize)(tree))
+{
+  tree res = gimple_simplify (fn, type, arg0, arg1, seq, valueize);
+  if (!res)
+    {
+      tree decl = builtin_decl_implicit (fn);
+      gimple stmt = gimple_build_call (decl, 2, arg0, arg1);
+      if (!VOID_TYPE_P (type))
+	{
+	  if (gimple_in_ssa_p (cfun))
+	    res = make_ssa_name (type, NULL);
+	  else
+	    res = create_tmp_reg (type, NULL);
+	  gimple_call_set_lhs (stmt, res);
+	}
+      gimple_set_location (stmt, loc);
+      gimple_seq_add_stmt_without_update (seq, stmt);
+    }
+  return res;
+}
+
+/* Build the call FN (ARG0, ARG1, ARG2) with a result of type TYPE
+   (or no result if TYPE is void) with location LOC,
+   simplifying it first if possible using VALUEIZE if not NULL.
+   ARG0 is expected to be valueized already.  Returns the built
+   expression value (or NULL_TREE if TYPE is void) and appends
+   statements possibly defining it to SEQ.  */
+
+tree
+gimple_build (gimple_seq *seq, location_t loc,
+	      enum built_in_function fn, tree type,
+	      tree arg0, tree arg1, tree arg2,
+	      tree (*valueize)(tree))
+{
+  tree res = gimple_simplify (fn, type, arg0, arg1, arg2, seq, valueize);
+  if (!res)
+    {
+      tree decl = builtin_decl_implicit (fn);
+      gimple stmt = gimple_build_call (decl, 3, arg0, arg1, arg2);
+      if (!VOID_TYPE_P (type))
+	{
+	  if (gimple_in_ssa_p (cfun))
+	    res = make_ssa_name (type, NULL);
+	  else
+	    res = create_tmp_reg (type, NULL);
+	  gimple_call_set_lhs (stmt, res);
+	}
       gimple_set_location (stmt, loc);
       gimple_seq_add_stmt_without_update (seq, stmt);
     }
Index: gcc/gimple-fold.h
===================================================================
--- gcc/gimple-fold.h	(revision 214097)
+++ gcc/gimple-fold.h	(working copy)
@@ -85,7 +85,25 @@ gimple_build (gimple_seq *seq,
 {
   return gimple_build (seq, UNKNOWN_LOCATION, fn, type, arg0);
 }
-
+tree gimple_build (gimple_seq *, location_t,
+		   enum built_in_function, tree, tree, tree,
+		   tree (*valueize) (tree) = NULL);
+inline tree
+gimple_build (gimple_seq *seq,
+	      enum built_in_function fn, tree type, tree arg0, tree arg1)
+{
+  return gimple_build (seq, UNKNOWN_LOCATION, fn, type, arg0, arg1);
+}
+tree gimple_build (gimple_seq *, location_t,
+		   enum built_in_function, tree, tree, tree, tree,
+		   tree (*valueize) (tree) = NULL);
+inline tree
+gimple_build (gimple_seq *seq,
+	      enum built_in_function fn, tree type,
+	      tree arg0, tree arg1, tree arg2)
+{
+  return gimple_build (seq, UNKNOWN_LOCATION, fn, type, arg0, arg1, arg2);
+}
 
 /* ???  Forward from gimple-expr.h.  */
 extern bool useless_type_conversion_p (tree, tree);
