2008-01-04 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Jan 2008 15:56:41 +0000 (15:56 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 4 Jan 2008 15:56:41 +0000 (15:56 +0000)
PR middle-end/34029
* tree-cfg.c (verify_expr): Do not look inside ADDR_EXPRs
for verifying purposes if they are is_gimple_min_invariant.

* gcc.c-torture/compile/pr34029-1.c: New testcase.
* gcc.c-torture/compile/pr34029-2.c: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131325 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr34029-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/pr34029-2.c [new file with mode: 0644]
gcc/tree-cfg.c

index d046801..d16ff84 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-04  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/34029
+       * tree-cfg.c (verify_expr): Do not look inside ADDR_EXPRs
+       for verifying purposes if they are is_gimple_min_invariant.
+
 2008-01-04  Aldy Hernandez  <aldyh@redhat.com>
 
        PR tree-optimization/34448
index 239fbeb..a8cdbf7 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-04  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/34029
+       * gcc.c-torture/compile/pr34029-1.c: New testcase.
+       * gcc.c-torture/compile/pr34029-2.c: Likewise.
+
 2008-01-04  Jakub Jelinek  <jakub@redhat.com>
 
        PR gcov-profile/34609
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr34029-1.c b/gcc/testsuite/gcc.c-torture/compile/pr34029-1.c
new file mode 100644 (file)
index 0000000..5261129
--- /dev/null
@@ -0,0 +1,22 @@
+static const char s[] = "ab.cd.efghijk";
+
+int
+foo (const char *x)
+{
+  const char *a;
+  int b = 0;
+
+  a = __builtin_strchr (s, '.');
+  if (a == 0)
+    b = 1;
+  else if ((a = __builtin_strchr (a + 1, '.')) == 0)
+    b = 1;
+  else if (__builtin_strncmp (s, x, a - s))
+    b = 1;
+  else if (__builtin_strncmp (a + 1, x + (a - s + 1), 4) < 0)
+    b = 1;
+
+  if (b)
+    return 4;
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr34029-2.c b/gcc/testsuite/gcc.c-torture/compile/pr34029-2.c
new file mode 100644 (file)
index 0000000..9ec49ec
--- /dev/null
@@ -0,0 +1,12 @@
+static const char s[] = "ab.cd.efghijk";
+static const char t[] = "abcde";
+
+long
+foo (const char *x)
+{
+  const char *a;
+  long b = 0;
+
+  a = __builtin_strchr (s, '.');
+  return ((long) a) + (1 - (long) t);
+}
index 1606497..a8cb627 100644 (file)
@@ -3218,6 +3218,11 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
            error ("address taken, but ADDRESSABLE bit not set");
            return x;
          }
+
+       /* Stop recursing and verifying invariant ADDR_EXPRs, they tend
+          to become arbitrary complicated.  */
+       if (is_gimple_min_invariant (t))
+         *walk_subtrees = 0;
        break;
       }