From patchwork Wed Jan 24 11:07:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 191477 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2553:b0:103:945f:af90 with SMTP id p19csp913000dyi; Wed, 24 Jan 2024 03:09:31 -0800 (PST) X-Google-Smtp-Source: AGHT+IGtadq3LBQx1ReTYS49+FYLm04r8IOk/G3IfQcuXghO7eF7LMGgh9SHU+O8sOP7YfmN4GFF X-Received: by 2002:a05:620a:2408:b0:783:9006:11f9 with SMTP id d8-20020a05620a240800b00783900611f9mr8274996qkn.153.1706094571180; Wed, 24 Jan 2024 03:09:31 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706094571; cv=pass; d=google.com; s=arc-20160816; b=XvcwsyOSiyc9zd0qL2nZidJAbdjqCpsE/0yh11nta2CkCnaVXWdB0uVwf7AL1HGADL Jw1SMG6fIpn5jt2b6Sf/MifpFwk+HzUjKwPWVz8m8QcN6HTfzYjr4WAedSzU1np21ybw VESFW5K6e3hmaLuXmSqxE12BDmuTz8ULOJjLh4aeq8UowRXs3MTgkuUzaQXdVPtIGAZs ZjkSDB+NZ4sljxZYM/XGLc5YFBmnQPUUF7LtGag0SwGtJl+r3cSkV9Y+qVT5qNiI73dC 0esHnzIqPIoYSstB86tqUwhMqjOtWWfD1FihVvr771NYcxILBD07YudZ5S3ojxErRSGE kAFQ== 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:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dkim-signature :arc-filter:dmarc-filter:delivered-to; bh=oaY+o/zuIHS3wyu0316+c2EgVeX6m0uD5l9K58aBCjk=; fh=uXf1mgDAefpqDEGJDL9umcdF3eby/Gqhcj5QI8MxE/0=; b=IogPq2fYJyixpW5uQcJWNKmxm6blvEancBTHhdrbwfwL3bD378ThQiZPNN+dNKJb/o q72to2KOfW2go8R0jGxDWgmPh6hxvoSSDH3KgUnZ9vCADTKTM7tkzPxBSW2Qw3NSARs0 GHzZ8n1AVTaDM2jW69EXZssqrT6xU+jDMvohYv40oVe9ugkWoVIhJp8MRIFAbxTKcJw/ 0QCHEhP4pineVl56uycyNBC+PFLu/kh9xbRYYzh4G+5ncNL/nBSCVYmXJNtbeVJpQZwJ h0sullXtGwEJ3SsmNzDql3wVbPFSg3RIgozdhgPmKKmRGh4cHx+dg71FNO3apX60VJzo /IuA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=n8eSLWVL; 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"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id j15-20020a05620a000f00b007833a6f7183si9659822qki.584.2024.01.24.03.09.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jan 2024 03:09:31 -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=@intel.com header.s=Intel header.b=n8eSLWVL; 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"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DCEEF385E446 for ; Wed, 24 Jan 2024 11:09:30 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 97D253857C69 for ; Wed, 24 Jan 2024 11:08:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 97D253857C69 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 97D253857C69 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094506; cv=none; b=M1Q0jep5SOSUhCqlFcSQU1aqyTRS/PgpwNYSApm4zN+ZjXNTEx8UHBNSH/oKbMljLdGmvsTU85cOSJ/N5KoHj/vUUMzpNYkeqpJ+LsLBXy08xYnLKD+kksps+e9e95hEUstz4iLMDvGzEqBeB1fYM6IUajw6rEA9jUs4hBlxFsY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094506; c=relaxed/simple; bh=6gu7FOKHdLCFrcIlsO2VIdvK7EIHzHG7Q2copvMq/YA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=aPnpBeTdv9FntoEnFwBRlORYU48IUmAazkWBvTNH4SHHyo4Fiax+llSZjIDhpIqoPNrTyVT4MySYiyLOjNC2g1YEvR/vtcvyxnP1KZsOtxbUfodCgnwSJ2V+j+IkRE+Z/7uexzqt4Q/IUFXd6un6+5G4cIbhwjP1xTRgSkzh9i0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7F-0004qO-RL for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094501; x=1737630501; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=6gu7FOKHdLCFrcIlsO2VIdvK7EIHzHG7Q2copvMq/YA=; b=n8eSLWVLgYX5DGmfPcNQxW5zyPyKEk9ulVc6lSUt8eKD9OuH4opKAkVm X4PVfoCyi7oCQ9JnL5ahqOrPpUSLknBT90FoszW5Fvuwblh4wgE11EPNc WT/Smt6QckE/kfP3tDNrkZJgKlDBL2SPbgbl2+fqN4YqdUWeahN2NqeNN qHE497q2Ap9h+PizOLMgedFu2Z+31k5wh1DvYCGPJbMH0BGLJiaoAPPHJ GLdMnTedIVEHyATX8sZQWMABhLAAqYFD3jUpecqKrQxQHuiXAvBRzr3OI 7e4FG1laGPNkshCdOGsuad5pqJxYScy3Bu8CxD6wRCSe2FnDtjpAbj/6C Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969568" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969568" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472953" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472953" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 1/4] Improve must tail in RTL backend Date: Wed, 24 Jan 2024 03:07:57 -0800 Message-ID: <20240124110800.3154093-1-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, 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: 1788969821302609091 X-GMAIL-MSGID: 1788969821302609091 - Give error messages for all causes of non sibling call generation - Don't override choices of other non sibling call checks with must tail. This causes ICEs. The must tail attribute now only overrides flag_optimize_sibling_calls locally. - Error out when tree-tailcall failed to mark a must-tail call sibcall. In this case it doesn't know the true reason and only gives a vague message (this could be improved, but it's already useful without that) tree-tailcall usually fails without optimization, so must adjust the existing must-tail plugin test to specify -O2. --- gcc/calls.cc | 31 +++++++++++++------ .../gcc.dg/plugin/must-tail-call-1.c | 1 + 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/gcc/calls.cc b/gcc/calls.cc index 01f447347437..3115807b7788 100644 --- a/gcc/calls.cc +++ b/gcc/calls.cc @@ -2650,7 +2650,9 @@ expand_call (tree exp, rtx target, int ignore) /* The type of the function being called. */ tree fntype; bool try_tail_call = CALL_EXPR_TAILCALL (exp); - bool must_tail_call = CALL_EXPR_MUST_TAIL_CALL (exp); + /* tree-tailcall decided not to do tail calls. Error for the musttail case. */ + if (!try_tail_call) + maybe_complain_about_tail_call (exp, "cannot tail-call: other reasons"); int pass; /* Register in which non-BLKmode value will be returned, @@ -3021,10 +3023,22 @@ expand_call (tree exp, rtx target, int ignore) pushed these optimizations into -O2. Don't try if we're already expanding a call, as that means we're an argument. Don't try if there's cleanups, as we know there's code to follow the call. */ - if (currently_expanding_call++ != 0 - || (!flag_optimize_sibling_calls && !CALL_FROM_THUNK_P (exp)) - || args_size.var - || dbg_cnt (tail_call) == false) + if (currently_expanding_call++ != 0) + { + maybe_complain_about_tail_call (exp, "cannot tail-call: inside another call"); + try_tail_call = 0; + } + if (!flag_optimize_sibling_calls + && !CALL_FROM_THUNK_P (exp) + && !CALL_EXPR_MUST_TAIL_CALL (exp)) + try_tail_call = 0; + if (args_size.var) + { + /* ??? correct message? */ + maybe_complain_about_tail_call (exp, "cannot tail-call: stack space needed"); + try_tail_call = 0; + } + if (dbg_cnt (tail_call) == false) try_tail_call = 0; /* Workaround buggy C/C++ wrappers around Fortran routines with @@ -3045,15 +3059,12 @@ expand_call (tree exp, rtx target, int ignore) if (MEM_P (*iter)) { try_tail_call = 0; + maybe_complain_about_tail_call (exp, + "cannot tail-call: hidden string length argument"); break; } } - /* If the user has marked the function as requiring tail-call - optimization, attempt it. */ - if (must_tail_call) - try_tail_call = 1; - /* Rest of purposes for tail call optimizations to fail. */ if (try_tail_call) try_tail_call = can_implement_as_sibling_call_p (exp, diff --git a/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c b/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c index 3a6d4cceaba7..44af361e2925 100644 --- a/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c +++ b/gcc/testsuite/gcc.dg/plugin/must-tail-call-1.c @@ -1,4 +1,5 @@ /* { dg-do compile { target tail_call } } */ +/* { dg-options "-O2" } */ /* { dg-options "-fdelayed-branch" { target sparc*-*-* } } */ extern void abort (void); From patchwork Wed Jan 24 11:07:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 191480 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2553:b0:103:945f:af90 with SMTP id p19csp913787dyi; Wed, 24 Jan 2024 03:10:51 -0800 (PST) X-Google-Smtp-Source: AGHT+IHj9MtoiSD6HzWGoDGax08UpLJ1DwFWGEoWpcbeaFJhq7yfQVTJXm3jG0ezm9KXZL7ZrPH6 X-Received: by 2002:ad4:5cc7:0:b0:67f:9b92:1bbb with SMTP id iu7-20020ad45cc7000000b0067f9b921bbbmr1424670qvb.56.1706094651628; Wed, 24 Jan 2024 03:10:51 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706094651; cv=pass; d=google.com; s=arc-20160816; b=IgTllPYA/tH5jf9ihEwgFDQpcgbBmB8YJXUTIqucG7omXAeKaqtiYEsqf/R0V3TcVc 6WWIGQrbb3sctJml2nYrMmHGiknop0kSEBCxJ5t/zaE/coaQkbCrSQ4P81hgPodBUa35 bivGBcvHLH5nDxF6xdlryOB63yXeo7RI+ogr+Fibqg1wsQ8jGKzQj0LxI2duBocIVpuA zT/2OafKr3zS4jGUyTMecD6fvJFzfP3DjLU7BWr9zWSHXDF+uwnHSAMFT47l7durFNIi CULSH24uWjxtztMASOmXq0cHCalgN0vIKLqdy6rOTcCI4ghQYI0L0uyQ2jHnyF9CWoiq s79w== 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:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=LYujgJ/PfEOSNI81iVQ55rO8ZyxsJVbNEiWvm9TIAUI=; fh=uXf1mgDAefpqDEGJDL9umcdF3eby/Gqhcj5QI8MxE/0=; b=e+l7cRpjgFgpdYK3W5Aj8ENyORrmMg3ur9E1pnUXpMX2LtMlt9TpzY+5v9cw0X+tLD tuUdt+nkxeKD6c/zgs+tqTer3kdDNnST+Cx8hWt4VnWomF2LNiEta2uCxPMpelb2U+eg rpT/hEUrGdQ69fPtHJe8DJfE7BH+2i5/HtRCMvUfmko1GxARyyj7Z+KMOy+C8lXK4KXc F+dOZUl2bV6ToBPU8JSwrcHTE0y4wzk5v9XYsNw4qH2p0AU49pCKrSzxdvHNWMRoeRif GDWkkCfIMkFNe8VLVA2y/Yixqz/i7zirxv/0AxPC8B/NEGCtVx1wmQ0y3Q3kQFn4Ct/2 a3CA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WICMJqOa; 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"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id a26-20020a0cb35a000000b00680b1758fdbsi10179815qvf.383.2024.01.24.03.10.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jan 2024 03:10:51 -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=@intel.com header.s=Intel header.b=WICMJqOa; 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"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7C100385E459 for ; Wed, 24 Jan 2024 11:10:50 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 4B6393857BAF for ; Wed, 24 Jan 2024 11:08:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4B6393857BAF Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4B6393857BAF Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; cv=none; b=m6uNxWzZ5h07CCWunICneB7yCTl0ES5+aJd5KghhvY5JcoCH2iIyF0dd3NWxoDbNrtuNvtBOM2CAsGohUa60ErwVUdnYFzjGyQ1qSQy34cHeUaJ+QwbIYMhAPC1RMXBxdzKhbLG8r2qHoHnIwruCaGbvlU84bv7SqDFaL5kpeJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; c=relaxed/simple; bh=NSJ7dXXUPEVyHP2Hxsib/3ihEeOU7RF/DjAeQFJf888=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=SbQ5djU0Q4qHo+IfxcVLziM9WtuNVOForrqEe7VsgxvxhwHs3Cr2L+dkc/9AapYzVAnZplJQLP76yDRkhQnbwweDJyf4n2gLgKJpzgENvuDl56dWbFrQNdYd8zVW3HRpA5pBWCyaq7h9jriJ1r/i4pBRvx4NJBAsRJZTS++G1DE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7I-0004qO-Pd for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094504; x=1737630504; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NSJ7dXXUPEVyHP2Hxsib/3ihEeOU7RF/DjAeQFJf888=; b=WICMJqOaqLDH9B4KntpODb3OR4aJchkjUIePV2+hY1AxlwY4vJJaoLk1 1jRRS5EdXHnqgCMCaaziq4+4nSMlhLEVebm17B1Z2wr5s75yRFLNFQ+Qv jsBUmJGrq8Mtz3PjR3vnVek02jPq6/GI+98fU8Kf4Lbckz1cLcPphNblr yukybWP0JCgvSkxvtlyT/FPj2dlMlK0w9oQG+ScCBD+Rh+J4J7UeDvBUY AoZ/CDhWaJ6E8uGe/9qb1Oh7ggPK4ndEPr2qR1gECN9MIv1PpJ4k4Tvjr I4A5qHz/G3IMkDJcRkBY/JdBzmZOVlc16o1cIsjHjjm7Uc9gSijawoG8c g==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969569" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969569" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472954" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472954" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 2/4] C++: Support clang compatible [[musttail]] Date: Wed, 24 Jan 2024 03:07:58 -0800 Message-ID: <20240124110800.3154093-2-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240124110800.3154093-1-ak@linux.intel.com> References: <20240124110800.3154093-1-ak@linux.intel.com> MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, 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: 1788969905262547458 X-GMAIL-MSGID: 1788969905262547458 This patch implements a clang compatible [[musttail]] attribute for returns. musttail is useful as an alternative to computed goto for interpreters. With computed goto the interpreter function usually ends up very big which causes problems with register allocation and other per function optimizations not scaling. With musttail the interpreter can be instead written as a sequence of smaller functions that call each other. To avoid unbounded stack growth this requires forcing a sibling call, which this attribute does. It guarantees an error if the call cannot be tail called which allows the programmer to fix it instead of risking a stack overflow. Unlike computed goto it is also type-safe. It turns out that David Malcolm had already implemented middle/backend support for a musttail attribute back in 2016, but it wasn't exposed to any frontend other than a special plugin. This patch adds a [[gnu::musttail]] attribute for C++ that can be added to return statements. The return statement must be a direct call (it does not follow dependencies), which is similar to what clang implements. It then uses the existing must tail infrastructure. For compatibility it also detects clang::musttail One problem is that tree-tailcall usually fails when optimization is disabled, which implies the attribute only really works with optimization on. But that seems to be a reasonable limitation. The attribute is only supported for C++, since the C-parser has no support for statement attributes for non empty statements. It could be added there with __attribute__ too but would need some minor grammar adjustments. Passes bootstrap and full test --- gcc/c-family/c-attribs.cc | 25 +++++++++++++++++++++++++ gcc/cp/cp-tree.h | 4 ++-- gcc/cp/parser.cc | 28 +++++++++++++++++++++++----- gcc/cp/semantics.cc | 6 +++--- gcc/cp/typeck.cc | 20 ++++++++++++++++++-- 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc index 40a0cf90295d..f31c62e76665 100644 --- a/gcc/c-family/c-attribs.cc +++ b/gcc/c-family/c-attribs.cc @@ -54,6 +54,7 @@ static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *); static tree handle_common_attribute (tree *, tree, tree, int, bool *); static tree handle_hot_attribute (tree *, tree, tree, int, bool *); static tree handle_cold_attribute (tree *, tree, tree, int, bool *); +static tree handle_musttail_attribute (tree *, tree, tree, int, bool *); static tree handle_no_sanitize_attribute (tree *, tree, tree, int, bool *); static tree handle_no_sanitize_address_attribute (tree *, tree, tree, int, bool *); @@ -499,6 +500,8 @@ const struct attribute_spec c_common_gnu_attributes[] = { "hot", 0, 0, false, false, false, false, handle_hot_attribute, attr_cold_hot_exclusions }, + { "musttail", 0, 0, false, false, false, false, + handle_musttail_attribute, NULL }, { "no_address_safety_analysis", 0, 0, true, false, false, false, handle_no_address_safety_analysis_attribute, @@ -1290,6 +1293,28 @@ handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args), return NULL_TREE; } +/* Handle a "musttail" and attribute; arguments as in + struct attribute_spec.handler. */ + +static tree +handle_musttail_attribute (tree *node, tree name, tree ARG_UNUSED (args), + int ARG_UNUSED (flags), bool *no_add_attrs) +{ + if (TREE_CODE (*node) == FUNCTION_DECL + || TREE_CODE (*node) == LABEL_DECL) + { + /* Attribute musttail processing is done later with lookup_attribute. */ + } + else + { + warning (OPT_Wattributes, "%qE attribute ignored", name); + *no_add_attrs = true; + } + + return NULL_TREE; +} + + /* Handle a "cold" and attribute; arguments as in struct attribute_spec.handler. */ diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 60e6dafc5494..bed52e860a00 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -7763,7 +7763,7 @@ extern void finish_while_stmt (tree); extern tree begin_do_stmt (void); extern void finish_do_body (tree); extern void finish_do_stmt (tree, tree, bool, tree, bool); -extern tree finish_return_stmt (tree); +extern tree finish_return_stmt (tree, bool = false); extern tree begin_for_scope (tree *); extern tree begin_for_stmt (tree, tree); extern void finish_init_stmt (tree); @@ -8275,7 +8275,7 @@ extern tree composite_pointer_type (const op_location_t &, tsubst_flags_t); extern tree merge_types (tree, tree); extern tree strip_array_domain (tree); -extern tree check_return_expr (tree, bool *, bool *); +extern tree check_return_expr (tree, bool *, bool *, bool); extern tree spaceship_type (tree, tsubst_flags_t = tf_warning_or_error); extern tree genericize_spaceship (location_t, tree, tree, tree); extern tree cp_build_binary_op (const op_location_t &, diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 3748ccd49ff3..5a32804c0201 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -2462,7 +2462,7 @@ static tree cp_parser_perform_range_for_lookup static tree cp_parser_range_for_member_function (tree, tree); static tree cp_parser_jump_statement - (cp_parser *); + (cp_parser *, bool = false); static void cp_parser_declaration_statement (cp_parser *); @@ -12719,9 +12719,27 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, NULL_TREE, false); break; + case RID_RETURN: + { + bool musttail_p = false; + std_attrs = process_stmt_hotness_attribute (std_attrs, attrs_loc); + if (lookup_attribute ("", "musttail", std_attrs)) + { + musttail_p = true; + std_attrs = remove_attribute ("", "musttail", std_attrs); + } + // support this for compatibility + if (lookup_attribute ("clang", "musttail", std_attrs)) + { + musttail_p = true; + std_attrs = remove_attribute ("clang", "musttail", std_attrs); + } + statement = cp_parser_jump_statement (parser, musttail_p); + } + break; + case RID_BREAK: case RID_CONTINUE: - case RID_RETURN: case RID_CO_RETURN: case RID_GOTO: std_attrs = process_stmt_hotness_attribute (std_attrs, attrs_loc); @@ -14767,7 +14785,7 @@ cp_parser_init_statement (cp_parser *parser, tree *decl) return false; } -/* Parse a jump-statement. +/* Parse a jump-statement. MUSTTAIL_P indicates a musttail attribute. jump-statement: break ; @@ -14785,7 +14803,7 @@ cp_parser_init_statement (cp_parser *parser, tree *decl) Returns the new BREAK_STMT, CONTINUE_STMT, RETURN_EXPR, or GOTO_EXPR. */ static tree -cp_parser_jump_statement (cp_parser* parser) +cp_parser_jump_statement (cp_parser* parser, bool musttail_p) { tree statement = error_mark_node; cp_token *token; @@ -14869,7 +14887,7 @@ cp_parser_jump_statement (cp_parser* parser) else if (FNDECL_USED_AUTO (current_function_decl) && in_discarded_stmt) /* Don't deduce from a discarded return statement. */; else - statement = finish_return_stmt (expr); + statement = finish_return_stmt (expr, musttail_p); /* Look for the final `;'. */ cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON); } diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index 3299e2704465..a277f70ea0fd 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -1324,16 +1324,16 @@ finish_do_stmt (tree cond, tree do_stmt, bool ivdep, tree unroll, } /* Finish a return-statement. The EXPRESSION returned, if any, is as - indicated. */ + indicated. MUSTTAIL_P indicates a mustcall attribute. */ tree -finish_return_stmt (tree expr) +finish_return_stmt (tree expr, bool musttail_p) { tree r; bool no_warning; bool dangling; - expr = check_return_expr (expr, &no_warning, &dangling); + expr = check_return_expr (expr, &no_warning, &dangling, musttail_p); if (error_operand_p (expr) || (flag_openmp && !check_omp_return ())) diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc index a15eda3f5f8c..8c116e3b4f4c 100644 --- a/gcc/cp/typeck.cc +++ b/gcc/cp/typeck.cc @@ -11028,10 +11028,12 @@ maybe_warn_pessimizing_move (tree expr, tree type, bool return_p) the DECL_RESULT for the function. Set *NO_WARNING to true if code reaches end of non-void function warning shouldn't be issued on this RETURN_EXPR. Set *DANGLING to true if code returns the - address of a local variable. */ + address of a local variable. MUSTTAIL_P indicates a musttail + return. */ tree -check_return_expr (tree retval, bool *no_warning, bool *dangling) +check_return_expr (tree retval, bool *no_warning, bool *dangling, + bool musttail_p) { tree result; /* The type actually returned by the function. */ @@ -11045,6 +11047,20 @@ check_return_expr (tree retval, bool *no_warning, bool *dangling) *no_warning = false; *dangling = false; + if (musttail_p) + { + if (TREE_CODE (retval) == TARGET_EXPR + && TREE_CODE (TARGET_EXPR_INITIAL (retval)) == CALL_EXPR) + CALL_EXPR_MUST_TAIL_CALL (TARGET_EXPR_INITIAL (retval)) = 1; + else if (TREE_CODE (retval) != CALL_EXPR) + { + error_at (loc, "cannot tail-call: return value must be a call"); + return error_mark_node; + } + else + CALL_EXPR_MUST_TAIL_CALL (retval) = 1; + } + /* A `volatile' function is one that isn't supposed to return, ever. (This is a G++ extension, used to get better code for functions that call the `volatile' function.) */ From patchwork Wed Jan 24 11:07:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 191478 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2553:b0:103:945f:af90 with SMTP id p19csp913021dyi; Wed, 24 Jan 2024 03:09:33 -0800 (PST) X-Google-Smtp-Source: AGHT+IG9uOKvaXtGvOtQAjbEESP+fmHmoA/Rnjo7yEcYXkQQpsjkldDlihLB5RbkRIzDSW4ptp/Q X-Received: by 2002:ac8:5807:0:b0:42a:2cbe:43fc with SMTP id g7-20020ac85807000000b0042a2cbe43fcmr3107597qtg.69.1706094573153; Wed, 24 Jan 2024 03:09:33 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706094573; cv=pass; d=google.com; s=arc-20160816; b=FhLWdy9PG8Dkak5zo3uJ+S0IgLlijxtIixyYRmq/bS8moY/fQOBPPcXwWh4HUTfewe Un8FLYBAJ29XbCcJJFJE3uHj+I+OmJNnc7RHKMgmfvBVJLdLw0Yw0m4ui1vvt71uDVIm QS+Hi7pcJmFMviXxB4vEGLm7pUC54994Xw5r+/IjVcYBcjxTZ2Mi20ALwgndF64N7NCS pgjabneiJrNM+F4+WXfAPXM6Ct+Tlss6dOGjcZ2DlLJQCaw9pMC5fFOF2ySmOpbukxtk gqNqg+dXRVKD1Ncx81/vZf/M16CD1BEKbiPKhw3DkhdLgq1kOZTCmQ7E0w8FWNbDR9ty Zylg== 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:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=brSh8rcRaEYO+2A0O3mQSHmVcBjHJ0nTRlNEWFM5dIw=; fh=uXf1mgDAefpqDEGJDL9umcdF3eby/Gqhcj5QI8MxE/0=; b=OA7frRqnQg0ZHkGS1C4kLyQUDHafJu43JEDu1sEfPypfqZdLsZneHkE8tiDBuIwwKw ZjFUgo1QesHFPyDEtpe24xQ4BedBH4PAhgVpSDm4SX4ADqU3k85m0BrFhg0VltDdu6Kq D49sFb717gqHlJGlI/Ji2BCHZnmTHlP6UNC+oLtoBbUFgt0ClD9x6M91udkjr5tpaI2v c4O8FYPXr6bEJPkavs3DuBmlRQNeX/JWAKFfcddouZYOwsiz/NJ5kitCA9/2rNMWT4ZR 7ISny9cLM4ll3m8V9CwOvFpHwIBEReHJSGZVsyr9u+bpj+fWIyttEAeho0zqJWoedKQN kBhw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CZUAxuyu; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id c10-20020ac87dca000000b0042a4c02c9acsi4044252qte.107.2024.01.24.03.09.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jan 2024 03:09:33 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CZUAxuyu; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DD505385DC15 for ; Wed, 24 Jan 2024 11:09:32 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 49A8F3857B92 for ; Wed, 24 Jan 2024 11:08:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 49A8F3857B92 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 49A8F3857B92 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; cv=none; b=dsJoaaTBPbD3icVyGh9+y7t/1breUU+wrTEqx/vvaiWt2/c+/tCX2fuA2cevxvc7EnaCI5Z03E5NdS4bj7USfB8zP5JyTcTaz7Y40vgxwVsofWpZG5tVLmg4f4Dj+wH39TVezErtRXQi6tPkyqiM5fnmyoZwgtx9Me8oFV0zIuM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094509; c=relaxed/simple; bh=IKoysltldrXLzV8qnDPU7mZX9uLCGg07vL+asiw6+Lo=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=ICeIlsfTkgKIBhjv09v6dryO8XV9C8FkHeKAfxsQ2udApcQL5QtLFf83gG0ra+8uMdP+nAeJj1xy4LZCBHaSGm1tTXVtJXPCb55vbR7YOtCaW+gsrkp1xwdsCfOfk9JNHFa2eGxc8/gJ2ykaA220AVOQgjkGduLVLwc7dRuYSnQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7J-0004qb-DT for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094505; x=1737630505; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IKoysltldrXLzV8qnDPU7mZX9uLCGg07vL+asiw6+Lo=; b=CZUAxuyuF2Zbo/HtASWJ5J1FuUehpdJeHjUxGWmgTCBokGYrQmpvd0YT T+x3J98AVzSZ/glPymHYNo0BaQfo/q+j/v3UnGDXFNchx0YPJq9Rk7TD7 vQz6z7FFCDTUhGz/xQ5tkPPtkl/D0xMDw+xSFgB6onimeEtaXao30+gNr Pbzuges2IxkvhryOsT9BdNyM7N8dGsAya8oe8CqjEoY/HnsSbgEoNCWSI HYoGmN+PDGpi5MSfAIt7FAS5a86TyVHLSfAIdhS/k42k3lRqAAptrEp9z POdrMysICh+PSQCT0ev65baSRwHf0G6sO7kGK2Hgvoks78t54vNydDpQ4 g==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969570" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969570" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472955" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472955" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 3/4] Add tests for C++ musttail attribute Date: Wed, 24 Jan 2024 03:07:59 -0800 Message-ID: <20240124110800.3154093-3-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240124110800.3154093-1-ak@linux.intel.com> References: <20240124110800.3154093-1-ak@linux.intel.com> MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UNWANTED_LANGUAGE_BODY 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: 1788969823527838677 X-GMAIL-MSGID: 1788969823527838677 Mostly adopted from the existing C musttail plugin tests. --- gcc/testsuite/g++.dg/musttail1.C | 15 ++++++++++++ gcc/testsuite/g++.dg/musttail2.C | 35 ++++++++++++++++++++++++++ gcc/testsuite/g++.dg/musttail3.C | 42 ++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/musttail4.C | 19 +++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 gcc/testsuite/g++.dg/musttail1.C create mode 100644 gcc/testsuite/g++.dg/musttail2.C create mode 100644 gcc/testsuite/g++.dg/musttail3.C create mode 100644 gcc/testsuite/g++.dg/musttail4.C diff --git a/gcc/testsuite/g++.dg/musttail1.C b/gcc/testsuite/g++.dg/musttail1.C new file mode 100644 index 000000000000..c9276e0ae86a --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail1.C @@ -0,0 +1,15 @@ +/* { dg-do compile { target tail_call } } */ +/* { dg-options "-std=c++11 -O2" } */ +/* { dg-options "-fdelayed-branch" { target sparc*-*-* } } */ + +int __attribute__((noinline,noclone)) +callee (int i) +{ + return i * i; +} + +int __attribute__((noinline,noclone)) +caller (int i) +{ + [[gnu::musttail]] return callee (i + 1); +} diff --git a/gcc/testsuite/g++.dg/musttail2.C b/gcc/testsuite/g++.dg/musttail2.C new file mode 100644 index 000000000000..d9151d25f517 --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail2.C @@ -0,0 +1,35 @@ +/* { dg-do compile { target tail_call } } */ +/* { dg-options "-std=c++11" } */ + +struct box { char field[256]; int i; }; + +int __attribute__((noinline,noclone)) +test_2_callee (int i, struct box b) +{ + if (b.field[0]) + return 5; + return i * i; +} + +int __attribute__((noinline,noclone)) +test_2_caller (int i) +{ + struct box b; + [[gnu::musttail]] return test_2_callee (i + 1, b); /* { dg-error "cannot tail-call: " } */ +} + +extern void setjmp (void); +void +test_3 (void) +{ + [[gnu::musttail]] return setjmp (); /* { dg-error "cannot tail-call: " } */ +} + +typedef void (fn_ptr_t) (void); +volatile fn_ptr_t fn_ptr; + +void +test_5 (void) +{ + [[gnu::musttail]] return fn_ptr (); /* { dg-error "cannot tail-call: " } */ +} diff --git a/gcc/testsuite/g++.dg/musttail3.C b/gcc/testsuite/g++.dg/musttail3.C new file mode 100644 index 000000000000..7d55f44124ee --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail3.C @@ -0,0 +1,42 @@ +/* { dg-do compile { target tail_call } } */ +/* { dg-options "-std=c++11" } */ + +extern int foo2 (int x, ...); + +struct str +{ + int a, b; +}; + +str +cstruct (int x) +{ + if (x < 10) + [[clang::musttail]] return cstruct (x + 1); + return { x, 0 }; +} + +int +cstruct2 (int x, str & ref) +{ + if (x < 10) + { + str r = { }; + [[clang::musttail]] return cstruct2 (x + 1, r); + } + return x + 1; +} + + +int +foo (int x) +{ + if (x < 10) + [[clang::musttail]] return foo2 (x, 29); + if (x < 100) + { + int k = foo (x + 1); + [[clang::musttail]] return k; /* { dg-error "cannot tail-call: " } */ + } + return x; +} diff --git a/gcc/testsuite/g++.dg/musttail4.C b/gcc/testsuite/g++.dg/musttail4.C new file mode 100644 index 000000000000..3122acfb1719 --- /dev/null +++ b/gcc/testsuite/g++.dg/musttail4.C @@ -0,0 +1,19 @@ +/* { dg-do compile { target tail_call } } */ +/* Allow nested functions. */ +/* { dg-options "-Wno-pedantic -std=c++11" } */ + +struct box { char field[64]; int i; }; + +struct box __attribute__((noinline,noclone)) +returns_struct (int i) +{ + struct box b; + b.i = i * i; + return b; +} + +int __attribute__((noinline,noclone)) +test_1 (int i) +{ + [[gnu::musttail]] return returns_struct (i * 5).i; /* { dg-error "return value must be a call" } */ +} From patchwork Wed Jan 24 11:08:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andi Kleen X-Patchwork-Id: 191479 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2553:b0:103:945f:af90 with SMTP id p19csp913785dyi; Wed, 24 Jan 2024 03:10:51 -0800 (PST) X-Google-Smtp-Source: AGHT+IEERGENss0wHUyE5GVLC32yjCVFeex0Cnjv+yaHl+8jKIbqQg+K7KX1UdsbPjcWR5pxdsSx X-Received: by 2002:a05:6214:21ef:b0:686:2659:a244 with SMTP id p15-20020a05621421ef00b006862659a244mr2614530qvj.70.1706094651478; Wed, 24 Jan 2024 03:10:51 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1706094651; cv=pass; d=google.com; s=arc-20160816; b=Roge9EkeVaoKxX52m4l9RmqWTbTNITXuog25HCu5SwUasSvg7qir8U4M23fQPeuKX/ TDxmvrvr5/bbi3Ddg55Nwml/u6tdCnUWztN0vdLqVaP3a+IC3iFDVkMGKpCqy4n2hv/M nEO5TYfInHUFFwRWDzXLlGoNM/SfWKfIbookxLSyi2ICBRo0iWePW1YuvK8Q++qa4H3m eY9AEoBTP9nDNHt1+7Oqrld48Vj7D0aZuGOiAu7Nmc6YwJjZT/488w9AU3NMRWCafZiv HFu04BpPliFAL78a0BEvQ3OtcRD4ac/NzKwLckLe1xUkXJonQ8QMOIhsJKxLPQDkTltC tajA== 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:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=jA32jlmRs83iGwsruUQvgy1F654KCkCG+LQTvuKHM1o=; fh=uXf1mgDAefpqDEGJDL9umcdF3eby/Gqhcj5QI8MxE/0=; b=TgCT6tZK5y7FJEeNLhRcc+cpOccn1lVkkqeu92xamf/w0YvIaIFGWF22Ro4cwA7FPq 5+/skszkVkVdGvlLEvGG6XCgekDrNUvZzbOqWmA6+5Hzijy0bKRBepdQ74DaGb77usGn 6WFRVwM3L/f1IlsGa8GbbNuJOyMLCi3JCuBPJUMm26El5N5ugw4ex77PK/cyVsAEIM3s wYFxB7+3PweHoR0zE0OCxsNBVFY0VGTsIguJBJzSBC/tFcNkyxxvxb9BCZjs+VHaVd0c 4G5WuEFULF6L3B/bp4wxBhYfEizSeigzVvVoKnuEmArfypmlOos4V0KgvSlsnyH54GxN EESA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lmyh2+eb; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id p15-20020a0ccb8f000000b00685193ac3ebsi9644754qvk.120.2024.01.24.03.10.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 Jan 2024 03:10:51 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lmyh2+eb; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4FDEE385ED72 for ; Wed, 24 Jan 2024 11:10:48 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:470:142:3::10]) by sourceware.org (Postfix) with ESMTPS id 05797385E007 for ; Wed, 24 Jan 2024 11:08:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 05797385E007 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=linux.intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 05797385E007 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:470:142:3::10 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094511; cv=none; b=fpTIyhD4tkJ0zaBZU3AHEFmKHRE5+9KdmkaiYmtWA6jC9RaAS4/23s1zze7SgQKmx1cml0zIBDG3zXzT2+1aMjjfG6AV0ms5VHZJkP/AAbFzvQJC+ystSlCcUDyrpEAzGTgl+sETyIKnGm4IG7+jemqq/cAJCS92Iz+g/dgkvcc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1706094511; c=relaxed/simple; bh=MLqYq3AHvAzhGbe+d5uSAffcZ9g2fRAzAg2AJWkZCHM=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=c+IJoA3TlhyNCDWnryAHGQoKtOyAY3CutkYoLxu0olYU4O7TjxW1Be9zkFDnWQVdf4JU4vR2uZsCxJ8trKzpR2RjVRjuqc2GwyURMmT2TVN2WtZmCg+2svIgHtthjZjfxeZOdizLRe8sYs18NHHrZiyyd4rSlh+BRbkF+6d+UIE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from mgamail.intel.com ([192.55.52.93]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rSb7L-0004qb-Kc for gcc-patches@gnu.org; Wed, 24 Jan 2024 06:08:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1706094507; x=1737630507; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MLqYq3AHvAzhGbe+d5uSAffcZ9g2fRAzAg2AJWkZCHM=; b=lmyh2+ebkQDsyr7hAiPZpTPmD8W7W99ge8V5PYMKzdZUA49r3Gl/Ov6l 7j6v1fEQLdsKl/J3Ij6OoA8+sbnknE0FGnWRcXr7sxS1l+aHFBA0VBP61 10lnkkc8S6rd/Kc1aXq0HNVfTJVIP/MKxXPhs6F6Ox+T1ncNaNmDNYY+j hMEV6vZvAoeNtxZ/0xILvgp4jaZpnQmCbjbhgRGDtjt94GRUKMWAlP2VM VgRn2TeGepQBYLHhpGfefouIdTBBZj62XPEp8/edb+vdzwKxDcmnuoa5X 6/HabDLri6SW7e9uNxJ4iZ8L0ORLZMXHK1zh1tgtCaNWtoHqsUJvml6nb w==; X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="398969571" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="398969571" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:18 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10962"; a="959472956" X-IronPort-AV: E=Sophos;i="6.05,216,1701158400"; d="scan'208";a="959472956" Received: from tassilo.jf.intel.com ([10.54.38.190]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2024 03:08:17 -0800 From: Andi Kleen To: gcc-patches@gnu.org Cc: Andi Kleen Subject: [PATCH v1 4/4] Add documentation for musttail attribute Date: Wed, 24 Jan 2024 03:08:00 -0800 Message-ID: <20240124110800.3154093-4-ak@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240124110800.3154093-1-ak@linux.intel.com> References: <20240124110800.3154093-1-ak@linux.intel.com> MIME-Version: 1.0 Received-SPF: none client-ip=192.55.52.93; envelope-from=ak@linux.intel.com; helo=mgamail.intel.com X-Spam_score_int: -55 X-Spam_score: -5.6 X-Spam_bar: ----- X-Spam_report: (-5.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1.327, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_NONE=0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, 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: 1788969905526554820 X-GMAIL-MSGID: 1788969905526554820 --- gcc/doc/extend.texi | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 0bc586d120e7..444b68f5d071 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -27890,7 +27890,8 @@ Predefined Macros,cpp,The GNU C Preprocessor}). each needed template instantiation is emitted. * Bound member functions:: You can extract a function pointer to the method denoted by a @samp{->*} or @samp{.*} expression. -* C++ Attributes:: Variable, function, and type attributes for C++ only. +* C++ Attributes:: Variable, function, statement, and type attributes + for C++ only. * Function Multiversioning:: Declaring multiple function versions. * Type Traits:: Compiler support for type traits. * C++ Concepts:: Improved support for generic programming. @@ -28458,6 +28459,22 @@ precedence and the @code{hot} attribute is not propagated. For the effects of the @code{hot} attribute on functions, see @ref{Common Function Attributes}. +@cindex @code{musttail} statement attribute +@item musttail + +The @code{gnu::musttail} or @code{clang::hottail} attribute +can be applied to a return statement that returns the value +of a call to indicate that the call must be a tail call +that does not allocate extra stack space. + +@smallexample +[[gnu::musttail]] return foo(); +@end smallexample + +If the compiler cannot generate a tail call it will generate +an error. Tail calls generally require enabling optimization. +On some targets they may not be supported. + @end table @node Function Multiversioning