On Fri, Aug 30, 2024 at 4:41 AM Jennifer Schmitz <jschm...@nvidia.com> wrote:
>
> This patch implements constant folding of binary operations for SVE intrinsics
> by calling the constant-folding mechanism of the middle-end for a given
> tree_code.
> In fold-const.cc, the code for folding vector constants was moved from
> const_binop to a new function vector_const_binop. This function takes a
> function pointer as argument specifying how to fold the vector elements.
> The code for folding operations where the first operand is a vector
> constant and the second argument is an integer constant was also moved
> into vector_const_binop to fold binary SVE intrinsics where the second
> operand is an integer (_n).
> In the aarch64 backend, the new function aarch64_const_binop was
> created, which - in contrast to int_const_binop - does not treat operations as
> overflowing. This function is passed as callback to vector_const_binop
> during gimple folding in intrinsic implementations.
> Because aarch64_const_binop calls poly_int_binop, the latter was made public.
>
> The patch was bootstrapped and regtested on aarch64-linux-gnu, no regression.
> OK for mainline?

This broke almost all targets (except for aarch64 and riscv since
those are NUM_POLY_INT_COEFFS  != 1 targets).
Because the assert in poly_int_binop for NUM_POLY_INT_COEFFS is now
before the check for both arg1/arg2 being INTEGER_CST since you moved
that from int_const_binop into poly_int_binop.

The obvious patch would move the assert below the check for
INTEGER_CSTs. I can't test it right now though.

Thanks,
Andrew Pinski

>
> Signed-off-by: Jennifer Schmitz <jschm...@nvidia.com>
>
> gcc/
>         * config/aarch64/aarch64-sve-builtins.cc (aarch64_const_binop):
>         New function to fold binary SVE intrinsics without overflow.
>         * config/aarch64/aarch64-sve-builtins.h: Declare aarch64_const_binop.
>         * fold-const.h: Declare vector_const_binop.
>         * fold-const.cc (const_binop): Remove cases for vector constants.
>         (vector_const_binop): New function that folds vector constants
>         element-wise.
>         (int_const_binop): Remove call to wide_int_binop.
>         (poly_int_binop): Add call to wide_int_binop.

Reply via email to