From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from arjuna.pair.com (arjuna.pair.com [209.68.5.131]) by sourceware.org (Postfix) with ESMTPS id 776853858416 for ; Fri, 28 Apr 2023 22:42:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 776853858416 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=bitrange.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=bitrange.com Received: by arjuna.pair.com (Postfix, from userid 3006) id A27B78A7CA; Fri, 28 Apr 2023 18:42:25 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by arjuna.pair.com (Postfix) with ESMTP id A1CB88A7D5; Fri, 28 Apr 2023 18:42:25 -0400 (EDT) Date: Fri, 28 Apr 2023 18:42:25 -0400 (EDT) From: Hans-Peter Nilsson X-X-Sender: hp@arjuna.pair.com To: Ajit Agarwal cc: gcc-patches , Jeff Law , Segher Boessenkool , Peter Bergner , Richard Biener Subject: Re: [PATCH v4 4/4] ree: Improve ree pass for rs6000 target using defined ABI interfaces. In-Reply-To: <8b50f07a-994e-1637-ae4d-2be8dbb25807@linux.ibm.com> Message-ID: References: <8b50f07a-994e-1637-ae4d-2be8dbb25807@linux.ibm.com> User-Agent: Alpine 2.20.16 (BSF 172 2016-09-29) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Scanned-By: mailmunge 3.11 on 209.68.5.131 X-Spam-Status: No, score=-9.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,SPF_HELO_NONE,SPF_PASS,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: On Sat, 22 Apr 2023, Ajit Agarwal via Gcc-patches wrote: > Hello All: > > This new version of patch 4 use improve ree pass for rs6000 target using defined ABI interfaces. > Bootstrapped and regtested on power64-linux-gnu. > > Thanks & Regards > Ajit > > > ree: Improve ree pass for rs6000 target 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 defines > ABI interfaces. > > 2023-04-22 Ajit Kumar Agarwal > > gcc/ChangeLog: > > * ree.cc (combline_reaching_defs): Add zero_extend > using defined abi interfaces. > (add_removable_extension): use of defined abi interfaces > for no reaching defs. > (abi_extension_candidate_return_reg_p): New defined ABI function. > (abi_extension_candidate_p): New defined ABI function. > (abi_extension_candidate_argno_p): New defined ABI function. > (abi_handle_regs_without_defs_p): New defined ABI function. > > gcc/testsuite/ChangeLog: > > * g++.target/powerpc/zext-elim-3.C > --- > gcc/ree.cc | 176 +++++++++++++++--- > .../g++.target/powerpc/zext-elim-3.C | 16 ++ > 2 files changed, 162 insertions(+), 30 deletions(-) > create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-3.C > > diff --git a/gcc/ree.cc b/gcc/ree.cc > index 413aec7c8eb..0de96b1ece1 100644 > --- a/gcc/ree.cc > +++ b/gcc/ree.cc > @@ -473,7 +473,8 @@ get_defs (rtx_insn *insn, rtx reg, vec *dest) > break; > } > > - gcc_assert (use != NULL); > + if (use == NULL) > + return NULL; > > ref_chain = DF_REF_CHAIN (use); > > @@ -514,7 +515,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 +752,103 @@ get_extended_src_reg (rtx src) > return src; > } > > +/* Return TRUE if the candidate insn is zero extend and regno is > + an return registers. */ > + > +static bool > +abi_extension_candidate_return_reg_p (rtx_insn *insn, int regno) > +{ > + rtx set = single_set (insn); > + > + if (GET_CODE (SET_SRC (set)) != ZERO_EXTEND) > + return false; > + > + if (FUNCTION_VALUE_REGNO_P (regno)) > + return true; > + > + return false; > +} > + > +/* Return TRUE if reg source operand of zero_extend is argument registers > + and not return registers and source and destination operand are same > + and mode of source and destination operand are not same. */ > + > +static bool > +abi_extension_candidate_p (rtx_insn *insn) > +{ > + rtx set = single_set (insn); > + > + if (GET_CODE (SET_SRC (set)) != ZERO_EXTEND) > + return false; > + > + machine_mode ext_dst_mode = GET_MODE (SET_DEST (set)); > + rtx orig_src = XEXP (SET_SRC (set),0); > + > + bool copy_needed > + = (REGNO (SET_DEST (set)) != REGNO (XEXP (SET_SRC (set), 0))); > + > + if (!copy_needed && ext_dst_mode != GET_MODE (orig_src) > + && FUNCTION_ARG_REGNO_P (REGNO (orig_src)) > + && !abi_extension_candidate_return_reg_p (insn, REGNO (orig_src))) > + return true; > + > + return false; > +} > + > +/* Return TRUE if the candidate insn is zero extend and regno is > + an argument registers. */ > + > +static bool > +abi_extension_candidate_argno_p (rtx_code code, int regno) > +{ > + if (code != ZERO_EXTEND) > + return false; > + > + if (FUNCTION_ARG_REGNO_P (regno)) > + return true; > + > + return false; > +} I don't see anything in those functions that checks if ZERO_EXTEND is actually a feature of the ABI, e.g. as opposed to no extension or SIGN_EXTEND. Do I miss something? Also, "!= ZERO_EXTEND" has too many spaces, copy-pasted in several (all?) places. Also, s/an return registers/a return register/ (three errors). brgds, H-P