diff options
author | Richard Guenther <rguenther@suse.de> | 2009-01-14 16:45:22 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-01-14 16:45:22 +0000 |
commit | 10bd6c5c4ab2fd182fc4e24ae539a97a9245774f (patch) | |
tree | 8fa08c2737a3ac983b265b46753713f8c3d356b3 /gcc/tree-ssa-structalias.c | |
parent | 7fe8ccdae51b85dd812af0d06df6f1a730064bc1 (diff) | |
download | gcc-10bd6c5c4ab2fd182fc4e24ae539a97a9245774f.zip gcc-10bd6c5c4ab2fd182fc4e24ae539a97a9245774f.tar.gz gcc-10bd6c5c4ab2fd182fc4e24ae539a97a9245774f.tar.bz2 |
re PR tree-optimization/38826 (points-to result wrong for reads from call-clobbered vars)
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.
* gcc.dg/Wstrict-aliasing-bogus-pta-1.c: New testcase.
From-SVN: r143374
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r-- | gcc/tree-ssa-structalias.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 3d64c1c..8b49556b 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); |