builtins.c (expand_builtin_strstr, [...]): Replace calls to build with calls to build...
authorRoger Sayle <roger@eyesopen.com>
Sat, 22 May 2004 22:25:15 +0000 (22:25 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 22 May 2004 22:25:15 +0000 (22:25 +0000)
* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
expand_builtin_strrchr, expand_builtin_strpbrk,
expand_builtin_mempcpy, expand_builtin_memcmp,
expand_builtin_strcmp, expand_builtin_strncmp,
expand_builtin_strcat, std_expand_builtin_va_start,
std_expand_builtin_va_arg, expand_builtin_va_copy,
expand_builtin_signbit, fold_builtin_cabs,
fold_builtin_logarithm, fold_builtin_mempcpy,
fold_builtin_signbit, fold_builtin_isascii,
fold_builtin_toascii, fold_builtin_isdigit,
fold_builtin_1, build_function_call_expr,
simplify_builtin_strchr, simplify_builtin_strrchr,
simplify_builtin_strpbrk, simplify_builtin_strncpy,
simplify_builtin_memcmp, simplify_builtin_strcmp,
simplify_builtin_strncmp, simplify_builtin_strncat,
simplify_builtin_strspn, simplify_builtin_strcspn,
simplify_builtin_fputs, simplify_builtin_sprintf): Replace calls
to build with calls to build2, build3 or omit_one_operand.

From-SVN: r82151

gcc/ChangeLog
gcc/builtins.c

index ce1712b..e3a273d 100644 (file)
@@ -1,3 +1,24 @@
+2004-05-22  Roger Sayle  <roger@eyesopen.com>
+
+       * builtins.c (expand_builtin_strstr, expand_builtin_strchr,
+       expand_builtin_strrchr, expand_builtin_strpbrk,
+       expand_builtin_mempcpy, expand_builtin_memcmp,
+       expand_builtin_strcmp, expand_builtin_strncmp,
+       expand_builtin_strcat, std_expand_builtin_va_start,
+       std_expand_builtin_va_arg, expand_builtin_va_copy,
+       expand_builtin_signbit, fold_builtin_cabs,
+       fold_builtin_logarithm, fold_builtin_mempcpy,
+       fold_builtin_signbit, fold_builtin_isascii,
+       fold_builtin_toascii, fold_builtin_isdigit,
+       fold_builtin_1, build_function_call_expr,
+       simplify_builtin_strchr, simplify_builtin_strrchr,
+       simplify_builtin_strpbrk, simplify_builtin_strncpy,
+       simplify_builtin_memcmp, simplify_builtin_strcmp,
+       simplify_builtin_strncmp, simplify_builtin_strncat,
+       simplify_builtin_strspn, simplify_builtin_strcspn,
+       simplify_builtin_fputs, simplify_builtin_sprintf): Replace calls
+       to build with calls to build2, build3 or omit_one_operand.
+
 2004-05-22  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips.c (mips_file_start): Emit a .gcc_compiled_longXX
index 0357ca9..2457d66 100644 (file)
@@ -2458,7 +2458,7 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
   else
     {
       tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
-      tree fn;
+      tree fn, tmp;
       const char *p1, *p2;
 
       p2 = c_getstr (s2);
@@ -2474,10 +2474,10 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
            return const0_rtx;
 
          /* Return an offset into the constant string argument.  */
-         return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
-                                          fold_convert (TREE_TYPE (s1),
-                                                        ssize_int (r - p1)))),
-                             target, mode, EXPAND_NORMAL);
+         tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
+                             fold_convert (TREE_TYPE (s1),
+                                           ssize_int (r - p1))));
+         return expand_expr (tmp, target, mode, EXPAND_NORMAL);
        }
 
       if (p2[0] == '\0')
@@ -2522,6 +2522,7 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode)
        {
          char c;
          const char *r;
+         tree tmp;
 
          if (target_char_cast (s2, &c))
            return 0;
@@ -2532,10 +2533,10 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode)
            return const0_rtx;
 
          /* Return an offset into the constant string argument.  */
-         return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
-                                          fold_convert (TREE_TYPE (s1),
-                                                        ssize_int (r - p1)))),
-                             target, mode, EXPAND_NORMAL);
+         tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
+                             fold_convert (TREE_TYPE (s1),
+                                           ssize_int (r - p1))));
+         return expand_expr (tmp, target, mode, EXPAND_NORMAL);
        }
 
       /* FIXME: Should use here strchrM optab so that ports can optimize
@@ -2556,7 +2557,7 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode)
   else
     {
       tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
-      tree fn;
+      tree fn, tmp;
       const char *p1;
 
       if (TREE_CODE (s2) != INTEGER_CST)
@@ -2577,10 +2578,10 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode)
            return const0_rtx;
 
          /* Return an offset into the constant string argument.  */
-         return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
-                                          fold_convert (TREE_TYPE (s1),
-                                                        ssize_int (r - p1)))),
-                             target, mode, EXPAND_NORMAL);
+         tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
+                             fold_convert (TREE_TYPE (s1),
+                                           ssize_int (r - p1))));
+         return expand_expr (tmp, target, mode, EXPAND_NORMAL);
        }
 
       if (! integer_zerop (s2))
@@ -2608,7 +2609,7 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode)
   else
     {
       tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
-      tree fn;
+      tree fn, tmp;
       const char *p1, *p2;
 
       p2 = c_getstr (s2);
@@ -2624,10 +2625,10 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode)
            return const0_rtx;
 
          /* Return an offset into the constant string argument.  */
-         return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
-                                          fold_convert (TREE_TYPE (s1),
-                                                        ssize_int (r - p1)))),
-                             target, mode, EXPAND_NORMAL);
+         tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
+                             fold_convert (TREE_TYPE (s1),
+                                           ssize_int (r - p1))));
+         return expand_expr (tmp, target, mode, EXPAND_NORMAL);
        }
 
       if (p2[0] == '\0')
@@ -2812,10 +2813,10 @@ expand_builtin_mempcpy (tree arglist, rtx target, enum machine_mode mode,
            }
 
          if (endp == 2)
-           len = fold (build (MINUS_EXPR, TREE_TYPE (len), dest,
-                              integer_one_node));
+           len = fold (build2 (MINUS_EXPR, TREE_TYPE (len), len,
+                               integer_one_node));
          len = fold_convert (TREE_TYPE (dest), len);
-         expr = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, len));
+         expr = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, len));
          return expand_expr (expr, target, mode, EXPAND_NORMAL);
        }
 
@@ -3369,7 +3370,7 @@ expand_builtin_memcmp (tree exp ATTRIBUTE_UNUSED, tree arglist, rtx target,
       fold (build1 (CONVERT_EXPR, integer_type_node,
                    build1 (INDIRECT_REF, cst_uchar_node,
                            fold_convert (cst_uchar_ptr_node, arg2))));
-      tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
+      tree result = fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
       return expand_expr (result, target, mode, EXPAND_NORMAL);
     }
 
@@ -3497,7 +3498,7 @@ expand_builtin_strcmp (tree exp, rtx target, enum machine_mode mode)
        fold (build1 (CONVERT_EXPR, integer_type_node,
                      build1 (INDIRECT_REF, cst_uchar_node,
                              fold_convert (cst_uchar_ptr_node, arg2))));
-      tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
+      tree result = fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
       return expand_expr (result, target, mode, EXPAND_NORMAL);
     }
 
@@ -3662,7 +3663,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode)
        fold (build1 (CONVERT_EXPR, integer_type_node,
                      build1 (INDIRECT_REF, cst_uchar_node,
                              fold_convert (cst_uchar_ptr_node, arg2))));
-      tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
+      tree result = fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
       return expand_expr (result, target, mode, EXPAND_NORMAL);
     }
 
@@ -3721,7 +3722,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode)
       return 0;
 
     /* The actual new length parameter is MIN(len,arg3).  */
-    len = fold (build (MIN_EXPR, TREE_TYPE (len), len, arg3));
+    len = fold (build2 (MIN_EXPR, TREE_TYPE (len), len, arg3));
 
     /* If we don't have POINTER_TYPE, call the function.  */
     if (arg1_align == 0 || arg2_align == 0)
@@ -3815,7 +3816,7 @@ expand_builtin_strcat (tree arglist, rtx target, enum machine_mode mode)
                                                build_tree_list (NULL_TREE,
                                                                 dst)));
              /* Create (dst + strlen (dst)).  */
-             newdst = fold (build (PLUS_EXPR, TREE_TYPE (dst), dst, newdst));
+             newdst = fold (build2 (PLUS_EXPR, TREE_TYPE (dst), dst, newdst));
 
              /* Prepend the new dst argument.  */
              arglist = tree_cons (NULL_TREE, newdst, arglist);
@@ -4144,8 +4145,8 @@ std_expand_builtin_va_start (tree valist, rtx nextarg)
 {
   tree t;
 
-  t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
-            make_tree (ptr_type_node, nextarg));
+  t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
+             make_tree (ptr_type_node, nextarg));
   TREE_SIDE_EFFECTS (t) = 1;
 
   expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
@@ -4200,15 +4201,15 @@ std_expand_builtin_va_arg (tree valist, tree type)
     {
       if (!PAD_VARARGS_DOWN)
        {
-         t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
-                    build (PLUS_EXPR, TREE_TYPE (valist), valist,
-                           build_int_2 (boundary / BITS_PER_UNIT - 1, 0)));
+         t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
+                     build2 (PLUS_EXPR, TREE_TYPE (valist), valist,
+                             build_int_2 (boundary / BITS_PER_UNIT - 1, 0)));
          TREE_SIDE_EFFECTS (t) = 1;
          expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
        }
-      t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
-                build (BIT_AND_EXPR, TREE_TYPE (valist), valist,
-                       build_int_2 (~(boundary / BITS_PER_UNIT - 1), -1)));
+      t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
+                 build2 (BIT_AND_EXPR, TREE_TYPE (valist), valist,
+                         build_int_2 (~(boundary / BITS_PER_UNIT - 1), -1)));
       TREE_SIDE_EFFECTS (t) = 1;
       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
     }
@@ -4217,27 +4218,29 @@ std_expand_builtin_va_arg (tree valist, tree type)
       || TREE_OVERFLOW (type_size))
     rounded_size = size_zero_node;
   else
-    rounded_size = fold (build (MULT_EXPR, sizetype,
-                               fold (build (TRUNC_DIV_EXPR, sizetype,
-                                            fold (build (PLUS_EXPR, sizetype,
-                                                         type_size, alignm1)),
-                                            align)),
-                               align));
+    {
+      rounded_size = fold (build2 (PLUS_EXPR, sizetype, type_size, alignm1));
+      rounded_size = fold (build2 (TRUNC_DIV_EXPR, sizetype,
+                                  rounded_size, align));
+      rounded_size = fold (build2 (MULT_EXPR, sizetype,
+                                  rounded_size, align));
+    }
 
   /* Get AP.  */
   addr_tree = valist;
   if (PAD_VARARGS_DOWN && ! integer_zerop (rounded_size))
     {
       /* Small args are padded downward.  */
-      addr_tree = fold (build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
-                              fold (build (COND_EXPR, sizetype,
-                                           fold (build (GT_EXPR, sizetype,
-                                                        rounded_size,
-                                                        align)),
-                                           size_zero_node,
-                                           fold (build (MINUS_EXPR, sizetype,
-                                                        rounded_size,
-                                                        type_size))))));
+      addr_tree = fold (build2 (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
+                               fold (build3 (COND_EXPR, sizetype,
+                                             fold (build2 (GT_EXPR, sizetype,
+                                                           rounded_size,
+                                                           align)),
+                                             size_zero_node,
+                                             fold (build2 (MINUS_EXPR,
+                                                           sizetype,
+                                                           rounded_size,
+                                                           type_size))))));
     }
 
   addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
@@ -4246,9 +4249,9 @@ std_expand_builtin_va_arg (tree valist, tree type)
   /* Compute new value for AP.  */
   if (! integer_zerop (rounded_size))
     {
-      t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
-                build (PLUS_EXPR, TREE_TYPE (valist), valist,
-                       rounded_size));
+      t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
+                 build2 (PLUS_EXPR, TREE_TYPE (valist), valist,
+                         rounded_size));
       TREE_SIDE_EFFECTS (t) = 1;
       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
     }
@@ -4387,7 +4390,7 @@ expand_builtin_va_copy (tree arglist)
 
   if (TREE_CODE (va_list_type_node) != ARRAY_TYPE)
     {
-      t = build (MODIFY_EXPR, va_list_type_node, dst, src);
+      t = build2 (MODIFY_EXPR, va_list_type_node, dst, src);
       TREE_SIDE_EFFECTS (t) = 1;
       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
     }
@@ -5261,8 +5264,8 @@ expand_builtin_signbit (tree exp, rtx target)
     if (fmt->has_signed_zero && HONOR_SIGNED_ZEROS (fmode))
       return 0;
 
-    arg = fold (build (LT_EXPR, TREE_TYPE (exp), arg,
-               build_real (TREE_TYPE (arg), dconst0)));
+    arg = fold (build2 (LT_EXPR, TREE_TYPE (exp), arg,
+                       build_real (TREE_TYPE (arg), dconst0)));
     return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
   }
 
@@ -6458,11 +6461,11 @@ fold_builtin_cabs (tree arglist, tree type)
          rpart = builtin_save_expr (rpart);
          ipart = builtin_save_expr (ipart);
 
-         result = fold (build (PLUS_EXPR, type,
-                               fold (build (MULT_EXPR, type,
-                                            rpart, rpart)),
-                               fold (build (MULT_EXPR, type,
-                                            ipart, ipart))));
+         result = fold (build2 (PLUS_EXPR, type,
+                                fold (build2 (MULT_EXPR, type,
+                                              rpart, rpart)),
+                                fold (build2 (MULT_EXPR, type,
+                                              ipart, ipart))));
 
          arglist = build_tree_list (NULL_TREE, result);
          return build_function_call_expr (sqrtfn, arglist);
@@ -6864,7 +6867,7 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value)
              tree logfn;
              arglist = build_tree_list (NULL_TREE, x);
              logfn = build_function_call_expr (fndecl, arglist);
-             return fold (build (MULT_EXPR, type, exponent, logfn));
+             return fold (build2 (MULT_EXPR, type, exponent, logfn));
            }
        }
     }
@@ -6999,7 +7002,7 @@ fold_builtin_mempcpy (tree exp)
   if (operand_equal_p (src, dest, 0))
     {
       tree temp = fold_convert (TREE_TYPE (dest), len);
-      temp = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, temp));
+      temp = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, temp));
       return fold_convert (TREE_TYPE (exp), temp);
     }
 
@@ -7231,8 +7234,8 @@ fold_builtin_signbit (tree exp)
 
   /* If ARG's format doesn't have signed zeros, return "arg < 0.0".  */
   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg))))
-    return fold (build (LT_EXPR, TREE_TYPE (exp), arg,
-                       build_real (TREE_TYPE (arg), dconst0)));
+    return fold (build2 (LT_EXPR, TREE_TYPE (exp), arg,
+                        build_real (TREE_TYPE (arg), dconst0)));
 
   return NULL_TREE;
 }
@@ -7249,11 +7252,11 @@ fold_builtin_isascii (tree arglist)
       /* Transform isascii(c) -> ((c & ~0x7f) == 0).  */
       tree arg = TREE_VALUE (arglist);
       
-      arg = fold (build (EQ_EXPR, integer_type_node,
-                        build (BIT_AND_EXPR, integer_type_node, arg,
-                               build_int_2 (~ (unsigned HOST_WIDE_INT) 0x7f,
-                                            ~ (HOST_WIDE_INT) 0)),
-                        integer_zero_node));
+      arg = fold (build2 (EQ_EXPR, integer_type_node,
+                         build2 (BIT_AND_EXPR, integer_type_node, arg,
+                                 build_int_2 (~ (unsigned HOST_WIDE_INT) 0x7f,
+                                              ~ (HOST_WIDE_INT) 0)),
+                         integer_zero_node));
       
       if (in_gimple_form && !TREE_CONSTANT (arg))
         return NULL_TREE;
@@ -7274,8 +7277,8 @@ fold_builtin_toascii (tree arglist)
       /* Transform toascii(c) -> (c & 0x7f).  */
       tree arg = TREE_VALUE (arglist);
       
-      return fold (build (BIT_AND_EXPR, integer_type_node, arg,
-                         build_int_2 (0x7f, 0)));
+      return fold (build2 (BIT_AND_EXPR, integer_type_node, arg,
+                          build_int_2 (0x7f, 0)));
     }
 }
 
@@ -7292,11 +7295,11 @@ fold_builtin_isdigit (tree arglist)
       /* According to the C standard, isdigit is unaffected by locale.  */
       tree arg = TREE_VALUE (arglist);
       arg = fold_convert (unsigned_type_node, arg);
-      arg = build (MINUS_EXPR, unsigned_type_node, arg,
-                  fold_convert (unsigned_type_node,
-                                build_int_2 (TARGET_DIGIT0, 0)));
-      arg = build (LE_EXPR, integer_type_node, arg,
-                  fold_convert (unsigned_type_node, build_int_2 (9, 0)));
+      arg = build2 (MINUS_EXPR, unsigned_type_node, arg,
+                   fold_convert (unsigned_type_node,
+                                 build_int_2 (TARGET_DIGIT0, 0)));
+      arg = build2 (LE_EXPR, integer_type_node, arg,
+                   fold_convert (unsigned_type_node, build_int_2 (9, 0)));
       arg = fold (arg);
       if (in_gimple_form && !TREE_CONSTANT (arg))
         return NULL_TREE;
@@ -7380,9 +7383,9 @@ fold_builtin_1 (tree exp)
          if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
            {
              tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
-             arg = fold (build (MULT_EXPR, type,
-                                TREE_VALUE (TREE_OPERAND (arg, 1)),
-                                build_real (type, dconsthalf)));
+             arg = fold (build2 (MULT_EXPR, type,
+                                 TREE_VALUE (TREE_OPERAND (arg, 1)),
+                                 build_real (type, dconsthalf)));
              arglist = build_tree_list (NULL_TREE, arg);
              return build_function_call_expr (expfn, arglist);
            }
@@ -7419,8 +7422,8 @@ fold_builtin_1 (tree exp)
              tree powfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
              tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1));
              tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1)));
-             tree narg1 = fold (build (MULT_EXPR, type, arg1,
-                                       build_real (type, dconsthalf)));
+             tree narg1 = fold (build2 (MULT_EXPR, type, arg1,
+                                        build_real (type, dconsthalf)));
              arglist = tree_cons (NULL_TREE, arg0,
                                   build_tree_list (NULL_TREE, narg1));
              return build_function_call_expr (powfn, arglist);
@@ -7446,9 +7449,9 @@ fold_builtin_1 (tree exp)
              tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
              const REAL_VALUE_TYPE third_trunc =
                real_value_truncate (TYPE_MODE (type), dconstthird);
-             arg = fold (build (MULT_EXPR, type,
-                                TREE_VALUE (TREE_OPERAND (arg, 1)),
-                                build_real (type, third_trunc)));
+             arg = fold (build2 (MULT_EXPR, type,
+                                 TREE_VALUE (TREE_OPERAND (arg, 1)),
+                                 build_real (type, third_trunc)));
              arglist = build_tree_list (NULL_TREE, arg);
              return build_function_call_expr (expfn, arglist);
            }
@@ -7618,9 +7621,8 @@ fold_builtin_1 (tree exp)
 
              /* Optimize pow(x,-1.0) = 1.0/x.  */
              if (REAL_VALUES_EQUAL (c, dconstm1))
-               return fold (build (RDIV_EXPR, type,
-                                   build_real (type, dconst1),
-                                   arg0));
+               return fold (build2 (RDIV_EXPR, type,
+                                    build_real (type, dconst1), arg0));
 
              /* Optimize pow(x,0.5) = sqrt(x).  */
              if (flag_unsafe_math_optimizations
@@ -7664,7 +7666,7 @@ fold_builtin_1 (tree exp)
            {
              tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
              tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
-             arg = fold (build (MULT_EXPR, type, arg, arg1));
+             arg = fold (build2 (MULT_EXPR, type, arg, arg1));
              arglist = build_tree_list (NULL_TREE, arg);
              return build_function_call_expr (expfn, arglist);
            }
@@ -7673,8 +7675,8 @@ fold_builtin_1 (tree exp)
          if (flag_unsafe_math_optimizations && BUILTIN_SQRT_P (fcode))
            {
              tree narg0 = TREE_VALUE (TREE_OPERAND (arg0, 1));
-             tree narg1 = fold (build (MULT_EXPR, type, arg1,
-                                       build_real (type, dconsthalf)));
+             tree narg1 = fold (build2 (MULT_EXPR, type, arg1,
+                                        build_real (type, dconsthalf)));
 
              arglist = tree_cons (NULL_TREE, narg0,
                                   build_tree_list (NULL_TREE, narg1));
@@ -7689,7 +7691,7 @@ fold_builtin_1 (tree exp)
            {
              tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
              tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
-             tree narg1 = fold (build (MULT_EXPR, type, arg01, arg1));
+             tree narg1 = fold (build2 (MULT_EXPR, type, arg01, arg1));
              arglist = tree_cons (NULL_TREE, arg00,
                                   build_tree_list (NULL_TREE, narg1));
              return build_function_call_expr (fndecl, arglist);
@@ -7849,8 +7851,8 @@ build_function_call_expr (tree fn, tree arglist)
   tree call_expr;
 
   call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
-  call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
-                    call_expr, arglist, NULL_TREE);
+  call_expr = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
+                     call_expr, arglist, NULL_TREE);
   return fold (call_expr);
 }
 
@@ -8133,9 +8135,9 @@ simplify_builtin_strchr (tree arglist)
            return fold_convert (TREE_TYPE (s1), integer_zero_node);
 
          /* Return an offset into the constant string argument.  */
-         return fold (build (PLUS_EXPR, TREE_TYPE (s1),
-                             s1, fold_convert (TREE_TYPE (s1),
-                                               ssize_int (r - p1))));
+         return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
+                              s1, fold_convert (TREE_TYPE (s1),
+                                                ssize_int (r - p1))));
        }
 
       /* FIXME: Should use here strchrM optab so that ports can optimize
@@ -8190,9 +8192,9 @@ simplify_builtin_strrchr (tree arglist)
            return fold_convert (TREE_TYPE (s1), integer_zero_node);
 
          /* Return an offset into the constant string argument.  */
-         return fold (build (PLUS_EXPR, TREE_TYPE (s1),
-                             s1, fold_convert (TREE_TYPE (s1),
-                                               ssize_int (r - p1))));
+         return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
+                              s1, fold_convert (TREE_TYPE (s1),
+                                                ssize_int (r - p1))));
        }
 
       if (! integer_zerop (s2))
@@ -8248,19 +8250,15 @@ simplify_builtin_strpbrk (tree arglist)
            return fold_convert (TREE_TYPE (s1), integer_zero_node);
 
          /* Return an offset into the constant string argument.  */
-         return fold (build (PLUS_EXPR, TREE_TYPE (s1),
-                             s1, fold_convert (TREE_TYPE (s1),
-                                               ssize_int (r - p1))));
+         return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
+                              s1, fold_convert (TREE_TYPE (s1),
+                                                ssize_int (r - p1))));
        }
 
       if (p2[0] == '\0')
-       {
-         /* strpbrk(x, "") == NULL.
-            Evaluate and ignore the arguments in case they had
-            side-effects.  */
-         return build (COMPOUND_EXPR, integer_type_node, s1,
-                       integer_zero_node);
-       }
+       /* strpbrk(x, "") == NULL.
+          Evaluate and ignore s1 in case it had side-effects.  */
+       return omit_one_operand (TREE_TYPE (s1), integer_zero_node, s1);
 
       if (p2[1] != '\0')
        return 0;  /* Really call strpbrk.  */
@@ -8358,13 +8356,11 @@ simplify_builtin_strncpy (tree arglist, tree slen)
 
       /* If the len parameter is zero, return the dst parameter.  */
       if (integer_zerop (len))
-       {
-         /* Evaluate and ignore the src argument in case it has
-            side-effects and return the dst parameter.  */
-         return build (COMPOUND_EXPR, TREE_TYPE (TREE_VALUE (arglist)),
-                       TREE_VALUE (TREE_CHAIN (arglist)),
-                       TREE_VALUE (arglist));
-       }
+       /* Evaluate and ignore the src argument in case it has
+          side-effects and return the dst parameter.  */
+       return omit_one_operand (TREE_TYPE (TREE_VALUE (arglist)),
+                                TREE_VALUE (arglist),
+                                TREE_VALUE (TREE_CHAIN (arglist)));
 
       if (!slen)
         slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)), 0);
@@ -8425,9 +8421,9 @@ simplify_builtin_memcmp (tree arglist)
     {
       /* Evaluate and ignore arg1 and arg2 in case they have
          side-effects.  */
-      return build (COMPOUND_EXPR, integer_type_node, arg1,
-                   build (COMPOUND_EXPR, integer_type_node,
-                          arg2, integer_zero_node));
+      return build2 (COMPOUND_EXPR, integer_type_node, arg1,
+                    build2 (COMPOUND_EXPR, integer_type_node,
+                            arg2, integer_zero_node));
     }
 
   p1 = c_getstr (arg1);
@@ -8460,7 +8456,7 @@ simplify_builtin_memcmp (tree arglist)
       fold (build1 (CONVERT_EXPR, integer_type_node,
                    build1 (INDIRECT_REF, cst_uchar_node,
                            build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
-      return fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
+      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
     }
 
   return 0;
@@ -8524,7 +8520,7 @@ simplify_builtin_strcmp (tree arglist)
        fold (build1 (CONVERT_EXPR, integer_type_node,
                      build1 (INDIRECT_REF, cst_uchar_node,
                              build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
-      return fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
+      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
     }
 
   return 0;
@@ -8566,17 +8562,15 @@ simplify_builtin_strncmp (tree arglist)
     {
       /* Evaluate and ignore arg1 and arg2 in case they have
         side-effects.  */
-      return build (COMPOUND_EXPR, integer_type_node, arg1,
-                   build (COMPOUND_EXPR, integer_type_node,
-                          arg2, integer_zero_node));
+      return build2 (COMPOUND_EXPR, integer_type_node, arg1,
+                    build2 (COMPOUND_EXPR, integer_type_node,
+                            arg2, integer_zero_node));
     }
 
   /* If arg1 and arg2 are equal (and not volatile), return zero.  */
   if (operand_equal_p (arg1, arg2, 0))
-    {
-      /* Evaluate and ignore arg3 in case it has side-effects.  */
-      return build (COMPOUND_EXPR, integer_type_node, arg3, integer_zero_node);
-    }
+    /* Evaluate and ignore arg3 in case it has side-effects.  */
+    return omit_one_operand (integer_type_node, integer_zero_node, arg3);
 
   p1 = c_getstr (arg1);
   p2 = c_getstr (arg2);
@@ -8607,7 +8601,7 @@ simplify_builtin_strncmp (tree arglist)
        fold (build1 (CONVERT_EXPR, integer_type_node,
                      build1 (INDIRECT_REF, cst_uchar_node,
                              build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
-      return fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
+      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
     }
 
   return 0;
@@ -8682,8 +8676,8 @@ simplify_builtin_strncat (tree arglist)
       /* If the requested length is zero, or the src parameter string
           length is zero, return the dst parameter.  */
       if (integer_zerop (len) || (p && *p == '\0'))
-       return build (COMPOUND_EXPR, TREE_TYPE (dst), src,
-                     build (COMPOUND_EXPR, integer_type_node, len, dst));
+       return build2 (COMPOUND_EXPR, TREE_TYPE (dst), src,
+                      build2 (COMPOUND_EXPR, integer_type_node, len, dst));
 
       /* If the requested len is greater than or equal to the string
          length, call strcat.  */
@@ -8744,9 +8738,9 @@ simplify_builtin_strspn (tree arglist)
        {
          /* Evaluate and ignore both arguments in case either one has
             side-effects.  */
-         return build (COMPOUND_EXPR, integer_type_node, s1,
-                       build (COMPOUND_EXPR, integer_type_node,
-                              s2, integer_zero_node));
+         return build2 (COMPOUND_EXPR, integer_type_node, s1,
+                        build2 (COMPOUND_EXPR, integer_type_node,
+                                s2, integer_zero_node));
        }
       return 0;
     }
@@ -8791,8 +8785,8 @@ simplify_builtin_strcspn (tree arglist)
        {
          /* Evaluate and ignore argument s2 in case it has
             side-effects.  */
-         return build (COMPOUND_EXPR, integer_type_node,
-                       s2, integer_zero_node);
+         return omit_one_operand (integer_type_node,
+                                  integer_zero_node, s2);
        }
 
       /* If the second argument is "", return __builtin_strlen(s1).  */
@@ -8862,10 +8856,9 @@ simplify_builtin_fputs (tree arglist, int ignore, int unlocked, tree known_len)
   switch (compare_tree_int (len, 1))
     {
     case -1: /* length is 0, delete the call entirely .  */
-      {
-       return build (COMPOUND_EXPR, integer_type_node,
-                     TREE_VALUE (TREE_CHAIN (arglist)), integer_zero_node);
-      }
+      return omit_one_operand (integer_type_node, integer_zero_node,
+                              TREE_VALUE (TREE_CHAIN (arglist)));
+
     case 0: /* length is 1, call fputc.  */
       {
        const char *p = c_getstr (TREE_VALUE (arglist));
@@ -9028,7 +9021,7 @@ simplify_builtin_sprintf (tree arglist, int ignored)
       retval = convert
        (TREE_TYPE (TREE_TYPE (implicit_built_in_decls[BUILT_IN_SPRINTF])),
         retval);
-      return build (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
+      return build2 (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
     }
   else
     return call;