This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PR 82078] Enqueue all SRA links for write flag propagation


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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]