From patchwork Sat Oct 28 10:20:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Agarwal X-Patchwork-Id: 159250 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:d641:0:b0:403:3b70:6f57 with SMTP id cy1csp1140201vqb; Sat, 28 Oct 2023 03:21:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEvnEYsx/7lWg31Ycl85kKZOcNeTIGSEuu/AfronGQXeb1LClVZGc9AWj+TduwCTIsaVmzm X-Received: by 2002:a05:6358:91e:b0:168:e2ec:593 with SMTP id r30-20020a056358091e00b00168e2ec0593mr6722992rwi.22.1698488466779; Sat, 28 Oct 2023 03:21:06 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1698488466; cv=pass; d=google.com; s=arc-20160816; b=vT9960axT7awClk59RhVTT+3PSO5AIIG1L1Sf6EB4N9K0d7mslu1Xqx1D/xWVuWx7a RYWhnMbrX3hB8KjrZmEwo9TrTkS+4EBq+WFW1FRcfO46/QYRTeTZzOWhoQcB7ijxcHAG MZKaDKBdCER3kcj5LQTJX560armVt9oo8YKdMzWHgmbz3aiMW5duAWZUnbDyeILeSJZM WjyLkf52o7kFcvgGbd/1t+YQJFIjjDCit6xI+eqAAFncupDuHNaI5PQNl8OGawfRkhaQ 1aItaDMMwX9j9dODYpBEzTg9f/5gJSavFJYejNe5gpEW8v/NfmT/lfVDtyWKHQ8kSVqN OpVA== 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=YEF+pc4I5sPoIsKi7M+A8DvGJfoZw9mR6ivE4DcP8FU=; fh=AMhO+Jg8miuV3jimyyKqe6uvMXQmhlayPajz9wx27uY=; b=vr7sr0tkpydCUl66lPdGoJGrGV+7jCyHwIA03BJk96SZMOjItBalGfMK3roggplM/L psFwqlKavqltPGeVZAtEXRuWCPpiLM8eMZU0xi2FSrYZFXpa+MLVPGlTgI2tpeSvQo3Y I9fiY6bGtukTCsIoAAZBwRy056h7UoM136MintXDbnA1fdZOEbKqlK88HYYZ/OscjP+R mANCjRBL++/JlXHrzF20c2M6N/SIH1s2Ep7i4zelR//2fjTE2o3+X3Fyii+4M5FHRf+y e5fFjljoGFXddOiANp1gIyh7TzS6udOzZiehzRhuMvY4tyTj0gxUocPhbASYnRf5XfGU 51Rw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=aFjZb7BW; 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=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id d9-20020a05622a15c900b004181451a0ecsi2121322qty.57.2023.10.28.03.21.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Oct 2023 03:21:06 -0700 (PDT) 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=@ibm.com header.s=pp1 header.b=aFjZb7BW; 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=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 82EF4386185E for ; Sat, 28 Oct 2023 10:21:06 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id A075038582A3 for ; Sat, 28 Oct 2023 10:20:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A075038582A3 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 A075038582A3 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698488440; cv=none; b=Kg8ttRuvtoLM2PGterp5VVKcNXC7T3tReNgvX2AQORS5WYECTkL2uN4S/+X5rFCMUXyTaEb2vQWQVYOF7pS+qaW+9/2coZ5ehVQ4ZB7D1vXYUiY98Pwn1dh1JIYFJcCrg61OBEYZUKn5+5QnwTm6ZBije1F/UU63D038WY/Y3WM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698488440; c=relaxed/simple; bh=BrG29UAZ7TY5FtbbM2LgKgG58J+4v1P3Bt9mxnCASpE=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=n1GS4HGMCpuEuOkcSwOIXH1f7OljgyYTBZ5rY0hb6FiVQEKOih5M7Y23r3G1UFtxctJOHx6bo9zFRKtpmYK/20AoOmwyZ6TwKwuc9EpYdd61ljTastjcZONFXRW4WBaud5hmiwMLqK8zoLDXA8/6l4MrL349fZG7CIfY5g65aWI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39SAG3fP001663; Sat, 28 Oct 2023 10:20:37 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=YEF+pc4I5sPoIsKi7M+A8DvGJfoZw9mR6ivE4DcP8FU=; b=aFjZb7BWSF4m+fAu3YGqbPM10ZKzQ5kaPCkzYNUFXE9kAcJagV79Pnxj7LXC5BXN0oLB UEzcypL4GfIzgqr4pMLh6LDOD7qae0Y0SrEqBXbDL9jICEumPya7SWGdoylEWZS5bdMk 0NSQjr4fDCvsHlRzKpPhzhJT9IYJzOAn/zRurxQdyJquCM1/vLr4S8r74+jSLnYIXcnO MwLvc4hqeJiuZ/q0+RdamhiNn2ZSM06IDHDynIPoywxh9+/T1xyeEagS8tli2DkmU7q9 ISJCCgZDoMJUwGtJWLpWHrqSFd9jZGHrvAVcN6Qgopub67ryperdE6xWnyh2ATAo7vPB gw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3u0wseapmg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 28 Oct 2023 10:20:37 +0000 Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 39SAGOWQ003027; Sat, 28 Oct 2023 10:20:36 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3u0wseapm1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 28 Oct 2023 10:20:36 +0000 Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 39S7GH4v021478; Sat, 28 Oct 2023 10:20:35 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3tywqrk7qf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sat, 28 Oct 2023 10:20:35 +0000 Received: from smtpav04.wdc07v.mail.ibm.com (smtpav04.wdc07v.mail.ibm.com [10.39.53.231]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 39SAKZpr14615184 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 28 Oct 2023 10:20:35 GMT Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0156458045; Sat, 28 Oct 2023 10:20:35 +0000 (GMT) Received: from smtpav04.wdc07v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3511158052; Sat, 28 Oct 2023 10:20:32 +0000 (GMT) Received: from [9.43.119.110] (unknown [9.43.119.110]) by smtpav04.wdc07v.mail.ibm.com (Postfix) with ESMTP; Sat, 28 Oct 2023 10:20:31 +0000 (GMT) Message-ID: <8da04e34-2074-4625-b18c-c347078558db@linux.ibm.com> Date: Sat, 28 Oct 2023 15:50:30 +0530 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gcc-patches , Jeff Law , Bernhard Reutner-Fischer , Vineet Gupta Cc: Richard Biener , Segher Boessenkool , Peter Bergner From: Ajit Agarwal Subject: [PATCH V15 4/4] ree: Improve ree pass using defined abi interfaces X-TM-AS-GCONF: 00 X-Proofpoint-GUID: IcPyKrE2X0s0tf8oabR39INXE34xg7ZD X-Proofpoint-ORIG-GUID: ddiqFjoC27INkkIwBFykJd5EtSlE-7PM X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.987,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-28_08,2023-10-27_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 malwarescore=0 suspectscore=0 priorityscore=1501 adultscore=0 impostorscore=0 lowpriorityscore=0 mlxlogscore=999 phishscore=0 spamscore=0 clxscore=1015 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2310240000 definitions=main-2310280078 X-Spam-Status: No, score=-12.7 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: 1780994242588269901 X-GMAIL-MSGID: 1780994242588269901 Hello Vineet, Jeff and Bernhard: This version 15 of the patch uses abi interfaces to remove zero and sign extension elimination. Bootstrapped and regtested on powerpc-linux-gnu. In this version (version 15) 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-28 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 | 133 +++++++++++++++++- .../g++.target/powerpc/zext-elim-3.C | 13 ++ 2 files changed, 140 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..b0fb37102ae 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,106 @@ 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); + + return tgt_mode == mode; +} + +/* 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 + reg source operand is argument register and not return register, + mode of source and destination operand are different, + if not promoted REGNO of source and destination operand are the 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)) + && dst_mode != GET_MODE (orig_src) + && abi_target_promote_function_mode (GET_MODE (orig_src)) + && REGNO (SET_DEST (set)) == REGNO (orig_src)) + return true; + + return false; +} + +/* 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 +871,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 +1222,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 +1239,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 +1437,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 +1462,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" } } */