Commit 51faf07c by Martin Jambor

sra: Do not create zero sized accesses (PR 93776)

SRA can get a bit confused with zero-sized accesses like the one in
the testcase.  Since there is nothing in the access, nothing is
scalarized, but we can get order of the structures wrong, which the
verifier is not happy about.

Fixed by simply ignoring such accesses.

2020-02-19  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/93776
	* tree-sra.c (create_access): Do not create zero size accesses.
	(get_access_for_expr): Do not search for zero sized accesses.

	testsuite/
	* gcc.dg/tree-ssa/pr93776.c: New test.
parent 665c5bad
2020-02-19 Martin Jambor <mjambor@suse.cz> 2020-02-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/93776
* tree-sra.c (create_access): Do not create zero size accesses.
(get_access_for_expr): Do not search for zero sized accesses.
2020-02-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/93667 PR tree-optimization/93667
* tree-sra.c (scalarizable_type_p): Return false if record fields * tree-sra.c (scalarizable_type_p): Return false if record fields
do not follow wach other. do not follow wach other.
......
2020-02-19 Martin Jambor <mjambor@suse.cz> 2020-02-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/93776
* gcc.dg/tree-ssa/pr93776.c: New test.
2020-02-19 Martin Jambor <mjambor@suse.cz>
PR tree-optimization/93667 PR tree-optimization/93667
* g++.dg/tree-ssa/pr93667.C: New test. * g++.dg/tree-ssa/pr93667.C: New test.
......
/* { dg-do compile } */
/* { dg-options "-O1" } */
struct empty {};
struct s { int i; };
struct z
{
int j;
struct empty e;
struct s s;
int k;
};
void bar (struct z);
void baz (int);
void foo (void)
{
struct z z, z2;
z.k = 8;
z2.s.i = 1;
z = z2;
bar (z);
z.e = (struct empty) {};
baz (z.k);
}
...@@ -926,6 +926,8 @@ create_access (tree expr, gimple *stmt, bool write) ...@@ -926,6 +926,8 @@ create_access (tree expr, gimple *stmt, bool write)
size = max_size; size = max_size;
unscalarizable_region = true; unscalarizable_region = true;
} }
if (size == 0)
return NULL;
if (size < 0) if (size < 0)
{ {
disqualify_candidate (base, "Encountered an unconstrained access."); disqualify_candidate (base, "Encountered an unconstrained access.");
...@@ -3643,7 +3645,8 @@ get_access_for_expr (tree expr) ...@@ -3643,7 +3645,8 @@ get_access_for_expr (tree expr)
return NULL; return NULL;
} }
if (!bitmap_bit_p (candidate_bitmap, DECL_UID (base))) if (max_size == 0
|| !bitmap_bit_p (candidate_bitmap, DECL_UID (base)))
return NULL; return NULL;
return get_var_base_offset_size_access (base, offset, max_size); return get_var_base_offset_size_access (base, offset, max_size);
......
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