ping

On 25/11/2021 13:53, Andre Vieira (lists) via Gcc-patches wrote:

On 22/11/2021 11:41, Richard Biener wrote:

On 18/11/2021 11:05, Richard Biener wrote:
This is a good shout and made me think about something I hadn't before... I thought I could handle the vector forms later, but the problem is if I add
support for the scalar, it will stop the vectorizer. It seems
vectorizable_call expects all arguments to have the same type, which doesn't
work with passing the integer type as an operand work around.
We already special case some IFNs there (masked load/store and gather)
to ignore some args, so that would just add to this set.

Richard.
Hi,

Reworked it to add support of the new IFN to the vectorizer. Was initially trying to make vectorizable_call and vectorizable_internal_function handle IFNs with different inputs more generically, using the information we have in the <IFN>_direct structs regarding what operands to get the modes from. Unfortunately, that wasn't straightforward because of how vectorizable_call assumes operands have the same type and uses the type of the DEF_STMT_INFO of the non-constant operands (either output operand or non-constant inputs) to determine the type of constants. I assume there is some reason why we use the DEF_STMT_INFO and not always use get_vectype_for_scalar_type on the argument types. That is why I ended up with this sort of half-way mix of both, which still allows room to add more IFNs that don't take inputs of the same type, but require adding a bit of special casing similar to the IFN_FTRUNC_INT and masking ones.

Bootstrapped on aarch64-none-linux.

OK for trunk?

gcc/ChangeLog:

        * config/aarch64/aarch64.md (ftrunc<mode><frintnz_mode>2): New pattern.
        * config/aarch64/iterators.md (FRINTNZ): New iterator.
        (frintnz_mode): New int attribute.
        (VSFDF): Make iterator conditional.
        * internal-fn.def (FTRUNC_INT): New IFN.
        * internal-fn.c (ftrunc_int_direct): New define.
        (expand_ftrunc_int_optab_fn): New custom expander.
        (direct_ftrunc_int_optab_supported_p): New supported_p.
        * match.pd: Add to the existing TRUNC pattern match.
        * optabs.def (ftrunc_int): New entry.
        * stor-layout.h (element_precision): Moved from here...
        * tree.h (element_precision): ... to here.
        (element_type): New declaration.
        * tree.c (element_type): New function.
        (element_precision): Changed to use element_type.
        * tree-vect-stmts.c (vectorizable_internal_function): Add support for
        IFNs with different input types.
        (vectorizable_call): Teach to handle IFN_FTRUNC_INT.
        * doc/md.texi: New entry for ftrunc pattern name.
        * doc/sourcebuild.texi (aarch64_frintzx_ok): New target.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/merge_trunc1.c: Adapted to skip if frintNz instruction available.
        * lib/target-supports.exp: Added arm_v8_5a_frintnzx_ok target.
        * gcc.target/aarch64/frintnz.c: New test.
        * gcc.target/aarch64/frintnz_vec.c: New test.

Reply via email to