https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107206
--- Comment #6 from rguenther at suse dot de <rguenther at suse dot de> --- > Am 14.10.2022 um 18:53 schrieb jamborm at gcc dot gnu.org > <gcc-bugzi...@gcc.gnu.org>: > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107206 > > --- Comment #5 from Martin Jambor <jamborm at gcc dot gnu.org> --- > I believe this is fallout from the fix to PR 92706 where we started > propagating accesses across assignments also from LHS to RHS and > because everything is totally flow-insensitive, we have an access > representing: > > MEM[(union _StorageD.10576 *)&D.11678]._M_valueD.10616 = 1; > > which gets propagated across: > > zD.11527.yD.11476.oD.11384 = D.11678; > > but this then triggers the LHS->RHS propagation across: > > MEM[(struct YD.10174 *)&zD.11527].oD.11384 = MEM[(const struct YD.10174 > &)&D.11546].oD.11384; > > So another reason to re-invent SRA from scratch. Yes > Apart from that, I > don't have a good solution except for adding another flag to mark > accesses that are result of LHS->RHS propagation and ignore them if > their base did not get totally scalarized because in the PR they were > added basically to prevent bad total scalarization. But of course it > is rather another band-aid than a real fix, but it seems to work for > this case: > > diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc > index 1a3e12f18cc..6cbeddfc548 100644 > --- a/gcc/tree-sra.cc > +++ b/gcc/tree-sra.cc > @@ -260,6 +260,9 @@ struct access > > /* Should TREE_NO_WARNING of a replacement be set? */ > unsigned grp_no_warning : 1; > + > + /* Result of propagation accross link from LHS to RHS. */ > + unsigned grp_result_of_prop_from_lhs : 1; > }; > > typedef struct access *access_p; > @@ -2532,6 +2535,9 @@ analyze_access_subtree (struct access *root, struct > access *parent, > if (allow_replacements && expr_with_var_bounded_array_refs_p (root->expr)) > allow_replacements = false; > > + if (!totally && root->grp_result_of_prop_from_lhs) > + allow_replacements = false; > + > for (child = root->first_child; child; child = child->next_sibling) > { > hole |= covered_to < child->offset; > @@ -2959,6 +2965,7 @@ propagate_subaccesses_from_lhs (struct access *lacc, > struct access *racc) > struct access *new_acc > = create_artificial_child_access (racc, lchild, norm_offset, > true, false); > + new_acc->grp_result_of_prop_from_lhs = 1; > propagate_subaccesses_from_lhs (lchild, new_acc); > } > else LGTM