From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1611) id CDAB73959CBC; Wed, 16 Nov 2022 12:13:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CDAB73959CBC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668600813; bh=BYVjgkkTaSVdVIPStkEdlSSMb43pWkT/EUGs3QqxBB4=; h=From:To:Subject:Date:From; b=sfUmiXUr7ucYKMrIYSndy2mmkd7J/4tLN7XvhiFM4+wU+OW/b9OCXZUvczvFVOSLD tVfILDRVjPbXeZc52ld5zbcA/7Q5sEbpAXlMsiS4tsaWDHve41bAH8R3xGDIWuKsQm VEynPPHjHXD7aSXhQHO4SiMedvVRBDUKXvKNZsbU= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Martin Jambor To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-8913] SRA: Limit replacement creation for accesses propagated from LHSs X-Act-Checkin: gcc X-Git-Author: Martin Jambor X-Git-Refname: refs/heads/releases/gcc-12 X-Git-Oldrev: bdcacfd5ad5b0f88d035f3618de969cea11dc5d3 X-Git-Newrev: 985a8962712a56d1c9418cf05e1761f8bd20cf8f Message-Id: <20221116121333.CDAB73959CBC@sourceware.org> Date: Wed, 16 Nov 2022 12:13:33 +0000 (GMT) List-Id: https://gcc.gnu.org/g:985a8962712a56d1c9418cf05e1761f8bd20cf8f commit r12-8913-g985a8962712a56d1c9418cf05e1761f8bd20cf8f Author: Martin Jambor Date: Wed Nov 16 13:11:27 2022 +0100 SRA: Limit replacement creation for accesses propagated from LHSs PR 107206 is fallout from the fix to PR 92706 where we started propagating accesses across assignments also from LHS to RHS of assignments so that we would not do harmful total scalarization of the aggregates on the RHS. But this can lead to new scalarization of these aggregates and in the testcase of PR 107206 these can appear in superfluous uses of un-initialized values and spurious warnings. Fixed by making sure the the accesses created by propagation in this direction are only used as a basis for replacements when the structure would be totally scalarized anyway. gcc/ChangeLog: 2022-10-18 Martin Jambor PR tree-optimization/107206 * tree-sra.cc (struct access): New field grp_result_of_prop_from_lhs. (analyze_access_subtree): Do not create replacements for accesses with this flag when not toally scalarizing. (propagate_subaccesses_from_lhs): Set the new flag. gcc/testsuite/ChangeLog: 2022-10-18 Martin Jambor PR tree-optimization/107206 * g++.dg/tree-ssa/pr107206.C: New test. (cherry picked from commit f6c168f8c06047bfaa3005e570126831b8855dcc) Diff: --- gcc/testsuite/g++.dg/tree-ssa/pr107206.C | 27 +++++++++++++++++++++++++++ gcc/tree-sra.cc | 7 +++++++ 2 files changed, 34 insertions(+) diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr107206.C b/gcc/testsuite/g++.dg/tree-ssa/pr107206.C new file mode 100644 index 00000000000..34810ad2b7b --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/pr107206.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// { dg-require-effective-target c++17 } +// { dg-options "-O -Wuninitialized" } + +#include +struct X { + X() = default; + X(X const& r) : i(r.i) {} + int i; +}; +struct Y { + Y() : x() {} + X x; + std::optional o; +}; +struct Z { + Y y; + explicit Z(Y y) : y(y) {} +}; +void f(Y const&); +void test() { + Y const y; + Z z(y); + z.y.o = 1; + auto const w = z; + f(w.y); +} diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc index 099e8dbe873..95291e8df93 100644 --- a/gcc/tree-sra.cc +++ b/gcc/tree-sra.cc @@ -260,6 +260,9 @@ struct access /* Should TREE_NO_WARNING of a replacement be set? */ unsigned grp_no_warning : 1; + + /* Result of propagation accross link from LHS to RHS. */ + unsigned grp_result_of_prop_from_lhs : 1; }; typedef struct access *access_p; @@ -2532,6 +2535,9 @@ analyze_access_subtree (struct access *root, struct access *parent, if (allow_replacements && expr_with_var_bounded_array_refs_p (root->expr)) allow_replacements = false; + if (!totally && root->grp_result_of_prop_from_lhs) + allow_replacements = false; + for (child = root->first_child; child; child = child->next_sibling) { hole |= covered_to < child->offset; @@ -2959,6 +2965,7 @@ propagate_subaccesses_from_lhs (struct access *lacc, struct access *racc) struct access *new_acc = create_artificial_child_access (racc, lchild, norm_offset, true, false); + new_acc->grp_result_of_prop_from_lhs = 1; propagate_subaccesses_from_lhs (lchild, new_acc); } else