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: 1902124 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=suse.cz header.i=@suse.cz header.a=rsa-sha256 header.s=susede2_rsa header.b=vHihjbtf; dkim=pass header.d=suse.cz header.i=@suse.cz header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=s5s06vgr; dkim=pass (1024-bit key) header.d=suse.cz header.i=@suse.cz header.a=rsa-sha256 header.s=susede2_rsa header.b=vHihjbtf; dkim=neutral header.d=suse.cz header.i=@suse.cz header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=s5s06vgr; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4TfzqB66gHz20RF for ; Thu, 22 Feb 2024 01:55:50 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AF4063858430 for ; Wed, 21 Feb 2024 14:55:48 +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+incoming=patchwork.ozlabs.org@gcc.gnu.org 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" } } */