This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix builtin strcpy
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 23 Jun 2003 15:08:37 +0200
- Subject: [PATCH] Fix builtin strcpy
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
The following testcase fails on the trunk, 3.3 branch and likely 3.2 as
well. We evaluate the side-effects twice, once when evaluating src
and once when evaluating len.
Ok to commit? 3.3 as well?
2003-06-23 Jakub Jelinek <jakub@redhat.com>
* builtins.c (expand_builtin_strcpy): Don't evaluate side-effects in
src twice.
* gcc.c-torture/execute/string-opt-17.c: New test.
--- gcc/builtins.c.jj 2003-06-23 06:29:54.000000000 -0400
+++ gcc/builtins.c 2003-06-23 08:51:11.000000000 -0400
@@ -2541,7 +2541,7 @@ expand_builtin_strcpy (tree arglist, rtx
src = TREE_VALUE (TREE_CHAIN (arglist));
len = c_strlen (src);
- if (len == 0)
+ if (len == 0 || TREE_SIDE_EFFECTS (len))
return 0;
dst = TREE_VALUE (arglist);
--- gcc/testsuite/gcc.c-torture/execute/string-opt-17.c.jj 2003-06-23 07:36:56.000000000 -0400
+++ gcc/testsuite/gcc.c-torture/execute/string-opt-17.c 2003-06-23 07:38:12.000000000 -0400
@@ -0,0 +1,45 @@
+/* Copyright (C) 2003 Free Software Foundation.
+
+ Test strcpy optimizations don't evaluate side-effects twice.
+
+ Written by Jakub Jelinek, June 23, 2003. */
+
+typedef __SIZE_TYPE__ size_t;
+extern char *strcpy (char *, const char *);
+extern int memcmp (const void *, const void *, size_t);
+extern void abort (void);
+extern void exit (int);
+
+size_t
+test1 (char *s, size_t i)
+{
+ strcpy (s, "foobarbaz" + i++);
+ return i;
+}
+
+size_t
+check2 (void)
+{
+ static size_t r = 5;
+ if (r != 5)
+ abort ();
+ return ++r;
+}
+
+void
+test2 (char *s)
+{
+ strcpy (s, "foobarbaz" + check2 ());
+}
+
+int
+main (void)
+{
+ char buf[10];
+ if (test1 (buf, 7) != 8 || memcmp (buf, "az", 3))
+ abort ();
+ test2 (buf);
+ if (memcmp (buf, "baz", 4))
+ abort ();
+ exit (0);
+}
Jakub