builtins.c (expand_builtin_strncpy): Delete duplicate code.
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Fri, 8 Oct 2004 16:06:02 +0000 (16:06 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Fri, 8 Oct 2004 16:06:02 +0000 (16:06 +0000)
* builtins.c (expand_builtin_strncpy): Delete duplicate code.
Accept an `exp' instead of an `arglist'.

From-SVN: r88761

gcc/ChangeLog
gcc/builtins.c

index 1da3715b99e7d5519de9266ff31fc539b4f96334..44f9eb80585d5d82d5f8875ae97c6b92db89a4ff 100644 (file)
@@ -1,3 +1,8 @@
+2004-10-08  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * builtins.c (expand_builtin_strncpy): Delete duplicate code.
+       Accept an `exp' instead of an `arglist'.
+
 2004-10-08  Nathan Sidwell  <nathan@codesourcery.com>
 
        * tree-tailcall.c (tree_optimize_tail_calls_1): Use fold_convert,
index 11fd5687a0efac265db33a5ebf24ec13331fd814..dc2297e99a6e78794a9fd7bbdd49fb5ab17184a2 100644 (file)
@@ -3010,35 +3010,21 @@ builtin_strncpy_read_str (void *data, HOST_WIDE_INT offset,
    if we failed the caller should emit a normal call.  */
 
 static rtx
-expand_builtin_strncpy (tree arglist, rtx target, enum machine_mode mode)
+expand_builtin_strncpy (tree exp, rtx target, enum machine_mode mode)
 {
-  if (!validate_arglist (arglist,
-                        POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
-    return 0;
-  else
+  tree arglist = TREE_OPERAND (exp, 1);
+  if (validate_arglist (arglist,
+                       POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
     {
       tree slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)), 1);
       tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
-      tree fn;
-
-      /* We must be passed a constant len parameter.  */
-      if (TREE_CODE (len) != INTEGER_CST)
-       return 0;
-
-      /* 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.  */
-         expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
-                      VOIDmode, EXPAND_NORMAL);
-         /* Return the dst parameter.  */
-         return expand_expr (TREE_VALUE (arglist), target, mode,
-                             EXPAND_NORMAL);
-       }
+      tree result = fold_builtin_strncpy (exp, slen);
+      
+      if (result)
+       return expand_expr (result, target, mode, EXPAND_NORMAL);
 
-      /* Now, we must be passed a constant src ptr parameter.  */
-      if (slen == 0 || TREE_CODE (slen) != INTEGER_CST)
+      /* We must be passed a constant len and src parameter.  */
+      if (!host_integerp (len, 1) || !slen || !host_integerp (slen, 1))
        return 0;
 
       slen = size_binop (PLUS_EXPR, slen, ssize_int (1));
@@ -3068,14 +3054,8 @@ expand_builtin_strncpy (tree arglist, rtx target, enum machine_mode mode)
          dest_mem = convert_memory_address (ptr_mode, dest_mem);
          return dest_mem;
        }
-
-      /* OK transform into builtin memcpy.  */
-      fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
-      if (!fn)
-       return 0;
-      return expand_expr (build_function_call_expr (fn, arglist),
-                         target, mode, EXPAND_NORMAL);
     }
+  return 0;
 }
 
 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
@@ -5391,7 +5371,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
       break;
 
     case BUILT_IN_STRNCPY:
-      target = expand_builtin_strncpy (arglist, target, mode);
+      target = expand_builtin_strncpy (exp, target, mode);
       if (target)
        return target;
       break;