From patchwork Wed Feb 21 14:54:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Jambor X-Patchwork-Id: 204250 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:693c:2685:b0:108:e6aa:91d0 with SMTP id mn5csp1086494dyc; Wed, 21 Feb 2024 06:56:13 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCUhvSvBE2H7Yase0L1JvdrqX82Rfa4W8Lq6UqwkZ+Hv2KMgK9XjIM0GjSU54roEu0JNX4/twb9TsjcPp18uKMI8jxopYg== X-Google-Smtp-Source: AGHT+IGEpYJc9xpHwtH9k5pKUNuakoUhARIy25gfIdiWsizmPraeW34LAlA/sK5twDv/2NWUtCh6 X-Received: by 2002:a05:620a:a14:b0:785:d359:21cf with SMTP id i20-20020a05620a0a1400b00785d35921cfmr18892817qka.57.1708527372829; Wed, 21 Feb 2024 06:56:12 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1708527372; cv=pass; d=google.com; s=arc-20160816; b=pl66HDlMercXpgDG2tnyv/qdgqAls0LLcUt+Q+FlYPdzW9budXJcjXndENXrWNbfPp 2wXl0k1fZszdJAH8LnPU5ZW+eXT5fnZawWZMZWEdQBBqfinoVAPyhGSMHlj85VVXxkZ5 vZAkz0CtMokg+X6Z+yXZCvaQ88cqfYVMDBcZ2SynWjwiv1Xn3LS1pW8PaS1vG5rD77ob EuEE9Ce2Bjbr1WdNy62DFsiCofqFH42MrliVwSvaHlhSOusS1RX7UDqI04g/7nN5d2Qr sb/anTTBPMjUMa6Pi3izRibvPucXckAEenGcX8ECKIj2hR9GMrnnxe/ztPhvnyABlKtD GGkQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mime-version:message-id:date :user-agent:subject:cc:to:from:dkim-signature:dkim-signature :dkim-signature:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=HsWssnZ1o+/t2U12jMU9SA4CTnF4AzOjT+fzK75Cc4Y=; fh=RsEJwzjll60Mv/cF7dyRMg+EVZ7Zmb6Ybf1M/YMSFHI=; b=JEwjK7jUFKO3c5f+6tDso41qafGA7vw0cKp6zhdQVEcY82XENo5H0+iMN4pGWpX6bw Zg5dUPy3HtWhdDPssWqHx+9SMu+kdiujfTFZher9elwYeg0uc/mtOkMNZf9IB/ZDOrfy UYnZsa9JWl5+4hOV5e0qNlql73khhXg0SbKAwjw4GTIFCIpiTmvxMdhb4zClNcmI+6mv xf6y1HeUpXXoF2Q1Ghfyzvtw+T+/FXvNei8hfVsV0q3pEF7oSvbmy87R5xzCIrz4eAVl dAUvlrJnsxq/QAWrlJtZ70yhrdDQKGEA+KSNGO6NmjAIYcezStonTek5oHVucK6fvTfu DJ1Q==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=vHihjbtf; dkim=neutral (no key) header.i=@suse.cz header.s=susede2_ed25519; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=vHihjbtf; dkim=neutral (no key) header.i=@suse.cz header.s=susede2_ed25519; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id o9-20020a05620a22c900b00785c15906b4si10528174qki.61.2024.02.21.06.56.12 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Feb 2024 06:56:12 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=vHihjbtf; dkim=neutral (no key) header.i=@suse.cz header.s=susede2_ed25519; dkim=pass header.i=@suse.cz header.s=susede2_rsa header.b=vHihjbtf; dkim=neutral (no key) header.i=@suse.cz header.s=susede2_ed25519; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 877663858407 for ; Wed, 21 Feb 2024 14:56:12 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id 5A2F13858CDA for ; Wed, 21 Feb 2024 14:54:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5A2F13858CDA Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5A2F13858CDA Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708527292; cv=none; b=eoS02g7U93qkkPN6h3QN6SPITLsltm2fm/2vgQtOKqBCUKFBB+Nvgsqkksho9+bdG2IeamnhaLKsZwYqw2UAiXh8LOrgndyg87x13PF3ElYgT5BNSFGIZwju2Fn5+ax7TYFoxqVUKvetcJgTsOlJ1/kIhv3FS9FQaByOn86HqwU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708527292; c=relaxed/simple; bh=06aHCTbEuWL/gkgmVQiZXtOMUWzrADOtQ5kEQxWmmOI=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=EtfkganEehWHX4D1l5aNrYtQ7EnCYHJJXf3UTIkTyIp6j0rlisjGUorlw1eu91cBGCRB4L+8kAo35L+os7ty74PhuoeoM/s+0sYeK8Ici3qrIgDT5NIWTILcby4DV4mYW2nA7gNZjF8YNjCiPuBVQy7UpmfSLr37E/OuZxADILk= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from imap2.dmz-prg2.suse.org (imap2.dmz-prg2.suse.org [10.150.64.98]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 41A7321AE3; Wed, 21 Feb 2024 14:54:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1708527288; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=HsWssnZ1o+/t2U12jMU9SA4CTnF4AzOjT+fzK75Cc4Y=; b=vHihjbtfDHwxvDY18n9HBGBCj+wYQG1CjnuvF8LwOn80SYTabnC+ax0K0Ipp7T7apw3Mbk PPXx+vwvOU/lcYxw1wryTw76wudjwEdoAZLW8kkaxZqeZwMk14vkR+jeL3eQ3Y/Fbpjh46 3twysXFvFmh4dOtOqZU0cgSOcBZMUrU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1708527288; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=HsWssnZ1o+/t2U12jMU9SA4CTnF4AzOjT+fzK75Cc4Y=; b=s5s06vgriixdk2LRBkbkHrVSs6sT53yb8gugnpRW2Am5zexbyxNA4rWZjJnfSwb19QYC36 xFjQomObsjPWnRDA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1708527288; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=HsWssnZ1o+/t2U12jMU9SA4CTnF4AzOjT+fzK75Cc4Y=; b=vHihjbtfDHwxvDY18n9HBGBCj+wYQG1CjnuvF8LwOn80SYTabnC+ax0K0Ipp7T7apw3Mbk PPXx+vwvOU/lcYxw1wryTw76wudjwEdoAZLW8kkaxZqeZwMk14vkR+jeL3eQ3Y/Fbpjh46 3twysXFvFmh4dOtOqZU0cgSOcBZMUrU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1708527288; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=HsWssnZ1o+/t2U12jMU9SA4CTnF4AzOjT+fzK75Cc4Y=; b=s5s06vgriixdk2LRBkbkHrVSs6sT53yb8gugnpRW2Am5zexbyxNA4rWZjJnfSwb19QYC36 xFjQomObsjPWnRDA== Received: from imap2.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap2.dmz-prg2.suse.org (Postfix) with ESMTPS id 2F888139D1; Wed, 21 Feb 2024 14:54:48 +0000 (UTC) Received: from dovecot-director2.suse.de ([10.150.64.162]) by imap2.dmz-prg2.suse.org with ESMTPSA id TjyRC7gO1mWBUQAAn2gu4w (envelope-from ); Wed, 21 Feb 2024 14:54:48 +0000 From: Martin Jambor To: GCC Patches Cc: Jan Hubicka Subject: [PATCH] ipa: Create indirect call edges also for lambdas User-Agent: Notmuch/0.38.2 (https://notmuchmail.org) Emacs/29.2 (x86_64-suse-linux-gnu) Date: Wed, 21 Feb 2024 15:54:47 +0100 Message-ID: MIME-Version: 1.0 Authentication-Results: smtp-out1.suse.de; none X-Spam-Level: X-Spam-Score: -4.28 X-Spamd-Result: default: False [-4.28 / 50.00]; ARC_NA(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; MIME_GOOD(-0.10)[text/plain]; RCVD_COUNT_THREE(0.00)[3]; MID_RHS_MATCH_FROMTLD(0.00)[]; DKIM_SIGNED(0.00)[suse.cz:s=susede2_rsa,suse.cz:s=susede2_ed25519]; TO_DN_ALL(0.00)[]; RCPT_COUNT_TWO(0.00)[2]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.cz:email]; FUZZY_BLOCKED(0.00)[rspamd.com]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; NEURAL_HAM_SHORT(-0.18)[-0.907]; RCVD_TLS_ALL(0.00)[]; BAYES_HAM(-3.00)[100.00%] X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1791520798599537084 X-GMAIL-MSGID: 1791520798599537084 Hi, Even though we have had code to handle creation of indirect call graph edges (so that these calls can than be made direct as part of IPA-CP and inlining and eventually also inlined) for C++ member pointers for many years, this code expects the member pointers to be structures passed by value. In PR 108802 it turned out that for lambdas these are passed by reference. This patch adjusts the code for that so that small lambdas are also inlineable without depending on early inlining. Bootstrapped and LTO bootstrapped on x86_64-linux. This is technically a regression against GCC 10. OK for master even now? Thanks, Martin gcc/ChangeLog: 2024-02-20 Martin Jambor PR ipa/108802 * ipa-prop.cc (ipa_get_stmt_member_ptr_load_param): Also recognize loads from a pointer parameter. (ipa_analyze_indirect_call_uses): Likewise. gcc/testsuite/ChangeLog: 2024-02-20 Martin Jambor PR ipa/108802 * g++.dg/ipa/pr108802.C: New test. --- gcc/ipa-prop.cc | 56 +++++++++++++++++++++-------- gcc/testsuite/g++.dg/ipa/pr108802.C | 14 ++++++++ 2 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr108802.C diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc index bec0ebd210c..25d252fd57c 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -2514,14 +2514,26 @@ ipa_get_stmt_member_ptr_load_param (gimple *stmt, bool use_delta, if (TREE_CODE (rhs) != MEM_REF) return NULL_TREE; rec = TREE_OPERAND (rhs, 0); - if (TREE_CODE (rec) != ADDR_EXPR) - return NULL_TREE; - rec = TREE_OPERAND (rec, 0); - if (TREE_CODE (rec) != PARM_DECL - || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field)) + if (TREE_CODE (rec) == ADDR_EXPR) + { + rec = TREE_OPERAND (rec, 0); + if (TREE_CODE (rec) != PARM_DECL + || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, + &delta_field)) + return NULL_TREE; + } + else if (TREE_CODE (rec) == SSA_NAME + && SSA_NAME_IS_DEFAULT_DEF (rec)) + { + if (TREE_CODE (SSA_NAME_VAR (rec)) != PARM_DECL + || !type_like_member_ptr_p (TREE_TYPE (TREE_TYPE (rec)), &ptr_field, + &delta_field)) + return NULL_TREE; + } + else return NULL_TREE; - ref_offset = TREE_OPERAND (rhs, 1); + ref_offset = TREE_OPERAND (rhs, 1); if (use_delta) fld = delta_field; else @@ -2757,17 +2769,31 @@ ipa_analyze_indirect_call_uses (struct ipa_func_body_info *fbi, gcall *call, if (rec != rec2) return; - index = ipa_get_param_decl_index (info, rec); - if (index >= 0 - && parm_preserved_before_stmt_p (fbi, index, call, rec)) + if (TREE_CODE (rec) == SSA_NAME) { - struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, - call, false); - cs->indirect_info->offset = offset; - cs->indirect_info->agg_contents = 1; - cs->indirect_info->member_ptr = 1; - cs->indirect_info->guaranteed_unmodified = 1; + index = ipa_get_param_decl_index (info, SSA_NAME_VAR (rec)); + if (index < 0 + || !parm_ref_data_preserved_p (fbi, index, call, + gimple_assign_rhs1 (def))) + return; + by_ref = true; } + else + { + index = ipa_get_param_decl_index (info, rec); + if (index < 0 + || !parm_preserved_before_stmt_p (fbi, index, call, rec)) + return; + by_ref = false; + } + + struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, + call, false); + cs->indirect_info->offset = offset; + cs->indirect_info->agg_contents = 1; + cs->indirect_info->member_ptr = 1; + cs->indirect_info->by_ref = by_ref; + cs->indirect_info->guaranteed_unmodified = 1; return; } diff --git a/gcc/testsuite/g++.dg/ipa/pr108802.C b/gcc/testsuite/g++.dg/ipa/pr108802.C new file mode 100644 index 00000000000..2e2b6c66b64 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr108802.C @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -std=c++14 -fdump-ipa-inline -fno-early-inlining" } */ +/* { dg-add-options bind_pic_locally } */ + +struct A { + int interesting(int x) { return 2 * x; } +}; + +int f1() { + A a; + return [&](auto&& f) { return (a.*f)(42); } (&A::interesting); +} + +/* { dg-final { scan-ipa-dump "A::interesting\[^\\n\]*inline copy in int f1" "inline" } } */