]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Allow RVV intrinsic for more function target
authorPan Li <pan2.li@intel.com>
Tue, 2 Apr 2024 14:22:29 +0000 (22:22 +0800)
committerPan Li <pan2.li@intel.com>
Mon, 8 Apr 2024 01:29:30 +0000 (09:29 +0800)
commitaf3a9807435a114c62f44f9d55456a3d37e0c25b
treeea17014127044c93d9e40d78bf0a5be22bb39263
parent8f0ff6b998748f3581e0f06e3108193866b1209d
RISC-V: Allow RVV intrinsic for more function target

In previous, we allowed the target(("arch=+v")) for a function with
rv64gc build.  This patch would like to support more arch options as
below:
* zve32x
* zve32f
* zve64x
* zve64f
* zve64d
* zvfhmin
* zvfh
* zvk*
* zvbb

For example, we have sample code as below.
vfloat32m1_t
__attribute__((target("arch=+zve64f")))
test_9 (vfloat32m1_t a, vfloat32m1_t b, size_t vl)
{
  return __riscv_vfadd_vv_f32m1 (a, b, vl);
}

It will generate the asm code when build with -O3 -march=rv64gc
test_9:
        vsetvli zero,a0,e32,m1,ta,ma
        vfadd.vv        v8,v8,v9
        ret

Meanwhile, this patch introduces more error handling for the target
attribute.  Take arch=+zve32x with vfloat32m1_t will have error message
"'vfloat32m1_t' requires the zve32f, zve64f or zve64d ISA extension".
And take arch=+zve32f with vfloat16m1_t will have error message
"'vfloat16m1_t' requires the zvfhmin or zvfh ISA extension".

By default, all the RVV types includes the cmdline march will be
registered when include the riscv_vector.h.  And we have sorts of check
during args and return types.

Below test are passed for this patch:
* The riscv fully regression test.

gcc/ChangeLog:

* config/riscv/riscv-c.cc (struct pragma_intrinsic_flags): New
struct to hold all intrinisc related flags.
(riscv_pragma_intrinsic_flags_pollute): New func to pollute
the intrinsic flags and backup original flags.
(riscv_pragma_intrinsic_flags_restore): New func to restore
the flags from the backup intrinsic flags.
(riscv_pragma_intrinsic): Pollute the flags and register all
possible builtin types and functions, then restore and reinit.
* config/riscv/riscv-protos.h (reinit_builtins): New func
decl to reinit after flags pollution.
(riscv_option_override): New extern func decl.
* config/riscv/riscv-vector-builtins.cc (register_builtin_types_on_null):
New func to register builtin types if null.
(DEF_RVV_TYPE): Ditto.
(DEF_RVV_TUPLE_TYPE): Ditto.
(reinit_builtins): New func impl to reinit after flags pollution.
(expand_builtin): Return
target rtx after error_at.
* config/riscv/riscv.cc (riscv_vector_int_type_p): New predicate
func to tell one tree type is integer or not.
(riscv_vector_float_type_p): New predicate func to tell one tree
type is float or not.
(riscv_vector_element_bitsize): New func to get the element bitsize
of a vector tree type.
(riscv_vector_required_min_vlen): New func to get the required min vlen
of a vector tree type.
(riscv_validate_vector_type): New func to validate the tree type
is valid on flags.
(riscv_return_value_is_vector_type_p): Leverage the func
riscv_validate_vector_type to do the tree type validation.
(riscv_arguments_is_vector_type_p): Ditto.
(riscv_override_options_internal): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/base/pr109479-1.c: Adjust the existing test
scenarios and add new error check tests.
* gcc.target/riscv/rvv/base/pr109479-2.c: Ditto.
* gcc.target/riscv/rvv/base/pr109479-3.c: Ditto.
* gcc.target/riscv/rvv/base/pr109479-4.c: Diito.
* gcc.target/riscv/rvv/base/pr109479-5.c: Diito.
* gcc.target/riscv/rvv/base/pr109479-6.c: Diito.
* gcc.target/riscv/rvv/base/user-10.c: Ditto.
* gcc.target/riscv/rvv/base/user-12.c: Ditto.
* gcc.target/riscv/rvv/base/user-13.c: Ditto.
* gcc.target/riscv/rvv/base/user-14.c: Ditto.
* gcc.target/riscv/rvv/base/user-15.c: Ditto.
* gcc.target/riscv/rvv/base/user-2.c: Ditto.
* gcc.target/riscv/rvv/base/user-3.c: Ditto.
* gcc.target/riscv/rvv/base/user-5.c: Ditto.
* gcc.target/riscv/rvv/base/user-6.c: Ditto.
* gcc.target/riscv/rvv/base/user-9.c: Ditto.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-10.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-11.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-12.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-13.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-14.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-15.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-16.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-17.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-18.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-19.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-20.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-21.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-22.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-23.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-24.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-25.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-26.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-27.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-28.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-29.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-30.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-31.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-32.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-33.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-34.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-35.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-36.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-37.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-38.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-39.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-40.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-41.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-42.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-43.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-44.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-45.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-46.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-47.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-48.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-49.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-50.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-51.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-52.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-53.c: New test.
* gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-9.c: New test.

Signed-off-by: Pan Li <pan2.li@intel.com>
65 files changed:
gcc/config/riscv/riscv-c.cc
gcc/config/riscv/riscv-protos.h
gcc/config/riscv/riscv-vector-builtins.cc
gcc/config/riscv/riscv.cc
gcc/testsuite/gcc.target/riscv/rvv/base/pr109479-1.c
gcc/testsuite/gcc.target/riscv/rvv/base/pr109479-2.c
gcc/testsuite/gcc.target/riscv/rvv/base/pr109479-3.c
gcc/testsuite/gcc.target/riscv/rvv/base/pr109479-4.c
gcc/testsuite/gcc.target/riscv/rvv/base/pr109479-5.c
gcc/testsuite/gcc.target/riscv/rvv/base/pr109479-6.c
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-13.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-14.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-15.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-17.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-18.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-19.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-20.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-21.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-22.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-23.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-24.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-25.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-26.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-27.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-28.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-29.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-30.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-31.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-33.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-34.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-35.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-36.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-37.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-38.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-39.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-40.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-41.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-42.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-43.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-44.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-45.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-46.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-47.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-48.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-49.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-50.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-51.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-52.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-53.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/target_attribute_v_with_intrinsic-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/base/user-10.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-12.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-13.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-14.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-15.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-2.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-3.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-5.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-6.c
gcc/testsuite/gcc.target/riscv/rvv/base/user-9.c