@@ -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);
@@ -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;
@@ -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);
@@ -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;
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(-)