On Mon, Aug 8, 2022 at 5:38 AM apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > From: Andrew Pinski <apin...@marvell.com> > > For compound literals empty struct stores are not removed as they go down a > different path of the gimplifier; trying to optimize the init constructor. > This fixes the problem by not adding the gimple assignment at the end > of gimplify_init_constructor if it was an empty type. > > Note this updates gcc.dg/pr87052.c where we had: > const char d[0] = { }; > And was expecting a store to d but after this, there is no store > as the decl's type is zero in size. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
OK. > gcc/ChangeLog: > > PR middle-end/103645 > * gimplify.c (gimplify_init_constructor): Don't build/add > gimple assignment of an empty type. > > testsuite/ChangeLog: > * gcc.dg/pr87052.c: Update d var to expect nothing. > --- > gcc/gimplify.cc | 7 +++++-- > gcc/testsuite/gcc.dg/pr87052.c | 6 +++--- > 2 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc > index 2ac7ca0855e..f0fbdb48012 100644 > --- a/gcc/gimplify.cc > +++ b/gcc/gimplify.cc > @@ -5488,8 +5488,11 @@ gimplify_init_constructor (tree *expr_p, gimple_seq > *pre_p, gimple_seq *post_p, > if (ret == GS_ERROR) > return GS_ERROR; > /* If we have gimplified both sides of the initializer but have > - not emitted an assignment, do so now. */ > - if (*expr_p) > + not emitted an assignment, do so now. */ > + if (*expr_p > + /* If the type is an empty type, we don't need to emit the > + assignment. */ > + && !is_empty_type (TREE_TYPE (TREE_OPERAND (*expr_p, 0)))) > { > tree lhs = TREE_OPERAND (*expr_p, 0); > tree rhs = TREE_OPERAND (*expr_p, 1); > diff --git a/gcc/testsuite/gcc.dg/pr87052.c b/gcc/testsuite/gcc.dg/pr87052.c > index 18e092c4674..796fe6440c1 100644 > --- a/gcc/testsuite/gcc.dg/pr87052.c > +++ b/gcc/testsuite/gcc.dg/pr87052.c > @@ -23,8 +23,7 @@ void test (void) > > const char d[0] = { }; > > - /* Expect the following: > - d = ""; */ > + /* Expect nothing. */ > > const char e[0] = ""; > > @@ -36,6 +35,7 @@ void test (void) > /* { dg-final { scan-tree-dump-times "a = \"\\\\x00ab\";" 1 "gimple" } } > { dg-final { scan-tree-dump-times "b = \"a\\\\x00bc\";" 1 "gimple" } } > { dg-final { scan-tree-dump-times "c = \"\";" 1 "gimple" } } > - { dg-final { scan-tree-dump-times "d = { *};" 1 "gimple" } } > + { dg-final { scan-tree-dump-times "d = " 1 "gimple" } } > + { dg-final { scan-tree-dump-times "d = {CLOBBER\\(eol\\)}" 1 "gimple" } } > { dg-final { scan-tree-dump-times "e = " 1 "gimple" } } > { dg-final { scan-tree-dump-times "e = {CLOBBER\\(eol\\)}" 1 "gimple" } > } */ > -- > 2.27.0 >