re PR tree-optimization/19217 (ICE: verify_stmts failed: address taken, but ADDRESSAB...
authorSteven Bosscher <stevenb@suse.de>
Tue, 1 Feb 2005 22:50:12 +0000 (22:50 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Tue, 1 Feb 2005 22:50:12 +0000 (22:50 +0000)
PR tree-optimization/19217
* tree-cfg.c (verify_expr): Use the data field to see if TP was
seen inside a PHI node.  Do not do the ADDR_EXPR check if it was.
(verify_stmts): Pass (void*)1 as data to verify_expr to signal
that it is walking a PHI node.

From-SVN: r94570

gcc/ChangeLog
gcc/tree-cfg.c

index 735403417384c9bfad287087e1e8624b2f68af44..ac04aeb5c81af4b8cfdd701ca18c4cf1b39763ba 100644 (file)
@@ -1,3 +1,11 @@
+2005-02-01  Steven Bosscher  <stevenb@suse.de>
+
+       PR tree-optimization/19217
+       * tree-cfg.c (verify_expr): Use the data field to see if TP was
+       seen inside a PHI node.  Do not do the ADDR_EXPR check if it was.
+       (verify_stmts): Pass (void*)1 as data to verify_expr to signal
+       that it is walking a PHI node.
+
 2005-02-01  Joseph S. Myers  <joseph@codesourcery.com>
 
        * doc/extend.texi (Nested Functions): Update.
index 4df58550c051f0f8e075b5c13cc83fdc9784a106..ba4fbdc0ac789a5a79e63089941334bf3b759f94 100644 (file)
@@ -3231,12 +3231,14 @@ has_label_p (basic_block bb, tree label)
 
 
 /* Callback for walk_tree, check that all elements with address taken are
-   properly noticed as such.  */
+   properly noticed as such.  The DATA is an int* that is 1 if TP was seen
+   inside a PHI node.  */
 
 static tree
 verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
 {
   tree t = *tp, x;
+  bool in_phi = (data != NULL);
 
   if (TYPE_P (t))
     *walk_subtrees = 0;
@@ -3270,6 +3272,16 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
       break;
 
     case ADDR_EXPR:
+      /* ??? tree-ssa-alias.c may have overlooked dead PHI nodes, missing
+        dead PHIs that take the address of something.  But if the PHI
+        result is dead, the fact that it takes the address of anything
+        is irrelevant.  Because we can not tell from here if a PHI result
+        is dead, we just skip this check for PHIs altogether.  This means
+        we may be missing "valid" checks, but what can you do?
+        This was PR19217.  */
+      if (in_phi)
+       break;
+
       /* Skip any references (they will be checked when we recurse down the
         tree) and ensure that any variable used as a prefix is marked
         addressable.  */
@@ -3546,7 +3558,7 @@ verify_stmts (void)
                  err |= true;
                }
 
-             addr = walk_tree (&t, verify_expr, NULL, NULL);
+             addr = walk_tree (&t, verify_expr, (void *) 1, NULL);
              if (addr)
                {
                  debug_generic_stmt (addr);