On November 20, 2014 7:16:04 PM CET, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>Before the r211956 changes, the only places that set si->stmt
>were required to check that stpcpy has been declared (with the right
>prototype) to signal the strlen pass that it can use stpcpy for
>optimization.  But r211956 sets si->stmt also for malloca call,
>which isn't in any way related to stpcpy.  So, this patch moves the
>assertion where it really is needed (for strcat/strcpy and their
>checking
>variants cases).
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Thanks,
Richard.

>2014-11-20  Jakub Jelinek  <ja...@redhat.com>
>
>       PR tree-optimization/61773
>       * tree-ssa-strlen.c (get_string_length): Don't assert
>       stpcpy has been prototyped if si->stmt is BUILT_IN_MALLOC.
>
>       * gcc.dg/pr61773.c: New test.
>
>--- gcc/tree-ssa-strlen.c.jj   2014-11-19 18:47:59.000000000 +0100
>+++ gcc/tree-ssa-strlen.c      2014-11-20 09:46:33.949017462 +0100
>@@ -430,7 +430,6 @@ get_string_length (strinfo si)
>       callee = gimple_call_fndecl (stmt);
>gcc_assert (callee && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL);
>       lhs = gimple_call_lhs (stmt);
>-      gcc_assert (builtin_decl_implicit_p (BUILT_IN_STPCPY));
>    /* unshare_strinfo is intentionally not called here.  The (delayed)
>        transformation of strcpy or strcat into stpcpy is done at the place
>        of the former strcpy/strcat call and so can affect all the strinfos
>@@ -479,6 +478,7 @@ get_string_length (strinfo si)
>       case BUILT_IN_STRCPY_CHK:
>       case BUILT_IN_STRCPY_CHKP:
>       case BUILT_IN_STRCPY_CHK_CHKP:
>+        gcc_assert (builtin_decl_implicit_p (BUILT_IN_STPCPY));
>         if (gimple_call_num_args (stmt) == (with_bounds ? 4 : 2))
>           fn = builtin_decl_implicit (BUILT_IN_STPCPY);
>         else
>--- gcc/testsuite/gcc.dg/pr61773.c.jj  2014-11-20 10:12:48.664616764
>+0100
>+++ gcc/testsuite/gcc.dg/pr61773.c     2014-11-20 10:13:47.384557904 +0100
>@@ -0,0 +1,16 @@
>+/* PR tree-optimization/61773 */
>+/* { dg-do compile } */
>+/* { dg-options "-O2" } */
>+
>+void
>+foo (char **x)
>+{
>+  char *p = __builtin_malloc (64);
>+  char *q = __builtin_malloc (64);
>+  __builtin_strcat (q, "abcde");
>+  __builtin_strcat (p, "ab");
>+  p[1] = q[3];
>+  __builtin_strcat (p, q);
>+  x[0] = p;
>+  x[1] = q;
>+}
>
>       Jakub


Reply via email to