------- Comment #2 from rguenth at gcc dot gnu dot org 2008-11-25 12:22 ------- On the branch I am installing the following as a stop-gap measure:
Index: tree-ssa-structalias.c =================================================================== --- tree-ssa-structalias.c (revision 142149) +++ tree-ssa-structalias.c (working copy) @@ -230,6 +230,9 @@ struct variable_info variable. This is used for C++ placement new. */ unsigned int no_tbaa_pruning : 1; + /* If found to be a non-pointer variable. */ + unsigned int is_nonpointer_var : 1; + /* Variable id this was collapsed to due to type unsafety. Zero if this variable was not collapsed. This should be unused completely after build_succ_graph, or something is broken. */ @@ -377,6 +380,7 @@ new_var_info (tree t, unsigned int id, c ret->is_special_var = false; ret->is_unknown_size_var = false; ret->is_full_var = false; + ret->is_nonpointer_var = false; var = t; if (TREE_CODE (var) == SSA_NAME) var = SSA_NAME_VAR (var); @@ -2175,6 +2179,7 @@ perform_var_substitution (constraint_gra "%s is a non-pointer variable, eliminating edges.\n", get_varinfo (node)->name); stats.nonpointer_vars++; + get_varinfo (i)->is_nonpointer_var = true; clear_edges_for_node (graph, node); } } @@ -4752,6 +4755,11 @@ find_what_p_points_to (tree p) if (vi->is_artificial_var) return false; + /* ??? Some real variables get eliminated as non-pointers. + Workaround this. See PR37869. */ + if (vi->is_nonpointer_var) + return false; + /* See if this is a field or a structure. */ if (vi->size != vi->fullsize) { -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37869