From patchwork Tue Jan 17 04:12:50 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: 44485 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp1549775wrn; Mon, 16 Jan 2023 20:13:47 -0800 (PST) X-Google-Smtp-Source: AMrXdXuigkqrTHXxALtPLI1NOzXOBxas43aI5TrEDSPDm4B0lXn9/dHhNys0b3a4t6H59+467+LP X-Received: by 2002:a17:906:99d1:b0:845:bb21:f638 with SMTP id s17-20020a17090699d100b00845bb21f638mr1385569ejn.75.1673928827548; Mon, 16 Jan 2023 20:13:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673928827; cv=none; d=google.com; s=arc-20160816; b=XtXh+gSfG3isv6JRMaE9I+jqt0w0OmpO21JaO3cB+1IM+gzkAEgGhA1+iVvzm6Xrqs QUW0XfPSBpFsZ/aqPpE+juDGjK5jWOF2PI9+kq7UR5T60dzfqEh2IkhN4jo/vikFFko0 DQOyj1ugRBR3wuknVvWIMPwmknav/inzz+uBzM7nMQhcZRq+OS32HcipTT8sc1FfzEtE FYqXBoyAcP1aemT/1lYg6HpbM19t4fkIac6d6ImpblW9AE2mCbiQXItlQATf6mwHZu1z HpqhiPnIgcgzXg0J35tfxxbex3LGFsEAEifUliX/1eOvdJJwFEudLnFY+KaBuO5IZea2 t5Ig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:references :content-transfer-encoding:subject:cc:to:user-agent:mime-version :date:message-id:dmarc-filter:delivered-to:dkim-signature :dkim-filter; bh=dTKtTt9y5j7kkFqDWphS0EH9dVFbuHTiEUqjQdW7gFU=; b=wPCZyA9eTyFBZ9OXfDiWmALo0oLDB5FjPcZkFzynSY7s4y/Bjnogtuw/mQAs9Uvgbv kxDGHZeTDi9AQ1HSVSB4emf9M5NvFO3rbyD19z1UB2LAx8GdcRMBxv9db355K/R/rgCM zj964MV2ARxJLCYIyGruY1qMCOyBioWDEytZBRzFaj9aokrxGeVttS9GlsxazGwR82Yn MDnu0Ql2iI8DEa+8Oe61ZF3fRC/UNMGivThe6LFRQ+EIZnXVcCXU15ANTDzBAtZdtUB5 +pcl1BbgeFnUYCFGpQCWz3qCDf7phQm67suluF0yCaJCe2LdtFs79EDCNo+kAGHi+oLc VLyQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b="xqe7sB/a"; 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=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id sa40-20020a1709076d2800b008366ae33ebbsi33203840ejc.562.2023.01.16.20.13.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jan 2023 20:13:47 -0800 (PST) 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=@gcc.gnu.org header.s=default header.b="xqe7sB/a"; 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=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5BAC93858438 for ; Tue, 17 Jan 2023 04:13:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5BAC93858438 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1673928826; bh=dTKtTt9y5j7kkFqDWphS0EH9dVFbuHTiEUqjQdW7gFU=; h=Date:To:Cc:Subject:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=xqe7sB/aVmD9xNnPJAvbZuGvXmUYj18QXtriaj1Taxo1aIYjRF8G9AkyLy5sJA+Ad dcyorwW6FkwGfrjUglmBCotwmLHaGBAkjp09K0goy/Dcr3FX3+HxtnJIeEyHQzozeb O5exxL+N9MapE2kDQ7YErkPqHGbYlL8TKIuRZ/dM= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from sonicconh5002-vm0.mail.kks.yahoo.co.jp (sonicconh5002-vm0.mail.kks.yahoo.co.jp [114.110.61.27]) by sourceware.org (Postfix) with ESMTPS id 39FD63858C83 for ; Tue, 17 Jan 2023 04:13:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 39FD63858C83 X-YMail-OSG: vv6rPEwVM1nO0nTPy89t659MQ5tAmP1EU3mKa8lWeefPvfGwhsP7O0PWKBdLydA yIXp3Hmm0p50tGkRc2hd775g6rQlmRuFLhS.0hxKz46GnQbhoY851fF1VOHDNUbhO3lhzfjgJFuP 9JZG_BVX.xg65TVZtni.XNwfiaspZ4qv1XhEc6zj8m670XUNwKrxHucFGmeXERjM1sXeb_O47ipw IqqVf.1PBbPup9GPwE3BybPD5JS6_n1vro2OaULV0yOVHpjWKR.WWC_beoLGeYzhasNTADYyiBcK wqd4toKawj41vjFnfJvhkUa_hSP6RXkTaNAJ2UTtkvgk2fx59gIQzEXgzso24BmCLq4NJ2mTQCE0 F6Z1riE84ShBItzMwUcEr19qO.9jw4vyauNnzcIJ4J95G0ciVTYdNVXLwbV0qw8niqkyYmRfwR4F zbz3O2qxc6aOETiXoqkC7Vf4YzKTjdoef_jC17vGZHAUPsG.b8iIsjGYjc3fRJLWX7J86a4jWK1N ZPZ2KV5sfT00F.ZADlKxBB8woiTMX0uugMQ7UX7X0SJz86zJe.jtAGeykqZd3Bx1_68eon87Jyou 15O6G6sRumkhKs7tmPoTCecSpIKppg6IGati4SJo0JjuP3f0oamdOFCzwySf4AmQEPe5ni3Vvwdl wsh7279jvBzyopL0lfR5RqiypyM_m5ejLyN48RJ16q5HWCF8WdIzRcV9FIs7MCywJGmhn4jQ8L09 LMrtgAwy7XDSQB.YC.nHjL_H8pNWAAvPNLl1TevA3IFRDLJO4innWzk2Q4kU1FC29AHhG6v29Uog xW6RADRhzK6cKjKbDqlL43FH8O5B89EHMEMUzQOkh27tYGJuHX3sDsrdeDgDNcCBT1AXzCqYN9qR G_P8mE.NzpJePQIC5C39CNoSDctRowQt9Hoy.zTciYNu8PP6RKKQs1AviCaxDBRRdn5Oqrn42ZDK LPbdUJ3o- Received: from sonicgw.mail.yahoo.co.jp by sonicconh5002.mail.kks.yahoo.co.jp with HTTP; Tue, 17 Jan 2023 04:12:55 +0000 Received: by smtphe5003.mail.kks.ynwp.yahoo.co.jp (YJ Hermes SMTP Server) with ESMTPA ID 217dd16df4cb5e267cb40eb8f9543cf2; Tue, 17 Jan 2023 13:12:51 +0900 (JST) Message-ID: <70bdc2f9-f0ae-cca7-0910-859cacbf5eae@yahoo.co.jp> Date: Tue, 17 Jan 2023 13:12:50 +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 the use of callee-saved register that saves and restores only once References: <70bdc2f9-f0ae-cca7-0910-859cacbf5eae.ref@yahoo.co.jp> X-Spam-Status: No, score=-11.6 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+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1755241594220929664?= X-GMAIL-MSGID: =?utf-8?q?1755241594220929664?= In the case of the CALL0 ABI, values that must be retained before and after function calls are placed in the callee-saved registers (A12 through A15) and referenced later. However, it is often the case that the save and the reference are each only once and a simple register- register move (the frame pointer is needed to recover the stack pointer and must be excluded). e.g. in the following example, if there are no other occurrences of register A14: ;; before ; prologue { ... s32i.n a14, sp, 16 ... ; } prologue ... mov.n a14, a6 ... call0 foo ... mov.n a8, a14 ... ; epilogue { ... l32i.n a14, sp, 16 ... ; } epilogue It can be possible like this: ;; after ; prologue { ... (deleted) ... ; } prologue ... s32i.n a6, sp, 16 ... call0 foo ... l32i.n a8, sp, 16 ... ; epilogue { ... (deleted) ... ; } epilogue This patch introduces a new peephole2 pattern that implements the above. gcc/ChangeLog: * config/xtensa/xtensa.md: New peephole2 pattern that eliminates the use of callee-saved register that saves and restores only once for other register, by using its stack slot directly. --- gcc/config/xtensa/xtensa.md | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/gcc/config/xtensa/xtensa.md b/gcc/config/xtensa/xtensa.md index 98f3c468f8b..fc512346741 100644 --- a/gcc/config/xtensa/xtensa.md +++ b/gcc/config/xtensa/xtensa.md @@ -3024,3 +3024,63 @@ FALLTHRU:; operands[1] = GEN_INT (imm0); operands[2] = GEN_INT (imm1); }) + +(define_peephole2 + [(set (match_operand:SI 0 "register_operand") + (match_operand:SI 1 "reload_operand"))] + "!TARGET_WINDOWED_ABI && df + && epilogue_contains (insn) + && ! call_used_or_fixed_reg_p (REGNO (operands[0])) + && (!frame_pointer_needed + || REGNO (operands[0]) != HARD_FRAME_POINTER_REGNUM)" + [(const_int 0)] +{ + rtx reg = operands[0], pattern; + rtx_insn *insnP = NULL, *insnS = NULL, *insnR = NULL; + df_ref ref; + rtx_insn *insn; + for (ref = DF_REG_DEF_CHAIN (REGNO (reg)); + ref; ref = DF_REF_NEXT_REG (ref)) + if (DF_REF_CLASS (ref) != DF_REF_REGULAR) + continue; + else if ((insn = DF_REF_INSN (ref)) == curr_insn) + continue; + else if (GET_CODE (pattern = PATTERN (insn)) == SET + && rtx_equal_p (SET_DEST (pattern), reg) + && REG_P (SET_SRC (pattern))) + { + if (insnS) + FAIL; + insnS = insn; + continue; + } + else + FAIL; + for (ref = DF_REG_USE_CHAIN (REGNO (reg)); + ref; ref = DF_REF_NEXT_REG (ref)) + if (DF_REF_CLASS (ref) != DF_REF_REGULAR) + continue; + else if (prologue_contains (insn = DF_REF_INSN (ref))) + { + insnP = insn; + continue; + } + else if (GET_CODE (pattern = PATTERN (insn)) == SET + && rtx_equal_p (SET_SRC (pattern), reg) + && REG_P (SET_DEST (pattern))) + { + if (insnR) + FAIL; + insnR = insn; + continue; + } + else + FAIL; + if (!insnP || !insnS || !insnR) + FAIL; + SET_DEST (PATTERN (insnS)) = copy_rtx (operands[1]); + df_insn_rescan (insnS); + SET_SRC (PATTERN (insnR)) = copy_rtx (operands[1]); + df_insn_rescan (insnR); + set_insn_deleted (insnP); +})