Remove global call sets: rtlanal.c
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 30 Sep 2019 16:21:28 +0000 (16:21 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 30 Sep 2019 16:21:28 +0000 (16:21 +0000)
The reg_set_p part is simple, since the caller is asking about
a specific REG rtx, with a known register number and mode.

The find_all_hard_reg_sets part emphasises that the "implicit"
behaviour was always a bit suspect, since it includes fully-clobbered
registers but not partially-clobbered registers.  The only current
user of this path is the c6x-specific scheduler predication code,
and c6x doesn't have partly call-clobbered registers, so in practice
it's fine.  I've added a comment to try to disuade future users.
(The !implicit path is OK and useful though.)

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

gcc/
* rtlanal.c: Include function-abi.h.
(reg_set_p): Use insn_callee_abi to get the ABI of the called
function and clobbers_reg_p to test whether the register
is call-clobbered.
(find_all_hard_reg_sets): When implicit is true, use insn_callee_abi
to get the ABI of the called function and full_reg_clobbers to
get the set of fully call-clobbered registers.  Warn about the
pitfalls of using this mode.

From-SVN: r276334

gcc/ChangeLog
gcc/rtlanal.c

index 3887c43f1ffac623ca76dbf2f06c2d6fd81b816f..046fbfc842585905a4107a3f1fcf52c2f37cfc5d 100644 (file)
@@ -1,3 +1,14 @@
+2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * rtlanal.c: Include function-abi.h.
+       (reg_set_p): Use insn_callee_abi to get the ABI of the called
+       function and clobbers_reg_p to test whether the register
+       is call-clobbered.
+       (find_all_hard_reg_sets): When implicit is true, use insn_callee_abi
+       to get the ABI of the called function and full_reg_clobbers to
+       get the set of fully call-clobbered registers.  Warn about the
+       pitfalls of using this mode.
+
 2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
 
        * reload.c: Include function-abi.h.
index 9c70eee4ccb1b1da765f2f80a0c90c23fb457a19..6adef47d9a68db06611b9ae237a3afa4095eca0c 100644 (file)
@@ -36,6 +36,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "addresses.h"
 #include "rtl-iter.h"
 #include "hard-reg-set.h"
+#include "function-abi.h"
 
 /* Forward declarations */
 static void set_of_1 (rtx, const_rtx, void *);
@@ -1270,8 +1271,8 @@ reg_set_p (const_rtx reg, const_rtx insn)
          || (CALL_P (insn)
              && ((REG_P (reg)
                   && REGNO (reg) < FIRST_PSEUDO_REGISTER
-                  && overlaps_hard_reg_set_p (regs_invalidated_by_call,
-                                              GET_MODE (reg), REGNO (reg)))
+                  && (insn_callee_abi (as_a<const rtx_insn *> (insn))
+                      .clobbers_reg_p (GET_MODE (reg), REGNO (reg))))
                  || MEM_P (reg)
                  || find_reg_fusage (insn, CLOBBER, reg)))))
     return true;
@@ -1486,7 +1487,11 @@ record_hard_reg_sets (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
 }
 
 /* Examine INSN, and compute the set of hard registers written by it.
-   Store it in *PSET.  Should only be called after reload.  */
+   Store it in *PSET.  Should only be called after reload.
+
+   IMPLICIT is true if we should include registers that are fully-clobbered
+   by calls.  This should be used with caution, since it doesn't include
+   partially-clobbered registers.  */
 void
 find_all_hard_reg_sets (const rtx_insn *insn, HARD_REG_SET *pset, bool implicit)
 {
@@ -1495,7 +1500,7 @@ find_all_hard_reg_sets (const rtx_insn *insn, HARD_REG_SET *pset, bool implicit)
   CLEAR_HARD_REG_SET (*pset);
   note_stores (insn, record_hard_reg_sets, pset);
   if (CALL_P (insn) && implicit)
-    *pset |= call_used_or_fixed_regs;
+    *pset |= insn_callee_abi (insn).full_reg_clobbers ();
   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
     if (REG_NOTE_KIND (link) == REG_INC)
       record_hard_reg_sets (XEXP (link, 0), NULL, pset);