This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix builtin strcpy


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]