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!?)