Li, Pan2 via Gcc-patches <gcc-patches@gcc.gnu.org>於 2023年7月12日 週三,15:07寫道:

> Thank Juzhe for review. Sure, let me hold the v3 for kito's comments.
>
> Pan
>
> From: juzhe.zh...@rivai.ai <juzhe.zh...@rivai.ai>
> Sent: Wednesday, July 12, 2023 2:11 PM
> To: Li, Pan2 <pan2...@intel.com>; gcc-patches <gcc-patches@gcc.gnu.org>
> Cc: Robin Dapp <rdapp....@gmail.com>; jeffreyalaw <jeffreya...@gmail.com>;
> Li, Pan2 <pan2...@intel.com>; Wang, Yanzhang <yanzhang.w...@intel.com>;
> kito.cheng <kito.ch...@gmail.com>
> Subject: Re: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM
>
>
> +regnum_definition_p (rtx_insn *insn, unsigned int regno)
>
> I prefer it to be reg_set_p.
>
>
>
> +insn_asm_p (rtx_insn *insn)
>
> asm_insn_p
>
>
>
> +global_vxrm_state_unknown_p
>
> vxrm_unknown_p
>
>
>
> +global_frm_state_unknown_p (rtx_insn *insn)
>
> FRM of CALL function is not "UNKNOWN" unlike VXRM.
>
> It just change into another unknown(may be same or different from previous
> dynamic mode) Dynamic mode.
>
> frm_unknown_dynamic_p
>
>
>
> The reset refactoring looks good.
>
> Let's see whether kito has more comments.
>
>
>
> Thanks.
>
> ________________________________
> juzhe.zh...@rivai.ai<mailto:juzhe.zh...@rivai.ai>
>
> From: pan2.li<mailto:pan2...@intel.com>
> Date: 2023-07-12 13:50
> To: gcc-patches<mailto:gcc-patches@gcc.gnu.org>
> CC: juzhe.zhong<mailto:juzhe.zh...@rivai.ai>; rdapp.gcc<mailto:
> rdapp....@gmail.com>; jeffreyalaw<mailto:jeffreya...@gmail.com>; pan2.li
> <mailto:pan2...@intel.com>; yanzhang.wang<mailto:yanzhang.w...@intel.com>;
> kito.cheng<mailto:kito.ch...@gmail.com>
> Subject: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM
> From: Pan Li <pan2...@intel.com<mailto:pan2...@intel.com>>
>
> When investigate the FRM dynmaic rounding mode, we find the global
> unknown status is quite different between the fixed-point and
> floating-point. Thus, we separate the unknown function with extracting
> some inner common functions.
>
> We will also prepare more test cases in another PATCH.
>
> Signed-off-by: Pan Li <pan2...@intel.com<mailto:pan2...@intel.com>>
>
> gcc/ChangeLog:
>
> * config/riscv/riscv.cc (regnum_definition_p): New function.
> (insn_asm_p): Ditto.
> (riscv_vxrm_mode_after): New function for fixed-point.
> (global_vxrm_state_unknown_p): Ditto.
> (riscv_frm_mode_after): New function for floating-point.
> (global_frm_state_unknown_p): Ditto.
> (riscv_mode_after): Leverage new functions.
> (riscv_entity_mode_after): Removed.
> ---
> gcc/config/riscv/riscv.cc | 96 +++++++++++++++++++++++++++++++++------
> 1 file changed, 82 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index 38d8eb2fcf5..553fbb4435a 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -7742,19 +7742,91 @@ global_state_unknown_p (rtx_insn *insn, unsigned
> int regno)
>    return false;
> }
> +static bool
> +regnum_definition_p (rtx_insn *insn, unsigned int regno)
> +{
> +  df_ref ref;
> +  struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
> +
> +  /* Return true if there is a definition of regno.  */
> +  for (ref = DF_INSN_INFO_DEFS (insn_info); ref; ref = DF_REF_NEXT_LOC
> (ref))
> +    if (DF_REF_REGNO (ref) == regno)
> +      return true;
> +
> +  return false;
> +}
> +
> +static bool
> +insn_asm_p (rtx_insn *insn)
> +{
> +  extract_insn (insn);
> +
> +  return recog_data.is_asm;
> +}
> +
> +static bool
> +global_vxrm_state_unknown_p (rtx_insn *insn)
> +{
> +  /* Return true if there is a definition of VXRM.  */
> +  if (regnum_definition_p (insn, VXRM_REGNUM))
> +    return true;
> +
> +  /* A CALL function may contain an instruction that modifies the VXRM,
> +     return true in this situation.  */
> +  if (CALL_P (insn))
> +    return true;
> +
> +  /* Return true for all assembly since users may hardcode a assembly
> +     like this: asm volatile ("csrwi vxrm, 0").  */
> +  if (insn_asm_p (insn))
> +    return true;
> +
> +  return false;
> +}
> +
> +static bool
> +global_frm_state_unknown_p (rtx_insn *insn)
> +{
> +  /* Return true if there is a definition of FRM.  */
> +  if (regnum_definition_p (insn, FRM_REGNUM))
> +    return true;
> +
> +  /* A CALL function may contain an instruction that modifies the FRM,
> +     return true in this situation.  */
> +  if (CALL_P (insn))
> +    return true;
> +
> +  return false;
> +}
> +
> static int
> -riscv_entity_mode_after (int regnum, rtx_insn *insn, int mode,
> - int (*get_attr_mode) (rtx_insn *), int default_mode)
> +riscv_vxrm_mode_after (rtx_insn *insn, int mode)
> {
> -  if (global_state_unknown_p (insn, regnum))
> -    return default_mode;
> -  else if (recog_memoized (insn) < 0)
> +  if (global_vxrm_state_unknown_p (insn))
> +    return VXRM_MODE_NONE;
> +
> +  if (recog_memoized (insn) < 0)
> +    return mode;
> +
> +  if (reg_mentioned_p (gen_rtx_REG (SImode, VXRM_REGNUM), PATTERN (insn)))


Extract vxrm reg to a local static variable to prevent construct that again
and again.


> +    return get_attr_vxrm_mode (insn);
> +  else
>      return mode;
> +}
> -  rtx reg = gen_rtx_REG (SImode, regnum);
> -  bool mentioned_p = reg_mentioned_p (reg, PATTERN (insn));
> +static int
> +riscv_frm_mode_after (rtx_insn *insn, int mode)
> +{
> +  if (global_frm_state_unknown_p (insn))
> +    return FRM_MODE_NONE;
> -  return mentioned_p ? get_attr_mode (insn): mode;
> +  if (recog_memoized (insn) < 0)
> +    return mode;
> +
> +  if (reg_mentioned_p (gen_rtx_REG (SImode, FRM_REGNUM), PATTERN (insn)))


Same here



> +    return get_attr_frm_mode (insn);
> +  else
> +    return mode;
> }
> /* Return the mode that an insn results in.  */
> @@ -7765,13 +7837,9 @@ riscv_mode_after (int entity, int mode, rtx_insn
> *insn)
>    switch (entity)
>      {
>      case RISCV_VXRM:
> -      return riscv_entity_mode_after (VXRM_REGNUM, insn, mode,
> -       (int (*)(rtx_insn *)) get_attr_vxrm_mode,
> -       VXRM_MODE_NONE);
> +      return riscv_vxrm_mode_after (insn, mode);
>      case RISCV_FRM:
> -      return riscv_entity_mode_after (FRM_REGNUM, insn, mode,
> -       (int (*)(rtx_insn *)) get_attr_frm_mode,
> -       FRM_MODE_DYN);
> +      return riscv_frm_mode_after (insn, mode);
>      default:
>        gcc_unreachable ();
>      }
> --
> 2.34.1
>
>
>

Reply via email to