diff mbox series

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

Message ID 20170906091533.t6r3gatru4pn4vtc@virgil.suse.cz
State New
Headers show
Series [PR,82078] Enqueue all SRA links for write flag propagation | expand

Commit Message

Martin Jambor Sept. 6, 2017, 9:15 a.m. UTC
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?

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

Comments

Richard Biener Sept. 6, 2017, 9:17 a.m. UTC | #1
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)
>
diff mbox series

Patch

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)