From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) by sourceware.org (Postfix) with ESMTPS id 7F40E38AA279 for ; Sun, 2 Jun 2024 17:22:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7F40E38AA279 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 7F40E38AA279 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=198.175.65.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1717348940; cv=none; b=LFiddTYagkgTDm7QVLjy8MdDdgiU09lKB21gkAdneTfYa5BhncqG+mQ0H/BaTgdd9iTISFesy2f9xLQHjLN+yRdjhgti4TG4hVho32PDSrCWXVHTwrerWoNsI6mlw4OTj3CNBikzgqhejKUtfm5KcKhPBYx+nZwTNZScPVF7U5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1717348940; c=relaxed/simple; bh=uWipM2UVpo/1WhIKouXpTUD4vAkY3YIth7sIbvyAqQA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=xbUdOYpVKsVDWjUClOYm7p821WPcNgbzJwVFGcmsbigw1MMCpXt1ZlHXm8ySYtROZwT+yIWGOl4NQGAcjwWbRu6vsHzad1jVZRfA8EI4x8hyOQPuMdxz5L2sA/WuRj/wpqAubME5wxK/BRMZ1pUt7eMYDtQkDE92vj8m8/aHnoQ= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1717348939; x=1748884939; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=uWipM2UVpo/1WhIKouXpTUD4vAkY3YIth7sIbvyAqQA=; b=IIS+TTtdYhpG7+CozJXtv5P4kKL+18kmtKqhH8Yl+ZquoPPhnxAid4GX V7iVDInba7b+ZD0QN/tumOEWmFU+pidkj0CbI6l6oe2k3xJU4V9Y9Rw2k +rPolTrb1q/YdQQ6qxhcFjWVd8O1u8bY+gbu20dHW/eLzwZ+nbsmYuXJk iCDYCDwjMD6qZM0/73+yoe4WscH7V1t8sy4NyqGiY3+fkNUPSNp3FiM/1 asl/vgE9HCQvULmRtSjS6C08wc1HEjNETbRiRtx108+G1jsNN1VAvnHcq 9t3DI8w6JCav3CUwLf0qyPXuObvipfGVFL6MyAoEVZhKkb+TAGp0SsBDF g==; X-CSE-ConnectionGUID: gzxFleOmSBSL/8EHAmY6PA== X-CSE-MsgGUID: 2higoatjSKm7T6DM5Y11bw== X-IronPort-AV: E=McAfee;i="6600,9927,11091"; a="24418918" X-IronPort-AV: E=Sophos;i="6.08,209,1712646000"; d="scan'208";a="24418918" Received: from fmviesa003.fm.intel.com ([10.60.135.143]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Jun 2024 10:22:17 -0700 X-CSE-ConnectionGUID: freaQcaxTlW9fFtcvxb9Qg== X-CSE-MsgGUID: uKu9br4MTmSl5+YIYZMSrw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,209,1712646000"; d="scan'208";a="41088183" Received: from tassilo.jf.intel.com ([10.54.38.190]) by fmviesa003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Jun 2024 10:22:16 -0700 From: Andi Kleen To: gcc-patches@gcc.gnu.org Cc: richard.guenther@gmail.com, nathan@acm.org, josmyers@redhat.com, richard.sandiford@arm.com, jason@redhat.com, Andi Kleen Subject: [PATCH v7 1/9] Improve must tail in RTL backend Date: Sun, 2 Jun 2024 10:16:45 -0700 Message-ID: <20240602172205.2151579-2-ak@linux.intel.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240602172205.2151579-1-ak@linux.intel.com> References: <20240602172205.2151579-1-ak@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,GIT_PATCH_0,SPF_HELO_NONE,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 List-Id: - Give error messages for all causes of non sibling call generation - When giving error messages clear the musttail flag to avoid ICEs - 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. PR83324 gcc/ChangeLog: * calls.cc (expand_call): Fix mustcall implementation. (maybe_complain_about_tail_call): Clear must tail flag on error. --- gcc/calls.cc | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/gcc/calls.cc b/gcc/calls.cc index 21d78f9779fe..161e36839654 100644 --- a/gcc/calls.cc +++ b/gcc/calls.cc @@ -1249,6 +1249,7 @@ maybe_complain_about_tail_call (tree call_expr, const char *reason) return; error_at (EXPR_LOCATION (call_expr), "cannot tail-call: %s", reason); + CALL_EXPR_MUST_TAIL_CALL (call_expr) = 0; } /* Fill in ARGS_SIZE and ARGS array based on the parameters found in @@ -2650,7 +2651,11 @@ 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, + unfortunately we don't know the reason so it's fairly vague. + When tree-tailcall reported an error it already cleared the flag. */ + if (!try_tail_call) + maybe_complain_about_tail_call (exp, "other reasons"); int pass; /* Register in which non-BLKmode value will be returned, @@ -3022,10 +3027,21 @@ 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, "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) + { + maybe_complain_about_tail_call (exp, "variable size arguments"); + try_tail_call = 0; + } + if (dbg_cnt (tail_call) == false) try_tail_call = 0; /* Workaround buggy C/C++ wrappers around Fortran routines with @@ -3046,13 +3062,15 @@ expand_call (tree exp, rtx target, int ignore) if (MEM_P (*iter)) { try_tail_call = 0; + maybe_complain_about_tail_call (exp, + "hidden string length argument passed on stack"); break; } } /* If the user has marked the function as requiring tail-call optimization, attempt it. */ - if (must_tail_call) + if (CALL_EXPR_MUST_TAIL_CALL (exp)) try_tail_call = 1; /* Rest of purposes for tail call optimizations to fail. */ -- 2.44.0