diff options
author | Andrew Pinski <apinski@marvell.com> | 2021-12-20 20:27:33 -0800 |
---|---|---|
committer | Andrew Pinski <apinski@marvell.com> | 2022-08-08 08:14:25 -0700 |
commit | 21c7aab09805d0c8c7695c8a69c8715d673a739a (patch) | |
tree | a382ed19535fe9b35a9268a7460f9680369803c8 | |
parent | 5471f55f001af412e1125b04972ebaab9d4f7337 (diff) |
Fix middle-end/103645: empty struct store not removed when using compound literallinaro-local/ci/tcwg_kernel/gnu-master-arm-lts-allmodconfiglinaro-local/ci/tcwg_gnu_native_check_gdb/master-armlinaro-local/ci/tcwg_gnu_native_check_gcc/master-aarch64linaro-local/ci/tcwg_gnu_native_build/master-armlinaro-local/ci/tcwg_gcc_bootstrap/master-arm-bootstrap_ubsanlinaro-local/ci/tcwg_gcc_bootstrap/master-arm-bootstrap_profiledlinaro-local/ci/tcwg_gcc_bootstrap/master-aarch64-bootstrap_profiledlinaro-local/ci/tcwg_bmk_llvm_tx1/llvm-master-aarch64-spec2k6-O2
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.
gcc/ChangeLog:
PR middle-end/103645
* gimplify.cc (gimplify_init_constructor): Don't build/add
gimple assignment of an empty type.
gcc/testsuite/ChangeLog:
* gcc.dg/pr87052.c: Update d var to expect nothing.
-rw-r--r-- | gcc/gimplify.cc | 7 | ||||
-rw-r--r-- | 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" } } */ |