From 8eef60973dd0f6a2d791fa6a3ae8ab2201b08c10 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Thu, 4 May 2017 18:19:20 +0200 Subject: [PATCH] [PR 80622] Treat const pools as initialized in SRA 2017-05-04 Martin Jambor PR tree-optimization/80622 * tree-sra.c (comes_initialized_p): New function. (build_accesses_from_assign): Only set write lazily when comes_initialized_p is false. (analyze_access_subtree): Use comes_initialized_p. (propagate_subaccesses_across_link): Assert !comes_initialized_p instead of testing for PARM_DECL. testsuite/ * gcc.dg/tree-ssa/pr80622.c: New test. From-SVN: r247604 --- gcc/ChangeLog | 12 +++++++++- gcc/testsuite/ChangeLog | 7 +++++- gcc/testsuite/gcc.dg/tree-ssa/pr80622.c | 19 ++++++++++++++++ gcc/tree-sra.c | 29 ++++++++++++++++++------- 4 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr80622.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34a56ab17c6..a59b8227ee3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,14 @@ -2016-05-04 Kyrylo Tkachov +2017-05-04 Martin Jambor + + PR tree-optimization/80622 + * tree-sra.c (comes_initialized_p): New function. + (build_accesses_from_assign): Only set write lazily when + comes_initialized_p is false. + (analyze_access_subtree): Use comes_initialized_p. + (propagate_subaccesses_across_link): Assert !comes_initialized_p + instead of testing for PARM_DECL. + +2017-05-04 Kyrylo Tkachov * config/aarch64/aarch64.md (prefetch); Adjust predicate and constraint on operand 0 to allow more general addressing modes. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b8d1e2f3cb3..feb65d55f53 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,4 +1,9 @@ -2016-05-04 Kyrylo Tkachov +2017-05-04 Martin Jambor + + PR tree-optimization/80622 + * gcc.dg/tree-ssa/pr80622.c: New test. + +2017-05-04 Kyrylo Tkachov * gcc.target/aarch64/prfm_imm_offset_1.c: New test. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr80622.c b/gcc/testsuite/gcc.dg/tree-ssa/pr80622.c new file mode 100644 index 00000000000..96dcb8fcdc0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr80622.c @@ -0,0 +1,19 @@ +/* { dg-do run } */ +/* { dg-options "-O" } */ + +struct S { int d; char e; int f; char g; } a; +char c; + +int +main () +{ + struct S b[][1] = {3, 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, + 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, 0, 3, 4, 3, 0, + 3, 4, 3, 4, 7, 7, 3, 5, 0, 3, 4, 7, 7, 3, 5, 0, 3, + 4, 3, 4, 7, 7, 3, 5, 0, 3, 4, 7, 7, 3, 5, 0, 3, 4}; + a = b[4][0]; + c = b[4][0].e; + if (a.g != 4) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 1606573aead..8ac9c0783ff 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1305,6 +1305,15 @@ disqualify_if_bad_bb_terminating_stmt (gimple *stmt, tree lhs, tree rhs) return false; } +/* Return true if the nature of BASE is such that it contains data even if + there is no write to it in the function. */ + +static bool +comes_initialized_p (tree base) +{ + return TREE_CODE (base) == PARM_DECL || constant_decl_p (base); +} + /* Scan expressions occurring in STMT, create access structures for all accesses to candidates for scalarization and remove those candidates which occur in statements or expressions that prevent them from being split apart. Return @@ -1364,8 +1373,10 @@ build_accesses_from_assign (gimple *stmt) link->racc = racc; add_link_to_rhs (racc, link); /* Let's delay marking the areas as written until propagation of accesses - across link. */ - lacc->write = false; + across link, unless the nature of rhs tells us that its data comes + from elsewhere. */ + if (!comes_initialized_p (racc->base)) + lacc->write = false; } return lacc || racc; @@ -2472,8 +2483,7 @@ analyze_access_subtree (struct access *root, struct access *parent, if (!hole || root->grp_total_scalarization) root->grp_covered = 1; - else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL - || constant_decl_p (root->base)) + else if (root->grp_write || comes_initialized_p (root->base)) root->grp_unscalarized_data = 1; /* not covered and written to */ return sth_created; } @@ -2581,11 +2591,14 @@ propagate_subaccesses_across_link (struct access *lacc, struct access *racc) /* IF the LHS is still not marked as being written to, we only need to do so if the RHS at this level actually was. */ - if (!lacc->grp_write && - (racc->grp_write || TREE_CODE (racc->base) == PARM_DECL)) + if (!lacc->grp_write) { - lacc->grp_write = true; - ret = true; + gcc_checking_assert (!comes_initialized_p (racc->base)); + if (racc->grp_write) + { + lacc->grp_write = true; + ret = true; + } } if (is_gimple_reg_type (lacc->type) -- 2.30.2