aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaveh Ghazi <ghazi@caip.rutgers.edu>2004-10-06 13:23:30 +0000
committerKaveh Ghazi <ghazi@caip.rutgers.edu>2004-10-06 13:23:30 +0000
commit077ec3e4fe9233676f0a388d0f957b29485dd668 (patch)
treec06da085b42fee9852c40c80dc16e03b0d80e320
parentb19f46a3ef2c374a9d8b364275a26c2314a2ee2d (diff)
* 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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@88604 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c49
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/builtins/lib/strcpy.c2
4 files changed, 30 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 932efe2132c..71d6d1b3b8f 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 b4ddcdb1d9c..11fd5687a0e 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 2ade3dd839b..8a39312affb 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 127b57733c4..0ee27c669ac 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