OSDN Git Service

PR tree-optimization/19217
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Feb 2005 22:50:12 +0000 (22:50 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 1 Feb 2005 22:50:12 +0000 (22:50 +0000)
* 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.

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

gcc/ChangeLog
gcc/tree-cfg.c

index 7354034..ac04aeb 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 4df5855..ba4fbdc 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);