https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87843
--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the alias machinery disambiguates them at
static bool
indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
poly_int64 offset1, poly_int64 max_size1,
...
/* Do type-based disambiguation. */
if (base1_alias_set != base2_alias_set
&& !alias_sets_conflict_p (base1_alias_set, base2_alias_set))
return false;
where base2_alias_set == ref2_alias_set from *p_11 and
ref1_alias_set == ref2_alias_set but base1_alias_set == 22 (from v_16->locs).
And somehow the alias-set for *v_16 doesn't have v_16->locs as child
(well, it probably has the pointer-to-complete one as child since we built
the alias-set for *v_16 _before_ adjusting the FIELD_DECLs type!?)