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]

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


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

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)
-- 
2.14.1


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