From patchwork Wed Jan 18 05:25:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takayuki 'January June' Suwa X-Patchwork-Id: 1727953 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=R9BvJjHt; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4NxZ4B2j9wz23gM for ; Wed, 18 Jan 2023 16:26:16 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 77A633858C31 for ; Wed, 18 Jan 2023 05:26:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 77A633858C31 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1674019572; bh=MzYfadqVS3MUCcvRqhb95hWkWCRR+iWtkbg5anjzBlA=; h=Date:To:Cc:Subject:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=R9BvJjHt+dP8g0wdv+8ue7VJskcLXqdU5cuAh4lWtVq9jPw5WK8NRM3FpgcAZ6KW2 quwhMUYx8Bs7OqGhonPkLwHG7kEriFQxazy/d21NVC7oCdOLWaScLU24G5PpwBXgad RqRozxzxr68u/R+QMMPw610UVY3pEbXx2en7ORWg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from sonicconh5003.mail.kks.yahoo.co.jp (sonicconh5003.mail.kks.yahoo.co.jp [114.110.61.42]) by sourceware.org (Postfix) with ESMTPS id 1614D3858D28 for ; Wed, 18 Jan 2023 05:25:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1614D3858D28 X-YMail-OSG: 9DSYGvwVM1kUR3cufoUR_aJpwJSL5N20EhYJppjm3U85qrfdUu2Bpz.JukBFquK 0SQej9RhiTo9gablD4Rp5b7AFq6vNlzJhPFDDDuaoAhi.v1gODx8p9uyqTOOq_Xdzrfy6e5hcX_e zf.aMDvSbKfHmoBaIVtPgZyHrBFJtGh13v5lAFz4GCN5ynGmHtmkm7HiGLtsl8CR9ZL.KlGRCKsi WKJJm5GOUgIaRh4sx5ajovhByVsq4RleGZ__I8FoB5riw5BYbB3rAHF711z.M2BnTWvylVErzb3G tRmSQYABMr22.Z3zKTcD0ue8XwUINbqnHDrqFrPbqj3fnar96jv0EfXNkNk5Xlu.xBvR48OUOqER ALWM2lROog7CXDnZJFJRil0anB44Q3oYZdnkYgltn3P0UGk8V7GyuRz2Ti7wsluJOphevF_TubDS AcRn4ffvnhjKsgWFnAxc44.y94kicnkks.R39ZSiE9kVpEfMD0sZsarxdNW19j4ZgE0qM6Ab4WxP 5QlJVMqvMYrmkJ3wUf1gtI3.TZ.CLL5nqqQ1y760eDSiUHCp0k7RM44zo1kvjxz8V9K7raIEG8.o we20ijW0Gfvghqbi6GnlvdeYyXPWz_cLt5CRVFXFTCsRMq2SRQqMXArOLA0mGidc1A24G6rS3rAq eruB72Ru5SUnqBwwvcfcVnCvocIEYeVUKOucVPGApYIjFqj4EvxSVIqUUgH.eo4ZghwxeUW8oj4N qYo3fM3nS.H.3CFFs4UVe_gxYOyb89FJe4JVnQXCNbkEXd4qo.DBi1pqQtrGOCqEabFhjHPqzOoY JfysPy90uSvU2WThzIWYTPVy4lecQlCePmJ0fdPBGQ_pY00vXgFlglWUBlIYIm7Maixj4ZcIUHUe GKJaPX49bYgToiPaN4hYKvpWc3lkWv4a6KBXQD.puoB0gDzqQpldOK9YdqyXA0j84lBvJlmlGEbA Jp3s_61zx Received: from sonicgw.mail.yahoo.co.jp by sonicconh5003.mail.kks.yahoo.co.jp with HTTP; Wed, 18 Jan 2023 05:25:46 +0000 Received: by smtphe5001.mail.kks.ynwp.yahoo.co.jp (YJ Hermes SMTP Server) with ESMTPA ID c8e7ba0bfe89a06c88b86d2a27b65aa1; Wed, 18 Jan 2023 14:25:43 +0900 (JST) Message-ID: Date: Wed, 18 Jan 2023 14:25:41 +0900 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 To: GCC Patches Cc: Max Filippov Subject: [PATCH v2] xtensa: Eliminate unnecessary general-purpose reg-reg moves References: X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Takayuki 'January June' Suwa via Gcc-patches From: Takayuki 'January June' Suwa Reply-To: Takayuki 'January June' Suwa Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Register-register move instructions that can be easily seen as unnecessary by the human eye may remain in the compiled result. For example: /* example */ double test(double a, double b) { return __builtin_copysign(a, b); } test: add.n a3, a3, a3 extui a5, a5, 31, 1 ssai 1 ;; be in the same BB src a7, a5, a3 ;; No '0' in the source constraints ;; No CALL insns in this span ;; Both A3 and A7 are irrelevant to ;; insns in this span mov.n a3, a7 ;; An unnecessary reg-reg move ;; A7 is not used after this ret.n The last two instructions above, excluding the return instruction, could be done like this: src a3, a5, a3 This symptom often occurs when handling DI/DFmode values with SImode instructions. This patch solves the above problem using peephole2 pattern. gcc/ChangeLog: * config/xtensa/xtensa.md: New peephole2 pattern that eliminates the occurrence of genral-purpose register used only once and for transferring intermediate value. --- gcc/config/xtensa/xtensa.md | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index 3694d95ad..0a477e711 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -3091,3 +3091,46 @@ FALLTHRU:; df_insn_rescan (insnR); set_insn_deleted (insnP); }) + +(define_peephole2 + [(set (match_operand 0 "register_operand") + (match_operand 1 "register_operand"))] + "GET_MODE_SIZE (GET_MODE (operands[0])) == 4 + && GET_MODE_SIZE (GET_MODE (operands[1])) == 4 + && GP_REG_P (REGNO (operands[0])) && GP_REG_P (REGNO (operands[1])) + && peep2_reg_dead_p (1, operands[1])" + [(const_int 0)] +{ + basic_block bb = BLOCK_FOR_INSN (curr_insn); + rtx_insn *head = BB_HEAD (bb), *insn; + rtx dest = operands[0], src = operands[1], pattern, t_dest; + int i; + for (insn = PREV_INSN (curr_insn); + insn && insn != head; + insn = PREV_INSN (insn)) + if (CALL_P (insn)) + break; + else if (INSN_P (insn)) + { + if (GET_CODE (pattern = PATTERN (insn)) == SET + && REG_P (t_dest = SET_DEST (pattern)) + && GET_MODE_SIZE (GET_MODE (t_dest)) == 4 + && REGNO (t_dest) == REGNO (src)) + { + extract_constrain_insn (insn); + for (i = 1; i < recog_data.n_operands; ++i) + if (strchr (recog_data.constraints[i], '0')) + goto ABORT; + SET_REGNO (t_dest, REGNO (dest)); + goto FALLTHRU; + } + if (reg_overlap_mentioned_p (dest, pattern) + || reg_overlap_mentioned_p (src, pattern) + || set_of (dest, insn) + || set_of (src, insn)) + break; + } +ABORT: + FAIL; +FALLTHRU:; +})