http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48764
--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-04-26
11:17:59 UTC ---
The following fixes it (partially, global vars need similar treatment) at the
cost of extra decls and points-to bits.
We have to give what we point to a name, not only rely in the nonlocal glob.
Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c (revision 172817)
+++ gcc/tree-ssa-structalias.c (working copy)
@@ -4727,8 +4727,27 @@ intra_create_variable_infos (void)
}
for (p = get_vi_for_tree (t); p; p = p->next)
- if (p->may_have_pointers)
- make_constraint_from (p, nonlocal_id);
+ {
+ if (p->may_have_pointers)
+ {
+ struct constraint_expr lhsc, rhsc;
+ tree heapvar;
+ heapvar = create_tmp_var_raw (TREE_TYPE (TREE_TYPE (t)),
+ "PARM_PT");
+ DECL_EXTERNAL (heapvar) = 1;
+ get_var_ann (heapvar)->is_heapvar = 1;
+ add_referenced_var (heapvar);
+ lhsc.var = p->id;
+ lhsc.type = SCALAR;
+ lhsc.offset = 0;
+ rhsc.var = get_vi_for_tree (heapvar)->id;
+ rhsc.type = ADDRESSOF;
+ rhsc.offset = 0;
+ process_constraint (new_constraint (lhsc, rhsc));
+
+ make_constraint_from (p, nonlocal_id);
+ }
+ }
if (POINTER_TYPE_P (TREE_TYPE (t))
&& TYPE_RESTRICT (TREE_TYPE (t)))
make_constraint_from_restrict (get_vi_for_tree (t), "PARM_RESTRICT");
it would be nice if we could avoid allocating decls for such things
(in principle we could simply allocate a DECL_UID only).