This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PR 82078] Enqueue all SRA links for write flag propagation
- From: Richard Biener <rguenther at suse dot de>
- To: Martin Jambor <mjambor at suse dot cz>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 6 Sep 2017 11:17:21 +0200 (CEST)
- Subject: Re: [PR 82078] Enqueue all SRA links for write flag propagation
- Authentication-results: sourceware.org; auth=none
- References: <20170906091533.t6r3gatru4pn4vtc@virgil.suse.cz>
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 <mjambor@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 <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)