On Tue, Oct 4, 2011 at 1:00 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> Hi!
>
> The following testcase ICEs on the trunk, as strlen optimization was
> assuming memcpy arguments will have expected type (size_type_node),
> but they had ssizetype instead.  The following patch fixes it
> both in the builtins.c folders that create memcpy and also in the
> strlen pass to no longer assume that.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2011-10-04  Jakub Jelinek  <ja...@redhat.com>
>
>        PR tree-optimization/50604
>        * builtins.c (fold_builtin_strcpy, fold_builtin_stpcpy,
>        fold_builtin_strncpy, fold_builtin_stxcpy_chk): Ensure
>        last argument to memcpy has size_type_node type instead of
>        ssizetype.
>        * tree-ssa-strlen.c (handle_builtin_memcpy): Use size_type_node
>        instead of TREE_TYPE (len) as type for newlen.
>
>        * gcc.dg/pr50604.c: New test.
>
> --- gcc/builtins.c.jj   2011-08-26 18:41:44.000000000 +0200
> +++ gcc/builtins.c      2011-10-04 09:50:11.000000000 +0200
> @@ -8288,7 +8288,8 @@ fold_builtin_strcpy (location_t loc, tre
>        return NULL_TREE;
>     }
>
> -  len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
> +  len = fold_convert_loc (loc, size_type_node, len);
> +  len = size_binop_loc (loc, PLUS_EXPR, len, build_int_cst (size_type_node, 
> 1));
>   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
>                           build_call_expr_loc (loc, fn, 3, dest, src, len));
>  }
> @@ -8319,7 +8320,9 @@ fold_builtin_stpcpy (location_t loc, tre
>   if (!fn)
>     return NULL_TREE;
>
> -  lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
> +  lenp1 = size_binop_loc (loc, PLUS_EXPR,
> +                         fold_convert_loc (loc, size_type_node, len),
> +                         build_int_cst (size_type_node, 1));
>   /* We use dest twice in building our expression.  Save it from
>      multiple expansions.  */
>   dest = builtin_save_expr (dest);
> @@ -8375,6 +8378,8 @@ fold_builtin_strncpy (location_t loc, tr
>   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
>   if (!fn)
>     return NULL_TREE;
> +
> +  len = fold_convert_loc (loc, size_type_node, len);
>   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
>                           build_call_expr_loc (loc, fn, 3, dest, src, len));
>  }
> @@ -12127,7 +12132,9 @@ fold_builtin_stxcpy_chk (location_t loc,
>              if (!fn)
>                return NULL_TREE;
>
> -             len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
> +             len = fold_convert_loc (loc, size_type_node, len);
> +             len = size_binop_loc (loc, PLUS_EXPR, len,
> +                                   build_int_cst (size_type_node, 1));
>              return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
>                                       build_call_expr_loc (loc, fn, 4,
>                                                        dest, src, len, size));
> --- gcc/tree-ssa-strlen.c.jj    2011-09-29 14:25:46.000000000 +0200
> +++ gcc/tree-ssa-strlen.c       2011-10-04 09:52:50.000000000 +0200
> @@ -1297,7 +1297,7 @@ handle_builtin_memcpy (enum built_in_fun
>   if (si != NULL)
>     newlen = si->length;
>   else
> -    newlen = build_int_cst (TREE_TYPE (len), ~idx);
> +    newlen = build_int_cst (size_type_node, ~idx);
>   oldlen = NULL_TREE;
>   if (olddsi != NULL)
>     {
> --- gcc/testsuite/gcc.dg/pr50604.c.jj   2011-10-04 09:55:38.000000000 +0200
> +++ gcc/testsuite/gcc.dg/pr50604.c      2011-10-04 09:53:39.000000000 +0200
> @@ -0,0 +1,19 @@
> +/* PR tree-optimization/50604 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +#include "strlenopt.h"
> +
> +typedef char T;
> +extern const T s[];
> +
> +void
> +foo (T *x)
> +{
> +  char *r = malloc (strlen (x));
> +  strcpy (r, s);
> +  strcat (r, x);
> +  strcat (r, "/");
> +}
> +
> +const T s[] = "abcdefghijklmnopq";
>
>        Jakub
>

Reply via email to