2008-12-09 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Dec 2008 11:06:34 +0000 (11:06 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 9 Dec 2008 11:06:34 +0000 (11:06 +0000)
PR tree-optimization/38445
* tree-ssa-structalias.c (emit_pointer_definition): Only visit
names once.
(emit_alias_warning): Adjust.

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

gcc/ChangeLog
gcc/tree-ssa-structalias.c

index 6f4c937..ae10870 100644 (file)
@@ -1,3 +1,10 @@
+2008-12-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/38445
+       * tree-ssa-structalias.c (emit_pointer_definition): Only visit
+       names once.
+       (emit_alias_warning): Adjust.
+
 2008-12-09  Andrew Haley  <aph@redhat.com>
 
        * fixed-value.c (do_fixed_add): Add comment.
index 46781b8..3d64c1c 100644 (file)
@@ -4704,8 +4704,9 @@ static bool have_alias_info = false;
 /* Emit a note for the pointer initialization point DEF.  */
 
 static void
-emit_pointer_definition (gimple def)
+emit_pointer_definition (tree ptr, bitmap visited)
 {
+  gimple def = SSA_NAME_DEF_STMT (ptr);
   if (gimple_code (def) == GIMPLE_PHI)
     {
       use_operand_p argp;
@@ -4715,7 +4716,10 @@ emit_pointer_definition (gimple def)
        {
          tree arg = USE_FROM_PTR (argp);
          if (TREE_CODE (arg) == SSA_NAME)
-           emit_pointer_definition (SSA_NAME_DEF_STMT (arg));
+           {
+             if (bitmap_set_bit (visited, SSA_NAME_VERSION (arg)))
+               emit_pointer_definition (arg, visited);
+           }
          else
            inform (0, "initialized from %qE", arg);
        }
@@ -4729,7 +4733,6 @@ emit_pointer_definition (gimple def)
 static void
 emit_alias_warning (tree ptr)
 {
-  gimple def = SSA_NAME_DEF_STMT (ptr);
   gimple use;
   imm_use_iterator ui;
   unsigned warned = 0;
@@ -4777,7 +4780,11 @@ emit_alias_warning (tree ptr)
        }
     }
   if (warned > 0)
-    emit_pointer_definition (def);
+    {
+      bitmap visited = BITMAP_ALLOC (NULL);
+      emit_pointer_definition (ptr, visited);
+      BITMAP_FREE (visited);
+    }
 }
 
 /* Given a pointer variable P, fill in its points-to set, or return