Message ID | ri6k14jj3d8.fsf@suse.cz |
---|---|
State | New |
Headers | show |
Series | sra: Do not create zero sized accesses (PR93776) | expand |
On February 18, 2020 4:56:35 PM GMT+01:00, Martin Jambor <mjambor@suse.cz> wrote: >Hi, > >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. Bootstrapped and tested on an >x86_64-linux. OK for trunk? Ok. Richard. >Thanks, > >Martin > >2020-02-18 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. >--- > gcc/ChangeLog | 6 ++++++ > gcc/testsuite/ChangeLog | 5 +++++ > gcc/testsuite/gcc.dg/tree-ssa/pr93776.c | 27 +++++++++++++++++++++++++ > gcc/tree-sra.c | 5 ++++- > 4 files changed, 42 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr93776.c > >diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c >b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c >new file mode 100644 >index 00000000000..c407a627718 >--- /dev/null >+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c >@@ -0,0 +1,27 @@ >+/* { 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); >+} >diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c >index 0cfac0a8192..2c717805b68 100644 >--- a/gcc/tree-sra.c >+++ b/gcc/tree-sra.c >@@ -926,6 +926,8 @@ create_access (tree expr, gimple *stmt, bool write) > size = max_size; > unscalarizable_region = true; > } >+ if (size == 0) >+ return NULL; > if (size < 0) > { > disqualify_candidate (base, "Encountered an unconstrained access."); >@@ -3629,7 +3631,8 @@ get_access_for_expr (tree expr) > 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 get_var_base_offset_size_access (base, offset, max_size);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c new file mode 100644 index 00000000000..c407a627718 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c @@ -0,0 +1,27 @@ +/* { 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); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 0cfac0a8192..2c717805b68 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -926,6 +926,8 @@ create_access (tree expr, gimple *stmt, bool write) size = max_size; unscalarizable_region = true; } + if (size == 0) + return NULL; if (size < 0) { disqualify_candidate (base, "Encountered an unconstrained access."); @@ -3629,7 +3631,8 @@ get_access_for_expr (tree expr) 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 get_var_base_offset_size_access (base, offset, max_size);