Sure and committed, thanks Kito. Pan
-----Original Message----- From: Kito Cheng <kito.ch...@gmail.com> Sent: Thursday, July 13, 2023 5:19 PM To: Li, Pan2 <pan2...@intel.com> Cc: Jeff Law <jeffreya...@gmail.com>; gcc-patches@gcc.gnu.org; juzhe.zh...@rivai.ai; rdapp....@gmail.com; Wang, Yanzhang <yanzhang.w...@intel.com> Subject: Re: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM Hmmm, anyway, I guess it's not worth spending any more of your time, LGTM for v3 :) On Thu, Jul 13, 2023 at 5:10 PM Li, Pan2 via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > It can pass the selftest with below diff based on v3, but got ICE when build > newlib. > > /home/pli/repos/gcc/222/riscv-gnu-toolchain/newlib/newlib/libc/time/../time/strftime.c:1426:1: > internal compiler error: in reg_overlap_mentioned_p, at rtlanal.cc:1928 > 1426 | } > | ^ > 0x87241f reg_overlap_mentioned_p(rtx_def const*, rtx_def const*) > ../.././gcc/gcc/rtlanal.cc:1928 > 0x1005eab set_of_1 > ../.././gcc/gcc/rtlanal.cc:1440 > 0x10015c2 set_of(rtx_def const*, rtx_def const*) > ../.././gcc/gcc/rtlanal.cc:1452 > 0x10015c2 reg_set_p(rtx_def const*, rtx_def const*) > ../.././gcc/gcc/rtlanal.cc:1295 > 0x13f66c0 vxrm_unknown_p > ../.././gcc/gcc/config/riscv/riscv.cc:7720 > 0x13f66c0 riscv_vxrm_mode_after > ../.././gcc/gcc/config/riscv/riscv.cc:7760 > 0x13f66c0 riscv_mode_after > ../.././gcc/gcc/config/riscv/riscv.cc:7799 > 0x1defe69 optimize_mode_switching > ../.././gcc/gcc/mode-switching.cc:632 > 0x1defe69 execute > ../.././gcc/gcc/mode-switching.cc:909 > > > Diff based on PATCH v3. > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > index 6ed735d6983..d66ba0030eb 100644 > --- a/gcc/config/riscv/riscv.cc > +++ b/gcc/config/riscv/riscv.cc > @@ -7714,10 +7714,10 @@ asm_insn_p (rtx_insn *insn) > /* Return TRUE that an insn is unknown for VXRM. */ > > static bool > -vxrm_unknown_p (rtx_insn *insn) > +vxrm_unknown_p (rtx_insn *insn, const_rtx vxrm_reg) > { > /* Return true if there is a definition of VXRM. */ > - if (reg_set_p (gen_rtx_REG (SImode, VXRM_REGNUM), insn)) > + if (reg_set_p (vxrm_reg, insn)) > return true; > > /* A CALL function may contain an instruction that modifies the VXRM, > @@ -7736,10 +7736,10 @@ vxrm_unknown_p (rtx_insn *insn) > /* Return TRUE that an insn is unknown dynamic for FRM. */ > > static bool > -frm_unknown_dynamic_p (rtx_insn *insn) > +frm_unknown_dynamic_p (rtx_insn *insn, const_rtx frm_reg) > { > /* Return true if there is a definition of FRM. */ > - if (reg_set_p (gen_rtx_REG (SImode, FRM_REGNUM), insn)) > + if (reg_set_p (frm_reg, insn)) > return true; > > /* A CALL function may contain an instruction that modifies the FRM, > @@ -7755,13 +7755,15 @@ frm_unknown_dynamic_p (rtx_insn *insn) > static int > riscv_vxrm_mode_after (rtx_insn *insn, int mode) > { > - if (vxrm_unknown_p (insn)) > + static const_rtx vxrm_reg = gen_rtx_REG (SImode, VXRM_REGNUM); > + > + if (vxrm_unknown_p (insn, vxrm_reg)) > return VXRM_MODE_NONE; > > if (recog_memoized (insn) < 0) > return mode; > > - if (reg_mentioned_p (gen_rtx_REG (SImode, VXRM_REGNUM), PATTERN (insn))) > + if (reg_mentioned_p (vxrm_reg, PATTERN (insn))) > return get_attr_vxrm_mode (insn); > else > return mode; > @@ -7772,13 +7774,15 @@ riscv_vxrm_mode_after (rtx_insn *insn, int mode) > static int > riscv_frm_mode_after (rtx_insn *insn, int mode) > { > - if (frm_unknown_dynamic_p (insn)) > + static const_rtx frm_reg = gen_rtx_REG (SImode, FRM_REGNUM); > + > + if (frm_unknown_dynamic_p (insn, frm_reg)) > return FRM_MODE_DYN; > > if (recog_memoized (insn) < 0) > return mode; > > - if (reg_mentioned_p (gen_rtx_REG (SImode, FRM_REGNUM), PATTERN (insn))) > + if (reg_mentioned_p (frm_reg, PATTERN (insn))) > return get_attr_frm_mode (insn); > else > return mode; > > Pan > > -----Original Message----- > From: Li, Pan2 > Sent: Thursday, July 13, 2023 4:42 PM > To: Kito Cheng <kito.ch...@gmail.com> > Cc: Jeff Law <jeffreya...@gmail.com>; gcc-patches@gcc.gnu.org; > juzhe.zh...@rivai.ai; rdapp....@gmail.com; Wang, Yanzhang > <yanzhang.w...@intel.com> > Subject: RE: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM > > Sure thing, get you point now, will have a try and send v4 if everything goes > well. > > Pan > > -----Original Message----- > From: Kito Cheng <kito.ch...@gmail.com> > Sent: Thursday, July 13, 2023 3:35 PM > To: Li, Pan2 <pan2...@intel.com> > Cc: Jeff Law <jeffreya...@gmail.com>; gcc-patches@gcc.gnu.org; > juzhe.zh...@rivai.ai; rdapp....@gmail.com; Wang, Yanzhang > <yanzhang.w...@intel.com> > Subject: Re: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM > > oh, I know why you failed on that, you need to put it within the > function, not global static, function static variable will construct > when first invoked rather than construct at program start. > > Could you try to apply my diff in the last mail and try again? > > On Thu, Jul 13, 2023 at 3:29 PM Li, Pan2 via Gcc-patches > <gcc-patches@gcc.gnu.org> wrote: > > > > Thanks Kito for review. Sorry didn't involve the code result in self test > > error in PATCH v3, but it can be reproduced with below diff based on PATCH > > v3. Let me know if I didn't get the point of your comments. > > > > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > > index 6ed735d6983..76689eaf8d5 100644 > > --- a/gcc/config/riscv/riscv.cc > > +++ b/gcc/config/riscv/riscv.cc > > @@ -233,6 +233,9 @@ static int epilogue_cfa_sp_offset; > > /* Which tuning parameters to use. */ > > static const struct riscv_tune_param *tune_param; > > > > +static const_rtx vxrm_rtx = gen_rtx_REG (SImode, VXRM_REGNUM); > > +static const_rtx frm_rtx = gen_rtx_REG (SImode, FRM_REGNUM); > > + > > /* Which automaton to use for tuning. */ > > enum riscv_microarchitecture_type riscv_microarchitecture; > > > > @@ -7717,7 +7720,7 @@ static bool > > vxrm_unknown_p (rtx_insn *insn) > > { > > /* Return true if there is a definition of VXRM. */ > > - if (reg_set_p (gen_rtx_REG (SImode, VXRM_REGNUM), insn)) > > + if (reg_set_p (vxrm_rtx, insn)) > > return true; > > > > /* A CALL function may contain an instruction that modifies the VXRM, > > @@ -7739,7 +7742,7 @@ static bool > > frm_unknown_dynamic_p (rtx_insn *insn) > > { > > /* Return true if there is a definition of FRM. */ > > - if (reg_set_p (gen_rtx_REG (SImode, FRM_REGNUM), insn)) > > + if (reg_set_p (frm_rtx, insn)) > > return true; > > > > /* A CALL function may contain an instruction that modifies the FRM, > > @@ -7761,7 +7764,7 @@ riscv_vxrm_mode_after (rtx_insn *insn, int mode) > > if (recog_memoized (insn) < 0) > > return mode; > > > > - if (reg_mentioned_p (gen_rtx_REG (SImode, VXRM_REGNUM), PATTERN (insn))) > > + if (reg_mentioned_p (vxrm_rtx, PATTERN (insn))) > > return get_attr_vxrm_mode (insn); > > else > > return mode; > > @@ -7778,7 +7781,7 @@ riscv_frm_mode_after (rtx_insn *insn, int mode) > > if (recog_memoized (insn) < 0) > > return mode; > > > > - if (reg_mentioned_p (gen_rtx_REG (SImode, FRM_REGNUM), PATTERN (insn))) > > + if (reg_mentioned_p (frm_rtx, PATTERN (insn))) > > return get_attr_frm_mode (insn); > > else > > return mode; > > > > Pan > > > > -----Original Message----- > > From: Kito Cheng <kito.ch...@gmail.com> > > Sent: Thursday, July 13, 2023 2:19 PM > > To: Li, Pan2 <pan2...@intel.com> > > Cc: Jeff Law <jeffreya...@gmail.com>; gcc-patches@gcc.gnu.org; > > juzhe.zh...@rivai.ai; rdapp....@gmail.com; Wang, Yanzhang > > <yanzhang.w...@intel.com> > > Subject: Re: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM > > > > Hmmm? I didn't get that error on selftest? > > > > my diff with your v2: > > > > $ git diff > > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > > index 12655f7fdc65..466e1aed91c7 100644 > > --- a/gcc/config/riscv/riscv.cc > > +++ b/gcc/config/riscv/riscv.cc > > @@ -8058,8 +8058,9 @@ asm_insn_p (rtx_insn *insn) > > static bool > > vxrm_unknown_p (rtx_insn *insn) > > { > > + static const_rtx vxrm_reg = gen_rtx_REG (SImode, VXRM_REGNUM); > > /* Return true if there is a definition of VXRM. */ > > - if (reg_set_p (gen_rtx_REG (SImode, VXRM_REGNUM), insn)) > > + if (reg_set_p (vxrm_reg, insn)) > > return true; > > > > /* A CALL function may contain an instruction that modifies the VXRM, > > @@ -8080,8 +8081,9 @@ vxrm_unknown_p (rtx_insn *insn) > > static bool > > frm_unknown_dynamic_p (rtx_insn *insn) > > { > > + static const_rtx frm_reg = gen_rtx_REG (SImode, FRM_REGNUM); > > /* Return true if there is a definition of FRM. */ > > - if (reg_set_p (gen_rtx_REG (SImode, FRM_REGNUM), insn)) > > + if (reg_set_p (frm_reg, insn)) > > return true; > > > > /* A CALL function may contain an instruction that modifies the FRM, > > > > > > On Thu, Jul 13, 2023 at 1:07 PM Li, Pan2 via Gcc-patches > > <gcc-patches@gcc.gnu.org> wrote: > > > > > > Thanks Jeff and Kito for comments, update the V3 version as below. > > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2023-July/624347.html > > > > > > > Extract vxrm reg to a local static variable to prevent construct that > > > > again and again. > > > > > > The "static const_rtx vxrm_rtx = gen_rtx_REG (SImode, VXRM_REGMU)" > > > results in some error when selftest like below, thus patch v3 doesn't > > > include this change. > > > > > > /home/pli/repos/gcc/111/riscv-gnu-toolchain/build-gcc-newlib-stage1/./gcc/xgcc > > > > > > -B/home/pli/repos/gcc/111/riscv-gnu-toolchain/build-gcc-newlib-stage1/./gcc/ > > > -xc -nostdinc /dev/null -S -o /dev/null > > > -fself-test=../.././gcc/gcc/testsuite/selftests > > > virtual memory exhausted: Invalid argument > > > make[2]: *** [../.././gcc/gcc/c/Make-lang.in:153: s-selftest-c] Error 1 > > > > > > Pan > > > > > > -----Original Message----- > > > From: Jeff Law <jeffreya...@gmail.com> > > > Sent: Wednesday, July 12, 2023 11:31 PM > > > To: Li, Pan2 <pan2...@intel.com>; gcc-patches@gcc.gnu.org > > > Cc: juzhe.zh...@rivai.ai; rdapp....@gmail.com; Wang, Yanzhang > > > <yanzhang.w...@intel.com>; kito.ch...@gmail.com > > > Subject: Re: [PATCH v2] RISC-V: Refactor riscv mode after for VXRM and FRM > > > > > > > > > > > > On 7/11/23 23:50, pan2...@intel.com wrote: > > > > From: Pan Li <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> > > > > > > > > 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) > > > Needs a function comment. This is true for each new function added. In > > > this specific case somethign like this might be appropriate > > > > > > /* Return TRUE if REGNO is set in INSN, FALSE otherwise. */ > > > > > > Which begs the question, is there some reason why we're not using the > > > existing reg_set_p or simple_regno_set from rtlanal.cc? > > > > > > > > > > > > Jeff