[AArch64] Make more use of function_abi
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 30 Sep 2019 16:47:39 +0000 (16:47 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 30 Sep 2019 16:47:39 +0000 (16:47 +0000)
This patch makes more use of the function_abi infrastructure.
We can then avoid checking specifically for the vector PCS in
a few places, and can test it more directly otherwise.

Specifically: we no longer need to call df_set_regs_ever_live
for the extra call-saved registers, since IRA now does that for us.
We also don't need to handle the vector PCS specially in
aarch64_epilogue_uses, because DF now marks the registers
as live on exit.

2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/aarch64/aarch64.c (aarch64_layout_frame): Use crtl->abi
to test whether we're compiling a vector PCS function and to test
whether the function needs to save a particular register.
Remove the vector PCS handling of df_set_regs_ever_live.
(aarch64_components_for_bb): Use crtl->abi to test whether
the function needs to save a particular register.
(aarch64_process_components): Use crtl->abi to test whether
we're compiling a vector PCS function.
(aarch64_expand_prologue, aarch64_expand_epilogue): Likewise.
(aarch64_epilogue_uses): Remove handling of vector PCS functions.

From-SVN: r276341

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 7b0bcef0248d8a107f7a2be8a4943d033657411a..c3f77270629f1d00d00b0a1410a9e06f8f8a991f 100644 (file)
@@ -1,3 +1,16 @@
+2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/aarch64/aarch64.c (aarch64_layout_frame): Use crtl->abi
+       to test whether we're compiling a vector PCS function and to test
+       whether the function needs to save a particular register.
+       Remove the vector PCS handling of df_set_regs_ever_live.
+       (aarch64_components_for_bb): Use crtl->abi to test whether
+       the function needs to save a particular register.
+       (aarch64_process_components): Use crtl->abi to test whether
+       we're compiling a vector PCS function.
+       (aarch64_expand_prologue, aarch64_expand_epilogue): Likewise.
+       (aarch64_epilogue_uses): Remove handling of vector PCS functions.
+
 2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/aarch64/aarch64-protos.h (aarch64_use_simple_return_insn_p):
index 3da92a2d41aa573d747bfa5051604039d9159124..ec180c8bd4f850b101b08d96efedb2c5e53b1f93 100644 (file)
@@ -5334,7 +5334,7 @@ aarch64_layout_frame (void)
 {
   HOST_WIDE_INT offset = 0;
   int regno, last_fp_reg = INVALID_REGNUM;
-  bool simd_function = aarch64_simd_decl_p (cfun->decl);
+  bool simd_function = (crtl->abi->id () == ARM_PCS_SIMD);
 
   cfun->machine->frame.emit_frame_chain = aarch64_needs_frame_chain ();
 
@@ -5348,17 +5348,6 @@ aarch64_layout_frame (void)
   cfun->machine->frame.wb_candidate1 = INVALID_REGNUM;
   cfun->machine->frame.wb_candidate2 = INVALID_REGNUM;
 
-  /* If this is a non-leaf simd function with calls we assume that
-     at least one of those calls is to a non-simd function and thus
-     we must save V8 to V23 in the prologue.  */
-
-  if (simd_function && !crtl->is_leaf)
-    {
-      for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
-       if (FP_SIMD_SAVED_REGNUM_P (regno))
-         df_set_regs_ever_live (regno, true);
-    }
-
   /* First mark all the registers that really need to be saved...  */
   for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
     cfun->machine->frame.reg_offset[regno] = SLOT_NOT_REQUIRED;
@@ -5375,14 +5364,15 @@ aarch64_layout_frame (void)
   /* ... and any callee saved register that dataflow says is live.  */
   for (regno = R0_REGNUM; regno <= R30_REGNUM; regno++)
     if (df_regs_ever_live_p (regno)
+       && !fixed_regs[regno]
        && (regno == R30_REGNUM
-           || !call_used_or_fixed_reg_p (regno)))
+           || !crtl->abi->clobbers_full_reg_p (regno)))
       cfun->machine->frame.reg_offset[regno] = SLOT_REQUIRED;
 
   for (regno = V0_REGNUM; regno <= V31_REGNUM; regno++)
     if (df_regs_ever_live_p (regno)
-       && (!call_used_or_fixed_reg_p (regno)
-           || (simd_function && FP_SIMD_SAVED_REGNUM_P (regno))))
+       && !fixed_regs[regno]
+       && !crtl->abi->clobbers_full_reg_p (regno))
       {
        cfun->machine->frame.reg_offset[regno] = SLOT_REQUIRED;
        last_fp_reg = regno;
@@ -5971,7 +5961,6 @@ aarch64_components_for_bb (basic_block bb)
   bitmap in = DF_LIVE_IN (bb);
   bitmap gen = &DF_LIVE_BB_INFO (bb)->gen;
   bitmap kill = &DF_LIVE_BB_INFO (bb)->kill;
-  bool simd_function = aarch64_simd_decl_p (cfun->decl);
 
   sbitmap components = sbitmap_alloc (LAST_SAVED_REGNUM + 1);
   bitmap_clear (components);
@@ -5994,8 +5983,8 @@ aarch64_components_for_bb (basic_block bb)
 
   /* GPRs are used in a bb if they are in the IN, GEN, or KILL sets.  */
   for (unsigned regno = 0; regno <= LAST_SAVED_REGNUM; regno++)
-    if ((!call_used_or_fixed_reg_p (regno)
-       || (simd_function && FP_SIMD_SAVED_REGNUM_P (regno)))
+    if (!fixed_regs[regno]
+       && !crtl->abi->clobbers_full_reg_p (regno)
        && (TEST_HARD_REG_BIT (extra_caller_saves, regno)
            || bitmap_bit_p (in, regno)
            || bitmap_bit_p (gen, regno)
@@ -6100,7 +6089,7 @@ aarch64_process_components (sbitmap components, bool prologue_p)
         mergeable with the current one into a pair.  */
       if (!satisfies_constraint_Ump (mem)
          || GP_REGNUM_P (regno) != GP_REGNUM_P (regno2)
-         || (aarch64_simd_decl_p (cfun->decl) && FP_REGNUM_P (regno))
+         || (crtl->abi->id () == ARM_PCS_SIMD && FP_REGNUM_P (regno))
          || maybe_ne ((offset2 - cfun->machine->frame.reg_offset[regno]),
                       GET_MODE_SIZE (mode)))
        {
@@ -6432,8 +6421,6 @@ aarch64_epilogue_uses (int regno)
     {
       if (regno == LR_REGNUM)
        return 1;
-      if (aarch64_simd_decl_p (cfun->decl) && FP_SIMD_SAVED_REGNUM_P (regno))
-       return 1;
     }
   return 0;
 }
@@ -6634,7 +6621,7 @@ aarch64_expand_prologue (void)
 
   aarch64_save_callee_saves (DImode, callee_offset, R0_REGNUM, R30_REGNUM,
                             callee_adjust != 0 || emit_frame_chain);
-  if (aarch64_simd_decl_p (cfun->decl))
+  if (crtl->abi->id () == ARM_PCS_SIMD)
     aarch64_save_callee_saves (TFmode, callee_offset, V0_REGNUM, V31_REGNUM,
                               callee_adjust != 0 || emit_frame_chain);
   else
@@ -6733,7 +6720,7 @@ aarch64_expand_epilogue (bool for_sibcall)
 
   aarch64_restore_callee_saves (DImode, callee_offset, R0_REGNUM, R30_REGNUM,
                                callee_adjust != 0, &cfi_ops);
-  if (aarch64_simd_decl_p (cfun->decl))
+  if (crtl->abi->id () == ARM_PCS_SIMD)
     aarch64_restore_callee_saves (TFmode, callee_offset, V0_REGNUM, V31_REGNUM,
                                  callee_adjust != 0, &cfi_ops);
   else