[PING] PATCH v5 4/4] ree: Improve ree pass for rs6000 target using defined ABI interfaces.
All: Ok for trunk. Please review. Thanks & Regards Ajit On 26/06/23 6:12 pm, Ajit Agarwal via Gcc-patches wrote: > All: > > Ok for trunk. Please review. > > Thanks & Regards > Ajit > > On 01/06/23 10:53 am, Ajit Agarwal via Gcc-patches wrote: >> Hello All: >> >> This new version of patch 4 use improve ree pass for rs6000 target using >> defined ABI interfaces. >> Bootstrapped and regtested on power64-linux-gnu. >> >> Review comments incorporated. >> >> Thanks & Regards >> Ajit >> >> Improve ree pass for rs6000 target using defined abi interfaces >> >> For rs6000 target we see redundant zero and sign >> extension and done to improve ree pass to eliminate >> such redundant zero and sign extension using defined >> ABI interfaces. >> >> 2023-06-01 Ajit Kumar Agarwal >> >> gcc/ChangeLog: >> >> * ree.cc (combine_reaching_defs): Use of zero_extend and sign_extend >> defined abi interfaces. >> (add_removable_extension): Use of defined abi interfaces for no >> reaching defs. >> (abi_extension_candidate_return_reg_p): New function. >> (abi_extension_candidate_p): New function. >> (abi_extension_candidate_argno_p): New function. >> (abi_handle_regs_without_defs_p): New function. >> (abi_target_promote_function_mode): New function. >> >> gcc/testsuite/ChangeLog: >> >> * g++.target/powerpc/zext-elim-3.C >> --- >> gcc/ree.cc| 199 +++--- >> .../g++.target/powerpc/zext-elim-3.C | 13 ++ >> 2 files changed, 183 insertions(+), 29 deletions(-) >> create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-3.C >> >> diff --git a/gcc/ree.cc b/gcc/ree.cc >> index fc04249fa84..2025a7c43da 100644 >> --- a/gcc/ree.cc >> +++ b/gcc/ree.cc >> @@ -514,7 +514,8 @@ get_uses (rtx_insn *insn, rtx reg) >> if (REGNO (DF_REF_REG (def)) == REGNO (reg)) >>break; >> >> - gcc_assert (def != NULL); >> + if (def == NULL) >> +return NULL; >> >>ref_chain = DF_REF_CHAIN (def); >> >> @@ -750,6 +751,120 @@ get_extended_src_reg (rtx src) >>return src; >> } >> >> +/* Return TRUE if target mode is equal to source mode of zero_extend >> + or sign_extend otherwise false. */ >> + >> +static bool >> +abi_target_promote_function_mode (machine_mode mode) >> +{ >> + int unsignedp; >> + machine_mode tgt_mode = >> +targetm.calls.promote_function_mode (NULL_TREE, mode, , >> + NULL_TREE, 1); >> + >> + if (tgt_mode == mode) >> +return true; >> + else >> +return false; >> +} >> + >> +/* Return TRUE if the candidate insn is zero extend and regno is >> + an return registers. */ >> + >> +static bool >> +abi_extension_candidate_return_reg_p (rtx_insn *insn, int regno) >> +{ >> + rtx set = single_set (insn); >> + >> + if (GET_CODE (SET_SRC (set)) != ZERO_EXTEND) >> +return false; >> + >> + if (FUNCTION_VALUE_REGNO_P (regno)) >> +return true; >> + >> + return false; >> +} >> + >> +/* Return TRUE if reg source operand of zero_extend is argument registers >> + and not return registers and source and destination operand are same >> + and mode of source and destination operand are not same. */ >> + >> +static bool >> +abi_extension_candidate_p (rtx_insn *insn) >> +{ >> + rtx set = single_set (insn); >> + >> + if (GET_CODE (SET_SRC (set)) != ZERO_EXTEND) >> +return false; >> + >> + machine_mode ext_dst_mode = GET_MODE (SET_DEST (set)); >> + rtx orig_src = XEXP (SET_SRC (set),0); >> + >> + bool copy_needed >> += (REGNO (SET_DEST (set)) != REGNO (XEXP (SET_SRC (set), 0))); >> + >> + if (!copy_needed && ext_dst_mode != GET_MODE (orig_src) >> + && FUNCTION_ARG_REGNO_P (REGNO (orig_src)) >> + && !abi_extension_candidate_return_reg_p (insn, REGNO (orig_src))) >> +return true; >> + >> + return false; >> +} >> + >> +/* Return TRUE if the candidate insn is zero extend and regno is >> + an argument registers. */ >> + >> +static bool >> +abi_extension_candidate_argno_p (rtx_code code, int regno) >> +{ >> + if (code != ZERO_EXTEND) >> +return false; >> + >> + if (FUNCTION_ARG_REGNO_P (regno)) >> +return true; >> + >> + return false; >> +} >> + >> +/* Return TRUE if the candidate insn doesn't have defs and have >> + * uses without RTX_BIN_ARITH/RTX_COMM_ARITH/RTX_UNARY rtx class. */ >> + >> +static bool >> +abi_handle_regs_without_defs_p (rtx_insn *insn) >> +{ >> + if (side_effects_p (PATTERN (insn))) >> +return false; >> + >> + struct df_link *uses >> += get_uses (insn, SET_DEST (PATTERN (insn))); >> + >> + if (!uses) >> +return false; >> + >> + for (df_link *use = uses; use; use = use->next) >> +{ >> + if (!use->ref) >> +return false; >> + >> + if (BLOCK_FOR_INSN (insn) >> + != BLOCK_FOR_INSN (DF_REF_INSN (use->ref))) >> +return false; >> + >> + rtx_insn *use_insn = DF_REF_INSN (use->ref); >> + >> + if (GET_CODE (PATTERN (use_insn)) == SET) >> +{ >> +
[PING] PATCH v5 4/4] ree: Improve ree pass for rs6000 target using defined ABI interfaces.
All: Ok for trunk. Please review. Thanks & Regards Ajit On 01/06/23 10:53 am, Ajit Agarwal via Gcc-patches wrote: > Hello All: > > This new version of patch 4 use improve ree pass for rs6000 target using > defined ABI interfaces. > Bootstrapped and regtested on power64-linux-gnu. > > Review comments incorporated. > > Thanks & Regards > Ajit > > Improve ree pass for rs6000 target using defined abi interfaces > > For rs6000 target we see redundant zero and sign > extension and done to improve ree pass to eliminate > such redundant zero and sign extension using defined > ABI interfaces. > > 2023-06-01 Ajit Kumar Agarwal > > gcc/ChangeLog: > > * ree.cc (combine_reaching_defs): Use of zero_extend and sign_extend > defined abi interfaces. > (add_removable_extension): Use of defined abi interfaces for no > reaching defs. > (abi_extension_candidate_return_reg_p): New function. > (abi_extension_candidate_p): New function. > (abi_extension_candidate_argno_p): New function. > (abi_handle_regs_without_defs_p): New function. > (abi_target_promote_function_mode): New function. > > gcc/testsuite/ChangeLog: > > * g++.target/powerpc/zext-elim-3.C > --- > gcc/ree.cc| 199 +++--- > .../g++.target/powerpc/zext-elim-3.C | 13 ++ > 2 files changed, 183 insertions(+), 29 deletions(-) > create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-3.C > > diff --git a/gcc/ree.cc b/gcc/ree.cc > index fc04249fa84..2025a7c43da 100644 > --- a/gcc/ree.cc > +++ b/gcc/ree.cc > @@ -514,7 +514,8 @@ get_uses (rtx_insn *insn, rtx reg) > if (REGNO (DF_REF_REG (def)) == REGNO (reg)) >break; > > - gcc_assert (def != NULL); > + if (def == NULL) > +return NULL; > >ref_chain = DF_REF_CHAIN (def); > > @@ -750,6 +751,120 @@ get_extended_src_reg (rtx src) >return src; > } > > +/* Return TRUE if target mode is equal to source mode of zero_extend > + or sign_extend otherwise false. */ > + > +static bool > +abi_target_promote_function_mode (machine_mode mode) > +{ > + int unsignedp; > + machine_mode tgt_mode = > +targetm.calls.promote_function_mode (NULL_TREE, mode, , > + NULL_TREE, 1); > + > + if (tgt_mode == mode) > +return true; > + else > +return false; > +} > + > +/* Return TRUE if the candidate insn is zero extend and regno is > + an return registers. */ > + > +static bool > +abi_extension_candidate_return_reg_p (rtx_insn *insn, int regno) > +{ > + rtx set = single_set (insn); > + > + if (GET_CODE (SET_SRC (set)) != ZERO_EXTEND) > +return false; > + > + if (FUNCTION_VALUE_REGNO_P (regno)) > +return true; > + > + return false; > +} > + > +/* Return TRUE if reg source operand of zero_extend is argument registers > + and not return registers and source and destination operand are same > + and mode of source and destination operand are not same. */ > + > +static bool > +abi_extension_candidate_p (rtx_insn *insn) > +{ > + rtx set = single_set (insn); > + > + if (GET_CODE (SET_SRC (set)) != ZERO_EXTEND) > +return false; > + > + machine_mode ext_dst_mode = GET_MODE (SET_DEST (set)); > + rtx orig_src = XEXP (SET_SRC (set),0); > + > + bool copy_needed > += (REGNO (SET_DEST (set)) != REGNO (XEXP (SET_SRC (set), 0))); > + > + if (!copy_needed && ext_dst_mode != GET_MODE (orig_src) > + && FUNCTION_ARG_REGNO_P (REGNO (orig_src)) > + && !abi_extension_candidate_return_reg_p (insn, REGNO (orig_src))) > +return true; > + > + return false; > +} > + > +/* Return TRUE if the candidate insn is zero extend and regno is > + an argument registers. */ > + > +static bool > +abi_extension_candidate_argno_p (rtx_code code, int regno) > +{ > + if (code != ZERO_EXTEND) > +return false; > + > + if (FUNCTION_ARG_REGNO_P (regno)) > +return true; > + > + return false; > +} > + > +/* Return TRUE if the candidate insn doesn't have defs and have > + * uses without RTX_BIN_ARITH/RTX_COMM_ARITH/RTX_UNARY rtx class. */ > + > +static bool > +abi_handle_regs_without_defs_p (rtx_insn *insn) > +{ > + if (side_effects_p (PATTERN (insn))) > +return false; > + > + struct df_link *uses > += get_uses (insn, SET_DEST (PATTERN (insn))); > + > + if (!uses) > +return false; > + > + for (df_link *use = uses; use; use = use->next) > +{ > + if (!use->ref) > + return false; > + > + if (BLOCK_FOR_INSN (insn) > + != BLOCK_FOR_INSN (DF_REF_INSN (use->ref))) > + return false; > + > + rtx_insn *use_insn = DF_REF_INSN (use->ref); > + > + if (GET_CODE (PATTERN (use_insn)) == SET) > + { > + rtx_code code = GET_CODE (SET_SRC (PATTERN (use_insn))); > + > + if (GET_RTX_CLASS (code) == RTX_BIN_ARITH > + || GET_RTX_CLASS (code) == RTX_COMM_ARITH > + || GET_RTX_CLASS (code) == RTX_UNARY) > + return false; > + } > +