On Mon, 26 Jun 2023, Robin Dapp wrote:

> Hi,
> 
> this patch changes TYPE_MODE into element_mode in a match.pd
> simplification.  As the simplification can be called with vector types
> real_can_shorten_arithmetic would ICE in REAL_MODE_FORMAT which
> expects a scalar mode.  Therefore, use element_mode instead of
> TYPE_MODE.
> 
> Additionally, check if the target supports the resulting operation in the
> new mode.  One target that supports e.g. a float addition but not a
> _Float16 addition is the RISC-V vector Float16 extension Zvfhmin.
> 
> Bootstrap on x86_64 succeeded, testsuite is currently running.  Is this OK
> if the testsuite is clean?

The element_mode passing is OK.  We don't do a target support check
in any other place when non-vector operations are involved.

Can you push the element_mode change separately please?

I'd like to hear more reasoning of why target_supports_op_p is wanted
here.  Doesn't target_supports_op_p return false if this is for example
a soft-fp target?  So if at all, shouldn't the test only be carried
out if the original operation was supported by the target?

Thanks,
Richard.

> Regards
>  Robin
> 
> gcc/ChangeLog:
> 
>       * match.pd: Use element_mode and check if target supports
>       operation with new type.
> ---
>  gcc/match.pd | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 33ccda3e7b6..4a200f221f6 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -7454,10 +7454,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>                 values representable in the TYPE to be within the
>                 range of normal values of ITYPE.  */
>             (if (element_precision (newtype) < element_precision (itype)
> +                && target_supports_op_p (newtype, op, optab_default)
>                  && (flag_unsafe_math_optimizations
>                      || (element_precision (newtype) == element_precision 
> (type)
> -                        && real_can_shorten_arithmetic (TYPE_MODE (itype),
> -                                                        TYPE_MODE (type))
> +                        && real_can_shorten_arithmetic (element_mode (itype),
> +                                                        element_mode (type))
>                          && !excess_precision_type (newtype)))
>                  && !types_match (itype, newtype))
>                (convert:type (op (convert:newtype @1)
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)

Reply via email to