From patchwork Fri Jan 7 00:21:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 49678 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A2CE33858027 for ; Fri, 7 Jan 2022 00:26:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A2CE33858027 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1641515189; bh=bvYLyYbJKUJZvnN4DANIqSdHKjBuIXaCGoTXdyLpQwU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=fe9khhqovjgqRmdHDO605C0dZ6UQyzojLQi7s5CJzJFL3q5NoPZIgFj6WdfSA/YVC xtrw7VJRf9M4z6VfuI/1rPrIcRZqfOyx/PzjXHOHqMRSyNNAcPGrM0we0qq7OvlIR4 neg0BeCniI9zKRFAUNpIzghXbWfpVjJZZyW/h5Vg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 7815B385803F for ; Fri, 7 Jan 2022 00:22:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7815B385803F Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-503-ra6lAI9OO0eUkt0yS51fXA-1; Thu, 06 Jan 2022 19:22:06 -0500 X-MC-Unique: ra6lAI9OO0eUkt0yS51fXA-1 Received: by mail-qv1-f69.google.com with SMTP id jn6-20020ad45de6000000b004146a2f1f97so2158788qvb.19 for ; Thu, 06 Jan 2022 16:22:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bvYLyYbJKUJZvnN4DANIqSdHKjBuIXaCGoTXdyLpQwU=; b=gtT2IZmb7Cj/tHm4n2VKnSYExG0uynkfCmM9MvgaxwbYo1J2j6tkC7K7zYf9lI+RlK GeOXuTrCNBFnLhsnIoj5aD1sz7ToeGURMkoYw6lM71kyxmGEghli5T60DK0QIAqXNMkT emZuAp8oyT/9xWd/+dMyhYANFIi+UZSQYzzwJpIMS6ESrQLpEQrjjDIPHzaz8O6M7jQN POvg8IJ783093I5g4VDNRCQNaL+a0r8WtPy0xFrj7QvVsXHX1AXVVJZIXl5c1i5VsoyP gZ5DS0b0PJW0ebK0mCvdKGMdyVKXAzuEcD/FtYzgpqX5CaLTO38oZaiVctG4jS41o2jo qBxQ== X-Gm-Message-State: AOAM531mDx+YslnfHLC8HFVndS0ikK78eXi0N2avTiE1kh90PZHiEc9y 5Gp/+zTJqH7KVmnjzPJ4e1TA4xC4gIh7fbvd73mYvhZK1ns1P1MC0oSivGd/BCZozi0VXYgJ+in SAgsFUzW4ayLQuhWTrFMmKSb2LoShkklcnUt9cBB9yEj/m7h5tY4m6f5TnTHPyFLBYQ== X-Received: by 2002:a05:6214:262e:: with SMTP id gv14mr56932707qvb.5.1641514925280; Thu, 06 Jan 2022 16:22:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJz2+kuhoDuvjkfORmOIg4pmL/j3nRFicN6i4wJhT/bYXlAL1GG85wll/AL5y8msreq/pd/H6Q== X-Received: by 2002:a05:6214:262e:: with SMTP id gv14mr56932693qvb.5.1641514924893; Thu, 06 Jan 2022 16:22:04 -0800 (PST) Received: from barrymore.redhat.com (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id s3sm2323785qkp.93.2022.01.06.16.22.03 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Jan 2022 16:22:04 -0800 (PST) To: gcc-patches@gcc.gnu.org Subject: [pushed 06/11] c++: don't cleanup the last aggregate elt Date: Thu, 6 Jan 2022 19:21:51 -0500 Message-Id: <20220107002156.2992278-6-jason@redhat.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20220107002156.2992278-1-jason@redhat.com> References: <20220107002156.2992278-1-jason@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jason Merrill via Gcc-patches From: Jason Merrill Reply-To: Jason Merrill Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Now that we're building cleanups for aggregate elements more often, it seems worth optimizing by avoiding building one for the last element; once it is initialized, the complete object is fully initialized, the element cleanups end in favor of the complete object cleanup, and so a cleanup for the last element would guard nothing at all. gcc/cp/ChangeLog: * typeck2.c (split_nonconstant_init_1): Don't cleanup the last elt. (split_nonconstant_init): Adjust. gcc/testsuite/ChangeLog: * g++.dg/tree-ssa/aggregate1.C: New test. --- gcc/cp/typeck2.c | 14 +++++++++----- gcc/testsuite/g++.dg/tree-ssa/aggregate1.C | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tree-ssa/aggregate1.C diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 7e7fc7f9f48..f439dd54866 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -486,7 +486,8 @@ maybe_push_temp_cleanup (tree sub, vec **flags) generated statements. */ static bool -split_nonconstant_init_1 (tree dest, tree init, vec **flags) +split_nonconstant_init_1 (tree dest, tree init, bool last, + vec **flags) { unsigned HOST_WIDE_INT idx, tidx = HOST_WIDE_INT_M1U; tree field_index, value; @@ -545,9 +546,11 @@ split_nonconstant_init_1 (tree dest, tree init, vec **flags) sub = build3 (COMPONENT_REF, inner_type, dest, field_index, NULL_TREE); + bool elt_last = last && idx == CONSTRUCTOR_NELTS (init) - 1; + if (TREE_CODE (value) == CONSTRUCTOR) { - if (!split_nonconstant_init_1 (sub, value, flags) + if (!split_nonconstant_init_1 (sub, value, elt_last, flags) /* For flexible array member with initializer we can't remove the initializer, because only the initializer determines how many elements the @@ -558,7 +561,7 @@ split_nonconstant_init_1 (tree dest, tree init, vec **flags) && TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE && COMPLETE_TYPE_P (TREE_TYPE (value)) && !integer_zerop (TYPE_SIZE (TREE_TYPE (value))) - && idx == CONSTRUCTOR_NELTS (init) - 1 + && elt_last && TYPE_HAS_TRIVIAL_DESTRUCTOR (strip_array_types (inner_type)))) complete_p = false; @@ -634,7 +637,8 @@ split_nonconstant_init_1 (tree dest, tree init, vec **flags) } code = build_stmt (input_location, EXPR_STMT, code); add_stmt (code); - maybe_push_temp_cleanup (sub, flags); + if (!elt_last) + maybe_push_temp_cleanup (sub, flags); } num_split_elts++; @@ -715,7 +719,7 @@ split_nonconstant_init (tree dest, tree init) if (TREE_CODE (TREE_TYPE (dest)) != ARRAY_TYPE) flags = make_tree_vector (); - if (split_nonconstant_init_1 (dest, init, &flags)) + if (split_nonconstant_init_1 (dest, init, true, &flags)) init = NULL_TREE; for (tree f : flags) diff --git a/gcc/testsuite/g++.dg/tree-ssa/aggregate1.C b/gcc/testsuite/g++.dg/tree-ssa/aggregate1.C new file mode 100644 index 00000000000..3f30a73b4e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/aggregate1.C @@ -0,0 +1,19 @@ +// Test that we don't bother building a cleanup for the last aggregate element. +// { dg-additional-options -fdump-tree-gimple } +// { dg-final { scan-tree-dump-not {A::~A \(&b\.a} "gimple" } } + +struct A +{ + A(int); + ~A(); +}; + +struct B +{ + A a; +}; + +int main() +{ + B b = { 1 }; +}