re PR tree-optimization/61773 (ICE in tree-ssa-strlen.c:417)

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.

From-SVN: r217910
This commit is contained in:
Jakub Jelinek 2014-11-21 10:27:19 +01:00 committed by Jakub Jelinek
parent aa7da51a8c
commit 1e762c6ad8
4 changed files with 24 additions and 1 deletions

View File

@ -1,5 +1,9 @@
2014-11-21 Jakub Jelinek <jakub@redhat.com> 2014-11-21 Jakub Jelinek <jakub@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.
PR target/63910 PR target/63910
* simplify-rtx.c (simplify_immed_subreg): Return NULL for integer * simplify-rtx.c (simplify_immed_subreg): Return NULL for integer
modes wider than MAX_BITSIZE_MODE_ANY_INT. If not using modes wider than MAX_BITSIZE_MODE_ANY_INT. If not using

View File

@ -1,5 +1,8 @@
2014-11-21 Jakub Jelinek <jakub@redhat.com> 2014-11-21 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/61773
* gcc.dg/pr61773.c: New test.
PR target/63764 PR target/63764
* c-c++-common/pr63764-1.c: New test. * c-c++-common/pr63764-1.c: New test.
* c-c++-common/pr63764-2.c: New test. * c-c++-common/pr63764-2.c: New test.

View File

@ -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;
}

View File

@ -430,7 +430,6 @@ get_string_length (strinfo si)
callee = gimple_call_fndecl (stmt); callee = gimple_call_fndecl (stmt);
gcc_assert (callee && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL); gcc_assert (callee && DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL);
lhs = gimple_call_lhs (stmt); lhs = gimple_call_lhs (stmt);
gcc_assert (builtin_decl_implicit_p (BUILT_IN_STPCPY));
/* unshare_strinfo is intentionally not called here. The (delayed) /* unshare_strinfo is intentionally not called here. The (delayed)
transformation of strcpy or strcat into stpcpy is done at the place 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 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_CHK:
case BUILT_IN_STRCPY_CHKP: case BUILT_IN_STRCPY_CHKP:
case BUILT_IN_STRCPY_CHK_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)) if (gimple_call_num_args (stmt) == (with_bounds ? 4 : 2))
fn = builtin_decl_implicit (BUILT_IN_STPCPY); fn = builtin_decl_implicit (BUILT_IN_STPCPY);
else else