aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-03-23 21:03:50 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-03-23 21:03:50 +0100
commitfc6a2c5d9a9b1338ef477e90b4b5d06b438ba82f (patch)
tree4065a00f4a4d32daf23fd885008073d594fbeea7 /gcc
parent9804b0fb044f4678eaedaaa00b46cbb934a7d270 (diff)
downloadgcc-fc6a2c5d9a9b1338ef477e90b4b5d06b438ba82f.zip
gcc-fc6a2c5d9a9b1338ef477e90b4b5d06b438ba82f.tar.gz
gcc-fc6a2c5d9a9b1338ef477e90b4b5d06b438ba82f.tar.bz2
re PR target/65523 (ICE: in gimple_op, at gimple.h:2270 with -fcheck-pointer-bounds -mmpx)
PR target/65523 * tree-chkp.c (chkp_build_returned_bound): Ignore ERF_RETURNS_ARG calls if they have fewer than needed arguments. * gcc.target/i386/pr65523.c: New test. From-SVN: r221606
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.target/i386/pr65523.c11
-rw-r--r--gcc/tree-chkp.c8
4 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2df46f5..97c0afd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/65523
+ * tree-chkp.c (chkp_build_returned_bound): Ignore
+ ERF_RETURNS_ARG calls if they have fewer than needed arguments.
+
2015-03-23 Oleg Endo <olegendo@gcc.gnu.org>
PR target/65505
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b612abc..b9f8dc2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2015-03-23 Jakub Jelinek <jakub@redhat.com>
+ PR target/65523
+ * gcc.target/i386/pr65523.c: New test.
+
PR ipa/65475
* g++.dg/lto/pr65475_0.C: Use dg-lto-options instead of
dg-options.
diff --git a/gcc/testsuite/gcc.target/i386/pr65523.c b/gcc/testsuite/gcc.target/i386/pr65523.c
new file mode 100644
index 0000000..5a25f50
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr65523.c
@@ -0,0 +1,11 @@
+/* PR target/65523 */
+/* { dg-do compile } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
+
+void *memmove ();
+
+void *
+bar ()
+{
+ return memmove ();
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index d2df4ba..977c460 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -2153,6 +2153,7 @@ chkp_build_returned_bound (gcall *call)
tree bounds;
gimple stmt;
tree fndecl = gimple_call_fndecl (call);
+ unsigned int retflags;
/* To avoid fixing alloca expands in targets we handle
it separately. */
@@ -2196,12 +2197,11 @@ chkp_build_returned_bound (gcall *call)
}
/* Do not use retbnd when returned bounds are equal to some
of passed bounds. */
- else if (gimple_call_return_flags (call) & ERF_RETURNS_ARG)
+ else if (((retflags = gimple_call_return_flags (call)) & ERF_RETURNS_ARG)
+ && (retflags & ERF_RETURN_ARG_MASK) < gimple_call_num_args (call))
{
gimple_stmt_iterator iter = gsi_for_stmt (call);
- unsigned int retarg = 0, argno;
- if (gimple_call_return_flags (call) & ERF_RETURNS_ARG)
- retarg = gimple_call_return_flags (call) & ERF_RETURN_ARG_MASK;
+ unsigned int retarg = retflags & ERF_RETURN_ARG_MASK, argno;
if (gimple_call_with_bounds_p (call))
{
for (argno = 0; argno < gimple_call_num_args (call); argno++)