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 _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 (ftrunc2): 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.