From patchwork Tue Oct 24 17:03:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Agarwal X-Patchwork-Id: 157643 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp2083334vqx; Tue, 24 Oct 2023 10:04:35 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGoh1zxk6q0/TFu2mYSQ+ddfKqb9w+3EqpU2GPMuQGJ2sTkjMbozIp7BA1srRzEacHxscxX X-Received: by 2002:a05:620a:b84:b0:76d:2725:f36f with SMTP id k4-20020a05620a0b8400b0076d2725f36fmr12463267qkh.71.1698167074889; Tue, 24 Oct 2023 10:04:34 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1698167074; cv=pass; d=google.com; s=arc-20160816; b=RWPCc6gU21j3QVNe8n/b3wO//+3oe6RM3QzWayOHSm3gT/r9fNosgmHDwecWb9e++V HVTo2fJHgxkwZKskYnEvM6jkvz1hCaGFu4YJ04zuNFggjS5aIjunwvcdF1K49mj6MwGX ofIKI7nqDWXJ9nMv+oGPSfGO5wmMJwp/KdSEofnNbWZ1/7aNyP4+Ql0kppZIUAAPCZ8V bogAEHtmwoO98LzCQheVXnWyISKLSBItxee/WXhE7erZKAi2dDbR1Uy6Hi6M83F7p5dP jxVI54P4jDjVMYtu9HUhG26nYp8tid1N5nUEr58gFRp8yNG48ougl9E4FzGI4vx/PIzV HU8g== 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 :subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=bsea5jBfyzjJddE8g0q5LAIrNp0rkEiX1BOAzQIZ3nc=; fh=N4QQ7mBnZH5Hs19lqk7UcevzgkKo/EO2JH0z+1MJWkQ=; b=t3C/m69Db1jOw6cNLfje8vqp4DRyjYOuHB53q+FdZA1xppffuuURPgis+Fkt9+yhz5 WRlkcm6bIRe7XyP9uGs6gS+KxsG+Mepcmh/MFj2y/s4tIEg/38297cXu5YI+6Gy5SkcO PGww4ztSbp+PZ+F0GZ9zNE2y0xEst4Kv33R9sROBDRpfHdxLibLLeE+Ji+6Pp+Qt7fMk vxC9OHq/H+VcCWB5MGK/1PpyZw6+n8KkLWBwv/TGIHnmWUD6BkTzRprun1Bc2VGfKj1f bQ5YCzBqWkW0aKP/mQHrAGXqMagYgX0uZS6IpbP92u2VGFJiqaoF2XLe+sA9BVtqyLzd oDLQ== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=Nu3aTEoa; 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=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from server2.sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id m7-20020a05620a290700b00779d17610absi4136674qkp.608.2023.10.24.10.04.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Oct 2023 10:04:34 -0700 (PDT) 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=@ibm.com header.s=pp1 header.b=Nu3aTEoa; 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=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A40EC3858CDA for ; Tue, 24 Oct 2023 17:04:34 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id 9DF453857709 for ; Tue, 24 Oct 2023 17:04:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9DF453857709 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 9DF453857709 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698167044; cv=none; b=Gy0D5gZFMKjXxGwKBVoG81crPkubNMOoSKY/+6ZjaTEBwO+0Vz2+K14jyFsnW3eCO0M2TXSpnFugcLiYKbyJkR8iix8LW0wXXg8mJI0Afxho3N5FLn9bMaYyK8+NLEJk9miFTEqBeIa6s5FIWsz4lfW7+++TU76AWHneE9FJe6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698167044; c=relaxed/simple; bh=I4BlQIQF7u9Y1pHOjcsOPR8G0cHdWDgk941Fv52wBF4=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=KEvooAGnHP/jy0eLP/dCHzqhrW2VG4p0toZtbLDmttlrBtvlghkl2CTmPK/brOVWOL93nkfxejwPWw7l5gRuppYK5lS+AVx9+p4exeU5HDbU5XDQ5A/b5ax/M5jpDve2Ft2g+I0mmkRWkDArLPtCRLtGR0jWWC2XSeoakP9TvnQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353723.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39OGKJis011342; Tue, 24 Oct 2023 17:04:01 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=message-id : date : mime-version : to : cc : from : subject : content-type : content-transfer-encoding; s=pp1; bh=bsea5jBfyzjJddE8g0q5LAIrNp0rkEiX1BOAzQIZ3nc=; b=Nu3aTEoayQAdROgb47EdbAmP7OB2nbPz5iKfuKDSQU6r9AL+mMLp1ZcTEkGUqS/Vvwl4 xwSb9fC0xRlqrX3YMYXBvzBPj+By6cQ8R4WQGEGJTy/4RkOA20EZAvIqD+p9L4SnWcEJ 3JswPsEM5R/stCm+vnTTEdcwhIERQE+gf5vj0HjgTuLTuNWbUnut+CezhR7sxJXxkzzG DdO6VjP4FXwCReSAantQdCLrjLTetH595XraD1kUqWilP8/2Uc4LL16rtMtV/33T9dVJ VKQQZlOJ+pE72hBVPRqa+c28ni6uwPOJNtXyebsu4dIL0u/3crfPUPL90AEW4QHpaIT7 Tw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3txhbs1rwm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 24 Oct 2023 17:04:00 +0000 Received: from m0353723.ppops.net (m0353723.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 39OGKKl4011502; Tue, 24 Oct 2023 17:04:00 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3txhbs1rw2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 24 Oct 2023 17:04:00 +0000 Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 39OFqdhf010284; Tue, 24 Oct 2023 17:03:59 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3tvsbyh4eu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 24 Oct 2023 17:03:59 +0000 Received: from smtpav03.dal12v.mail.ibm.com (smtpav03.dal12v.mail.ibm.com [10.241.53.102]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 39OH3wuS52691464 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 24 Oct 2023 17:03:58 GMT Received: from smtpav03.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C5B6558056; Tue, 24 Oct 2023 17:03:58 +0000 (GMT) Received: from smtpav03.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A865958060; Tue, 24 Oct 2023 17:03:55 +0000 (GMT) Received: from [9.43.48.172] (unknown [9.43.48.172]) by smtpav03.dal12v.mail.ibm.com (Postfix) with ESMTP; Tue, 24 Oct 2023 17:03:55 +0000 (GMT) Message-ID: Date: Tue, 24 Oct 2023 22:33:54 +0530 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gcc-patches , Vineet Gupta , Jeff Law Cc: Richard Biener , Segher Boessenkool , Peter Bergner , Bernhard Reutner-Fischer From: Ajit Agarwal Subject: [PATCH V14 4/4] ree: Improve ree pass using defined abi interfaces X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: KOe2X24lX5VkDvGD9bYRbliIF2NMBTed X-Proofpoint-GUID: wLN1YHzAzMnBDkHT6bDKjKepJTQQd5Au X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-24_16,2023-10-24_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=999 mlxscore=0 suspectscore=0 impostorscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 adultscore=0 bulkscore=0 spamscore=0 phishscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2310170001 definitions=main-2310240147 X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, 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 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: 1780628768618121080 X-GMAIL-MSGID: 1780657239142894506 Hello Vineet, Jeff and Bernhard: This version 14 of the patch uses abi interfaces to remove zero and sign extension elimination. This fixes aarch64 regressions failures with aggressive CSE. Bootstrapped and regtested on powerpc-linux-gnu. In this version (version 14) of the patch following review comments are incorporated. a) Removal of hard code zero_extend and sign_extend in abi interfaces. b) Source and destination with different registers are considered. c) Further enhancements. d) Added sign extension elimination using abi interfaces. d) Addressed remaining review comments from Vineet. e) Addressed review comments from Bernhard. f) Fix aarch64 regressions failure. Please let me know if there is anything missing in this patch. Ok for trunk? Thanks & Regards Ajit ree: Improve ree pass using defined abi interfaces For rs6000 target we see zero and sign extend with missing definitions. Improved to eliminate such zero and sign extension using defined ABI interfaces. 2023-10-24 Ajit Kumar Agarwal gcc/ChangeLog: * ree.cc (combine_reaching_defs): Eliminate zero_extend and sign_extend using defined abi interfaces. (add_removable_extension): Use of defined abi interfaces for no reaching defs. (abi_extension_candidate_return_reg_p): New function. (abi_extension_candidate_p): New function. (abi_extension_candidate_argno_p): New function. (abi_handle_regs): New function. (abi_target_promote_function_mode): New function. gcc/testsuite/ChangeLog: * g++.target/powerpc/zext-elim-3.C --- changes since v6: - Added missing abi interfaces. - Rearranging and restructuring the code. - Removal of hard coded zero extend and sign extend in abi interfaces. - Relaxed different registers with source and destination in abi interfaces. - Using CSE in abi interfaces. - Fix aarch64 regressions. - Add Sign extension removal in abi interfaces. - Modified comments as per coding convention. - Modified code as per coding convention. - Fix bug bootstrapping RISCV failures. --- gcc/ree.cc | 147 +++++++++++++++++- .../g++.target/powerpc/zext-elim-3.C | 13 ++ 2 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-3.C diff --git a/gcc/ree.cc b/gcc/ree.cc index fc04249fa84..f557b49b366 100644 --- a/gcc/ree.cc +++ b/gcc/ree.cc @@ -514,7 +514,8 @@ get_uses (rtx_insn *insn, rtx reg) if (REGNO (DF_REF_REG (def)) == REGNO (reg)) break; - gcc_assert (def != NULL); + if (def == NULL) + return NULL; ref_chain = DF_REF_CHAIN (def); @@ -750,6 +751,120 @@ get_extended_src_reg (rtx src) return src; } +/* Return TRUE if target mode is equal to source mode, false otherwise. */ + +static bool +abi_target_promote_function_mode (machine_mode mode) +{ + int unsignedp; + machine_mode tgt_mode + = targetm.calls.promote_function_mode (NULL_TREE, mode, &unsignedp, + NULL_TREE, 1); + + if (tgt_mode == mode) + return true; + else + return false; +} + +/* Return TRUE if regno is a return register. */ + +static inline bool +abi_extension_candidate_return_reg_p (int regno) +{ + if (targetm.calls.function_value_regno_p (regno)) + return true; + + return false; +} + +/* Return TRUE if the following conditions are satisfied. + + a) reg source operand is argument register and not return register. + b) mode of source and destination operand are different. + c) if not promoted REGNO of source and destination operand are same. */ + +static bool +abi_extension_candidate_p (rtx_insn *insn) +{ + rtx set = single_set (insn); + machine_mode dst_mode = GET_MODE (SET_DEST (set)); + rtx orig_src = XEXP (SET_SRC (set), 0); + + if (!FUNCTION_ARG_REGNO_P (REGNO (orig_src)) + || abi_extension_candidate_return_reg_p (REGNO (orig_src))) + return false; + + /* Return FALSE if mode of destination and source is same. */ + if (dst_mode == GET_MODE (orig_src)) + return false; + + machine_mode mode = GET_MODE (XEXP (SET_SRC (set), 0)); + bool promote_p = abi_target_promote_function_mode (mode); + + /* Return FALSE if promote is false and REGNO of source and destination + is different. */ + if (!promote_p && REGNO (SET_DEST (set)) != REGNO (orig_src)) + return false; + + return true; +} + +/* Return TRUE if regno is an argument register. */ + +static inline bool +abi_extension_candidate_argno_p (int regno) +{ + return FUNCTION_ARG_REGNO_P (regno); +} + +/* Return TRUE if the candidate insn doesn't have defs and have + * uses without RTX_BIN_ARITH/RTX_COMM_ARITH/RTX_UNARY rtx class. */ + +static bool +abi_handle_regs (rtx_insn *insn) +{ + if (side_effects_p (PATTERN (insn))) + return false; + + struct df_link *uses = get_uses (insn, SET_DEST (PATTERN (insn))); + + if (!uses) + return false; + + for (df_link *use = uses; use; use = use->next) + { + if (!use->ref) + return false; + + if (BLOCK_FOR_INSN (insn) != BLOCK_FOR_INSN (DF_REF_INSN (use->ref))) + return false; + + rtx_insn *use_insn = DF_REF_INSN (use->ref); + + if (GET_CODE (PATTERN (use_insn)) == SET) + { + rtx_code code = GET_CODE (SET_SRC (PATTERN (use_insn))); + + if (GET_RTX_CLASS (code) == RTX_BIN_ARITH + || GET_RTX_CLASS (code) == RTX_COMM_ARITH + || GET_RTX_CLASS (code) == RTX_UNARY) + return false; + } + } + + rtx set = single_set (insn); + + if (GET_CODE (SET_SRC (set)) == SIGN_EXTEND) + { + machine_mode mode = GET_MODE (XEXP (SET_SRC (set), 0)); + bool promote_p = abi_target_promote_function_mode (mode); + + return promote_p; + } + return true; +} + /* This function goes through all reaching defs of the source of the candidate for elimination (CAND) and tries to combine the extension with the definition instruction. The changes @@ -770,6 +885,11 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state) state->defs_list.truncate (0); state->copies_list.truncate (0); + rtx orig_src = XEXP (SET_SRC (cand->expr),0); + + if (abi_extension_candidate_p (cand->insn) + && !get_defs (cand->insn, orig_src, NULL)) + return abi_handle_regs (cand->insn); outcome = make_defs_and_copies_lists (cand->insn, set_pat, state); @@ -1116,9 +1236,12 @@ add_removable_extension (const_rtx expr, rtx_insn *insn, /* Zero-extension of an undefined value is partly defined (it's completely undefined for sign-extension, though). So if there exists a path from the entry to this zero-extension that leaves this register - uninitialized, removing the extension could change the behavior of - correct programs. So first, check it is not the case. */ - if (code == ZERO_EXTEND && !bitmap_bit_p (init_regs, REGNO (reg))) + uninitialized and not argument register, removing the extension could + change the behavior of correct programs. So first, check it is not + the case. */ + if (code == ZERO_EXTEND + && !bitmap_bit_p (init_regs, REGNO (reg)) + && !abi_extension_candidate_argno_p (REGNO (reg))) { if (dump_file) { @@ -1130,10 +1253,17 @@ add_removable_extension (const_rtx expr, rtx_insn *insn, return; } - /* Second, make sure we can get all the reaching definitions. */ + /* Second, make sure we can get all the reaching definitions or reg is + argument register. */ defs = get_defs (insn, reg, NULL); if (!defs) { + if (abi_extension_candidate_argno_p (REGNO (reg))) + { + ext_cand e = {expr, code, mode, insn}; + insn_list->safe_push (e); + return; + } if (dump_file) { fprintf (dump_file, "Cannot eliminate extension:\n"); @@ -1321,7 +1451,8 @@ find_and_remove_re (void) && (REGNO (SET_DEST (set)) != REGNO (XEXP (SET_SRC (set), 0)))) { reinsn_copy_list.safe_push (curr_cand->insn); - reinsn_copy_list.safe_push (state.defs_list[0]); + if (state.defs_list.length () != 0) + reinsn_copy_list.safe_push (state.defs_list[0]); } reinsn_del_list.safe_push (curr_cand->insn); state.modified[INSN_UID (curr_cand->insn)].deleted = 1; @@ -1345,6 +1476,10 @@ find_and_remove_re (void) for (unsigned int i = 0; i < reinsn_copy_list.length (); i += 2) { rtx_insn *curr_insn = reinsn_copy_list[i]; + + if ((i+1) >= reinsn_copy_list.length ()) + continue; + rtx_insn *def_insn = reinsn_copy_list[i + 1]; /* Use the mode of the destination of the defining insn diff --git a/gcc/testsuite/g++.target/powerpc/zext-elim-3.C b/gcc/testsuite/g++.target/powerpc/zext-elim-3.C new file mode 100644 index 00000000000..5a050df06ff --- /dev/null +++ b/gcc/testsuite/g++.target/powerpc/zext-elim-3.C @@ -0,0 +1,13 @@ +/* { dg-options "-mcpu=power9 -O2" } */ + +void *memset(void *b, int c, unsigned long len) +{ + unsigned long i; + + for (i = 0; i < len; i++) + ((unsigned char *)b)[i] = c; + + return b; +} + +/* { dg-final { scan-assembler-not "\mrlwinm\M" } } */