From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.14]) by sourceware.org (Postfix) with ESMTPS id B7F98384AB56 for ; Tue, 21 May 2024 14:32:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B7F98384AB56 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 B7F98384AB56 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=198.175.65.14 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716301951; cv=none; b=wfKqIU0UyjLpk0kDT8v1zmZXc+xZanqz09ydR0a5LY8gX0ZyRNlvlr2ejIVal8J6SRhUDM1bmYHhumziKHkSGRpjU0nDSFN0y+XOpCzBU66akp737KtewPYSYjFPDx9AOBBmZyE1uQnEHtnSQFqpA8tIj2Fjkas4/RwApUrk/7s= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1716301951; c=relaxed/simple; bh=d0imsXXugI5GAFGe4n3p5QVWKt/zYENqrqaNTXF8eRs=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=jZhfIYQBCw37fQX5g0TPW4L7PZ9UbJqVNcs2LEg0q5bAQNwUCGcHKluPikdeUyEXaQXu8HluQF0YoVSfAoNdZV+kj8zdO9Epp91Z9nU1zjg7RuFROaC+dG+JiHOhGcfMhDgUJWjy36+49IhY9swXCG1aBgpHJ5oGzcTba43Lcew= 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=1716301950; x=1747837950; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=d0imsXXugI5GAFGe4n3p5QVWKt/zYENqrqaNTXF8eRs=; b=mmp4aR2zq2IeQZHHWfpmDX9POjE4RaSufgvB84iOa+RdBWAxPoy0ytOf qaZnmzEaGd9B8z9Rv17BiP1w+6HJXpumKk1yP7Yk+xTqSJhVRzlqlMMlg k0Vt2wAUWfYshNwJUhZfbLM6mvtHAy8QHYLIOOEm+jX1OKFjsDN+q5yHF wMKNZIEGDPftagVHjnWcaiKMMOBvJTgzzkI5oBrnRAWwNr7bwvH0vwHat iWbiG9jnxJ8PjmcIlWiQ+oUjJvt14RLtmOAkDTDA9BDkhnHyigsnQkYbL K0YUC7nbVRJcl54h0FNypHAROxbXYZIgMvJuH9ZrVGKAJIKTAEP22azJR Q==; X-CSE-ConnectionGUID: Y2U1YiBFTtaEef/ivIsL/A== X-CSE-MsgGUID: KhoqjYprR/eT/fmlaucZNA== X-IronPort-AV: E=McAfee;i="6600,9927,11078"; a="16328287" X-IronPort-AV: E=Sophos;i="6.08,178,1712646000"; d="scan'208";a="16328287" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by orvoesa106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2024 07:32:20 -0700 X-CSE-ConnectionGUID: 1zkNrf1ISLKOzPy2L31VBA== X-CSE-MsgGUID: 8EyynaqYRlqkh4kiiEeCGA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,178,1712646000"; d="scan'208";a="64166857" Received: from tassilo.jf.intel.com ([10.54.38.190]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2024 07:32:20 -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 v6 7/8] Give better error messages for musttail Date: Tue, 21 May 2024 07:28:40 -0700 Message-ID: <20240521143203.2893096-8-ak@linux.intel.com> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20240521143203.2893096-1-ak@linux.intel.com> References: <20240521143203.2893096-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 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: When musttail is set, make tree-tailcall to give error messages when it cannot handle a call. This avoids vague "other reasons" error messages later at expand time. This doesn't always work, for example when find_tail_call walking gives up because the control flow is too complicated then it won't find the tail call and can't give a suitable error message. gcc/ChangeLog: * tree-tailcall.cc (maybe_error_musttail): Add. (find_tail_calls): Add error messages. --- gcc/tree-tailcall.cc | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/gcc/tree-tailcall.cc b/gcc/tree-tailcall.cc index 094856de22ef..1217435c3f90 100644 --- a/gcc/tree-tailcall.cc +++ b/gcc/tree-tailcall.cc @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "common/common-target.h" #include "ipa-utils.h" #include "tree-ssa-live.h" +#include "diagnostic-core.h" /* The file implements the tail recursion elimination. It is also used to analyze the tail calls in general, passing the results to the rtl level @@ -402,6 +403,20 @@ propagate_through_phis (tree var, edge e) return var; } +/* Report an error for failing to tail convert must call CALL + with error message ERR. */ + +static void +maybe_error_musttail (gcall *call, const char *err) +{ + if (gimple_call_must_tail_p (call)) + { + error_at (call->location, "cannot tail-call: %s", err); + gimple_call_set_must_tail (call, false); /* Avoid another error. */ + gimple_call_set_tail (call, false); + } +} + /* Argument for compute_live_vars/live_vars_at_stmt and what compute_live_vars returns. Computed lazily, but just once for the function. */ static live_vars_map *live_vars; @@ -489,8 +504,14 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail) if (ass_var && !is_gimple_reg (ass_var) && !auto_var_in_fn_p (ass_var, cfun->decl)) - return; + { + maybe_error_musttail (call, "complex return value"); + return; + } + /* This doesn't really work because the BB would have multiple succ edges + and is rejected above. Instead just gives a "other reasons" error + at expand time. */ /* If the call might throw an exception that wouldn't propagate out of cfun, we can't transform to a tail or sibling call (82081). */ if (stmt_could_throw_p (cfun, stmt) @@ -524,7 +545,10 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail) if (result_decl && may_be_aliased (result_decl) && ref_maybe_used_by_stmt_p (call, result_decl, false)) - return; + { + maybe_error_musttail (call, "tail call must be same type"); + return; + } /* We found the call, check whether it is suitable. */ tail_recursion = false; @@ -605,6 +629,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail) { if (local_live_vars) BITMAP_FREE (local_live_vars); + maybe_error_musttail (call, "call invocation refers to locals"); return; } else @@ -613,6 +638,7 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail) if (bitmap_bit_p (local_live_vars, *v)) { BITMAP_FREE (local_live_vars); + maybe_error_musttail (call, "call invocation refers to locals"); return; } } @@ -631,6 +657,8 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail) auto_bitmap to_move_defs; auto_vec to_move_stmts; + /* Does not give musttail errors because the frontend won't generate + such musttails. */ abb = bb; agsi = gsi; while (1) @@ -716,7 +744,10 @@ find_tail_calls (basic_block bb, struct tailcall **ret, bool only_musttail) if (ret_var && (ret_var != ass_var && !(is_empty_type (TREE_TYPE (ret_var)) && !ass_var))) - return; + { + maybe_error_musttail (call, "call must be the same type"); + return; + } /* If this is not a tail recursive call, we cannot handle addends or multiplicands. */ -- 2.44.0