aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-02-10 15:28:07 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-02-10 15:28:07 +0000
commit92b1d23b739e8b640772220aeac3c86205e2814d (patch)
tree4ac38843448296b95316452c0b8e5f6e0a215f7e /gcc
parentfcc414dca4703222b72348d0aeef5aae2ec9b726 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr47677.c34
-rw-r--r--gcc/tree-vrp.c2
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)));
}