From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 9B4F13858C27; Fri, 4 Mar 2022 14:15:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9B4F13858C27 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-7483] gimplify: Clear TREE_READONLY on automatic vars being stored into [PR104529] X-Act-Checkin: gcc X-Git-Author: Jakub Jelinek X-Git-Refname: refs/heads/master X-Git-Oldrev: 07395f19dff610f03d1b1d30c8bd640f610c45dc X-Git-Newrev: c85aaf2cbe9da50e23655a8082a37166adf4c0f7 Message-Id: <20220304141535.9B4F13858C27@sourceware.org> Date: Fri, 4 Mar 2022 14:15:35 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 04 Mar 2022 14:15:35 -0000 https://gcc.gnu.org/g:c85aaf2cbe9da50e23655a8082a37166adf4c0f7 commit r12-7483-gc85aaf2cbe9da50e23655a8082a37166adf4c0f7 Author: Jakub Jelinek Date: Fri Mar 4 15:14:59 2022 +0100 gimplify: Clear TREE_READONLY on automatic vars being stored into [PR104529] The following testcase regressed when SRA started punting on stores to TREE_READONLY vars. We document that: "In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node, nonzero means it may not be the lhs of an assignment." so the SRA change looks desirable. On the other side, at least in this testcase the TREE_READONLY is set there intentionally from the PR85873 fix, because gimplify_init_constructor itself uses TREE_READONLY on the object to determine if it can perform promotion to static const or not. So, similarly to other spots in the gimplifier where we also clear TREE_READONLY when we emit IL that stores into the object, this does the same in gimplify_init_constructor, but in the way so that the TREE_READONLY test for the promotion to static const keeps working and doesn't change anything for notify_temp_creation mode, which doesn't emit any IL, just tests if it would need a temporary or not. This keeps PR85873 testcase working as before and fixes this regression. 2022-03-04 Jakub Jelinek PR middle-end/104529 * gimplify.cc (gimplify_init_constructor): Clear TREE_READONLY on automatic objects which will be runtime initialized. * g++.dg/tree-ssa/pr104529.C: New test. Diff: --- gcc/gimplify.cc | 11 +++++++++++ gcc/testsuite/g++.dg/tree-ssa/pr104529.C | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index be8f0d3c76f..c6ba0c33480 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -5120,6 +5120,12 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, { if (notify_temp_creation) return GS_OK; + + /* The var will be initialized and so appear on lhs of + assignment, it can't be TREE_READONLY anymore. */ + if (VAR_P (object)) + TREE_READONLY (object) = 0; + is_empty_ctor = true; break; } @@ -5171,6 +5177,11 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, break; } + /* The var will be initialized and so appear on lhs of + assignment, it can't be TREE_READONLY anymore. */ + if (VAR_P (object) && !notify_temp_creation) + TREE_READONLY (object) = 0; + /* If there are "lots" of initialized elements, even discounting those that are not address constants (and thus *must* be computed at runtime), then partition the constructor into diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr104529.C b/gcc/testsuite/g++.dg/tree-ssa/pr104529.C new file mode 100644 index 00000000000..3cb3853c22a --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr104529.C @@ -0,0 +1,20 @@ +// PR middle-end/104529 +// { dg-do compile { target c++11 } } +// { dg-options "-O2 -fdump-tree-optimized" } +// { dg-final { scan-tree-dump-not "MEM\[^\n\r]*MEM" "optimized" } } + +#include +#include + +struct S { + unsigned int a; + std::vector b; + std::vector c; +}; + +std::size_t +foo () +{ + S test[] = { { 48, { 255, 0, 0, 0, 0, 0 } } }; + return sizeof (test); +}