On Fri, Sep 30, 2011 at 05:17:00PM +0200, Jakub Jelinek wrote: > Here is the updated patch, bootstrapped/regtested on x86_64-linux and > i686-linux, committed to trunk. Will work on 4.6 backport of the str{,n}cat > part.
And here is the backport I've just committed. 4.6 doesn't handle BUILT_IN_*_CHK in tree-ssa-alias.c at all, so the patch is shorter. 2011-09-30 Jakub Jelinek <ja...@redhat.com> Richard Guenther <rguent...@suse.de> * tree-ssa-alias.c (call_may_clobber_ref_p_1): Fix handling of BUILT_IN_STRNCAT. (ref_maybe_used_by_call_p_1): Fix handling of BUILT_IN_STRCAT, and BUILT_IN_STRNCAT. --- gcc/tree-ssa-alias.c.jj 2011-09-29 15:27:17.000000000 +0200 +++ gcc/tree-ssa-alias.c 2011-09-30 12:16:20.000000000 +0200 @@ -1208,8 +1208,20 @@ ref_maybe_used_by_call_p_1 (gimple call, && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL) switch (DECL_FUNCTION_CODE (callee)) { - /* All the following functions clobber memory pointed to by - their first argument. */ + /* All the following functions read memory pointed to by + their second argument. strcat/strncat additionally + reads memory pointed to by the first argument. */ + case BUILT_IN_STRCAT: + case BUILT_IN_STRNCAT: + { + ao_ref dref; + ao_ref_init_from_ptr_and_size (&dref, + gimple_call_arg (call, 0), + NULL_TREE); + if (refs_may_alias_p_1 (&dref, ref, false)) + return true; + } + /* FALLTHRU */ case BUILT_IN_STRCPY: case BUILT_IN_STRNCPY: case BUILT_IN_MEMCPY: @@ -1217,8 +1229,6 @@ ref_maybe_used_by_call_p_1 (gimple call, case BUILT_IN_MEMPCPY: case BUILT_IN_STPCPY: case BUILT_IN_STPNCPY: - case BUILT_IN_STRCAT: - case BUILT_IN_STRNCAT: { ao_ref dref; tree size = NULL_TREE; @@ -1449,7 +1459,12 @@ call_may_clobber_ref_p_1 (gimple call, a { ao_ref dref; tree size = NULL_TREE; - if (gimple_call_num_args (call) == 3) + /* Don't pass in size for strncat, as the maximum size + is strlen (dest) + n + 1 instead of n, resp. + n + 1 at dest + strlen (dest), but strlen (dest) isn't + known. */ + if (gimple_call_num_args (call) == 3 + && DECL_FUNCTION_CODE (callee) != BUILT_IN_STRNCAT) size = gimple_call_arg (call, 2); ao_ref_init_from_ptr_and_size (&dref, gimple_call_arg (call, 0), Jakub