On Sat, 22 Apr 2023, 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.
> 
> Thanks & Regards
> Ajit
> 
> 
>       ree: 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 defines
>         ABI interfaces.
> 
>         2023-04-22  Ajit Kumar Agarwal  <aagar...@linux.ibm.com>
> 
> gcc/ChangeLog:
> 
>         * ree.cc (combline_reaching_defs): Add zero_extend
>         using defined abi interfaces.
>         (add_removable_extension): use of defined abi interfaces
>         for no reaching defs.
>         (abi_extension_candidate_return_reg_p): New defined ABI function.
>         (abi_extension_candidate_p): New defined ABI function.
>         (abi_extension_candidate_argno_p): New defined ABI function.
>         (abi_handle_regs_without_defs_p): New defined ABI function.
> 
> gcc/testsuite/ChangeLog:
> 
>         * g++.target/powerpc/zext-elim-3.C
> ---
>  gcc/ree.cc                                    | 176 +++++++++++++++---
>  .../g++.target/powerpc/zext-elim-3.C          |  16 ++
>  2 files changed, 162 insertions(+), 30 deletions(-)
>  create mode 100644 gcc/testsuite/g++.target/powerpc/zext-elim-3.C
> 
> diff --git a/gcc/ree.cc b/gcc/ree.cc
> index 413aec7c8eb..0de96b1ece1 100644
> --- a/gcc/ree.cc
> +++ b/gcc/ree.cc
> @@ -473,7 +473,8 @@ get_defs (rtx_insn *insn, rtx reg, vec<rtx_insn *> *dest)
>       break;
>      }
>  
> -  gcc_assert (use != NULL);
> +  if (use == NULL)
> +    return NULL;
>  
>    ref_chain = DF_REF_CHAIN (use);
>  
> @@ -514,7 +515,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 +752,103 @@ get_extended_src_reg (rtx src)
>    return src;
>  }
>  
> +/* 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;
> +}

I don't see anything in those functions that checks if 
ZERO_EXTEND is actually a feature of the ABI, e.g. as opposed to 
no extension or SIGN_EXTEND.  Do I miss something?

Also, "!=  ZERO_EXTEND" has too many spaces, copy-pasted in 
several (all?) places.

Also, s/an return  registers/a return register/ (three errors).

brgds, H-P

Reply via email to