aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-sra.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2017-06-01 14:14:29 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2017-06-01 14:14:29 +0200
commitc8638450abe8a406813652eae4f9e7b3cb3bece4 (patch)
tree4fddb5aa4bc1185eb3bc05e4fc510a14a8d1b53c /gcc/tree-sra.c
parent4ba66aee9e94f1bfb82fbebac661ad60cbce1176 (diff)
downloadgcc-c8638450abe8a406813652eae4f9e7b3cb3bece4.zip
gcc-c8638450abe8a406813652eae4f9e7b3cb3bece4.tar.gz
gcc-c8638450abe8a406813652eae4f9e7b3cb3bece4.tar.bz2
[PR 80898] Propagate grp_write from disqualified SRA candidates
2017-06-01 Martin Jambor <mjambor@suse.cz> PR tree-optimization/80898 * tree-sra.c (process_subtree_disqualification): Removed. (disqualify_candidate): Do not acll process_subtree_disqualification. (subtree_mark_written_and_enqueue): New function. (propagate_all_subaccesses): Set grp_write of LHS subtree if the RHS has been disqualified and re-queue LHS if necessary. Apart from that, ignore disqualified RHS. testsuite/ * gcc.dg/tree-ssa/pr80898.c: New test. * gcc.dg/tree-ssa/pr80898-2.c: Likewise. From-SVN: r248790
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r--gcc/tree-sra.c56
1 files changed, 35 insertions, 21 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 6a8a0a4..f25818f 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -694,21 +694,9 @@ static bool constant_decl_p (tree decl)
return VAR_P (decl) && DECL_IN_CONSTANT_POOL (decl);
}
-
-/* Mark LHS of assign links out of ACCESS and its children as written to. */
-
-static void
-process_subtree_disqualification (struct access *access)
-{
- struct access *child;
- for (struct assign_link *link = access->first_link; link; link = link->next)
- link->lacc->grp_write = true;
- for (child = access->first_child; child; child = child->next_sibling)
- process_subtree_disqualification (child);
-}
-
/* Remove DECL from candidates for SRA and write REASON to the dump file if
there is one. */
+
static void
disqualify_candidate (tree decl, const char *reason)
{
@@ -723,13 +711,6 @@ disqualify_candidate (tree decl, const char *reason)
print_generic_expr (dump_file, decl);
fprintf (dump_file, " - %s\n", reason);
}
-
- struct access *access = get_first_repr_for_decl (decl);
- while (access)
- {
- process_subtree_disqualification (access);
- access = access->next_grp;
- }
}
/* Return true iff the type contains a field or an element which does not allow
@@ -2679,6 +2660,26 @@ propagate_subaccesses_across_link (struct access *lacc, struct access *racc)
return ret;
}
+/* Beginning with ACCESS, traverse its whole access subtree and mark all
+ sub-trees as written to. If any of them has not been marked so previously
+ and has assignment links leading from it, re-enqueue it. */
+
+static void
+subtree_mark_written_and_enqueue (struct access *access)
+{
+ if (access->grp_write)
+ return;
+ access->grp_write = true;
+ if (access->first_link)
+ add_access_to_work_queue (access);
+
+ struct access *child;
+ for (child = access->first_child; child; child = child->next_sibling)
+ subtree_mark_written_and_enqueue (child);
+}
+
+
+
/* Propagate all subaccesses across assignment links. */
static void
@@ -2698,7 +2699,20 @@ propagate_all_subaccesses (void)
if (!bitmap_bit_p (candidate_bitmap, DECL_UID (lacc->base)))
continue;
lacc = lacc->group_representative;
- if (propagate_subaccesses_across_link (lacc, racc))
+
+ bool reque_parents = false;
+ if (!bitmap_bit_p (candidate_bitmap, DECL_UID (racc->base)))
+ {
+ if (!lacc->grp_write)
+ {
+ subtree_mark_written_and_enqueue (lacc);
+ reque_parents = true;
+ }
+ }
+ else if (propagate_subaccesses_across_link (lacc, racc))
+ reque_parents = true;
+
+ if (reque_parents)
do
{
if (lacc->first_link)