arm: Factorize several occurrences of the same code into reg_needs_saving_p
authorChristophe Lyon <christophe.lyon@linaro.org>
Mon, 4 May 2020 13:41:34 +0000 (13:41 +0000)
committerChristophe Lyon <christophe.lyon@linaro.org>
Thu, 14 May 2020 15:38:24 +0000 (15:38 +0000)
The same code pattern occurs in several functions, so it seems cleaner
to move it into a dedicated function.

2020-05-14  Christophe Lyon  <christophe.lyon@linaro.org>

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/ChangeLog
gcc/config/arm/arm.c

index 6b707cd1f0899d6156da054a69ea3b7548ee87ef..156fd6cc8dc310fe5da557d7edea6cf3d63c9d37 100644 (file)
@@ -1,3 +1,14 @@
+2020-05-14  Christophe Lyon  <christophe.lyon@linaro.org>
+
+       * 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.
+
 2020-05-14  Christophe Lyon  <christophe.lyon@linaro.org>
 
         * config/arm/arm.c (thumb1_expand_prologue): Update error message.
index 98abda6a6f0c8ab07a5c37817f01116163a83df0..3dab6145987395817bac42b7ebf4dc745a99cae2 100644 (file)
@@ -4188,6 +4188,16 @@ arm_trampoline_adjust_address (rtx addr)
   return addr;
 }
 \f
+/* Return 1 if REG needs to be saved.   */
+static inline bool reg_needs_saving_p (unsigned reg)
+{
+  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 +4327,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;
@@ -20937,7 +20947,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)
@@ -20955,10 +20964,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)
                {
@@ -22483,8 +22489,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;
        }
 
@@ -22705,8 +22710,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);
@@ -22721,9 +22727,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,
@@ -27018,7 +27022,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))
@@ -27084,9 +27088,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,
@@ -27113,7 +27115,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,
@@ -27318,9 +27320,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).  */
@@ -27342,7 +27342,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,