diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-03-07 23:11:55 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-03-07 23:11:55 +0100 |
commit | c7148991ec3e8a98f2fce90ef7d1073fc07764f2 (patch) | |
tree | 42ab2b8833f8c3a1123d34aa1635fa2f941b1a81 | |
parent | 691a924baf30c73fd91a19b6b9679ab9da6e29b3 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr47991.c | 25 | ||||
-rw-r--r-- | gcc/var-tracking.c | 11 |
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; |