OSDN Git Service

2009-01-14 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Jan 2009 16:45:22 +0000 (16:45 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Jan 2009 16:45:22 +0000 (16:45 +0000)
PR tree-optimization/38826
PR middle-end/38477
* tree-ssa-structalias.c (emit_alias_warning): Emit the pointer
initialization notes only if we actually emitted a warning.
(intra_create_variable_infos): Add constraints for a result decl
that is passed by hidden reference.
(build_pred_graph): Mark all related variables non-direct on
address-taking.

* gcc.dg/Wstrict-aliasing-bogus-pta-1.c: New testcase.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-pta-1.c [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index d6a6ab9..97e9742 100644 (file)
@@ -1,3 +1,14 @@
+2009-01-14  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/38826
+       PR middle-end/38477
+       * tree-ssa-structalias.c (emit_alias_warning): Emit the pointer
+       initialization notes only if we actually emitted a warning.
+       (intra_create_variable_infos): Add constraints for a result decl
+       that is passed by hidden reference.
+       (build_pred_graph): Mark all related variables non-direct on
+       address-taking.
+
 2009-01-14  Nick Clifton  <nickc@redhat.com>
 
        * ira-conflicts.c: Include addresses.h for the definition of
index 27f60f9..8432ec6 100644 (file)
@@ -1,3 +1,9 @@
+2009-01-14  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/38826
+       PR middle-end/38477
+       * gcc.dg/Wstrict-aliasing-bogus-pta-1.c: New testcase.
+
 2009-01-13  Sebastian Pop  <sebastian.pop@amd.com>
 
        * gcc.dg/graphite/pr38786.c: Fix commit problem.
diff --git a/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-pta-1.c b/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-pta-1.c
new file mode 100644 (file)
index 0000000..a488274
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+struct S { int *p; int *q; };
+
+void foo (struct S *);
+
+int bar (int b)
+{
+  struct S s;
+  int *p;
+  float f;
+  foo (&s);
+  if (b)
+    p = s.q;
+  else
+    p = (int *)&f;
+  return *p;
+}
index 3d64c1c..8b49556 100644 (file)
@@ -1129,6 +1129,8 @@ build_pred_graph (void)
        }
       else if (rhs.type == ADDRESSOF)
        {
+         varinfo_t v;
+
          /* x = &y */
          if (graph->points_to[lhsvar] == NULL)
            graph->points_to[lhsvar] = BITMAP_ALLOC (&predbitmap_obstack);
@@ -1141,7 +1143,19 @@ build_pred_graph (void)
          /* Implicitly, *x = y */
          add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
 
+         /* All related variables are no longer direct nodes.  */
          RESET_BIT (graph->direct_nodes, rhsvar);
+         v = get_varinfo (rhsvar);
+         if (!v->is_full_var)
+           {
+             v = lookup_vi_for_tree (v->decl);
+             do
+               {
+                 RESET_BIT (graph->direct_nodes, v->id);
+                 v = v->next;
+               }
+             while (v != NULL);
+           }
          bitmap_set_bit (graph->address_taken, rhsvar);
        }
       else if (lhsvar > anything_id
@@ -4561,6 +4575,16 @@ intra_create_variable_infos (void)
        }
     }
 
+  /* Add a constraint for a result decl that is passed by reference.  */
+  if (DECL_RESULT (cfun->decl)
+      && DECL_BY_REFERENCE (DECL_RESULT (cfun->decl)))
+    {
+      varinfo_t p, result_vi = get_vi_for_tree (DECL_RESULT (cfun->decl));
+
+      for (p = result_vi; p; p = p->next)
+        make_constraint_from (p, nonlocal_id);
+    }
+
   /* Add a constraint for the incoming static chain parameter.  */
   if (cfun->static_chain_decl != NULL_TREE)
     {
@@ -4735,7 +4759,7 @@ emit_alias_warning (tree ptr)
 {
   gimple use;
   imm_use_iterator ui;
-  unsigned warned = 0;
+  bool warned = false;
 
   FOR_EACH_IMM_USE_STMT (use, ui, ptr)
     {
@@ -4773,13 +4797,12 @@ emit_alias_warning (tree ptr)
          && !TREE_NO_WARNING (deref))
        {
          TREE_NO_WARNING (deref) = 1;
-         warning_at (gimple_location (use), OPT_Wstrict_aliasing,
-                     "dereferencing pointer %qD does break strict-aliasing "
-                     "rules", SSA_NAME_VAR (ptr));
-         ++warned;
+         warned |= warning_at (gimple_location (use), OPT_Wstrict_aliasing,
+                               "dereferencing pointer %qD does break "
+                               "strict-aliasing rules", SSA_NAME_VAR (ptr));
        }
     }
-  if (warned > 0)
+  if (warned)
     {
       bitmap visited = BITMAP_ALLOC (NULL);
       emit_pointer_definition (ptr, visited);