From: Richard Guenther Date: Wed, 14 Jan 2009 16:45:22 +0000 (+0000) Subject: re PR tree-optimization/38826 (points-to result wrong for reads from call-clobbered... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=10bd6c5c4ab2fd182fc4e24ae539a97a9245774f;p=gcc.git re PR tree-optimization/38826 (points-to result wrong for reads from call-clobbered vars) 2009-01-14 Richard Guenther 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. From-SVN: r143374 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6a6ab98e2c..97e97422c5a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2009-01-14 Richard Guenther + + 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 * ira-conflicts.c: Include addresses.h for the definition of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 27f60f96e02..8432ec6cdfe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-01-14 Richard Guenther + + PR tree-optimization/38826 + PR middle-end/38477 + * gcc.dg/Wstrict-aliasing-bogus-pta-1.c: New testcase. + 2009-01-13 Sebastian Pop * 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 index 00000000000..a48827474d7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wstrict-aliasing-bogus-pta-1.c @@ -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; +} diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 3d64c1cbd33..8b49556b3c0 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -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);