OSDN Git Service

* doc/invoke.texi (-mfix-and-continue): Add support for
[pf3gnuchains/gcc-fork.git] / gcc / builtins.c
index 5b2a63f..65028cf 100644 (file)
@@ -170,9 +170,6 @@ static tree fold_builtin_abs (tree, tree);
 static tree fold_builtin_unordered_cmp (tree, enum tree_code, enum tree_code);
 static tree fold_builtin_1 (tree, bool);
 
-static tree simplify_builtin_memcmp (tree);
-static tree simplify_builtin_strcmp (tree);
-static tree simplify_builtin_strncmp (tree);
 static tree simplify_builtin_strpbrk (tree);
 static tree simplify_builtin_strstr (tree);
 static tree simplify_builtin_strchr (tree);
@@ -524,8 +521,6 @@ expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label)
 
   buf_addr = force_reg (Pmode, force_operand (buf_addr, NULL_RTX));
 
-  emit_queue ();
-
   /* We store the frame pointer and the address of receiver_label in
      the buffer and use the rest of it for the stack save area, which
      is machine-dependent.  */
@@ -576,8 +571,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
   emit_insn (gen_rtx_CLOBBER (VOIDmode, static_chain_rtx));
 
   /* Now put in the code to restore the frame pointer, and argument
-     pointer, if needed.  The code below is from expand_end_bindings
-     in stmt.c; see detailed documentation there.  */
+     pointer, if needed.  */
 #ifdef HAVE_nonlocal_goto
   if (! HAVE_nonlocal_goto)
 #endif
@@ -794,7 +788,9 @@ expand_builtin_nonlocal_goto (tree arglist)
   t_save_area = TREE_VALUE (arglist);
 
   r_label = expand_expr (t_label, NULL_RTX, VOIDmode, 0);
+  r_label = convert_memory_address (Pmode, r_label);
   r_save_area = expand_expr (t_save_area, NULL_RTX, VOIDmode, 0);
+  r_save_area = convert_memory_address (Pmode, r_save_area);
   r_fp = gen_rtx_MEM (Pmode, r_save_area);
   r_sp = gen_rtx_MEM (STACK_SAVEAREA_MODE (SAVE_NONLOCAL),
                      plus_constant (r_save_area, GET_MODE_SIZE (Pmode)));
@@ -817,7 +813,7 @@ expand_builtin_nonlocal_goto (tree arglist)
       emit_insn (gen_rtx_CLOBBER (VOIDmode,
                                  gen_rtx_MEM (BLKmode,
                                               hard_frame_pointer_rtx)));
+
       /* Restore frame pointer for containing function.
         This sets the actual hard register used for the frame pointer
         to the location of the function's incoming static chain info.
@@ -825,14 +821,14 @@ expand_builtin_nonlocal_goto (tree arglist)
         proper value and reload the argument pointer, if needed.  */
       emit_move_insn (hard_frame_pointer_rtx, r_fp);
       emit_stack_restore (SAVE_NONLOCAL, r_sp, NULL_RTX);
+
       /* USE of hard_frame_pointer_rtx added for consistency;
         not clear if really needed.  */
       emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
       emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
       emit_indirect_jump (r_label);
     }
+
   /* Search backwards to the jump insn and mark it as a
      non-local goto.  */
   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
@@ -907,12 +903,12 @@ expand_builtin_prefetch (tree arglist)
       if (TREE_CHAIN (TREE_CHAIN (arglist)))
        arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
       else
-       arg2 = build_int_2 (3, 0);
+       arg2 = build_int_cst (NULL_TREE, 3, 0);
     }
   else
     {
       arg1 = integer_zero_node;
-      arg2 = build_int_2 (3, 0);
+      arg2 = build_int_cst (NULL_TREE, 3, 0);
     }
 
   /* Argument 0 is an address.  */
@@ -959,9 +955,8 @@ expand_builtin_prefetch (tree arglist)
        }
       emit_insn (gen_prefetch (op0, op1, op2));
     }
-  else
 #endif
-    op0 = protect_from_queue (op0, 0);
+
   /* Don't do anything with direct references to volatile memory, but
      generate code to handle other side effects.  */
   if (!MEM_P (op0) && side_effects_p (op0))
@@ -1270,9 +1265,6 @@ expand_builtin_apply (rtx function, rtx arguments, rtx argsize)
                                       incoming_args, 0, OPTAB_LIB_WIDEN);
 #endif
 
-  /* Perform postincrements before actually calling the function.  */
-  emit_queue ();
-
   /* Push a new argument block and copy the arguments.  Do not allow
      the (potential) memcpy call below to interfere with our stack
      manipulations.  */
@@ -1776,7 +1768,6 @@ expand_builtin_mathfn (tree exp, rtx target, rtx subtarget)
 
       op0 = expand_expr (arg, subtarget, VOIDmode, 0);
 
-      emit_queue ();
       start_sequence ();
 
       /* Compute into TARGET.
@@ -1931,7 +1922,6 @@ expand_builtin_mathfn_2 (tree exp, rtx target, rtx subtarget)
   op0 = expand_expr (arg0, subtarget, VOIDmode, 0);
   op1 = expand_expr (arg1, 0, VOIDmode, 0);
 
-  emit_queue ();
   start_sequence ();
 
   /* Compute into TARGET.
@@ -2036,7 +2026,6 @@ expand_builtin_mathfn_3 (tree exp, rtx target, rtx subtarget)
 
       op0 = expand_expr (arg, subtarget, VOIDmode, 0);
 
-      emit_queue ();
       start_sequence ();
 
       /* Compute into TARGET.
@@ -2048,7 +2037,7 @@ expand_builtin_mathfn_3 (tree exp, rtx target, rtx subtarget)
            case BUILT_IN_SIN:
            case BUILT_IN_SINF:
            case BUILT_IN_SINL:
-             if (!expand_twoval_unop (builtin_optab, op0, 0, target, 0))    
+             if (!expand_twoval_unop (builtin_optab, op0, 0, target, 0))
                abort();
              break;
            case BUILT_IN_COS:
@@ -2501,8 +2490,8 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
 
       /* New argument list transforming strstr(s1, s2) to
         strchr(s1, s2[0]).  */
-      arglist =
-       build_tree_list (NULL_TREE, build_int_2 (p2[0], 0));
+      arglist = build_tree_list (NULL_TREE,
+                                build_int_cst (NULL_TREE, p2[0], 0));
       arglist = tree_cons (NULL_TREE, s1, arglist);
       return expand_expr (build_function_call_expr (fn, arglist),
                          target, mode, EXPAND_NORMAL);
@@ -2658,8 +2647,8 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode)
 
       /* New argument list transforming strpbrk(s1, s2) to
         strchr(s1, s2[0]).  */
-      arglist =
-       build_tree_list (NULL_TREE, build_int_2 (p2[0], 0));
+      arglist = build_tree_list (NULL_TREE,
+                                build_int_cst (NULL_TREE, p2[0], 0));
       arglist = tree_cons (NULL_TREE, s1, arglist);
       return expand_expr (build_function_call_expr (fn, arglist),
                          target, mode, EXPAND_NORMAL);
@@ -3137,7 +3126,12 @@ expand_builtin_stpcpy (tree arglist, rtx target, enum machine_mode mode)
              if (ret)
                {
                  if (! target)
-                   target = gen_reg_rtx (mode);
+                   {
+                     if (mode != VOIDmode)
+                       target = gen_reg_rtx (mode);
+                     else
+                       target = gen_reg_rtx (GET_MODE (ret));
+                   }
                  if (GET_MODE (target) != GET_MODE (ret))
                    ret = gen_lowpart (GET_MODE (target), ret);
 
@@ -3836,7 +3830,8 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode)
       return 0;
 
     /* The actual new length parameter is MIN(len,arg3).  */
-    len = fold (build2 (MIN_EXPR, TREE_TYPE (len), len, arg3));
+    len = fold (build2 (MIN_EXPR, TREE_TYPE (len), len,
+                       fold_convert (TREE_TYPE (len), arg3)));
 
     /* If we don't have POINTER_TYPE, call the function.  */
     if (arg1_align == 0 || arg2_align == 0)
@@ -4290,191 +4285,12 @@ expand_builtin_va_start (tree arglist)
 /* The "standard" implementation of va_arg: read the value from the
    current (padded) address and increment by the (padded) size.  */
 
-rtx
-std_expand_builtin_va_arg (tree valist, tree type)
-{
-  tree addr_tree, t, type_size = NULL;
-  tree align, alignm1;
-  tree rounded_size;
-  rtx addr;
-  HOST_WIDE_INT boundary;
-
-  /* Compute the rounded size of the type.  */
-  align = size_int (PARM_BOUNDARY / BITS_PER_UNIT);
-  alignm1 = size_int (PARM_BOUNDARY / BITS_PER_UNIT - 1);
-  boundary = FUNCTION_ARG_BOUNDARY (TYPE_MODE (type), type);
-
-  /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
-     requires greater alignment, we must perform dynamic alignment.  */
-
-  if (boundary > PARM_BOUNDARY)
-    {
-      if (!PAD_VARARGS_DOWN)
-       {
-         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 = 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);
-    }
-  if (type == error_mark_node
-      || (type_size = TYPE_SIZE_UNIT (TYPE_MAIN_VARIANT (type))) == NULL
-      || TREE_OVERFLOW (type_size))
-    rounded_size = size_zero_node;
-  else
-    {
-      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 (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);
-  addr = copy_to_reg (addr);
-
-  /* Compute new value for AP.  */
-  if (! integer_zerop (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);
-    }
-
-  return addr;
-}
-
-/* Expand __builtin_va_arg, which is not really a builtin function, but
-   a very special sort of operator.  */
-
-rtx
-expand_builtin_va_arg (tree valist, tree type)
-{
-  rtx addr, result;
-  tree promoted_type, want_va_type, have_va_type;
-
-  /* Verify that valist is of the proper type.  */
-
-  want_va_type = va_list_type_node;
-  have_va_type = TREE_TYPE (valist);
-  if (TREE_CODE (want_va_type) == ARRAY_TYPE)
-    {
-      /* If va_list is an array type, the argument may have decayed
-        to a pointer type, e.g. by being passed to another function.
-         In that case, unwrap both types so that we can compare the
-        underlying records.  */
-      if (TREE_CODE (have_va_type) == ARRAY_TYPE
-         || TREE_CODE (have_va_type) == POINTER_TYPE)
-       {
-         want_va_type = TREE_TYPE (want_va_type);
-         have_va_type = TREE_TYPE (have_va_type);
-       }
-    }
-  if (TYPE_MAIN_VARIANT (want_va_type) != TYPE_MAIN_VARIANT (have_va_type))
-    {
-      error ("first argument to `va_arg' not of type `va_list'");
-      addr = const0_rtx;
-    }
-
-  /* Generate a diagnostic for requesting data of a type that cannot
-     be passed through `...' due to type promotion at the call site.  */
-  else if ((promoted_type = lang_hooks.types.type_promotes_to (type))
-          != type)
-    {
-      const char *name = "<anonymous type>", *pname = 0;
-      static bool gave_help;
-
-      if (TYPE_NAME (type))
-       {
-         if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
-           name = IDENTIFIER_POINTER (TYPE_NAME (type));
-         else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
-                  && DECL_NAME (TYPE_NAME (type)))
-           name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
-       }
-      if (TYPE_NAME (promoted_type))
-       {
-         if (TREE_CODE (TYPE_NAME (promoted_type)) == IDENTIFIER_NODE)
-           pname = IDENTIFIER_POINTER (TYPE_NAME (promoted_type));
-         else if (TREE_CODE (TYPE_NAME (promoted_type)) == TYPE_DECL
-                  && DECL_NAME (TYPE_NAME (promoted_type)))
-           pname = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (promoted_type)));
-       }
-
-      /* Unfortunately, this is merely undefined, rather than a constraint
-        violation, so we cannot make this an error.  If this call is never
-        executed, the program is still strictly conforming.  */
-      warning ("`%s' is promoted to `%s' when passed through `...'",
-              name, pname);
-      if (! gave_help)
-       {
-         gave_help = true;
-         warning ("(so you should pass `%s' not `%s' to `va_arg')",
-                  pname, name);
-       }
-
-      /* We can, however, treat "undefined" any way we please.
-        Call abort to encourage the user to fix the program.  */
-      inform ("if this code is reached, the program will abort");
-      expand_builtin_trap ();
-
-      /* This is dead code, but go ahead and finish so that the
-        mode of the result comes out right.  */
-      addr = const0_rtx;
-    }
-  else
-    {
-      /* Make it easier for the backends by protecting the valist argument
-         from multiple evaluations.  */
-      valist = stabilize_va_list (valist, 0);
-
-#ifdef EXPAND_BUILTIN_VA_ARG
-      addr = EXPAND_BUILTIN_VA_ARG (valist, type);
-#else
-      addr = std_expand_builtin_va_arg (valist, type);
-#endif
-    }
-
-  addr = convert_memory_address (Pmode, addr);
-
-  result = gen_rtx_MEM (TYPE_MODE (type), addr);
-  set_mem_alias_set (result, get_varargs_alias_set ());
-
-  return result;
-}
-
-/* Like std_expand_builtin_va_arg, but gimplify instead of expanding.  */
-
 tree
 std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
 {
   tree addr, t, type_size, rounded_size, valist_tmp;
   unsigned HOST_WIDE_INT align, boundary;
+  bool indirect;
 
 #ifdef ARGS_GROW_DOWNWARD
   /* All of the alignment and movement below is for args-grow-up machines.
@@ -4483,6 +4299,10 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
   abort ();
 #endif
 
+  indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
+  if (indirect)
+    type = build_pointer_type (type);
+
   align = PARM_BOUNDARY / BITS_PER_UNIT;
   boundary = FUNCTION_ARG_BOUNDARY (TYPE_MODE (type), type) / BITS_PER_UNIT;
 
@@ -4530,18 +4350,11 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
   gimplify_and_add (t, pre_p);
 
   addr = fold_convert (build_pointer_type (type), addr);
-  return build_fold_indirect_ref (addr);
-}
 
-/* Like std_gimplify_va_arg_expr, but uses pass-by-reference.  */
-tree
-ind_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
-{
-  tree t;
-  t = build_pointer_type (type);
-  t = std_gimplify_va_arg_expr (valist, t, pre_p, post_p);
-  return build_fold_indirect_ref (t);
+  if (indirect)
+    addr = build_fold_indirect_ref (addr);
+
+  return build_fold_indirect_ref (addr);
 }
 
 /* Return a dummy expression of type TYPE in order to keep going after an
@@ -4554,7 +4367,8 @@ dummy_object (tree type)
   return build1 (INDIRECT_REF, type, t);
 }
 
-/* Like expand_builtin_va_arg, but gimplify instead of expanding.  */
+/* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a
+   builtin function, but a very special sort of operator.  */
 
 enum gimplify_status
 gimplify_va_arg_expr (tree *expr_p, tree *pre_p, tree *post_p)
@@ -4642,11 +4456,11 @@ gimplify_va_arg_expr (tree *expr_p, tree *pre_p, tree *post_p)
       else
        gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
 
-      if (!targetm.calls.gimplify_va_arg_expr)
+      if (!targetm.gimplify_va_arg_expr)
        /* Once most targets are converted this should abort.  */
        return GS_ALL_DONE;
 
-      *expr_p = targetm.calls.gimplify_va_arg_expr (valist, type, pre_p, post_p);
+      *expr_p = targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p);
       return GS_OK;
     }
 }
@@ -4862,10 +4676,11 @@ expand_builtin_fputs (tree arglist, rtx target, bool unlocked)
          {
            /* New argument list transforming fputs(string, stream) to
               fputc(string[0], stream).  */
-           arglist =
-             build_tree_list (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)));
-           arglist =
-             tree_cons (NULL_TREE, build_int_2 (p[0], 0), arglist);
+           arglist = build_tree_list (NULL_TREE,
+                                      TREE_VALUE (TREE_CHAIN (arglist)));
+           arglist = tree_cons (NULL_TREE,
+                                build_int_cst (NULL_TREE, p[0], 0),
+                                arglist);
            fn = fn_fputc;
            break;
          }
@@ -5122,7 +4937,7 @@ build_string_literal (int len, const char *str)
 
   t = build_string (len, str);
   elem = build_type_variant (char_type_node, 1, 0);
-  index = build_index_type (build_int_2 (len - 1, 0));
+  index = build_index_type (build_int_cst (NULL_TREE, len - 1, 0));
   type = build_array_type (elem, index);
   TREE_TYPE (t) = type;
   TREE_CONSTANT (t) = 1;
@@ -5208,7 +5023,7 @@ expand_builtin_printf (tree arglist, rtx target, enum machine_mode mode,
          /* Given printf("c"), (where c is any one character,)
             convert "c"[0] to an int and pass that to the replacement
             function.  */
-         arg = build_int_2 (fmt_str[0], 0);
+         arg = build_int_cst (NULL_TREE, fmt_str[0], 0);
          arglist = build_tree_list (NULL_TREE, arg);
          fn = fn_putchar;
        }
@@ -5379,8 +5194,7 @@ expand_builtin_sprintf (tree arglist, rtx target, enum machine_mode mode)
                   const0_rtx, VOIDmode, EXPAND_NORMAL);
       if (target == const0_rtx)
        return const0_rtx;
-      exp = build_int_2 (strlen (fmt_str), 0);
-      exp = fold_convert (integer_type_node, exp);
+      exp = build_int_cst (NULL_TREE, strlen (fmt_str), 0);
       return expand_expr (exp, target, mode, EXPAND_NORMAL);
     }
   /* If the format is "%s", use strcpy if the result isn't used.  */
@@ -5694,9 +5508,6 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
   enum machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
 
-  /* Perform postincrements before expanding builtin functions.  */
-  emit_queue ();
-
   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
     return targetm.expand_builtin (exp, target, subtarget, mode, ignore);
 
@@ -5945,11 +5756,6 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
        return target;
       break;
 
-    case BUILT_IN_STACK_ALLOC:
-      expand_stack_alloc (TREE_VALUE (arglist),
-                         TREE_VALUE (TREE_CHAIN (arglist)));
-      return const0_rtx;
-
     case BUILT_IN_STACK_SAVE:
       return expand_stack_save ();
 
@@ -6465,9 +6271,10 @@ static tree
 fold_builtin_classify_type (tree arglist)
 {
   if (arglist == 0)
-    return build_int_2 (no_type_class, 0);
+    return build_int_cst (NULL_TREE, no_type_class, 0);
 
-  return build_int_2 (type_to_class (TREE_TYPE (TREE_VALUE (arglist))), 0);
+  return build_int_cst (NULL_TREE,
+                       type_to_class (TREE_TYPE (TREE_VALUE (arglist))), 0);
 }
 
 /* Fold a call to __builtin_inf or __builtin_huge_val.  */
@@ -6900,7 +6707,7 @@ fold_builtin_lround (tree exp)
 
          real_round (&r, TYPE_MODE (ftype), &x);
          REAL_VALUE_TO_INT (&lo, &hi, r);
-         result = build_int_2 (lo, hi);
+         result = build_int_cst (NULL_TREE, lo, hi);
          if (int_fits_type_p (result, itype))
            return fold_convert (itype, result);
        }
@@ -6929,7 +6736,7 @@ fold_builtin_bitop (tree exp)
     {
       HOST_WIDE_INT hi, width, result;
       unsigned HOST_WIDE_INT lo;
-      tree type, t;
+      tree type;
 
       type = TREE_TYPE (arg);
       width = TYPE_PRECISION (type);
@@ -7009,9 +6816,7 @@ fold_builtin_bitop (tree exp)
          abort();
        }
 
-      t = build_int_2 (result, 0);
-      TREE_TYPE (t) = TREE_TYPE (exp);
-      return t;
+      return build_int_cst (TREE_TYPE (exp), result, 0);
     }
 
   return NULL_TREE;
@@ -7465,10 +7270,10 @@ fold_builtin_strchr (tree exp, bool actually_strrchr)
    NULL_TREE if no simplification can be made.  */
 
 static tree
-fold_builtin_memcmp (tree exp)
+fold_builtin_memcmp (tree arglist)
 {
-  tree arglist = TREE_OPERAND (exp, 1);
   tree arg1, arg2, len;
+  const char *p1, *p2;
 
   if (!validate_arglist (arglist,
                         POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
@@ -7480,14 +7285,48 @@ fold_builtin_memcmp (tree exp)
 
   /* If the LEN parameter is zero, return zero.  */
   if (integer_zerop (len))
-    {
-      tree temp = omit_one_operand (TREE_TYPE (exp), integer_zero_node, arg2);
-      return omit_one_operand (TREE_TYPE (exp), temp, arg1);
-    }
+    return omit_two_operands (integer_type_node, integer_zero_node,
+                             arg1, arg2);
 
   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
   if (operand_equal_p (arg1, arg2, 0))
-    return omit_one_operand (TREE_TYPE (exp), integer_zero_node, len);
+    return omit_one_operand (integer_type_node, integer_zero_node, len);
+
+  p1 = c_getstr (arg1);
+  p2 = c_getstr (arg2);
+
+  /* If all arguments are constant, and the value of len is not greater
+     than the lengths of arg1 and arg2, evaluate at compile-time.  */
+  if (host_integerp (len, 1) && p1 && p2
+      && compare_tree_int (len, strlen (p1) + 1) <= 0
+      && compare_tree_int (len, strlen (p2) + 1) <= 0)
+    {
+      const int r = memcmp (p1, p2, tree_low_cst (len, 1));
+
+      if (r > 0)
+       return integer_one_node;
+      else if (r < 0)
+       return integer_minus_one_node;
+      else
+       return integer_zero_node;
+    }
+
+  /* If len parameter is one, return an expression corresponding to
+     (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
+  if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
+    {
+      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
+      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
+      tree ind1 = fold_convert (integer_type_node,
+                               build1 (INDIRECT_REF, cst_uchar_node,
+                                       fold_convert (cst_uchar_ptr_node,
+                                                     arg1)));
+      tree ind2 = fold_convert (integer_type_node,
+                               build1 (INDIRECT_REF, cst_uchar_node,
+                                       fold_convert (cst_uchar_ptr_node,
+                                                     arg2)));
+      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
+    }
 
   return 0;
 }
@@ -7496,14 +7335,12 @@ fold_builtin_memcmp (tree exp)
    NULL_TREE if no simplification can be made.  */
 
 static tree
-fold_builtin_strcmp (tree exp)
+fold_builtin_strcmp (tree arglist)
 {
-  tree arglist = TREE_OPERAND (exp, 1);
   tree arg1, arg2;
   const char *p1, *p2;
 
-  if (!validate_arglist (arglist,
-                        POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
+  if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
     return 0;
 
   arg1 = TREE_VALUE (arglist);
@@ -7511,22 +7348,43 @@ fold_builtin_strcmp (tree exp)
 
   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
   if (operand_equal_p (arg1, arg2, 0))
-    return fold_convert (TREE_TYPE (exp), integer_zero_node);
+    return integer_zero_node;
 
   p1 = c_getstr (arg1);
   p2 = c_getstr (arg2);
 
   if (p1 && p2)
     {
-      tree temp;
       const int i = strcmp (p1, p2);
       if (i < 0)
-       temp = integer_minus_one_node;
+       return integer_minus_one_node;
       else if (i > 0)
-       temp = integer_one_node;
+       return integer_one_node;
       else
-       temp = integer_zero_node;
-      return fold_convert (TREE_TYPE (exp), temp);
+       return integer_zero_node;
+    }
+
+  /* If the second arg is "", return *(const unsigned char*)arg1.  */
+  if (p2 && *p2 == '\0')
+    {
+      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
+      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
+      return fold_convert (integer_type_node,
+                          build1 (INDIRECT_REF, cst_uchar_node,
+                                  fold_convert (cst_uchar_ptr_node,
+                                                arg1)));
+    }
+
+  /* If the first arg is "", return -*(const unsigned char*)arg2.  */
+  if (p1 && *p1 == '\0')
+    {
+      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
+      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
+      tree temp = fold_convert (integer_type_node,
+                               build1 (INDIRECT_REF, cst_uchar_node,
+                                       fold_convert (cst_uchar_ptr_node,
+                                                     arg2)));
+      return fold (build1 (NEGATE_EXPR, integer_type_node, temp));
     }
 
   return 0;
@@ -7536,9 +7394,8 @@ fold_builtin_strcmp (tree exp)
    NULL_TREE if no simplification can be made.  */
 
 static tree
-fold_builtin_strncmp (tree exp)
+fold_builtin_strncmp (tree arglist)
 {
-  tree arglist = TREE_OPERAND (exp, 1);
   tree arg1, arg2, len;
   const char *p1, *p2;
 
@@ -7552,29 +7409,71 @@ fold_builtin_strncmp (tree exp)
 
   /* If the LEN parameter is zero, return zero.  */
   if (integer_zerop (len))
-    {
-      tree temp = omit_one_operand (TREE_TYPE (exp), integer_zero_node, arg2);
-      return omit_one_operand (TREE_TYPE (exp), temp, arg1);
-    }
+    return omit_two_operands (integer_type_node, integer_zero_node,
+                             arg1, arg2);
 
   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
   if (operand_equal_p (arg1, arg2, 0))
-    return omit_one_operand (TREE_TYPE (exp), integer_zero_node, len);
+    return omit_one_operand (integer_type_node, integer_zero_node, len);
 
   p1 = c_getstr (arg1);
   p2 = c_getstr (arg2);
 
   if (host_integerp (len, 1) && p1 && p2)
     {
-      tree temp;
       const int i = strncmp (p1, p2, tree_low_cst (len, 1));
-      if (i < 0)
-       temp = integer_minus_one_node;
-      else if (i > 0)
-       temp = integer_one_node;
+      if (i > 0)
+       return integer_one_node;
+      else if (i < 0)
+       return integer_minus_one_node;
       else
-       temp = integer_zero_node;
-      return fold_convert (TREE_TYPE (exp), temp);
+       return integer_zero_node;
+    }
+
+  /* If the second arg is "", and the length is greater than zero,
+     return *(const unsigned char*)arg1.  */
+  if (p2 && *p2 == '\0'
+      && TREE_CODE (len) == INTEGER_CST
+      && tree_int_cst_sgn (len) == 1)
+    {
+      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
+      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
+      return fold_convert (integer_type_node,
+                          build1 (INDIRECT_REF, cst_uchar_node,
+                                  fold_convert (cst_uchar_ptr_node,
+                                                arg1)));
+    }
+
+  /* If the first arg is "", and the length is greater than zero,
+     return -*(const unsigned char*)arg2.  */
+  if (p1 && *p1 == '\0'
+      && TREE_CODE (len) == INTEGER_CST
+      && tree_int_cst_sgn (len) == 1)
+    {
+      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
+      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
+      tree temp = fold_convert (integer_type_node,
+                               build1 (INDIRECT_REF, cst_uchar_node,
+                                       fold_convert (cst_uchar_ptr_node,
+                                                     arg2)));
+      return fold (build1 (NEGATE_EXPR, integer_type_node, temp));
+    }
+
+  /* If len parameter is one, return an expression corresponding to
+     (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
+  if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
+    {
+      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
+      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
+      tree ind1 = fold_convert (integer_type_node,
+                               build1 (INDIRECT_REF, cst_uchar_node,
+                                       fold_convert (cst_uchar_ptr_node,
+                                                     arg1)));
+      tree ind2 = fold_convert (integer_type_node,
+                               build1 (INDIRECT_REF, cst_uchar_node,
+                                       fold_convert (cst_uchar_ptr_node,
+                                                     arg2)));
+      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
     }
 
   return 0;
@@ -7671,13 +7570,14 @@ fold_builtin_isascii (tree arglist)
     {
       /* Transform isascii(c) -> ((c & ~0x7f) == 0).  */
       tree arg = TREE_VALUE (arglist);
-      
+
+      arg = build2 (BIT_AND_EXPR, integer_type_node, arg,
+                   build_int_cst (NULL_TREE,
+                                  ~ (unsigned HOST_WIDE_INT) 0x7f,
+                                  ~ (HOST_WIDE_INT) 0));
       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));
-      
+                         arg, integer_zero_node));
+
       if (in_gimple_form && !TREE_CONSTANT (arg))
         return NULL_TREE;
       else
@@ -7696,9 +7596,9 @@ fold_builtin_toascii (tree arglist)
     {
       /* Transform toascii(c) -> (c & 0x7f).  */
       tree arg = TREE_VALUE (arglist);
-      
+
       return fold (build2 (BIT_AND_EXPR, integer_type_node, arg,
-                          build_int_2 (0x7f, 0)));
+                          build_int_cst (NULL_TREE, 0x7f, 0)));
     }
 }
 
@@ -7716,10 +7616,9 @@ fold_builtin_isdigit (tree arglist)
       tree arg = TREE_VALUE (arglist);
       arg = fold_convert (unsigned_type_node, arg);
       arg = build2 (MINUS_EXPR, unsigned_type_node, arg,
-                   fold_convert (unsigned_type_node,
-                                 build_int_2 (TARGET_DIGIT0, 0)));
+                   build_int_cst (unsigned_type_node, TARGET_DIGIT0, 0));
       arg = build2 (LE_EXPR, integer_type_node, arg,
-                   fold_convert (unsigned_type_node, build_int_2 (9, 0)));
+                   build_int_cst (unsigned_type_node, 9, 0));
       arg = fold (arg);
       if (in_gimple_form && !TREE_CONSTANT (arg))
         return NULL_TREE;
@@ -8045,7 +7944,7 @@ fold_builtin_1 (tree exp, bool ignore)
          if (flag_unsafe_math_optimizations && BUILTIN_ROOT_P (fcode))
            {
              tree powfn = mathfn_built_in (type, BUILT_IN_POW);
-             
+
              if (powfn)
                {
                  tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1));
@@ -8053,7 +7952,7 @@ fold_builtin_1 (tree exp, bool ignore)
                  /* The inner root was either sqrt or cbrt.  */
                  REAL_VALUE_TYPE dconstroot =
                    BUILTIN_SQRT_P (fcode) ? dconsthalf : dconstthird;
-                 
+
                  /* Adjust for the outer root.  */
                  SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
                  dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
@@ -8127,7 +8026,7 @@ fold_builtin_1 (tree exp, bool ignore)
                                       build_tree_list (NULL_TREE, tree_root));
                  return build_function_call_expr (powfn, arglist);
                }
-             
+
            }
        }
       break;
@@ -8457,13 +8356,13 @@ fold_builtin_1 (tree exp, bool ignore)
       return fold_builtin_strchr (exp, true);
 
     case BUILT_IN_MEMCMP:
-      return fold_builtin_memcmp (exp);
+      return fold_builtin_memcmp (arglist);
 
     case BUILT_IN_STRCMP:
-      return fold_builtin_strcmp (exp);
+      return fold_builtin_strcmp (arglist);
 
     case BUILT_IN_STRNCMP:
-      return fold_builtin_strncmp (exp);
+      return fold_builtin_strncmp (arglist);
 
     case BUILT_IN_SIGNBIT:
     case BUILT_IN_SIGNBITF:
@@ -8526,7 +8425,7 @@ fold_builtin_1 (tree exp, bool ignore)
 }
 
 /* A wrapper function for builtin folding that prevents warnings for
-   "statement without effect" and the like, caused by removing the 
+   "statement without effect" and the like, caused by removing the
    call node earlier than the warning is generated.  */
 
 tree
@@ -8635,7 +8534,7 @@ readonly_data_expr (tree exp)
   /* Make sure we call decl_readonly_section only for trees it
      can handle (since it returns true for everything it doesn't
      understand).  */
-  if (TREE_CODE (exp) == STRING_CST 
+  if (TREE_CODE (exp) == STRING_CST
       || TREE_CODE (exp) == CONSTRUCTOR
       || (TREE_CODE (exp) == VAR_DECL && TREE_STATIC (exp)))
     return decl_readonly_section (exp, 0);
@@ -8701,17 +8600,17 @@ simplify_builtin (tree exp, int ignore)
       val = fold_builtin_strncpy (exp, NULL_TREE);
       break;
     case BUILT_IN_STRCMP:
-      val = simplify_builtin_strcmp (arglist);
+      val = fold_builtin_strcmp (arglist);
       break;
     case BUILT_IN_STRNCMP:
-      val = simplify_builtin_strncmp (arglist);
+      val = fold_builtin_strncmp (arglist);
       break;
     case BUILT_IN_STRPBRK:
       val = simplify_builtin_strpbrk (arglist);
       break;
     case BUILT_IN_BCMP:
     case BUILT_IN_MEMCMP:
-      val = simplify_builtin_memcmp (arglist);
+      val = fold_builtin_memcmp (arglist);
       break;
     case BUILT_IN_VA_START:
       simplify_builtin_va_start (arglist);
@@ -8796,7 +8695,8 @@ simplify_builtin_strstr (tree arglist)
 
       /* New argument list transforming strstr(s1, s2) to
         strchr(s1, s2[0]).  */
-      arglist = build_tree_list (NULL_TREE, build_int_2 (p2[0], 0));
+      arglist = build_tree_list (NULL_TREE,
+                                build_int_cst (NULL_TREE, p2[0], 0));
       arglist = tree_cons (NULL_TREE, s1, arglist);
       return build_function_call_expr (fn, arglist);
     }
@@ -8981,227 +8881,13 @@ simplify_builtin_strpbrk (tree arglist)
 
       /* New argument list transforming strpbrk(s1, s2) to
         strchr(s1, s2[0]).  */
-      arglist =
-       build_tree_list (NULL_TREE, build_int_2 (p2[0], 0));
+      arglist = build_tree_list (NULL_TREE,
+                                build_int_cst (NULL_TREE, p2[0], 0));
       arglist = tree_cons (NULL_TREE, s1, arglist);
       return build_function_call_expr (fn, arglist);
     }
 }
 
-/* Simplify a call to the memcmp builtin.
-
-   Return 0 if no simplification was possible, otherwise return the
-   simplified form of the call as a tree.
-
-   The simplified form may be a constant or other expression which
-   computes the same value, but in a more efficient manner (including
-   calls to other builtin functions).
-
-   The call may contain arguments which need to be evaluated, but
-   which are not useful to determine the result of the call.  In
-   this case we return a chain of COMPOUND_EXPRs.  The LHS of each
-   COMPOUND_EXPR will be an argument which must be evaluated.
-   COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
-   COMPOUND_EXPR in the chain will contain the tree for the simplified
-   form of the builtin function call.  */
-
-static tree
-simplify_builtin_memcmp (tree arglist)
-{
-  tree arg1, arg2, len;
-  const char *p1, *p2;
-
-  if (!validate_arglist (arglist,
-                        POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
-    return 0;
-
-  arg1 = TREE_VALUE (arglist);
-  arg2 = TREE_VALUE (TREE_CHAIN (arglist));
-  len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
-
-  /* If the len parameter is zero, return zero.  */
-  if (host_integerp (len, 1) && tree_low_cst (len, 1) == 0)
-    /* Evaluate and ignore arg1 and arg2 in case they have side-effects.  */
-    return omit_two_operands (integer_type_node, integer_zero_node,
-                             arg1, arg2);
-
-  p1 = c_getstr (arg1);
-  p2 = c_getstr (arg2);
-
-  /* If all arguments are constant, and the value of len is not greater
-     than the lengths of arg1 and arg2, evaluate at compile-time.  */
-  if (host_integerp (len, 1) && p1 && p2
-      && compare_tree_int (len, strlen (p1) + 1) <= 0
-      && compare_tree_int (len, strlen (p2) + 1) <= 0)
-    {
-      const int r = memcmp (p1, p2, tree_low_cst (len, 1));
-
-      return (r < 0
-             ? integer_minus_one_node
-             : (r > 0 ? integer_one_node : integer_zero_node));
-    }
-
-  /* If len parameter is one, return an expression corresponding to
-     (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
-  if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
-    {
-      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
-      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
-      tree ind1 =
-      fold (build1 (CONVERT_EXPR, integer_type_node,
-                   build1 (INDIRECT_REF, cst_uchar_node,
-                           build1 (NOP_EXPR, cst_uchar_ptr_node, arg1))));
-      tree ind2 =
-      fold (build1 (CONVERT_EXPR, integer_type_node,
-                   build1 (INDIRECT_REF, cst_uchar_node,
-                           build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
-      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
-    }
-
-  return 0;
-}
-
-/* Simplify a call to the strcmp builtin.
-
-   Return 0 if no simplification was possible, otherwise return the
-   simplified form of the call as a tree.
-
-   The simplified form may be a constant or other expression which
-   computes the same value, but in a more efficient manner (including
-   calls to other builtin functions).
-
-   The call may contain arguments which need to be evaluated, but
-   which are not useful to determine the result of the call.  In
-   this case we return a chain of COMPOUND_EXPRs.  The LHS of each
-   COMPOUND_EXPR will be an argument which must be evaluated.
-   COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
-   COMPOUND_EXPR in the chain will contain the tree for the simplified
-   form of the builtin function call.  */
-
-static tree
-simplify_builtin_strcmp (tree arglist)
-{
-  tree arg1, arg2;
-  const char *p1, *p2;
-
-  if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
-    return 0;
-
-  arg1 = TREE_VALUE (arglist);
-  arg2 = TREE_VALUE (TREE_CHAIN (arglist));
-
-  /* If both arguments are equal (and not volatile), return zero.  */
-  if (operand_equal_p (arg1, arg2, 0))
-    return integer_zero_node;
-
-  p1 = c_getstr (arg1);
-  p2 = c_getstr (arg2);
-
-  if (p1 && p2)
-    {
-      const int i = strcmp (p1, p2);
-      return (i < 0
-             ? integer_minus_one_node
-             : (i > 0 ? integer_one_node : integer_zero_node));
-    }
-
-  /* If either arg is "", return an expression corresponding to
-     (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
-  if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
-    {
-      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
-      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
-      tree ind1 =
-       fold (build1 (CONVERT_EXPR, integer_type_node,
-                     build1 (INDIRECT_REF, cst_uchar_node,
-                             build1 (NOP_EXPR, cst_uchar_ptr_node, arg1))));
-      tree ind2 =
-       fold (build1 (CONVERT_EXPR, integer_type_node,
-                     build1 (INDIRECT_REF, cst_uchar_node,
-                             build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
-      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
-    }
-
-  return 0;
-}
-
-/* Simplify a call to the strncmp builtin.
-
-   Return 0 if no simplification was possible, otherwise return the
-   simplified form of the call as a tree.
-
-   The simplified form may be a constant or other expression which
-   computes the same value, but in a more efficient manner (including
-   calls to other builtin functions).
-
-   The call may contain arguments which need to be evaluated, but
-   which are not useful to determine the result of the call.  In
-   this case we return a chain of COMPOUND_EXPRs.  The LHS of each
-   COMPOUND_EXPR will be an argument which must be evaluated.
-   COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
-   COMPOUND_EXPR in the chain will contain the tree for the simplified
-   form of the builtin function call.  */
-
-static tree
-simplify_builtin_strncmp (tree arglist)
-{
-  tree arg1, arg2, arg3;
-  const char *p1, *p2;
-
-  if (!validate_arglist (arglist,
-                        POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
-    return 0;
-
-  arg1 = TREE_VALUE (arglist);
-  arg2 = TREE_VALUE (TREE_CHAIN (arglist));
-  arg3 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
-
-  /* If the len parameter is zero, return zero.  */
-  if (integer_zerop (arg3))
-    /* Evaluate and ignore arg1 and arg2 in case they have side-effects.  */
-    return omit_two_operands (integer_type_node, integer_zero_node,
-                             arg1, arg2);
-
-  /* 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 omit_one_operand (integer_type_node, integer_zero_node, arg3);
-
-  p1 = c_getstr (arg1);
-  p2 = c_getstr (arg2);
-
-  /* If all arguments are constant, evaluate at compile-time.  */
-  if (host_integerp (arg3, 1) && p1 && p2)
-    {
-      const int r = strncmp (p1, p2, tree_low_cst (arg3, 1));
-      return (r < 0
-             ? integer_minus_one_node
-             : (r > 0 ? integer_one_node : integer_zero_node));
-    }
-
-  /* If len == 1 or (either string parameter is "" and (len >= 1)),
-      return (*(const u_char*)arg1 - *(const u_char*)arg2).  */
-  if (host_integerp (arg3, 1)
-      && (tree_low_cst (arg3, 1) == 1
-         || (tree_low_cst (arg3, 1) > 1
-             && ((p1 && *p1 == '\0') || (p2 && *p2 == '\0')))))
-    {
-      tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
-      tree cst_uchar_ptr_node = build_pointer_type (cst_uchar_node);
-      tree ind1 =
-       fold (build1 (CONVERT_EXPR, integer_type_node,
-                     build1 (INDIRECT_REF, cst_uchar_node,
-                             build1 (NOP_EXPR, cst_uchar_ptr_node, arg1))));
-      tree ind2 =
-       fold (build1 (CONVERT_EXPR, integer_type_node,
-                     build1 (INDIRECT_REF, cst_uchar_node,
-                             build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
-      return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
-    }
-
-  return 0;
-}
-
 /* Simplify a call to the strcat builtin.
 
    Return 0 if no simplification was possible, otherwise return the
@@ -9444,9 +9130,11 @@ fold_builtin_fputs (tree arglist, bool ignore, bool unlocked, tree len)
          {
            /* New argument list transforming fputs(string, stream) to
               fputc(string[0], stream).  */
-           arglist =
-             build_tree_list (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)));
-           arglist = tree_cons (NULL_TREE, build_int_2 (p[0], 0), arglist);
+           arglist = build_tree_list (NULL_TREE,
+                                      TREE_VALUE (TREE_CHAIN (arglist)));
+           arglist = tree_cons (NULL_TREE,
+                                build_int_cst (NULL_TREE, p[0], 0),
+                                arglist);
            fn = fn_fputc;
            break;
          }
@@ -9570,7 +9258,7 @@ simplify_builtin_sprintf (tree arglist, int ignored)
       arglist = tree_cons (NULL_TREE, dest, arglist);
       call = build_function_call_expr (fn, arglist);
       if (!ignored)
-       retval = build_int_2 (strlen (fmt_str), 0);
+       retval = build_int_cst (NULL_TREE, strlen (fmt_str), 0);
     }
 
   /* If the format is "%s", use strcpy if the result isn't used.  */