aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2017-09-06 11:25:00 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2017-09-06 11:25:00 +0200
commite9982c6ae9c3525d0815963281a825996e392d42 (patch)
treeb1a1cc1aa54de0f4c913401af9eb5b8e08779489 /gcc
parentc7a494c99b4a421f6b80af834adb0d4c703d47a5 (diff)
downloadgcc-e9982c6ae9c3525d0815963281a825996e392d42.zip
gcc-e9982c6ae9c3525d0815963281a825996e392d42.tar.gz
gcc-e9982c6ae9c3525d0815963281a825996e392d42.tar.bz2
Enqueue all SRA links for write flag propagation
2017-09-06 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. From-SVN: r251756
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr82078.c27
-rw-r--r--gcc/tree-sra.c5
4 files changed, 45 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e35d6b3..50c6106 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2017-09-06 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/82078
+ * 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.
+
2017-09-06 Jakub Jelinek <jakub@redhat.com>
PR middle-end/82095
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2b16829..75f6f89 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-06 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/82078
+ * gcc.dg/tree-ssa/pr82078.c: New test.
+
2017-09-06 Jakub Jelinek <jakub@redhat.com>
PR middle-end/82095
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 0000000..3774986
--- /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 68edbce..163b7a2 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)