From 1e762c6ad828137e5cd2310e7acb2a6c80be17d1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 21 Nov 2014 10:27:19 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/pr61773.c | 16 ++++++++++++++++ gcc/tree-ssa-strlen.c | 2 +- 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr61773.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9f03c0f2432..3235ba0da45 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2014-11-21 Jakub Jelinek + 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 * simplify-rtx.c (simplify_immed_subreg): Return NULL for integer modes wider than MAX_BITSIZE_MODE_ANY_INT. If not using diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 034f4d94174..67e3895b9f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2014-11-21 Jakub Jelinek + PR tree-optimization/61773 + * gcc.dg/pr61773.c: New test. + PR target/63764 * c-c++-common/pr63764-1.c: New test. * c-c++-common/pr63764-2.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr61773.c b/gcc/testsuite/gcc.dg/pr61773.c new file mode 100644 index 00000000000..e0b4e60202d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr61773.c @@ -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; +} diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index c02e6128aa7..7b1c0d95f4a 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -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 -- 2.30.2