[PATCH] [PATCH] PR rtl-optimization/96791 Check precision of partial modes

Richard Sandiford richard.sandiford@arm.com
Thu Sep 10 09:32:51 GMT 2020


Aaron Sawdey <acsawdey@linux.ibm.com> writes:
> Now that the documentation for partial modes says they have a known
> number of bits of precision, would it make sense for extract_low_bits to
> check this before attempting to extract the bits?
>
> This would solve the problem we have been having with POImode and
> extract_low_bits -- DSE tries to use it to extract part of a POImode
> register used in a previous store. We do not want to supply any patterns
> to make POImode (or OImode) used like a regular integer mode.
>
> This patch adds such a check, and sets the precision of POImode to one
> bit, which resolves the problems of PR/96791 for ppc64 target.
>
> Bootstrap passes on ppc64le and x86_64.
>
> Thanks,
>    Aaron
>
> gcc/ChangeLog:
>
> 	* config/rs6000/rs6000-modes.def (POImode): Change precision.
> 	* expmed.c (extract_low_bits): Check precision.
> ---
>  gcc/config/rs6000/rs6000-modes.def | 2 +-
>  gcc/expmed.c                       | 3 +++
>  2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/config/rs6000/rs6000-modes.def b/gcc/config/rs6000/rs6000-modes.def
> index ddb218b3fba..aa7d60dd835 100644
> --- a/gcc/config/rs6000/rs6000-modes.def
> +++ b/gcc/config/rs6000/rs6000-modes.def
> @@ -90,5 +90,5 @@ INT_MODE (OI, 32);
>  INT_MODE (XI, 64);
>  
>  /* Modes used by __vector_pair and __vector_quad.  */
> -PARTIAL_INT_MODE (OI, 256, POI);	/* __vector_pair.  */
> +PARTIAL_INT_MODE (OI, 1, POI);	/* __vector_pair.  */
>  PARTIAL_INT_MODE (XI, 512, PXI);	/* __vector_quad.  */
> diff --git a/gcc/expmed.c b/gcc/expmed.c
> index d34f0fb0b54..23ca181afa6 100644
> --- a/gcc/expmed.c
> +++ b/gcc/expmed.c
> @@ -2396,6 +2396,9 @@ extract_low_bits (machine_mode mode, machine_mode src_mode, rtx src)
>    if (GET_MODE_CLASS (mode) == MODE_CC || GET_MODE_CLASS (src_mode) == MODE_CC)
>      return NULL_RTX;
>  
> +  if (known_lt (GET_MODE_PRECISION (src_mode), GET_MODE_BITSIZE (mode)))
> +    return NULL_RTX;

extract_low_bits has defined semantics when MODE is wider than SRC_MODE:

     - when MODE is wider than SRC_MODE, the extraction involves
       a zero extension

Also, I'd be worried that setting the precision to 1 (although a nice
hack for some things) could lead to miscompilation, since it would be
telling target-independent code that only the low bit of the mode is
significant.

Thanks,
Richard


More information about the Gcc-patches mailing list