From 8b592de00624d2a4dbac168c20d1e240034aa0cf Mon Sep 17 00:00:00 2001
From: steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 1 Feb 2005 22:50:12 +0000
Subject: [PATCH] 	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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94570 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog  |  8 ++++++++
 gcc/tree-cfg.c | 16 ++++++++++++++--
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 735403417384..ac04aeb5c81a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 4df58550c051..ba4fbdc0ac78 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -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);
-- 
GitLab