From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qv1-xf2f.google.com (mail-qv1-xf2f.google.com [IPv6:2607:f8b0:4864:20::f2f]) by sourceware.org (Postfix) with ESMTPS id 3A4603858CDA for ; Tue, 24 Oct 2023 18:17:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3A4603858CDA Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivosinc.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3A4603858CDA Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::f2f ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698171480; cv=none; b=tXUCZquXfV/ryjMGFPqWSDcpsJ47aS9hS0RLlTL/dCg1ibev3TkRci6uhFRi0jW3F0dQ34moP0twkHFl0AF6uBQq7Gb8F6nSNkdxVEHl4C1OpvUlMKzOepFC5MFZXHgEatCC97zopN7387NgP+GdDQmRMTrRUPFDHATbdnr4uvk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698171480; c=relaxed/simple; bh=B8u54RgEUpBKrxWQx9lgoNUZhpbEo2yNSLzbIcr/nmo=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From; b=EvsdCKJ3DHrQQ2bL/m1m5AU671AIohVZjeNN18pXM1yygffE3napaMe2xdBiz4a6vGM+A2bKBeBQciFsoXWNYfVnGzghNEZtF8iWg2qcO2IkZNQdvmBq7Q1orhLg55RF7RiHsIRr93Mdkjr8P52Z0cBKoB/jcSKJTofSEST0YFM= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-qv1-xf2f.google.com with SMTP id 6a1803df08f44-66cee0d62fbso33802726d6.3 for ; Tue, 24 Oct 2023 11:17:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1698171475; x=1698776275; darn=gcc.gnu.org; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=WVW4XIWxSbKJ8TGS4c2wPouT4uw7FrlGa420Ra4+O84=; b=bnKOOYSFDVa1useU51j1970zJdBZgXuxN0guu4p2d8dmfCPLGohM34XjNaVD5RTHyQ L+E410KaPeUsWzGwIGNtu3m6+8TxaoOiizW7ICILwBmqQCnswBqf8oDrG2cQsQBpAJyc QdEgeVNOi4fU13sxVdCKYTKxk3gBpBJmLPVLBeWEwAonxlmnqyY/aXx+xNuzZrq2Q+i3 F89UJOUQffUlqAfhTeAxuIf/Ly/NsLBOdL/qPa2AfHmjMrYiEUxMYR1nXhCoX6Be4TkW GiUxPXjjdHqYnrAEDzuRbnXmwlVek3YsvZjkEpZloHLB/eDHtnqm3XBtmq0Xm9A5h+DY IS2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698171475; x=1698776275; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WVW4XIWxSbKJ8TGS4c2wPouT4uw7FrlGa420Ra4+O84=; b=csKu/AgdSJ8UTpdctBuCDLjlqO2fpeO65InDN/2N10trLHwU9At6dLZ+l1fOCl5evz r6oX91Yn4ir3+Ufg/win3F84ztAh+P92uhKnzWIFQCYMkhfwBPxuEmXty+ZqAJ44dSDu Ex0Z1CrTWiq6yB/IXy/TXRvYjb6cue4QdjGI9U/JTdyt0WnEfmiV7WvPpo4EX//cejB0 E07IHbfhEQtBpsGC9Wrzh98MNJlHDqC46D5EoZD1Apmp+Jkd5piBk68aa4q2PfF/7BrG yEGukcq0LMcCQW+6AYHx7rWCYk+g75lj3Ft0IYV98Pi+yEPWrlzZ79HE+xcShCfAUJvB MsjA== X-Gm-Message-State: AOJu0YzMm8w3JmnbLTys3TdibEY9g1+Qog2/f1bo7WNuwamZ0Xkt2I/l ncFfPkgFXx/i4jT2l+lmCXmAeQ== X-Google-Smtp-Source: AGHT+IHqufdYxkq+pg8fn6RuGiiTCQjFuND/un5XeF+BJ00L0xmNv4WAk3Q3lJcdgcld96m2WOsTZw== X-Received: by 2002:a05:6214:250d:b0:66d:1f11:8b7c with SMTP id gf13-20020a056214250d00b0066d1f118b7cmr15406122qvb.52.1698171475489; Tue, 24 Oct 2023 11:17:55 -0700 (PDT) Received: from [10.0.16.165] ([208.116.208.98]) by smtp.gmail.com with ESMTPSA id w4-20020a0562140b2400b0065b21f1b687sm3796495qvj.80.2023.10.24.11.17.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 24 Oct 2023 11:17:55 -0700 (PDT) Message-ID: Date: Tue, 24 Oct 2023 11:17:52 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH V14 4/4] ree: Improve ree pass using defined abi interfaces Content-Language: en-US To: Ajit Agarwal , gcc-patches , Jeff Law Cc: Richard Biener , Segher Boessenkool , Peter Bergner , Bernhard Reutner-Fischer References: From: Vineet Gupta In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,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 List-Id: On 10/24/23 10:03, Ajit Agarwal wrote: > 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. Once again, this information belong between the two "---" lines that you added for v6 and stopped updating. And it seems the only code difference between v13 and v14 is -  return tgt_mode == mode; +  if (tgt_mode == mode) +    return true; +  else +    return false; How does that make any difference ? -Vineet > > 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" } } */