On Wed, 6 Sep 2017, Martin Jambor wrote: > Hi, > > PR 82078 is another fallout from lazy setting of written flag in SRA. > The problem here is that we do not enqueue assignment links going out > of accesses of candidates that were disqualified before we start the > loop with sort_and_splice_var_accesses. > > Given that the propagation is now a correctness necessity, we need to > enqueue all links for processing, so this patch does it when they they > are created. There should be very little extra work done because of > this because propagate_all_subaccesses starts with checking the > candidate-status of both sides of each link and acts accordingly. > > Bootstrapped and tested on x86_64-linux without any issues. OK for > trunk?
Ok. Thanks, Richard. > Thanks, > > Martin > > > > 2017-09-05 Martin Jambor <mjam...@suse.cz> > > PR tree-optimization/82078 > gcc/ > * tree-sra.c (sort_and_splice_var_accesses): Move call to > add_access_to_work_queue... > (build_accesses_from_assign): ...here. > (propagate_all_subaccesses): Make sure racc is the group > representative, if there is one. > > gcc/testsuite/ > * gcc.dg/tree-ssa/pr82078.c: New test. > --- > gcc/testsuite/gcc.dg/tree-ssa/pr82078.c | 27 +++++++++++++++++++++++++++ > gcc/tree-sra.c | 5 ++++- > 2 files changed, 31 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr82078.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr82078.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr82078.c > new file mode 100644 > index 00000000000..3774986324b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr82078.c > @@ -0,0 +1,27 @@ > +/* { dg-do run } */ > +/* { dg-options "-O" } */ > + > +struct S0 { > + signed f4; > + signed f9 : 5; > +} a[6][5], b = {2} > + > +; > +int c, d; > +int fn1() { > + struct S0 e[5][6]; > + struct S0 f; > + b = f = e[2][5] = a[5][0]; > + if (d) > + ; > + else > + return f.f9; > + e[c][45] = a[4][4]; > +} > + > +int main() { > + fn1(); > + if (b.f4 != 0) > + __builtin_abort (); > + return 0; > +} > diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c > index 68edbce21b3..163b7a2d03b 100644 > --- a/gcc/tree-sra.c > +++ b/gcc/tree-sra.c > @@ -1359,6 +1359,8 @@ build_accesses_from_assign (gimple *stmt) > link->lacc = lacc; > link->racc = racc; > add_link_to_rhs (racc, link); > + add_access_to_work_queue (racc); > + > /* Let's delay marking the areas as written until propagation of > accesses > across link, unless the nature of rhs tells us that its data comes > from elsewhere. */ > @@ -2118,7 +2120,6 @@ sort_and_splice_var_accesses (tree var) > access->grp_total_scalarization = total_scalarization; > access->grp_partial_lhs = grp_partial_lhs; > access->grp_unscalarizable_region = unscalarizable_region; > - add_access_to_work_queue (access); > > *prev_acc_ptr = access; > prev_acc_ptr = &access->next_grp; > @@ -2712,6 +2713,8 @@ propagate_all_subaccesses (void) > struct access *racc = pop_access_from_work_queue (); > struct assign_link *link; > > + if (racc->group_representative) > + racc= racc->group_representative; > gcc_assert (racc->first_link); > > for (link = racc->first_link; link; link = link->next) > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)