on 2020/1/20 下午9:14, Segher Boessenkool wrote: > Hi! > > On Mon, Jan 20, 2020 at 10:42:12AM +0000, Richard Sandiford wrote: >> "Kewen.Lin" <li...@linux.ibm.com> writes: >>> gcc/ChangeLog >>> >>> 2020-01-16 Kewen Lin <li...@gcc.gnu.org> >>> >>> * config/rs6000/rs6000.c (TARGET_STRIDE_DFORM_VALID_P): New macro. >>> (rs6000_stride_dform_valid_p): New function. >>> * doc/tm.texi: Regenerate. >>> * doc/tm.texi.in (TARGET_STRIDE_DFORM_VALID_P): New hook. >>> * target.def (stride_dform_valid_p): New hook. >> >> It looks like we should able to derive this information from the normal >> legitimate_address_p hook. > > Yes, probably. > >> Also, "D-form" vs. "X-form" is AFAIK a PowerPC-specific classification. >> It would be good to use a more generic term in target-independent code. > > Yeah. X-form is [reg+reg] addressing; D-form is [reg+imm] addressing. > We can do simple [reg] addressing in either form as well. Whether D-form > can be used for some access depends on many factors (ISA version, mode of > the datum, alignment, and how big the offset is of course). But the usual > legitimate_address_p hook should do fine. The ivopts code already has an > addr_offset_valid_p function, maybe that could be adjusted for this? > > > Segher >
Hi Segher and Richard S., Sorry for late response. Thanks for your comments on legitimate_address_p hook and function addr_offset_valid_p. I updated the IVOPTs part with addr_offset_valid_p, although rs6000_legitimate_offset_address_p doesn't check strictly all the time (like worst_case is false), it works well with SPEC2017. Based on it, the hook is simplified as attached patch. BR, Kewen ----------- gcc/ChangeLog 2020-02-25 Kewen Lin <li...@gcc.gnu.org> * config/rs6000/rs6000.c (TARGET_CONSIDER_REG_OFFSET_FOR_UNROLL_P): New macro. * doc/tm.texi: Regenerate. * doc/tm.texi.in (TARGET_CONSIDER_REG_OFFSET_FOR_UNROLL_P): New hook. * target.def (consider_reg_offset_for_unroll_p): New hook.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 4c1c0e9..0eb13df 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1652,6 +1652,9 @@ static const struct attribute_spec rs6000_attribute_table[] = #undef TARGET_PREDICT_DOLOOP_P #define TARGET_PREDICT_DOLOOP_P rs6000_predict_doloop_p +#undef TARGET_CONSIDER_REG_OFFSET_FOR_UNROLL_P +#define TARGET_CONSIDER_REG_OFFSET_FOR_UNROLL_P true + #undef TARGET_HAVE_COUNT_REG_DECR_P #define TARGET_HAVE_COUNT_REG_DECR_P true diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 19985ad..fc21a3b 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -11680,6 +11680,18 @@ function version at run-time for a given set of function versions. body must be generated. @end deftypefn +@deftypevr {Target Hook} bool TARGET_CONSIDER_REG_OFFSET_FOR_UNROLL_P +When RTL unrolling performs on a loop, the duplicated loop iterations +have appropriate IV step update expressions. But if an IV is derived from +address object, it is profitable to fill its required offset updates into +appropriate memory access expressions if target memory accessing supports +the register offset mode and the resulted offset is in the valid range. +Return true if target supports register offset memory accessing mode and +wants IVOPTs or other passes to consider this information for better code +for unrolling. It needs to invoke unroll factor estimation in middle-end. +The default version of this hook returns false. +@end deftypevr + @deftypefn {Target Hook} bool TARGET_PREDICT_DOLOOP_P (class loop *@var{loop}) Return true if we can predict it is possible to use a low-overhead loop for a particular loop. The parameter @var{loop} is a pointer to the loop. diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 1a16150..45377d3 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -7953,6 +7953,8 @@ to by @var{ce_info}. @hook TARGET_GENERATE_VERSION_DISPATCHER_BODY +@hook TARGET_CONSIDER_REG_OFFSET_FOR_UNROLL_P + @hook TARGET_PREDICT_DOLOOP_P @hook TARGET_HAVE_COUNT_REG_DECR_P diff --git a/gcc/target.def b/gcc/target.def index b5e82ff..a966d4f 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -4299,7 +4299,20 @@ DEFHOOK emits a @code{speculation_barrier} instruction if that is defined.", rtx, (machine_mode mode, rtx result, rtx val, rtx failval), default_speculation_safe_value) - + +DEFHOOKPOD +(consider_reg_offset_for_unroll_p, + "When RTL unrolling performs on a loop, the duplicated loop iterations\n\ +have appropriate IV step update expressions. But if an IV is derived from\n\ +address object, it is profitable to fill its required offset updates into\n\ +appropriate memory access expressions if target memory accessing supports\n\ +the register offset mode and the resulted offset is in the valid range.\n\ +Return true if target supports register offset memory accessing mode and\n\ +wants IVOPTs or other passes to consider this information for better code\n\ +for unrolling. It needs to invoke unroll factor estimation in middle-end.\n\ +The default version of this hook returns false.", + bool, false) + DEFHOOK (predict_doloop_p, "Return true if we can predict it is possible to use a low-overhead loop\n\