From: Trevor Saunders <tbsaunde+...@tbsaunde.org> gcc/ChangeLog:
2016-11-14 Trevor Saunders <tbsaunde+...@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 --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; -- 2.9.3.dirty