aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-03-07 23:11:55 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-03-07 23:11:55 +0100
commitc7148991ec3e8a98f2fce90ef7d1073fc07764f2 (patch)
tree42ab2b8833f8c3a1123d34aa1635fa2f941b1a81
parent691a924baf30c73fd91a19b6b9679ab9da6e29b3 (diff)
downloadgcc-c7148991ec3e8a98f2fce90ef7d1073fc07764f2.zip
gcc-c7148991ec3e8a98f2fce90ef7d1073fc07764f2.tar.gz
gcc-c7148991ec3e8a98f2fce90ef7d1073fc07764f2.tar.bz2
re PR debug/47991 (Var-tracking ICE on s390x *setmem_long insn)
PR debug/47991 * var-tracking.c (find_use_val): Return NULL for cui->sets && cui->store_p BLKmode MEMs. * gcc.dg/pr47991.c: New test. From-SVN: r170759
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr47991.c25
-rw-r--r--gcc/var-tracking.c11
4 files changed, 45 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 413b546..8b1b64f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-03-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/47991
+ * var-tracking.c (find_use_val): Return NULL for
+ cui->sets && cui->store_p BLKmode MEMs.
+
2011-03-07 Anatoly Sokolov <aesok@post.ru>
* config/stormy16/stormy16.h (PRINT_OPERAND, PRINT_OPERAND_ADDRESS):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 71fc4294..f578396 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/47991
+ * gcc.dg/pr47991.c: New test.
+
2011-03-07 Jason Merrill <jason@redhat.com>
* g++.dg/abi/mangle46.C: New.
diff --git a/gcc/testsuite/gcc.dg/pr47991.c b/gcc/testsuite/gcc.dg/pr47991.c
new file mode 100644
index 0000000..688be5c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr47991.c
@@ -0,0 +1,25 @@
+/* PR debug/47991 */
+/* { dg-do compile } */
+/* { dg-options "-g -Os" } */
+
+typedef __SIZE_TYPE__ size_t;
+extern inline __attribute__ ((__always_inline__))
+void *
+memset (void *x, int y, size_t z)
+{
+ return __builtin___memset_chk (x, y, z, __builtin_object_size (x, 0));
+}
+
+void
+foo (unsigned char *x, unsigned char *y, unsigned char *z,
+ unsigned char *w, unsigned int v, int u, int t)
+{
+ int i;
+ for (i = 0; i < t; i++)
+ {
+ memset (z, x[0], v);
+ memset (w, y[0], v);
+ x += u;
+ }
+ __builtin_memcpy (z, x, u);
+}
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 7543a5a..a9efcb1 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -1,5 +1,5 @@
/* Variable tracking routines for the GNU compiler.
- Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+ Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
@@ -4784,12 +4784,19 @@ find_use_val (rtx x, enum machine_mode mode, struct count_use_info *cui)
if (cui->sets)
{
/* This is called after uses are set up and before stores are
- processed bycselib, so it's safe to look up srcs, but not
+ processed by cselib, so it's safe to look up srcs, but not
dsts. So we look up expressions that appear in srcs or in
dest expressions, but we search the sets array for dests of
stores. */
if (cui->store_p)
{
+ /* Some targets represent memset and memcpy patterns
+ by (set (mem:BLK ...) (reg:[QHSD]I ...)) or
+ (set (mem:BLK ...) (const_int ...)) or
+ (set (mem:BLK ...) (mem:BLK ...)). Don't return anything
+ in that case, otherwise we end up with mode mismatches. */
+ if (mode == BLKmode && MEM_P (x))
+ return NULL;
for (i = 0; i < cui->n_sets; i++)
if (cui->sets[i].dest == x)
return cui->sets[i].src_elt;