Commit 8eef6097 by Martin Jambor

[PR 80622] Treat const pools as initialized in SRA

2017-05-04  Martin Jambor  <mjambor@suse.cz>

	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
parent 9bf2f779
2016-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2017-05-04 Martin Jambor <mjambor@suse.cz>
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 <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.md (prefetch); Adjust predicate and * config/aarch64/aarch64.md (prefetch); Adjust predicate and
constraint on operand 0 to allow more general addressing modes. constraint on operand 0 to allow more general addressing modes.
......
2016-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2017-05-04 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/80622
* gcc.dg/tree-ssa/pr80622.c: New test.
2017-05-04 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/prfm_imm_offset_1.c: New test. * gcc.target/aarch64/prfm_imm_offset_1.c: New test.
......
/* { 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;
}
...@@ -1305,6 +1305,15 @@ disqualify_if_bad_bb_terminating_stmt (gimple *stmt, tree lhs, tree rhs) ...@@ -1305,6 +1305,15 @@ disqualify_if_bad_bb_terminating_stmt (gimple *stmt, tree lhs, tree rhs)
return false; 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 /* Scan expressions occurring in STMT, create access structures for all accesses
to candidates for scalarization and remove those candidates which occur in to candidates for scalarization and remove those candidates which occur in
statements or expressions that prevent them from being split apart. Return statements or expressions that prevent them from being split apart. Return
...@@ -1364,8 +1373,10 @@ build_accesses_from_assign (gimple *stmt) ...@@ -1364,8 +1373,10 @@ build_accesses_from_assign (gimple *stmt)
link->racc = racc; link->racc = racc;
add_link_to_rhs (racc, link); add_link_to_rhs (racc, link);
/* Let's delay marking the areas as written until propagation of accesses /* Let's delay marking the areas as written until propagation of accesses
across link. */ across link, unless the nature of rhs tells us that its data comes
lacc->write = false; from elsewhere. */
if (!comes_initialized_p (racc->base))
lacc->write = false;
} }
return lacc || racc; return lacc || racc;
...@@ -2472,8 +2483,7 @@ analyze_access_subtree (struct access *root, struct access *parent, ...@@ -2472,8 +2483,7 @@ analyze_access_subtree (struct access *root, struct access *parent,
if (!hole || root->grp_total_scalarization) if (!hole || root->grp_total_scalarization)
root->grp_covered = 1; root->grp_covered = 1;
else if (root->grp_write || TREE_CODE (root->base) == PARM_DECL else if (root->grp_write || comes_initialized_p (root->base))
|| constant_decl_p (root->base))
root->grp_unscalarized_data = 1; /* not covered and written to */ root->grp_unscalarized_data = 1; /* not covered and written to */
return sth_created; return sth_created;
} }
...@@ -2581,11 +2591,14 @@ propagate_subaccesses_across_link (struct access *lacc, struct access *racc) ...@@ -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 LHS is still not marked as being written to, we only need to do so
if the RHS at this level actually was. */ if the RHS at this level actually was. */
if (!lacc->grp_write && if (!lacc->grp_write)
(racc->grp_write || TREE_CODE (racc->base) == PARM_DECL))
{ {
lacc->grp_write = true; gcc_checking_assert (!comes_initialized_p (racc->base));
ret = true; if (racc->grp_write)
{
lacc->grp_write = true;
ret = true;
}
} }
if (is_gimple_reg_type (lacc->type) if (is_gimple_reg_type (lacc->type)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment