From patchwork Fri Nov 8 07:07:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 1194151 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-513214-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="tMzGm+Bc"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47CfKM5gk6z9sNT for ; Wed, 13 Nov 2019 20:22:47 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; q=dns; s=default; b=Wr4lKZHnL7w4VhW/WBZUeZxFYt71R WEvEjcgUUl4LGstJqNZ1wD6y0ZM4wDTmpTVYbWzY7zz9djwCQcYoqFHiO25Fx6oK yZ/bWShtOk7l89XfaBYFmBuz7WRy5AGYmbOmjwERMpH+rl+1cQTd2WhWFQ8RyQfd HiQo9mOoWoe+s8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; s=default; bh=G+CHMGuKcsYteYO3XaRG46yyWIc=; b=tMz Gm+Bc6AYfwY26bhAGXWk8GuimA9IUWlpDoWLCcLPDoL8jlZOJMbwKa1jnYptY5+e RjtF9pm2GOvoMrAel9wVyED5lOv9CR4Em6Fg54KWj6ZFQCXg8ftjrpCb1FlSVISa yKBiac3wICJ422tI8AE2d4isfzZh1r7EDBPLZpQQ= Received: (qmail 43868 invoked by alias); 13 Nov 2019 09:22:17 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 43816 invoked by uid 89); 13 Nov 2019 09:22:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=HX-Languages-Length:783 X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Nov 2019 09:22:15 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 7E84AB23F for ; Wed, 13 Nov 2019 09:22:13 +0000 (UTC) Resent-From: =?utf-8?q?Martin_Li=C5=A1ka?= Resent-To: GCC Patches Resent-Date: Wed, 13 Nov 2019 10:22:13 +0100 Resent-Message-ID: <465cb607-77b5-f6f9-b2e3-45de85f8c66a@suse.cz> Message-Id: <1bb908adb191b1855328e1e38825b367f74746a7.1573636740.git.mliska@suse.cz> In-Reply-To: References: From: Martin Liska Date: Fri, 8 Nov 2019 08:07:22 +0100 Subject: [PATCH 1/5] Do not overuse push/pop_cfun in IPA ICF. To: gcc-patches@gcc.gnu.org MIME-Version: 1.0 X-IsSubscribed: yes gcc/ChangeLog: 2019-11-11 Martin Liska * ipa-icf.c (sem_function::equals_private): Do not overuse push/pop_cfun functions. --- gcc/ipa-icf.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 10aa4b76463..53e387403c8 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -877,14 +877,9 @@ sem_function::equals_private (sem_item *item) } /* Checking all basic blocks. */ - push_cfun (DECL_STRUCT_FUNCTION (decl)); for (unsigned i = 0; i < bb_sorted.length (); ++i) if(!m_checker->compare_bb (bb_sorted[i], m_compared_func->bb_sorted[i])) - { - pop_cfun (); - return return_false (); - } - pop_cfun (); + return return_false (); auto_vec bb_dict; From patchwork Fri Nov 8 07:13:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 1194152 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-513215-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="CbAvBbNE"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47CfKc5BSnz9s7T for ; Wed, 13 Nov 2019 20:23:00 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; q=dns; s=default; b=RpnGyB3zmudkrHPRnm4rQ+XgNM4cf abvc/08t1vR0VOp/PfPw5l/fKi4YSt/elKXRi7f2ZMJCY0HHWh65Mk3VJR9GrF2K kInTUDQF1+F848VHNMemQySYAQ3QC1v24RHpsWDP1ii3j0+ZnC+XJ6GV/Cybf22E R72xav5DTTRUMA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; s=default; bh=U7ynDhis85LRc6p+fz7CSSTYF1M=; b=CbA vBbNErdblbwwSl5qvC0dYi8Gxbxh7UHgFwDvMuSf/kmEr02/Xu+wlsjaCxZw1jAR HCMK9OBvaWS9m1ZUlEcOcFUw0CwEdCNSWBgCoSxY/IQreU4tZXIsZAJHAqeXU2R+ VVkFEh/sMaXCZPF1LmDYbGt7T9yMOmc6q+oP+0yI= Received: (qmail 43891 invoked by alias); 13 Nov 2019 09:22:17 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 43817 invoked by uid 89); 13 Nov 2019 09:22:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=sk:return_ X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Nov 2019 09:22:15 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 76C63B231 for ; Wed, 13 Nov 2019 09:22:13 +0000 (UTC) Resent-From: =?utf-8?q?Martin_Li=C5=A1ka?= Resent-To: GCC Patches Resent-Date: Wed, 13 Nov 2019 10:22:13 +0100 Resent-Message-ID: <0e20cc8b-f845-3d23-c71c-03668bdbc94f@suse.cz> Message-Id: In-Reply-To: References: From: Martin Liska Date: Fri, 8 Nov 2019 08:13:21 +0100 Subject: [PATCH 2/5] Update dump message in IPA ICF. To: gcc-patches@gcc.gnu.org MIME-Version: 1.0 X-IsSubscribed: yes gcc/ChangeLog: 2019-11-11 Martin Liska * ipa-icf-gimple.c (func_checker::compare_gimple_call): Update bail out reason. (func_checker::compare_gimple_assign): Likewise. --- gcc/ipa-icf-gimple.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c index 7e4ffc852a8..edb8fd66e08 100644 --- a/gcc/ipa-icf-gimple.c +++ b/gcc/ipa-icf-gimple.c @@ -579,7 +579,7 @@ func_checker::compare_gimple_call (gcall *s1, gcall *s2) t2 = gimple_call_arg (s2, i); if (!compare_operand (t1, t2)) - return return_false_with_msg ("memory operands are different"); + return return_false_with_msg ("GIMPLE call operands are different"); } /* Return value checking. */ @@ -618,7 +618,8 @@ func_checker::compare_gimple_assign (gimple *s1, gimple *s2) arg2 = gimple_op (s2, i); if (!compare_operand (arg1, arg2)) - return return_false_with_msg ("memory operands are different"); + return return_false_with_msg ("GIMPLE assignment operands " + "are different"); } From patchwork Fri Nov 8 08:31:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 1194154 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-513217-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="RNKYJOOG"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47CfL52vzgz9sNT for ; Wed, 13 Nov 2019 20:23:25 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; q=dns; s=default; b=TFUTegUPL5NJcAyzUu5Nmk1S8aSpx cww0y3+M9tXp0+QsHwm5INcmv7HQ2uOUZbUWNxisgATWrirHmdBzxnidKQFn7LGd ZCqvl1x8EPKLfXvWNN7U2AG2PBynK6AB6o5ZHTVkML4r9xnR0n2kYgQ8n5fCRcML FLboY1LhGejvow= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; s=default; bh=v3AINnJpiMefvEwjWK0JyDHvlp0=; b=RNK YJOOGRpNQQTXksEGg5D4+1gQB9X9IKtyqpqTLjDkUFHMHH8DJg4MWcfVQjQErbEO hXY3PA3Dc6ZNYOihESIpIyO6a7MlCXwZrEmbatNehbYEWpDkRoxqv3n6gZJeI0Sx 1KM3oqfBx1oRzU8mIGC1t7MF4EpushZP8/djXZ5Q= Received: (qmail 45263 invoked by alias); 13 Nov 2019 09:22:26 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 45199 invoked by uid 89); 13 Nov 2019 09:22:25 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_SOFTFAIL autolearn=ham version=3.3.1 spammy=HX-detected-operating-system:timestamps, CONSTRUCTOR, MEM_REF X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (209.51.188.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Nov 2019 09:22:22 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iUoqw-0002fe-29 for gcc-patches@gcc.gnu.org; Wed, 13 Nov 2019 04:22:20 -0500 Received: from mx2.suse.de ([195.135.220.15]:58254 helo=mx1.suse.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iUoqv-0002cq-En for gcc-patches@gcc.gnu.org; Wed, 13 Nov 2019 04:22:17 -0500 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 7693CB225 for ; Wed, 13 Nov 2019 09:22:13 +0000 (UTC) Resent-From: =?utf-8?q?Martin_Li=C5=A1ka?= Resent-To: GCC Patches Resent-Date: Wed, 13 Nov 2019 10:22:13 +0100 Resent-Message-ID: Message-Id: <0c58e8ead4ac3d2daa3a8c5380d31c5e9a07a576.1573636740.git.mliska@suse.cz> In-Reply-To: References: From: Martin Liska Date: Fri, 8 Nov 2019 09:31:45 +0100 Subject: [PATCH 3/5] Use func_checker::hash_operand for hashing of GIMPLE operands. To: gcc-patches@gcc.gnu.org MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 195.135.220.15 X-IsSubscribed: yes gcc/ChangeLog: 2019-11-11 Martin Liska * ipa-icf-gimple.h (func_checker::func_checker): Add default constructor. * ipa-icf.c (sem_function::init): Make operand_equal_p and hash_operand public. (sem_item::add_expr): Remove. (sem_item::add_type): Remove. (sem_function::hash_stmt): Use m_checker for hashing of GIMPLE statements. (sem_function::parse): Init with checker. (sem_variable::parse): Pass NULL as checker. (sem_item_optimizer::parse_funcs_and_vars): Pass checker to ::parse function. (sem_item_optimizer::parse_nonsingleton_classes): Likewise. (sem_variable::parse): New function. (sem_variable::get_hash): Only return computed hash value. (sem_variable::init): Initialize hash of a variable. * ipa-icf.h: Remove add_expr, add_type and add func_checker to couple of functions as a new argument. --- gcc/ipa-icf-gimple.h | 11 ++ gcc/ipa-icf.c | 239 ++++++++----------------------------------- gcc/ipa-icf.h | 20 ++-- 3 files changed, 60 insertions(+), 210 deletions(-) diff --git a/gcc/ipa-icf-gimple.h b/gcc/ipa-icf-gimple.h index 8213e4f2f46..b59d05fd605 100644 --- a/gcc/ipa-icf-gimple.h +++ b/gcc/ipa-icf-gimple.h @@ -121,6 +121,16 @@ public: class func_checker : operand_compare { public: + /* Default constructor. */ + func_checker (): + m_source_func_decl (NULL_TREE), m_target_func_decl (NULL_TREE), + m_ignored_source_nodes (NULL), m_ignored_target_nodes (NULL), + m_ignore_labels (false) + { + m_source_ssa_names.create (0); + m_target_ssa_names.create (0); + } + /* Initialize internal structures for a given SOURCE_FUNC_DECL and TARGET_FUNC_DECL. Strict polymorphic comparison is processed if an option COMPARE_POLYMORPHIC is true. For special cases, one can @@ -254,6 +264,7 @@ private: /* Flag if ignore labels in comparison. */ bool m_ignore_labels; +public: /* Return true if two operands are equal. The flags fields can be used to specify OEP flags described above. */ virtual bool operand_equal_p (const_tree, const_tree, unsigned int flags); diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 53e387403c8..8297eec9388 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -1335,8 +1335,9 @@ sem_function::merge (sem_item *alias_item) /* Semantic item initialization function. */ void -sem_function::init (void) +sem_function::init (ipa_icf_gimple::func_checker *checker) { + m_checker = checker; if (in_lto_p) get_node ()->get_untransformed_body (); @@ -1411,161 +1412,6 @@ sem_function::init (void) } } -/* Accumulate to HSTATE a hash of expression EXP. - Identical to inchash::add_expr, but guaranteed to be stable across LTO - and DECL equality classes. */ - -void -sem_item::add_expr (const_tree exp, inchash::hash &hstate) -{ - if (exp == NULL_TREE) - { - hstate.merge_hash (0); - return; - } - - /* Handled component can be matched in a cureful way proving equivalence - even if they syntactically differ. Just skip them. */ - STRIP_NOPS (exp); - while (handled_component_p (exp)) - exp = TREE_OPERAND (exp, 0); - - enum tree_code code = TREE_CODE (exp); - hstate.add_int (code); - - switch (code) - { - /* Use inchash::add_expr for everything that is LTO stable. */ - case VOID_CST: - case INTEGER_CST: - case REAL_CST: - case FIXED_CST: - case STRING_CST: - case COMPLEX_CST: - case VECTOR_CST: - inchash::add_expr (exp, hstate); - break; - case CONSTRUCTOR: - { - unsigned HOST_WIDE_INT idx; - tree value; - - hstate.add_hwi (int_size_in_bytes (TREE_TYPE (exp))); - - FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) - if (value) - add_expr (value, hstate); - break; - } - case ADDR_EXPR: - case FDESC_EXPR: - add_expr (get_base_address (TREE_OPERAND (exp, 0)), hstate); - break; - case SSA_NAME: - case VAR_DECL: - case CONST_DECL: - case PARM_DECL: - hstate.add_hwi (int_size_in_bytes (TREE_TYPE (exp))); - break; - case MEM_REF: - case POINTER_PLUS_EXPR: - case MINUS_EXPR: - case RANGE_EXPR: - add_expr (TREE_OPERAND (exp, 0), hstate); - add_expr (TREE_OPERAND (exp, 1), hstate); - break; - case PLUS_EXPR: - { - inchash::hash one, two; - add_expr (TREE_OPERAND (exp, 0), one); - add_expr (TREE_OPERAND (exp, 1), two); - hstate.add_commutative (one, two); - } - break; - CASE_CONVERT: - hstate.add_hwi (int_size_in_bytes (TREE_TYPE (exp))); - return add_expr (TREE_OPERAND (exp, 0), hstate); - default: - break; - } -} - -/* Accumulate to HSTATE a hash of type t. - TYpes that may end up being compatible after LTO type merging needs to have - the same hash. */ - -void -sem_item::add_type (const_tree type, inchash::hash &hstate) -{ - if (type == NULL_TREE) - { - hstate.merge_hash (0); - return; - } - - type = TYPE_MAIN_VARIANT (type); - - hstate.add_int (TYPE_MODE (type)); - - if (TREE_CODE (type) == COMPLEX_TYPE) - { - hstate.add_int (COMPLEX_TYPE); - sem_item::add_type (TREE_TYPE (type), hstate); - } - else if (INTEGRAL_TYPE_P (type)) - { - hstate.add_int (INTEGER_TYPE); - hstate.add_flag (TYPE_UNSIGNED (type)); - hstate.add_int (TYPE_PRECISION (type)); - } - else if (VECTOR_TYPE_P (type)) - { - hstate.add_int (VECTOR_TYPE); - hstate.add_int (TYPE_PRECISION (type)); - sem_item::add_type (TREE_TYPE (type), hstate); - } - else if (TREE_CODE (type) == ARRAY_TYPE) - { - hstate.add_int (ARRAY_TYPE); - /* Do not hash size, so complete and incomplete types can match. */ - sem_item::add_type (TREE_TYPE (type), hstate); - } - else if (RECORD_OR_UNION_TYPE_P (type)) - { - /* Incomplete types must be skipped here. */ - if (!COMPLETE_TYPE_P (type)) - { - hstate.add_int (RECORD_TYPE); - return; - } - - hashval_t *val = m_type_hash_cache.get (type); - - if (!val) - { - inchash::hash hstate2; - unsigned nf; - tree f; - hashval_t hash; - - hstate2.add_int (RECORD_TYPE); - for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f)) - if (TREE_CODE (f) == FIELD_DECL) - { - add_type (TREE_TYPE (f), hstate2); - nf++; - } - - hstate2.add_int (nf); - hash = hstate2.end (); - hstate.add_hwi (hash); - m_type_hash_cache.put (type, hash); - } - else - hstate.add_hwi (*val); - } -} - /* Improve accumulated hash for HSTATE based on a gimple statement STMT. */ void @@ -1578,27 +1424,19 @@ sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate) switch (code) { case GIMPLE_SWITCH: - add_expr (gimple_switch_index (as_a (stmt)), hstate); + m_checker->hash_operand (gimple_switch_index (as_a (stmt)), + hstate, 0); break; case GIMPLE_ASSIGN: hstate.add_int (gimple_assign_rhs_code (stmt)); if (commutative_tree_code (gimple_assign_rhs_code (stmt)) || commutative_ternary_tree_code (gimple_assign_rhs_code (stmt))) { - inchash::hash one, two; - - add_expr (gimple_assign_rhs1 (stmt), one); - add_type (TREE_TYPE (gimple_assign_rhs1 (stmt)), one); - add_expr (gimple_assign_rhs2 (stmt), two); - hstate.add_commutative (one, two); + m_checker->hash_operand (gimple_assign_rhs1 (stmt), hstate, 0); + m_checker->hash_operand (gimple_assign_rhs2 (stmt), hstate, 0); if (commutative_ternary_tree_code (gimple_assign_rhs_code (stmt))) - { - add_expr (gimple_assign_rhs3 (stmt), hstate); - add_type (TREE_TYPE (gimple_assign_rhs3 (stmt)), hstate); - } - add_expr (gimple_assign_lhs (stmt), hstate); - add_type (TREE_TYPE (gimple_assign_lhs (stmt)), two); - break; + m_checker->hash_operand (gimple_assign_rhs3 (stmt), hstate, 0); + m_checker->hash_operand (gimple_assign_lhs (stmt), hstate, 0); } /* fall through */ case GIMPLE_CALL: @@ -1608,11 +1446,7 @@ sem_function::hash_stmt (gimple *stmt, inchash::hash &hstate) case GIMPLE_RETURN: /* All these statements are equivalent if their operands are. */ for (unsigned i = 0; i < gimple_num_ops (stmt); ++i) - { - add_expr (gimple_op (stmt, i), hstate); - if (gimple_op (stmt, i)) - add_type (TREE_TYPE (gimple_op (stmt, i)), hstate); - } + m_checker->hash_operand (gimple_op (stmt, i), hstate, 0); /* Consider nocf_check attribute in hash as it affects code generation. */ if (code == GIMPLE_CALL @@ -1648,7 +1482,8 @@ sem_function::compare_polymorphic_p (void) semantic function item. */ sem_function * -sem_function::parse (cgraph_node *node, bitmap_obstack *stack) +sem_function::parse (cgraph_node *node, bitmap_obstack *stack, + func_checker *checker) { tree fndecl = node->decl; function *func = DECL_STRUCT_FUNCTION (fndecl); @@ -1669,8 +1504,7 @@ sem_function::parse (cgraph_node *node, bitmap_obstack *stack) return NULL; sem_function *f = new sem_function (node, stack); - - f->init (); + f->init (checker); return f; } @@ -2038,40 +1872,45 @@ sem_variable::equals (tree t1, tree t2) /* Parser function that visits a varpool NODE. */ sem_variable * -sem_variable::parse (varpool_node *node, bitmap_obstack *stack) +sem_variable::parse (varpool_node *node, bitmap_obstack *stack, + func_checker *checker) { if (TREE_THIS_VOLATILE (node->decl) || DECL_HARD_REGISTER (node->decl) || node->alias) return NULL; sem_variable *v = new sem_variable (node, stack); - - v->init (); + v->init (checker); return v; } -/* References independent hash function. */ +/* Semantic variable initialization function. */ -hashval_t -sem_variable::get_hash (void) +void +sem_variable::init (ipa_icf_gimple::func_checker *checker) { - if (m_hash_set) - return m_hash; + decl = get_node ()->decl; /* All WPA streamed in symbols should have their hashes computed at compile time. At this point, the constructor may not be in memory at all. DECL_INITIAL (decl) would be error_mark_node in that case. */ - gcc_assert (!node->lto_file_data); - tree ctor = DECL_INITIAL (decl); - inchash::hash hstate; + if (!m_hash_set) + { + gcc_assert (!node->lto_file_data); + inchash::hash hstate; + hstate.add_int (456346417); + checker->hash_operand (DECL_INITIAL (decl), hstate, 0); + set_hash (hstate.end ()); + } +} - hstate.add_int (456346417); - if (DECL_SIZE (decl) && tree_fits_shwi_p (DECL_SIZE (decl))) - hstate.add_hwi (tree_to_shwi (DECL_SIZE (decl))); - add_expr (ctor, hstate); - set_hash (hstate.end ()); +/* References independent hash function. */ +hashval_t +sem_variable::get_hash (void) +{ + gcc_checking_assert (m_hash_set); return m_hash; } @@ -2590,10 +2429,13 @@ sem_item_optimizer::parse_funcs_and_vars (void) { cgraph_node *cnode; + /* Create dummy func_checker for hashing purpose. */ + func_checker checker; + if (flag_ipa_icf_functions) FOR_EACH_DEFINED_FUNCTION (cnode) { - sem_function *f = sem_function::parse (cnode, &m_bmstack); + sem_function *f = sem_function::parse (cnode, &m_bmstack, &checker); if (f) { m_items.safe_push (f); @@ -2606,7 +2448,7 @@ sem_item_optimizer::parse_funcs_and_vars (void) if (flag_ipa_icf_variables) FOR_EACH_DEFINED_VARIABLE (vnode) { - sem_variable *v = sem_variable::parse (vnode, &m_bmstack); + sem_variable *v = sem_variable::parse (vnode, &m_bmstack, &checker); if (v) { @@ -2750,10 +2592,13 @@ sem_item_optimizer::parse_nonsingleton_classes (void) { unsigned int counter = 0; + /* Create dummy func_checker for hashing purpose. */ + func_checker checker; + for (unsigned i = 0; i < m_items.length (); i++) if (m_items[i]->cls->members.length () > 1) { - m_items[i]->init (); + m_items[i]->init (&checker); ++counter; } diff --git a/gcc/ipa-icf.h b/gcc/ipa-icf.h index 0b99a612016..906002214d5 100644 --- a/gcc/ipa-icf.h +++ b/gcc/ipa-icf.h @@ -191,7 +191,7 @@ public: DEBUG_FUNCTION void dump (void); /* Semantic item initialization function. */ - virtual void init (void) = 0; + virtual void init (ipa_icf_gimple::func_checker *) = 0; /* Add reference to a semantic TARGET. */ void add_reference (ref_map *map, sem_item *target); @@ -269,11 +269,6 @@ public: protected: /* Cached, once calculated hash for the item. */ - /* Accumulate to HSTATE a hash of expression EXP. */ - static void add_expr (const_tree exp, inchash::hash &hstate); - /* Accumulate to HSTATE a hash of type T. */ - static void add_type (const_tree t, inchash::hash &hstate); - /* Compare properties of symbol that does not affect semantics of symbol itself but affects semantics of its references. If ADDRESS is true, do extra checking needed for IPA_REF_ADDR. */ @@ -322,7 +317,7 @@ public: ~sem_function (); - virtual void init (void); + virtual void init (ipa_icf_gimple::func_checker *); virtual bool equals_wpa (sem_item *item, hash_map &ignored_nodes); virtual hashval_t get_hash (void); @@ -351,7 +346,8 @@ public: /* For a given call graph NODE, the function constructs new semantic function item. */ - static sem_function *parse (cgraph_node *node, bitmap_obstack *stack); + static sem_function *parse (cgraph_node *node, bitmap_obstack *stack, + ipa_icf_gimple::func_checker *checker); /* Perform additional checks needed to match types of used function paramters. */ @@ -423,10 +419,7 @@ public: sem_variable (varpool_node *_node, bitmap_obstack *stack); /* Semantic variable initialization function. */ - inline virtual void init (void) - { - decl = get_node ()->decl; - } + virtual void init (ipa_icf_gimple::func_checker *); virtual hashval_t get_hash (void); virtual bool merge (sem_item *alias_item); @@ -445,7 +438,8 @@ public: } /* Parser function that visits a varpool NODE. */ - static sem_variable *parse (varpool_node *node, bitmap_obstack *stack); + static sem_variable *parse (varpool_node *node, bitmap_obstack *stack, + ipa_icf_gimple::func_checker *checker); private: /* Compares trees T1 and T2 for semantic equality. */ From patchwork Fri Nov 8 10:01:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 1194150 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-513213-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="Y/tCcXRs"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47CfK807WNz9sPZ for ; Wed, 13 Nov 2019 20:22:35 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; q=dns; s=default; b=qirigVOe+Mhb1y6hat7pAh2vcB9kH ImMkeEUB4umaIU0kPTy0q2eGLOsj3l9z8t0t4hCKCwMiPKT9QSjA5raNxhM1tzoZ lvymzNhXehQE8oAQ9qCcGVTfo4En03OB/jKXtPsbtSFQddgn4/b9AYYSvGi+K2JN v9BkAlgg07A/kg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; s=default; bh=o2WiaPlish3OgrG2dAfP3U7qAmM=; b=Y/t CcXRsD+pOpWoAAKHgLsO/N9uwed7lgielJuz/iibD+yIdLLaQNnTU3DSnh8fvxL9 g6U9pNe/3pk7xXB4cmpZg98pEbuaMLBDgKkBw7ytJ0tLG5EWXCx467Doo5vclFP2 p+MKVbCKHkV00Vp6ivNhleDQyxZ25gzscgqRvODo= Received: (qmail 43842 invoked by alias); 13 Nov 2019 09:22:17 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 43811 invoked by uid 89); 13 Nov 2019 09:22:16 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=HX-Languages-Length:751 X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Nov 2019 09:22:15 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 768F4B205 for ; Wed, 13 Nov 2019 09:22:13 +0000 (UTC) Resent-From: =?utf-8?q?Martin_Li=C5=A1ka?= Resent-To: GCC Patches Resent-Date: Wed, 13 Nov 2019 10:22:13 +0100 Resent-Message-ID: <5f57f727-27f3-c147-e2dd-cbbfb33580de@suse.cz> Message-Id: <8fe6b96e1dea77e3af48fd1192699df9d6841b11.1573636740.git.mliska@suse.cz> In-Reply-To: References: From: Martin Liska Date: Fri, 8 Nov 2019 11:01:49 +0100 Subject: [PATCH 4/5] Handle FIELD_DECL in IPA ICF. To: gcc-patches@gcc.gnu.org MIME-Version: 1.0 X-IsSubscribed: yes gcc/ChangeLog: 2019-11-11 Martin Liska * ipa-icf-gimple.c (func_checker::hash_operand): Improve func_checker::hash_operand by handling of FIELD_DECLs. --- gcc/ipa-icf-gimple.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c index edb8fd66e08..ac53a1dfbbf 100644 --- a/gcc/ipa-icf-gimple.c +++ b/gcc/ipa-icf-gimple.c @@ -234,7 +234,10 @@ func_checker::hash_operand (const_tree arg, inchash::hash &hstate, case CONST_DECL: case SSA_NAME: return; - + case FIELD_DECL: + inchash::add_expr (DECL_FIELD_OFFSET (arg), hstate, flags); + inchash::add_expr (DECL_FIELD_BIT_OFFSET (arg), hstate, flags); + return; default: break; } From patchwork Mon Nov 11 13:38:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Li=C5=A1ka?= X-Patchwork-Id: 1194153 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-513216-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="ZhON0nvn"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47CfKr6grqz9sNT for ; Wed, 13 Nov 2019 20:23:12 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; q=dns; s=default; b=Me2y7OgUO5boXJS8Q7YB6vwsT5wI8 co2Zpkk/NzwXPC/BJYq5PF1GEJ0fsGeYM279JqepQvbBgprAsO9J3toYOWbAXdLd 00muYgeosSjBePKD4Pcw8T5XcokEAOnwsDdC0XEx1sz9BL4oIFnYaiJkOycZKWVH TcPGjV2r+Oblt8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :resent-from:resent-to:resent-date:resent-message-id:message-id :in-reply-to:references:from:date:subject:to:mime-version :content-type; s=default; bh=DwYDES8uc+pdl/Za+EjJpSy6VDY=; b=ZhO N0nvn09VxKN26vLO9/B8HIixekZpBqpG0Xq2XK7zNFqe5T8xGlfJibflQVFPiFlT XzxlDXKDUrSYmKMSvmuIykvbhemLluuiq0IQCRrySkNhdcig3RTnzRZOv66gAS2E 8iHQjMVY66p2JjHBZdcDzXzGRPnUlbsO3EMEsVGg= Received: (qmail 45002 invoked by alias); 13 Nov 2019 09:22:24 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 44945 invoked by uid 89); 13 Nov 2019 09:22:24 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-18.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_SOFTFAIL autolearn=ham version=3.3.1 spammy=HX-detected-operating-system:timestamps X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (209.51.188.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Nov 2019 09:22:22 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iUoqw-0002gC-LU for gcc-patches@gcc.gnu.org; Wed, 13 Nov 2019 04:22:20 -0500 Received: from mx2.suse.de ([195.135.220.15]:58264 helo=mx1.suse.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iUoqw-0002f8-7k for gcc-patches@gcc.gnu.org; Wed, 13 Nov 2019 04:22:18 -0500 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 7E342B23D for ; Wed, 13 Nov 2019 09:22:13 +0000 (UTC) Resent-From: =?utf-8?q?Martin_Li=C5=A1ka?= Resent-To: GCC Patches Resent-Date: Wed, 13 Nov 2019 10:22:13 +0100 Resent-Message-ID: <617cddb6-5706-5af1-3e65-25bb9c288afd@suse.cz> Message-Id: In-Reply-To: References: From: Martin Liska Date: Mon, 11 Nov 2019 14:38:33 +0100 Subject: [PATCH 5/5] Update statistics about needed symbols in IPA ICF. To: gcc-patches@gcc.gnu.org MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 195.135.220.15 X-IsSubscribed: yes gcc/ChangeLog: 2019-11-11 Martin Liska * ipa-icf.c (sem_item_optimizer::execute): Save loaded_symbols. (sem_item_optimizer::parse_nonsingleton_classes): Return number of loaded symbols. (sem_item_optimizer::merge_classes): Print statistics about totally needed symbols. * ipa-icf.h (parse_nonsingleton_classes): Change return type. (merge_classes): Add one argument. --- gcc/ipa-icf.c | 20 +++++++++++++------- gcc/ipa-icf.h | 8 +++++--- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 8297eec9388..15aac1cdbe6 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -2400,7 +2400,7 @@ sem_item_optimizer::execute (void) dump_cong_classes (); - parse_nonsingleton_classes (); + unsigned int loaded_symbols = parse_nonsingleton_classes (); subdivide_classes_by_equality (); if (dump_file) @@ -2413,7 +2413,7 @@ sem_item_optimizer::execute (void) process_cong_reduction (); dump_cong_classes (); checking_verify_classes (); - bool merged_p = merge_classes (prev_class_count); + bool merged_p = merge_classes (prev_class_count, loaded_symbols); if (dump_file && (dump_flags & TDF_DETAILS)) symtab->dump (dump_file); @@ -2587,7 +2587,7 @@ sem_item_optimizer::build_graph (void) /* Semantic items in classes having more than one element and initialized. In case of WPA, we load function body. */ -void +unsigned int sem_item_optimizer::parse_nonsingleton_classes (void) { unsigned int counter = 0; @@ -2607,6 +2607,8 @@ sem_item_optimizer::parse_nonsingleton_classes (void) float f = m_items.length () ? 100.0f * counter / m_items.length () : 0.0f; fprintf (dump_file, "Init called for %u items (%.2f%%).\n", counter, f); } + + return counter; } /* Equality function for semantic items is used to subdivide existing @@ -3214,10 +3216,12 @@ sort_congruence_class_groups_by_decl_uid (const void *a, const void *b) /* After reduction is done, we can declare all items in a group to be equal. PREV_CLASS_COUNT is start number of classes before reduction. True is returned if there's a merge operation - processed. */ + processed. LOADED_SYMBOLS is number of symbols that were loaded + in WPA. */ bool -sem_item_optimizer::merge_classes (unsigned int prev_class_count) +sem_item_optimizer::merge_classes (unsigned int prev_class_count, + unsigned int loaded_symbols) { unsigned int item_count = m_items.length (); unsigned int class_count = m_classes_count; @@ -3280,8 +3284,10 @@ sem_item_optimizer::merge_classes (unsigned int prev_class_count) non_singular_classes_count : 0.0f, non_singular_classes_count); fprintf (dump_file, "Equal symbols: %u\n", equal_items); - fprintf (dump_file, "Fraction of visited symbols: %.2f%%\n\n", - item_count ? 100.0f * equal_items / item_count : 0.0f); + unsigned total = equal_items + non_singular_classes_count; + fprintf (dump_file, "Totally needed symbols: %u" + ", fraction of loaded symbols: %.2f%%\n\n", total, + loaded_symbols ? 100.0f * total / loaded_symbols: 0.0f); } unsigned int l; diff --git a/gcc/ipa-icf.h b/gcc/ipa-icf.h index 906002214d5..3098fd1f0ce 100644 --- a/gcc/ipa-icf.h +++ b/gcc/ipa-icf.h @@ -546,7 +546,7 @@ private: /* Semantic items in classes having more than one element and initialized. In case of WPA, we load function body. */ - void parse_nonsingleton_classes (void); + unsigned int parse_nonsingleton_classes (void); /* Equality function for semantic items is used to subdivide existing classes. If IN_WPA, fast equality function is invoked. */ @@ -571,8 +571,10 @@ private: /* After reduction is done, we can declare all items in a group to be equal. PREV_CLASS_COUNT is start number of classes before reduction. True is returned if there's a merge operation - processed. */ - bool merge_classes (unsigned int prev_class_count); + processed. LOADED_SYMBOLS is number of symbols that were loaded + in WPA. */ + bool merge_classes (unsigned int prev_class_count, + unsigned int loaded_symbols); /* Fixup points to analysis info. */ void fixup_points_to_sets (void);