From patchwork Thu May 14 14:58:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Lyon X-Patchwork-Id: 1290435 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: 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@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: 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=t34oBQMR; 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 RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49NF6X04xxz9sRK for ; Fri, 15 May 2020 00:58:43 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BB0A8396E054; Thu, 14 May 2020 14:58:39 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BB0A8396E054 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1589468319; bh=ByvnpoNXhTsW9dBf9+i+67NJj7xxp9vj1CxqQaGO0gc=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=t34oBQMRj9rEOCBRfqK9Hcvrbt3NXBa4pxB0hvpasdQdi5hdIvVmcvbZHx9dDmefZ xUybrlMlg4gh1EjZ3nR+HECyTz1+yiuyybFC90bBtQWHkZnatxqAw7cE6ABrZFP/iS NoZf0Cjae6ymyJ69zQSrmc7d7qL4q0MR21Z+ofzs= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x442.google.com (mail-wr1-x442.google.com [IPv6:2a00:1450:4864:20::442]) by sourceware.org (Postfix) with ESMTPS id 03F34395CCA2 for ; Thu, 14 May 2020 14:58:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 03F34395CCA2 Received: by mail-wr1-x442.google.com with SMTP id y3so4596139wrt.1 for ; Thu, 14 May 2020 07:58:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ByvnpoNXhTsW9dBf9+i+67NJj7xxp9vj1CxqQaGO0gc=; b=ImP49OkWVnBZpwbVJ6hH6ie/1j1Arn+Jg5yKoRqPZ4i4wQQwnD4DDLCDSsz6d20ToN eakOsz69eN/9Z4nrn9t6DYaQHLgx6fPbXaYTvpXg8Xrk3rTNjHtj7oEXddQqH5geXZkC eEWMa7Hq4cgohbCQ0sofAzV9k20ZRIBSkbon2idxZu98QgzAqipsSh0ndpmkGMAqCiEZ q6hL35IUGLVfTKQKj0wM7TjwpJscRAE+lvgd16CYIZjQCEzXo4CUgP7APS/+oyX9Ugj3 XobBaH22vTysV8x1wxMtHgWnFsVjoNlUeIKVWpKrMknBY0QJDzViNP2eZFZcfwGF/NFM uxJA== X-Gm-Message-State: AOAM5308tgDasRhZVMzqoBtFkIpJG7CD/5BXWIbxT5gcgmhQutMJf0oJ qDil3viEoXpkHghzqiD+iGoG5YZU+M6+Ug== X-Google-Smtp-Source: ABdhPJzIY5/gPPjdRgYa+O4iISvJbvJCyGNRMlMIiNVt7NLE+LVgxVm/BJq40iq2wRMzlToLpurkew== X-Received: by 2002:a5d:404a:: with SMTP id w10mr5919011wrp.265.1589468306482; Thu, 14 May 2020 07:58:26 -0700 (PDT) Received: from localhost.localdomain (static.42.136.251.148.clients.your-server.de. [148.251.136.42]) by smtp.gmail.com with ESMTPSA id v8sm4374090wrs.45.2020.05.14.07.58.25 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 May 2020 07:58:25 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [PATCH 1/2] arm: Factorize several occurrences of the same code into reg_needs_saving_p Date: Thu, 14 May 2020 14:58:22 +0000 Message-Id: <1589468303-7890-1-git-send-email-christophe.lyon@linaro.org> X-Mailer: git-send-email 2.7.4 X-Spam-Status: No, score=-17.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: Christophe Lyon via Gcc-patches From: Christophe Lyon Reply-To: Christophe Lyon Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" The same code pattern occurs in several functions, so it seems cleaner to move it into a dedicated function. 2020-05-14 Christophe Lyon gcc/ * config/arm/arm.c (reg_needs_saving_p): New function. (use_return_insn): Use reg_needs_saving_p. (arm_get_vfp_saved_size): Likewise. (arm_compute_frame_layout): Likewise. (arm_save_coproc_regs): Likewise. (thumb1_expand_epilogue): Likewise. (arm_expand_epilogue_apcs_frame): Likewise. (arm_expand_epilogue): Likewise. --- gcc/config/arm/arm.c | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c88de3e..694c1bb 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -4188,6 +4188,18 @@ arm_trampoline_adjust_address (rtx addr) return addr; } +/* Return 1 if REG needs to be saved. */ +static bool reg_needs_saving_p (unsigned reg) +{ + unsigned long func_type = arm_current_func_type (); + + if (!df_regs_ever_live_p (reg) + || call_used_or_fixed_reg_p (reg)) + return false; + else + return true; +} + /* Return 1 if it is possible to return using a single instruction. If SIBLING is non-null, this is a test for a return before a sibling call. SIBLING is the call insn, so we can examine its register usage. */ @@ -4317,12 +4329,12 @@ use_return_insn (int iscond, rtx sibling) since this also requires an insn. */ if (TARGET_VFP_BASE) for (regno = FIRST_VFP_REGNUM; regno <= LAST_VFP_REGNUM; regno++) - if (df_regs_ever_live_p (regno) && !call_used_or_fixed_reg_p (regno)) + if (reg_needs_saving_p (regno)) return 0; if (TARGET_REALLY_IWMMXT) for (regno = FIRST_IWMMXT_REGNUM; regno <= LAST_IWMMXT_REGNUM; regno++) - if (df_regs_ever_live_p (regno) && ! call_used_or_fixed_reg_p (regno)) + if (reg_needs_saving_p (regno)) return 0; return 1; @@ -20943,7 +20955,6 @@ thumb1_compute_save_core_reg_mask (void) return mask; } - /* Return the number of bytes required to save VFP registers. */ static int arm_get_vfp_saved_size (void) @@ -20961,10 +20972,7 @@ arm_get_vfp_saved_size (void) regno < LAST_VFP_REGNUM; regno += 2) { - if ((!df_regs_ever_live_p (regno) - || call_used_or_fixed_reg_p (regno)) - && (!df_regs_ever_live_p (regno + 1) - || call_used_or_fixed_reg_p (regno + 1))) + if (!reg_needs_saving_p (regno) && !reg_needs_saving_p (regno + 1)) { if (count > 0) { @@ -22489,8 +22497,7 @@ arm_compute_frame_layout (void) for (regno = FIRST_IWMMXT_REGNUM; regno <= LAST_IWMMXT_REGNUM; regno++) - if (df_regs_ever_live_p (regno) - && !call_used_or_fixed_reg_p (regno)) + if (reg_needs_saving_p (regno)) saved += 8; } @@ -22711,8 +22718,9 @@ arm_save_coproc_regs(void) unsigned start_reg; rtx insn; + if (TARGET_REALLY_IWMMXT) for (reg = LAST_IWMMXT_REGNUM; reg >= FIRST_IWMMXT_REGNUM; reg--) - if (df_regs_ever_live_p (reg) && !call_used_or_fixed_reg_p (reg)) + if (reg_needs_saving_p (reg)) { insn = gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx); insn = gen_rtx_MEM (V2SImode, insn); @@ -22727,9 +22735,7 @@ arm_save_coproc_regs(void) for (reg = FIRST_VFP_REGNUM; reg < LAST_VFP_REGNUM; reg += 2) { - if ((!df_regs_ever_live_p (reg) || call_used_or_fixed_reg_p (reg)) - && (!df_regs_ever_live_p (reg + 1) - || call_used_or_fixed_reg_p (reg + 1))) + if (!reg_needs_saving_p (reg) && !reg_needs_saving_p (reg + 1)) { if (start_reg != reg) saved_size += vfp_emit_fstmd (start_reg, @@ -27024,7 +27030,7 @@ thumb1_expand_epilogue (void) /* Emit a clobber for each insn that will be restored in the epilogue, so that flow2 will get register lifetimes correct. */ for (regno = 0; regno < 13; regno++) - if (df_regs_ever_live_p (regno) && !call_used_or_fixed_reg_p (regno)) + if (reg_needs_saving_p (regno)) emit_clobber (gen_rtx_REG (SImode, regno)); if (! df_regs_ever_live_p (LR_REGNUM)) @@ -27090,9 +27096,7 @@ arm_expand_epilogue_apcs_frame (bool really_return) for (i = FIRST_VFP_REGNUM; i < LAST_VFP_REGNUM; i += 2) /* Look for a case where a reg does not need restoring. */ - if ((!df_regs_ever_live_p (i) || call_used_or_fixed_reg_p (i)) - && (!df_regs_ever_live_p (i + 1) - || call_used_or_fixed_reg_p (i + 1))) + if (!reg_needs_saving_p (i) && !reg_needs_saving_p (i + 1)) { if (start_reg != i) arm_emit_vfp_multi_reg_pop (start_reg, @@ -27119,7 +27123,7 @@ arm_expand_epilogue_apcs_frame (bool really_return) int lrm_count = (num_regs % 2) ? (num_regs + 2) : (num_regs + 1); for (i = LAST_IWMMXT_REGNUM; i >= FIRST_IWMMXT_REGNUM; i--) - if (df_regs_ever_live_p (i) && !call_used_or_fixed_reg_p (i)) + if (reg_needs_saving_p (i)) { rtx addr = gen_frame_mem (V2SImode, plus_constant (Pmode, hard_frame_pointer_rtx, @@ -27324,9 +27328,7 @@ arm_expand_epilogue (bool really_return) unlike pop, vldm can only do consecutive regs. */ for (i = LAST_VFP_REGNUM - 1; i >= FIRST_VFP_REGNUM; i -= 2) /* Look for a case where a reg does not need restoring. */ - if ((!df_regs_ever_live_p (i) || call_used_or_fixed_reg_p (i)) - && (!df_regs_ever_live_p (i + 1) - || call_used_or_fixed_reg_p (i + 1))) + if (!reg_needs_saving_p (i) && !reg_needs_saving_p (i + 1)) { /* Restore the regs discovered so far (from reg+2 to end_reg). */ @@ -27348,7 +27350,7 @@ arm_expand_epilogue (bool really_return) if (TARGET_IWMMXT) for (i = FIRST_IWMMXT_REGNUM; i <= LAST_IWMMXT_REGNUM; i++) - if (df_regs_ever_live_p (i) && !call_used_or_fixed_reg_p (i)) + if (reg_needs_saving_p (i)) { rtx_insn *insn; rtx addr = gen_rtx_MEM (V2SImode, From patchwork Thu May 14 14:58:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Lyon X-Patchwork-Id: 1290436 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gcc.gnu.org Authentication-Results: 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=VoAHyU08; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49NF6Z651fz9sRK for ; Fri, 15 May 2020 00:58:46 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 54260396E062; Thu, 14 May 2020 14:58:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 54260396E062 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1589468320; bh=TsWByOguPGyeMTbDxMpbYe1HKgbVZR0AB/vDxT9GArs=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=VoAHyU08SHUbVXO8AFNbap4BXQFLPFnWarp1Bf0DjfuL52CzT9j5Lvi/xV2Gda00G u0jU+so49Kz6JRZsxA2l2iIMvF9Q3KujDgOeNoputp9Z6ps0R4CBUaO4d5icp9Ez+L ODTimbBpNXNgtKeMX5xckCw0Om+mPYeOGQirPHhw= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wr1-x441.google.com (mail-wr1-x441.google.com [IPv6:2a00:1450:4864:20::441]) by sourceware.org (Postfix) with ESMTPS id EE8FD396E00F for ; Thu, 14 May 2020 14:58:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org EE8FD396E00F Received: by mail-wr1-x441.google.com with SMTP id l11so4604216wru.0 for ; Thu, 14 May 2020 07:58:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=TsWByOguPGyeMTbDxMpbYe1HKgbVZR0AB/vDxT9GArs=; b=A5/x7AnIBXxaxLkLm+IrtVwgI4ahtPKio5YplQ8pCxG4lgvKLuV8oFDN41GlZ2/OBL NHqRVWj9jgZwUlPBq5KukeG56B0BLg+TUO39WTOCuB6GIX9aLgRrrO+ZTPXv0KJSYpy6 2eNGERri7IOecEJhNs/VjiWiRtACOso0+UCMBoy6B1vPJ5ZtvSWS00pYOxWHcTHzKT7/ +O1ZTYUSoseQpZh1woL4z/ZU+FgkIyg4gwDfyeTq5bgyT78UudFhi7KImAS69ILm0pZJ x1Flspa0hHGtpc5CCe4SV8pNO0F/d+LB/52dFo4ORRlWeikcTpD6fY2HGOWEX4bZ0YX1 6jZQ== X-Gm-Message-State: AOAM533zZU6cYHQon7Nu31d/yLyRrGp+LRQjoFyjyqQU1sSJx76yw/+F 9z+EbFKovUNcLDXcjiHNcTEkpNTd7r4aLA== X-Google-Smtp-Source: ABdhPJzrMhauXdXA4rlyFcaDjYzg6ncPQrtMgP5BpCGnpBag7W5QKUulEdyiBhrfKDFkL67UeI0K+g== X-Received: by 2002:a5d:684f:: with SMTP id o15mr5724002wrw.89.1589468312532; Thu, 14 May 2020 07:58:32 -0700 (PDT) Received: from localhost.localdomain (static.42.136.251.148.clients.your-server.de. [148.251.136.42]) by smtp.gmail.com with ESMTPSA id v8sm4374090wrs.45.2020.05.14.07.58.31 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 May 2020 07:58:31 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [PATCH 2/2] arm: Add support for interrupt routines to reg_needs_saving_p Date: Thu, 14 May 2020 14:58:23 +0000 Message-Id: <1589468303-7890-2-git-send-email-christophe.lyon@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1589468303-7890-1-git-send-email-christophe.lyon@linaro.org> References: <1589468303-7890-1-git-send-email-christophe.lyon@linaro.org> X-Spam-Status: No, score=-17.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: Christophe Lyon via Gcc-patches From: Christophe Lyon Reply-To: Christophe Lyon Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" reg_needs_saving_p is only used when dealing with non-interrupt routines, but it makes sense to extend it to support that context too, and make arm_compute_save_reg0_reg12_mask use it. Save only live registers for non-leaf functions, but assume a callee could clobber any register. 2020-05-14 Christophe Lyon gcc/ * config/arm/arm.c (reg_needs_saving_p): Add support for interrupt routines. (arm_compute_save_reg0_reg12_mask): Use reg_needs_saving_p. --- gcc/config/arm/arm.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 694c1bb..0107f50 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -4188,16 +4188,29 @@ arm_trampoline_adjust_address (rtx addr) return addr; } -/* Return 1 if REG needs to be saved. */ +/* Return 1 if REG needs to be saved. For interrupt handlers, this + includes call-clobbered registers too. If this is a leaf function + we can just examine the registers used by the RTL, but otherwise we + have to assume that whatever function is called might clobber + anything, and so we have to save all the call-clobbered registers + as well. */ static bool reg_needs_saving_p (unsigned reg) { unsigned long func_type = arm_current_func_type (); - if (!df_regs_ever_live_p (reg) - || call_used_or_fixed_reg_p (reg)) - return false; + if (IS_INTERRUPT (func_type)) + if (df_regs_ever_live_p (reg) + /* Save call-clobbered core registers. */ + || (! crtl->is_leaf && call_used_or_fixed_reg_p (reg) && reg < FIRST_VFP_REGNUM)) + return true; + else + return false; else - return true; + if (!df_regs_ever_live_p (reg) + || call_used_or_fixed_reg_p (reg)) + return false; + else + return true; } /* Return 1 if it is possible to return using a single instruction. @@ -20685,8 +20698,7 @@ arm_compute_save_reg0_reg12_mask (void) max_reg = 12; for (reg = 0; reg <= max_reg; reg++) - if (df_regs_ever_live_p (reg) - || (! crtl->is_leaf && call_used_or_fixed_reg_p (reg))) + if (reg_needs_saving_p (reg)) save_reg_mask |= (1 << reg); /* Also save the pic base register if necessary. */