> > +alias_set_entry
> > +init_alias_set_entry (alias_set_type set)
> > +{
> > + alias_set_entry ase = ggc_cleared_alloc<alias_set_entry_d> ();
>
> no need to use cleared_alloc if you also init ->is_pointer to false.
OK, will update the patch.
>
> > + ase->alias_set = set;
> > + ase->children
> > + = hash_map<int, int, alias_set_traits>::create_ggc (64);
>
> that seems a bit excessive, esp. for pointers which won't end
> up with any children? So better make children lazily allocated
> in record_alias_subset.
All pointers that are not in alias set of ptr_type_node will have a child.
So there is only one childless pointer set. I will update the code though.
>
> I still wonder why you do this instead of changing alias_sets_conflict
> in the same way you changed alias_set_subset_of.
Because I would need two flags otherwise. One denoting alias sets that
are pointers (who needs special treatment for subset_of) and one denoting
alias set that contains pointer.
i.e. for:
struct {int *a,b;}
I need to have its alias set to contain all of setof(int), setof(int *),
setof(void *).
I however do not want setof(struct {int *a,b;}) to be subset of setof(void *)
Honza
>
> Patch looks ok otherwise but please leave the patch for others to
> comment on for a while.
>
> Thanks,
> Richard.
>
> > + }
> > + }
> > + }
> > + /* In LTO the rules above needs to be part of canonical type machinery.
> > + For now just punt. */
> > + else if (POINTER_TYPE_P (t) && t != ptr_type_node && in_lto_p)
> > set = get_alias_set (ptr_type_node);
> >
> > /* Otherwise make a new alias set for this type. */
> > @@ -953,6 +1052,15 @@ get_alias_set (tree t)
> > if (AGGREGATE_TYPE_P (t) || TREE_CODE (t) == COMPLEX_TYPE)
> > record_component_aliases (t);
> >
> > + /* We treat pointer types specially in alias_set_subset_of. */
> > + if (POINTER_TYPE_P (t) && set)
> > + {
> > + alias_set_entry ase = get_alias_set_entry (set);
> > + if (!ase)
> > + ase = init_alias_set_entry (set);
> > + ase->is_pointer = true;
> > + }
> > +
> > return set;
> > }
> >
> > @@ -1003,12 +1111,7 @@ record_alias_subset (alias_set_type supe
> > {
> > /* Create an entry for the SUPERSET, so that we have a place to
> > attach the SUBSET. */
> > - superset_entry = ggc_cleared_alloc<alias_set_entry_d> ();
> > - superset_entry->alias_set = superset;
> > - superset_entry->children
> > - = hash_map<int, int, alias_set_traits>::create_ggc (64);
> > - superset_entry->has_zero_child = 0;
> > - (*alias_sets)[superset] = superset_entry;
> > + superset_entry = init_alias_set_entry (superset);
> > }
> >
> > if (subset == 0)
> > Index: testsuite/gcc.dg/alias-8.c
> > ===================================================================
> > --- testsuite/gcc.dg/alias-8.c (revision 223772)
> > +++ testsuite/gcc.dg/alias-8.c (working copy)
> > @@ -8,5 +8,5 @@ struct s {
> > void
> > func(struct s *ptr)
> > {
> > - *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" "" { xfail
> > *-*-* } } */
> > + *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" "" { } } */
> > }
> > Index: testsuite/gcc.dg/pr62167.c
> > ===================================================================
> > --- testsuite/gcc.dg/pr62167.c (revision 223772)
> > +++ testsuite/gcc.dg/pr62167.c (working copy)
> > @@ -29,6 +29,8 @@ main ()
> >
> > node.prev = (void *)head;
> >
> > + asm("":"=m"(node.prev));
> > +
> > head->first = &node;
> >
> > struct node *n = head->first;
> >
> >
>
> --
> Richard Biener <[email protected]>
> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Dilip Upmanyu, Graham
> Norton, HRB 21284 (AG Nuernberg)