aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-11-21 10:27:19 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-11-21 10:27:19 +0100
commit1e762c6ad828137e5cd2310e7acb2a6c80be17d1 (patch)
treec42b16609c961418091986ce3830bcb9a07f493c /gcc
parentaa7da51a8c95366b781d0ce5e6cb046ef0aa899f (diff)
downloadgcc-1e762c6ad828137e5cd2310e7acb2a6c80be17d1.zip
gcc-1e762c6ad828137e5cd2310e7acb2a6c80be17d1.tar.gz
gcc-1e762c6ad828137e5cd2310e7acb2a6c80be17d1.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/pr61773.c16
-rw-r--r--gcc/tree-ssa-strlen.c2
4 files changed, 24 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9f03c0f..3235ba0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
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
* 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 034f4d9..67e3895 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2014-11-21 Jakub Jelinek <jakub@redhat.com>
+ 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 0000000..e0b4e60
--- /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 c02e612..7b1c0d9 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