This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 2/4 GCC11] Add target hook stride_dform_valid_p
- From: Richard Sandiford <richard dot sandiford at arm dot com>
- To: "Kewen.Lin" <linkw at linux dot ibm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Segher Boessenkool <segher at kernel dot crashing dot org>, Bill Schmidt <wschmidt at linux dot ibm dot com>, "bin.cheng" <bin dot cheng at linux dot alibaba dot com>, Richard Guenther <rguenther at suse dot de>
- Date: Mon, 20 Jan 2020 10:42:12 +0000
- Subject: Re: [PATCH 2/4 GCC11] Add target hook stride_dform_valid_p
- References: <ddd8c186-fc88-96df-b1c0-f99edec654f2@linux.ibm.com> <c58c8a2d-7b02-7946-d9ce-1c8f60342cad@linux.ibm.com>
"Kewen.Lin" <linkw@linux.ibm.com> writes:
> gcc/ChangeLog
>
> 2020-01-16 Kewen Lin <linkw@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.
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.
Thanks,
Richard
>
> gcc/config/rs6000/rs6000.c | 40 ++++++++++++++++++++++++++++++++++++++++
> gcc/doc/tm.texi | 8 ++++++++
> gcc/doc/tm.texi.in | 2 ++
> gcc/target.def | 13 ++++++++++++-
> 4 files changed, 62 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
> index 0dabaa6..1e41fcf 100644
> --- a/gcc/config/rs6000/rs6000.c
> +++ b/gcc/config/rs6000/rs6000.c
> @@ -1657,6 +1657,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_STRIDE_DFORM_VALID_P
> +#define TARGET_STRIDE_DFORM_VALID_P rs6000_stride_dform_valid_p
> +
> #undef TARGET_HAVE_COUNT_REG_DECR_P
> #define TARGET_HAVE_COUNT_REG_DECR_P true
>
> @@ -26272,6 +26275,43 @@ rs6000_predict_doloop_p (struct loop *loop)
> return true;
> }
>
> +/* Return true if the memory access with mode MODE, signedness SIGNED_P and
> + store STORE_P with offset from 0 to (NUNROLL-1) * STRIDE are valid with
> + D-form instructions. */
> +
> +static bool
> +rs6000_stride_dform_valid_p (machine_mode mode, signed HOST_WIDE_INT stride,
> + bool signed_p, bool store_p, unsigned nunroll)
> +{
> + static const HOST_WIDE_INT max_bound = 0x7fff;
> + static const HOST_WIDE_INT min_bound = -0x8000;
> +
> + if (!IN_RANGE ((nunroll - 1) * stride, min_bound, max_bound))
> + return false;
> +
> + /* Check DQ-form for vector mode or float128 mode. */
> + if (VECTOR_MODE_P (mode) || FLOAT128_VECTOR_P (mode))
> + {
> + if (mode_supports_dq_form (mode) && !(stride & 0xF))
> + return true;
> + else
> + return false;
> + }
> +
> + /* Simply consider non VSX instructions. */
> + if (mode == QImode || mode == HImode || mode == SFmode || mode == DFmode)
> + return true;
> +
> + /* lwz/stw is D-form, but lwa is DS-form. */
> + if (mode == SImode && (!signed_p || store_p || !(stride & 0x03)))
> + return true;
> +
> + if (mode == DImode && !(stride & 0x03))
> + return true;
> +
> + return false;
> +}
> +
> struct gcc_target targetm = TARGET_INITIALIZER;
>
> #include "gt-rs6000.h"
> diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
> index 86ad278..0b8bc7c 100644
> --- a/gcc/doc/tm.texi
> +++ b/gcc/doc/tm.texi
> @@ -11669,6 +11669,14 @@ function version at run-time for a given set of function versions.
> body must be generated.
> @end deftypefn
>
> +@deftypefn {Target Hook} bool TARGET_STRIDE_DFORM_VALID_P (machine_mode @var{mode}, signed HOST_WIDE_INT @var{stride}, bool @var{signed_p}, bool @var{store_p}, unsigned @var{nunroll})
> +For a given memory access, check whether it is valid to put 0, @var{stride}
> +, 2 * @var{stride}, ... , (@var{nunroll} - 1) to the instruction D-form
> +displacement, with mode @var{mode}, signedness @var{signed_p} and store
> +@var{store_p}. Return true if valid.
> +The default version of this hook returns false.
> +@end deftypefn
> +
> @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 fd9769e..e90d020 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_STRIDE_DFORM_VALID_P
> +
> @hook TARGET_PREDICT_DOLOOP_P
>
> @hook TARGET_HAVE_COUNT_REG_DECR_P
> diff --git a/gcc/target.def b/gcc/target.def
> index f61c831..ee19a8d 100644
> --- a/gcc/target.def
> +++ b/gcc/target.def
> @@ -4300,7 +4300,18 @@ 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)
> -
> +
> +DEFHOOK
> +(stride_dform_valid_p,
> + "For a given memory access, check whether it is valid to put 0, @var{stride}\n\
> +, 2 * @var{stride}, ... , (@var{nunroll} - 1) to the instruction D-form\n\
> +displacement, with mode @var{mode}, signedness @var{signed_p} and store\n\
> +@var{store_p}. Return true if valid.\n\
> +The default version of this hook returns false.",
> + bool, (machine_mode mode, signed HOST_WIDE_INT stride, bool signed_p,
> + bool store_p, unsigned nunroll),
> + NULL)
> +
> DEFHOOK
> (predict_doloop_p,
> "Return true if we can predict it is possible to use a low-overhead loop\n\