diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2004-10-06 13:23:30 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2004-10-06 13:23:30 +0000 |
commit | 609ae0e2cef6f31f9cf871fd1997923f177c38df (patch) | |
tree | c06da085b42fee9852c40c80dc16e03b0d80e320 | |
parent | 96836f619421f1be5070b674d15948c1a516b5c4 (diff) | |
download | gcc-609ae0e2cef6f31f9cf871fd1997923f177c38df.zip gcc-609ae0e2cef6f31f9cf871fd1997923f177c38df.tar.gz gcc-609ae0e2cef6f31f9cf871fd1997923f177c38df.tar.bz2 |
builtins.c (expand_builtin_strcpy): Delete duplicate code.
* builtins.c (expand_builtin_strcpy): Delete duplicate code.
Accept an expression instead of an arglist.
(expand_builtin_stpcpy): Accept an expression instead of an
arglist.
testsuite:
* gcc.c-torture/execute/builtins/lib/strcpy.c: Don't abort when
optimizing for size.
From-SVN: r88604
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/builtins.c | 49 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/builtins/lib/strcpy.c | 2 |
4 files changed, 30 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 932efe2..71d6d1b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-10-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * builtins.c (expand_builtin_strcpy): Delete duplicate code. + Accept an expression instead of an arglist. + (expand_builtin_stpcpy): Accept an expression instead of an + arglist. + 2004-10-06 Eric Botcazou <ebotcazou@libertysurf.fr> PR target/16007 diff --git a/gcc/builtins.c b/gcc/builtins.c index b4ddcdb..11fd568 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -2891,36 +2891,20 @@ expand_movstr (tree dest, tree src, rtx target, int endp) convenient). */ static rtx -expand_builtin_strcpy (tree arglist, rtx target, enum machine_mode mode) +expand_builtin_strcpy (tree exp, rtx target, enum machine_mode mode) { - tree fn, len, src, dst; - - if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE)) - return 0; - - src = TREE_VALUE (TREE_CHAIN (arglist)); - dst = TREE_VALUE (arglist); - - /* If SRC and DST are equal (and not volatile), return DST. */ - if (operand_equal_p (src, dst, 0)) - return expand_expr (dst, target, mode, EXPAND_NORMAL); - - len = c_strlen (src, 1); - if (len == 0 || TREE_SIDE_EFFECTS (len)) - return expand_movstr (TREE_VALUE (arglist), - TREE_VALUE (TREE_CHAIN (arglist)), - target, /*endp=*/0); - - fn = implicit_built_in_decls[BUILT_IN_MEMCPY]; - if (!fn) - return 0; + tree arglist = TREE_OPERAND (exp, 1); + if (validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE)) + { + tree result = fold_builtin_strcpy (exp, 0); + if (result) + return expand_expr (result, target, mode, EXPAND_NORMAL); - len = size_binop (PLUS_EXPR, len, ssize_int (1)); - arglist = build_tree_list (NULL_TREE, len); - arglist = tree_cons (NULL_TREE, src, arglist); - arglist = tree_cons (NULL_TREE, dst, arglist); - return expand_expr (build_function_call_expr (fn, arglist), - target, mode, EXPAND_NORMAL); + return expand_movstr (TREE_VALUE (arglist), + TREE_VALUE (TREE_CHAIN (arglist)), + target, /*endp=*/0); + } + return 0; } /* Expand a call to the stpcpy builtin, with arguments in ARGLIST. @@ -2929,8 +2913,9 @@ expand_builtin_strcpy (tree arglist, rtx target, enum machine_mode mode) mode MODE if that's convenient). */ static rtx -expand_builtin_stpcpy (tree arglist, rtx target, enum machine_mode mode) +expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode) { + tree arglist = TREE_OPERAND (exp, 1); /* If return value is ignored, transform stpcpy into strcpy. */ if (target == const0_rtx) { @@ -2976,7 +2961,7 @@ expand_builtin_stpcpy (tree arglist, rtx target, enum machine_mode mode) if (GET_CODE (len_rtx) == CONST_INT) { - ret = expand_builtin_strcpy (arglist, target, mode); + ret = expand_builtin_strcpy (exp, target, mode); if (ret) { @@ -5400,7 +5385,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, break; case BUILT_IN_STRCPY: - target = expand_builtin_strcpy (arglist, target, mode); + target = expand_builtin_strcpy (exp, target, mode); if (target) return target; break; @@ -5412,7 +5397,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, break; case BUILT_IN_STPCPY: - target = expand_builtin_stpcpy (arglist, target, mode); + target = expand_builtin_stpcpy (exp, target, mode); if (target) return target; break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ade3dd..8a39312 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-10-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * gcc.c-torture/execute/builtins/lib/strcpy.c: Don't abort when + optimizing for size. + 2004-10-05 Joseph S. Myers <jsm@polyomino.org.uk> * gcc.dg/complex-2.c, gcc.dg/complex-2.h: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/builtins/lib/strcpy.c b/gcc/testsuite/gcc.c-torture/execute/builtins/lib/strcpy.c index 127b577..0ee27c6 100644 --- a/gcc/testsuite/gcc.c-torture/execute/builtins/lib/strcpy.c +++ b/gcc/testsuite/gcc.c-torture/execute/builtins/lib/strcpy.c @@ -4,7 +4,7 @@ char * strcpy (char *d, const char *s) { char *r = d; -#ifdef __OPTIMIZE__ +#if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ if (inside_main) abort (); #endif |