diff mbox

[11/11] make find_reg{,no}_fusage take rtx_insn *

Message ID 20161114080934.19056-12-tbsaunde+gcc@tbsaunde.org
State New
Headers show

Commit Message

tbsaunde+gcc@tbsaunde.org Nov. 14, 2016, 8:09 a.m. UTC
From: Trevor Saunders <tbsaunde+gcc@tbsaunde.org>

gcc/ChangeLog:

2016-11-14  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>

	* config/arm/arm-protos.h: Adjust prototype.
	* config/arm/arm.c (use_return_insn): Change argument type to
	rtx_insn *.
	* rtl.h (is_a_helper ::test): New specialization.
	* rtlanal.c (reg_set_p): Adjust.
	(find_reg_fusage): Change argument type to rtx_insn *.
	(find_regno_fusage): Likewise.
---
 gcc/config/arm/arm-protos.h |  2 +-
 gcc/config/arm/arm.c        |  2 +-
 gcc/rtl.h                   | 12 ++++++++++--
 gcc/rtlanal.c               | 23 +++++++++++++----------
 4 files changed, 25 insertions(+), 14 deletions(-)
diff mbox

Patch

diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h
index 95bae5e..539588b 100644
--- a/gcc/config/arm/arm-protos.h
+++ b/gcc/config/arm/arm-protos.h
@@ -23,7 +23,7 @@ 
 #define GCC_ARM_PROTOS_H
 
 extern enum unwind_info_type arm_except_unwind_info (struct gcc_options *);
-extern int use_return_insn (int, rtx);
+extern int use_return_insn (int, rtx_insn *);
 extern bool use_simple_return_p (void);
 extern enum reg_class arm_regno_class (int);
 extern void arm_load_pic_register (unsigned long);
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 3e63330..7f8ab8e 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3737,7 +3737,7 @@  arm_trampoline_adjust_address (rtx addr)
    call.  SIBLING is the call insn, so we can examine its register usage.  */
 
 int
-use_return_insn (int iscond, rtx sibling)
+use_return_insn (int iscond, rtx_insn *sibling)
 {
   int regno;
   unsigned int func_type;
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 03c1157..f8b6b95 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -907,6 +907,14 @@  is_a_helper <rtx_call_insn *>::test (rtx rt)
 template <>
 template <>
 inline bool
+is_a_helper <const rtx_call_insn *>::test (const_rtx rt)
+{
+  return CALL_P (rt);
+}
+
+template <>
+template <>
+inline bool
 is_a_helper <rtx_call_insn *>::test (rtx_insn *insn)
 {
   return CALL_P (insn);
@@ -3013,8 +3021,8 @@  extern rtx find_reg_note (const_rtx, enum reg_note, const_rtx);
 extern rtx find_regno_note (const_rtx, enum reg_note, unsigned int);
 extern rtx find_reg_equal_equiv_note (const rtx_insn *);
 extern rtx find_constant_src (const rtx_insn *);
-extern int find_reg_fusage (const_rtx, enum rtx_code, const_rtx);
-extern int find_regno_fusage (const_rtx, enum rtx_code, unsigned int);
+extern int find_reg_fusage (const rtx_insn *, enum rtx_code, const_rtx);
+extern int find_regno_fusage (const rtx_insn *, enum rtx_code, unsigned int);
 extern rtx alloc_reg_note (enum reg_note, rtx, rtx);
 extern void add_reg_note (rtx, enum reg_note, rtx);
 extern void add_int_reg_note (rtx_insn *, enum reg_note, int);
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 9cd24bb..e85da56 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -1196,14 +1196,17 @@  reg_set_p (const_rtx reg, const_rtx insn)
   /* We can be passed an insn or part of one.  If we are passed an insn,
      check if a side-effect of the insn clobbers REG.  */
   if (INSN_P (insn)
-      && (FIND_REG_INC_NOTE (insn, reg)
-	  || (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)))
-		  || MEM_P (reg)
-		  || find_reg_fusage (insn, CLOBBER, reg)))))
+      && FIND_REG_INC_NOTE (insn, reg))
+    return true;
+
+  const rtx_call_insn *call = dyn_cast<const rtx_call_insn *> (insn);
+  if (call
+      && ((REG_P (reg)
+	   && REGNO (reg) < FIRST_PSEUDO_REGISTER
+	   && overlaps_hard_reg_set_p (regs_invalidated_by_call,
+				       GET_MODE (reg), REGNO (reg)))
+	  || MEM_P (reg)
+	  || find_reg_fusage (call, CLOBBER, reg)))
     return true;
 
   return set_of (reg, insn) != NULL_RTX;
@@ -2165,7 +2168,7 @@  find_constant_src (const rtx_insn *insn)
    in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
 
 int
-find_reg_fusage (const_rtx insn, enum rtx_code code, const_rtx datum)
+find_reg_fusage (const rtx_insn *insn, enum rtx_code code, const_rtx datum)
 {
   /* If it's not a CALL_INSN, it can't possibly have a
      CALL_INSN_FUNCTION_USAGE field, so don't bother checking.  */
@@ -2210,7 +2213,7 @@  find_reg_fusage (const_rtx insn, enum rtx_code code, const_rtx datum)
    in the CALL_INSN_FUNCTION_USAGE information of INSN.  */
 
 int
-find_regno_fusage (const_rtx insn, enum rtx_code code, unsigned int regno)
+find_regno_fusage (const rtx_insn *insn, enum rtx_code code, unsigned int regno)
 {
   rtx link;