diff options
author | Richard Guenther <rguenther@suse.de> | 2011-02-10 15:28:07 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-02-10 15:28:07 +0000 |
commit | 92b1d23b739e8b640772220aeac3c86205e2814d (patch) | |
tree | 4ac38843448296b95316452c0b8e5f6e0a215f7e /gcc | |
parent | fcc414dca4703222b72348d0aeef5aae2ec9b726 (diff) | |
download | gcc-92b1d23b739e8b640772220aeac3c86205e2814d.zip gcc-92b1d23b739e8b640772220aeac3c86205e2814d.tar.gz gcc-92b1d23b739e8b640772220aeac3c86205e2814d.tar.bz2 |
re PR tree-optimization/47677 (Hang in VRP)
2011-02-10 Richard Guenther <rguenther@suse.de>
PR tree-optimization/47677
* tree-vrp.c (vrp_bitmap_equal_p): Fix comparison of empty bitmaps.
* gcc.dg/torture/pr47677.c: New testcase.
From-SVN: r170002
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr47677.c | 34 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 2 |
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f041a02..7b75f48 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-02-10 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/47677 + * tree-vrp.c (vrp_bitmap_equal_p): Fix comparison of empty bitmaps. + 2011-02-10 Jakub Jelinek <jakub@redhat.com> PR target/47665 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c39034c..649a0b7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-10 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/47677 + * gcc.dg/torture/pr47677.c: New testcase. + 2011-02-10 Iain Sandoe <iains@gcc.gnu.org> * objc.dg/special/load-category-1.m: Remove unused header. diff --git a/gcc/testsuite/gcc.dg/torture/pr47677.c b/gcc/testsuite/gcc.dg/torture/pr47677.c new file mode 100644 index 0000000..bd90778 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr47677.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ + +struct S { int s; int u; }; +extern int bar (void); +extern struct S *baz (void); + +void +foo (int x, struct S *y, char z, int *v, struct S *s) +{ + int c, d; + if (x & 2) + d = 1; + else + { + d = (x & 1) ? 11 : 0; + while ((c = (s->s != (s->u & 1) ? s->s : bar ())) != '\0'); + c = (s->s != '\\' && (s->u & 4) ? s->s : bar ()); + if (c == '<') + goto lab; + } + while ((c = ((s->u & 1) ? s->s : bar ())) != 0 + && ((d != 11 && d != 17) || (v[c] & 1) == 0)) + { + lab:; + switch (d) + { + case 14: + if (c == '}') + y = baz (); + d = y->s = z == '<' ? 17 : 11; + } + } +} + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index b07f121..5e891f5 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -714,6 +714,8 @@ static inline bool vrp_bitmap_equal_p (const_bitmap b1, const_bitmap b2) { return (b1 == b2 + || ((!b1 || bitmap_empty_p (b1)) + && (!b2 || bitmap_empty_p (b2))) || (b1 && b2 && bitmap_equal_p (b1, b2))); } |