From patchwork Mon Oct 23 06:43:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Agarwal X-Patchwork-Id: 156684 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:ce89:0:b0:403:3b70:6f57 with SMTP id p9csp1113652vqx; Sun, 22 Oct 2023 23:43:52 -0700 (PDT) X-Google-Smtp-Source: AGHT+IElRUnGrFdBj1L53ajy5jvB1+Z4zMyoN+9zdbTyh6unLsg6jIgGNeH5q8f+UhAg5V0oy5XK X-Received: by 2002:ad4:4b6b:0:b0:66d:7f65:71c9 with SMTP id m11-20020ad44b6b000000b0066d7f6571c9mr15588583qvx.9.1698043432447; Sun, 22 Oct 2023 23:43:52 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1698043432; cv=pass; d=google.com; s=arc-20160816; b=ZxPrfKLC0Oyzx1pu5h0GKsa3X2sBKsvexpZ3OlXHiRDU42Pv/EPIOTFlqO4ckOSxKN enoShu8YhWDy16FyvzKWkkY/cJ9igYasYcs794xDsojz3Gw0mMcWj+ExtdPWg5l5wKYR BXRQXwz80fcczcUnJHJUyDkyriegi+8XMDf+wjXVHdZ6jh1Pb/Qy9z6mJI0QqPpS17JF QbX4dRY9rE/rsIFSbW62Efl6i1+fMnOz+/h8fkDV5WSukRtzz3YSENiN+OJIdI1TodQ8 gRAnIMl2FqPMg20g6tMq9Gmk0hQpslWDD0uLaXC30lXTvKrpTV9UuZfQ3YDFei9c729I LWsQ== 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=WkatrZOhR1gpoompoItZwISfr6vX0XvtTcAV5TKKiWY=; fh=yehUO2Iw+dtUhjqRUJCgaFyv7KMOyIYwZ8IQPCil10E=; b=faF61N2v6wqyE4q2y3shwASYuiaoYlSp/teqJ/6qRvabZy/GR4ZEbCjbQzfx1jhhvv wNqENLOIQEww+gMg1EaVfKANAXtKU8GHoOoaYFIunlpRVBx7LyggZuT8ilaaOlyxO5L/ V8+PWRRuA8mMRA3/LPA5b+9bvByCKRlhqblU0y2lfMyEWUze2zofa/V2Gwo54hsgXkh1 RG5uslQ4e9kz3EjaW5ejY0tL5BJDpmdIR2uSRwf1HhbDKv/Cz2sbepLvOwD04I35oH5T FkL1lwrzg5hjPMqJKAwscnEtp5Qg/PXJaCOUo/iLxZC7dltoOjgf/q6MMa4O/0+7zvTp quVA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=XlX0l++f; 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 ei6-20020ad45a06000000b0065aff063eafsi5148990qvb.538.2023.10.22.23.43.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Oct 2023 23:43:52 -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=XlX0l++f; 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 383F03858419 for ; Mon, 23 Oct 2023 06:43:52 +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 2E5E03858D37 for ; Mon, 23 Oct 2023 06:43:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2E5E03858D37 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 2E5E03858D37 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=1698043408; cv=none; b=A3uazyW6a3LxDdH7zGbrLEounlr/8GGjSaFAN/Z8GmFo7jcZ31vOv1sJjg5wEU+47gbsQBnWx6uYSqrxfuq77C5w7lvnHNsomsl11Qyuwf9kwoO0gVBG8RxxVrQjmNgP1NdrtOjqKTyI3kBwQg5D6htOQ+xtuYqeVcXfbXzjXfE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698043408; c=relaxed/simple; bh=DV9tOWem1Ll42VGoKJaQ5uGyiPpAZr2Vd3qJ8ioVpGM=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=I+Pu9oqp8HAdOxxrrUbzcM/QanDtkuB+0PVh4YZHyNN/537H245US19Jz0nfrg1NFbJy5vFhEp/nnv5ZIB6khew85F3wIG6ULM6cvFoP19Q7zQKgl2Iw5Yjlu3iylPxiSmBCqdT3NmCyrstJVbYzNLU2rrbMpc9blvGFWG8BNOg= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353724.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39N6dnw0024037; Mon, 23 Oct 2023 06:43:25 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=WkatrZOhR1gpoompoItZwISfr6vX0XvtTcAV5TKKiWY=; b=XlX0l++f5igD4ZG07vdi1bUSV58GkhXEqS+8zNo/aHWezZaaqGQtnxw2tEKvRja1kVKW LUq4imwODoHQpBuEi0VCLkuwau8VAriewl2xRuoznt77ySYXCPmobdj4/DLORwqBTCui fZw8Qesf0RMer5kDTP3Z1SliAOKS5mLBsblhYgxNnvt7RFkz07BHuqPq2FCKU6dfTLx6 NwRcyhqWFBD7rBEotY4QFxmOaIaeleXdrg0+/iJ9Lrz4uFAUCpDcepCpf9tlvuQuHArL RWDSSxYK3JL+9W9CRF5HXwt/hQgUz+Yz+6gTq3EsPhjYC9lTTxRa1x/AEFidhBviAj9K Tw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3twkrqg33q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Oct 2023 06:43:25 +0000 Received: from m0353724.ppops.net (m0353724.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 39N6fwnI030253; Mon, 23 Oct 2023 06:43:24 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3twkrqg33b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Oct 2023 06:43:24 +0000 Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 39N40dai005105; Mon, 23 Oct 2023 06:43:24 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3tvtfk6rg9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 23 Oct 2023 06:43:23 +0000 Received: from smtpav06.dal12v.mail.ibm.com (smtpav06.dal12v.mail.ibm.com [10.241.53.105]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 39N6hN2Q27066882 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 23 Oct 2023 06:43:23 GMT Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3F95858059; Mon, 23 Oct 2023 06:43:23 +0000 (GMT) Received: from smtpav06.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3402058043; Mon, 23 Oct 2023 06:43:20 +0000 (GMT) Received: from [9.43.84.41] (unknown [9.43.84.41]) by smtpav06.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 23 Oct 2023 06:43:19 +0000 (GMT) Message-ID: <1b7c3ee2-5c44-4d79-9708-c0183d6634c9@linux.ibm.com> Date: Mon, 23 Oct 2023 12:13:18 +0530 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gcc-patches Cc: Vineet Gupta , Jeff Law , Richard Biener , Segher Boessenkool , Peter Bergner , Bernhard Reutner-Fischer From: Ajit Agarwal Subject: [PATCH V11] ree: Improve ree pass using defined abi interfaces X-TM-AS-GCONF: 00 X-Proofpoint-GUID: xAU8B6GVb9YkryIuBjfiRH9c_Z0Jms83 X-Proofpoint-ORIG-GUID: 3lIt6buoJazh4BIrvOf05VWB7PwIzK3o 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-23_04,2023-10-19_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 impostorscore=0 mlxscore=0 lowpriorityscore=0 adultscore=0 suspectscore=0 clxscore=1015 malwarescore=0 bulkscore=0 mlxlogscore=999 spamscore=0 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2310170001 definitions=main-2310230058 X-Spam-Status: No, score=-12.9 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: 1780527589727452394 X-GMAIL-MSGID: 1780527589727452394 Hello Vineet, Jeff and Bernhard: This version 11 of the patch uses abi interfaces to remove zero and sign extension elimination. Bootstrapped and regtested on powerpc-linux-gnu. In this version (version 11) 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. Please check if its addressed bootstrapped failure with RISC-V. Also 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 redundant zero and sign extension and done to improve ree pass to eliminate such redundant zero and sign extension using defined ABI interfaces. 2023-10-23 Ajit Kumar Agarwal gcc/ChangeLog: * ree.cc (combine_reaching_defs): Use of zero_extend and sign_extend 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 --- gcc/ree.cc | 144 +++++++++++++++++- .../g++.target/powerpc/zext-elim-3.C | 13 ++ 2 files changed, 151 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..88528b048c2 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,117 @@ 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) +{ + return targetm.calls.function_value_regno_p (regno); +} + +/* Return TRUE if the following conditions are satisified. + + 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 (/*insn,*/ 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 +882,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 +1233,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 +1250,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 +1448,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 +1473,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" } } */