Re: Re: [PATCH] RISC-V: Add vcreate intrinsics for RVV tuple types
Committed, thanks juzhe and kito. -- Li Xu >LGTM, thanks for implement this :) > >On Tue, Sep 12, 2023 at 10:16 AM juzhe.zh...@rivai.ai > wrote: >> >> Thanks for support it. >> LGTM from my side. >> Wait for kito's more comments. >> >> >> >> juzhe.zh...@rivai.ai >> >> From: Li Xu >> Date: 2023-09-12 10:08 >> To: gcc-patches >> CC: kito.cheng; palmer; juzhe.zhong; pan2.li; gaofei; wangfeng; xuli >> Subject: [PATCH] RISC-V: Add vcreate intrinsics for RVV tuple types >> From: xuli >> >> gcc/ChangeLog: >> >> * config/riscv/riscv-vector-builtins-bases.cc (class vcreate): >> (BASE): New class. >> * config/riscv/riscv-vector-builtins-bases.h: Ditto. >> * config/riscv/riscv-vector-builtins-functions.def (vcreate): Add >>vcreate support. >> * config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): >>Ditto. >> (SHAPE): Ditto. >> * config/riscv/riscv-vector-builtins-shapes.h: Ditto. >> * config/riscv/riscv-vector-builtins.cc: Add args type. >> >> gcc/testsuite/ChangeLog: >> >> * gcc.target/riscv/rvv/base/tuple_create.c: New test. >> --- >> .../riscv/riscv-vector-builtins-bases.cc | 40 ++ >> .../riscv/riscv-vector-builtins-bases.h | 1 + >> .../riscv/riscv-vector-builtins-functions.def | 1 + >> .../riscv/riscv-vector-builtins-shapes.cc | 50 +++ >> .../riscv/riscv-vector-builtins-shapes.h | 1 + >> gcc/config/riscv/riscv-vector-builtins.cc | 12 ++ >> .../gcc.target/riscv/rvv/base/tuple_create.c | 123 ++ >> 7 files changed, 228 insertions(+) >> create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/tuple_create.c >> >> diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc >> b/gcc/config/riscv/riscv-vector-builtins-bases.cc >> index 8e679f72392..be3df2c1ea2 100644 >> --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc >> +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc >> @@ -1824,6 +1824,44 @@ public: >> } >> }; >> +class vcreate : public function_base >> +{ >> +public: >> + gimple *fold (gimple_folder &f) const override >> + { >> + unsigned int nargs = gimple_call_num_args (f.call); >> + tree lhs_type = TREE_TYPE (f.lhs); >> + >> + /* Replace the call with a clobber of the result (to prevent it from >> + becoming upwards exposed) followed by stores into each individual >> + vector of tuple. >> + >> + The fold routines expect the replacement statement to have the >> + same lhs as the original call, so return the clobber statement >> + rather than the final vector store. */ >> + gassign *clobber = gimple_build_assign (f.lhs, build_clobber >> (lhs_type)); >> + >> + for (unsigned int i = nargs; i-- > 0; ) >> + { >> + tree rhs_vector = gimple_call_arg (f.call, i); >> + tree field = tuple_type_field (TREE_TYPE (f.lhs)); >> + tree lhs_array = build3 (COMPONENT_REF, TREE_TYPE (field), >> + unshare_expr (f.lhs), field, NULL_TREE); >> + tree lhs_vector = build4 (ARRAY_REF, TREE_TYPE (rhs_vector), >> + lhs_array, size_int (i), >> + NULL_TREE, NULL_TREE); >> + gassign *assign = gimple_build_assign (lhs_vector, rhs_vector); >> + gsi_insert_after (f.gsi, assign, GSI_SAME_STMT); >> + } >> + return clobber; >> + } >> + >> + rtx expand (function_expander &e) const override >> + { >> + return NULL_RTX; >> + } >> +}; >> + >> class read_vl : public function_base >> { >> public: >> @@ -2285,6 +2323,7 @@ static CONSTEXPR const vlmul_ext vlmul_ext_obj; >> static CONSTEXPR const vlmul_trunc vlmul_trunc_obj; >> static CONSTEXPR const vset vset_obj; >> static CONSTEXPR const vget vget_obj; >> +static CONSTEXPR const vcreate vcreate_obj; >> static CONSTEXPR const read_vl read_vl_obj; >> static CONSTEXPR const vleff vleff_obj; >> static CONSTEXPR const vlenb vlenb_obj; >> @@ -2546,6 +2585,7 @@ BASE (vlmul_ext) >> BASE (vlmul_trunc) >> BASE (vset) >> BASE (vget) >> +BASE (vcreate) >> BASE (read_vl) >> BASE (vleff) >> BASE (vlenb) >> diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.h >> b/gcc/config/riscv/riscv-vector-builtins-bases.h >> index 69d4562091f..131041ea66f 100644 >> --- a/gcc/config/riscv/riscv-vector-builtins-bases.h >> +++ b/gcc/config/riscv/riscv-vector-builtins-bases.h >> @@ -267,6 +267,7 @@ extern const function_base *const vlmul_ext; >> extern const function_base *const vlmul_trunc; >> extern const function_base *const vset; >> extern const function_base *const vget; >> +extern const function_base *const vcreate; >> extern const function_base *const read_vl; >> extern const function_base *const vleff; >> extern const function_base *const vlenb; >> diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def >> b/gcc/config/riscv/riscv-vector-builtins-functions.def >> index 3ce06dc60b7..18ed2c2b8f6 100644 >> --- a/gcc/config/riscv/riscv-vector-builtins-functions.def >> +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def >> @@ -621,6 +621,7 @@ DEF_RVV_FUNCTION (vge
Re: [PATCH] RISC-V: Add vcreate intrinsics for RVV tuple types
LGTM, thanks for implement this :) On Tue, Sep 12, 2023 at 10:16 AM juzhe.zh...@rivai.ai wrote: > > Thanks for support it. > LGTM from my side. > Wait for kito's more comments. > > > > juzhe.zh...@rivai.ai > > From: Li Xu > Date: 2023-09-12 10:08 > To: gcc-patches > CC: kito.cheng; palmer; juzhe.zhong; pan2.li; gaofei; wangfeng; xuli > Subject: [PATCH] RISC-V: Add vcreate intrinsics for RVV tuple types > From: xuli > > gcc/ChangeLog: > > * config/riscv/riscv-vector-builtins-bases.cc (class vcreate): > (BASE): New class. > * config/riscv/riscv-vector-builtins-bases.h: Ditto. > * config/riscv/riscv-vector-builtins-functions.def (vcreate): Add > vcreate support. > * config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): > Ditto. > (SHAPE): Ditto. > * config/riscv/riscv-vector-builtins-shapes.h: Ditto. > * config/riscv/riscv-vector-builtins.cc: Add args type. > > gcc/testsuite/ChangeLog: > > * gcc.target/riscv/rvv/base/tuple_create.c: New test. > --- > .../riscv/riscv-vector-builtins-bases.cc | 40 ++ > .../riscv/riscv-vector-builtins-bases.h | 1 + > .../riscv/riscv-vector-builtins-functions.def | 1 + > .../riscv/riscv-vector-builtins-shapes.cc | 50 +++ > .../riscv/riscv-vector-builtins-shapes.h | 1 + > gcc/config/riscv/riscv-vector-builtins.cc | 12 ++ > .../gcc.target/riscv/rvv/base/tuple_create.c | 123 ++ > 7 files changed, 228 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/tuple_create.c > > diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc > b/gcc/config/riscv/riscv-vector-builtins-bases.cc > index 8e679f72392..be3df2c1ea2 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc > +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc > @@ -1824,6 +1824,44 @@ public: >} > }; > +class vcreate : public function_base > +{ > +public: > + gimple *fold (gimple_folder &f) const override > + { > +unsigned int nargs = gimple_call_num_args (f.call); > +tree lhs_type = TREE_TYPE (f.lhs); > + > +/* Replace the call with a clobber of the result (to prevent it from > + becoming upwards exposed) followed by stores into each individual > + vector of tuple. > + > + The fold routines expect the replacement statement to have the > + same lhs as the original call, so return the clobber statement > + rather than the final vector store. */ > +gassign *clobber = gimple_build_assign (f.lhs, build_clobber (lhs_type)); > + > +for (unsigned int i = nargs; i-- > 0; ) > + { > + tree rhs_vector = gimple_call_arg (f.call, i); > + tree field = tuple_type_field (TREE_TYPE (f.lhs)); > + tree lhs_array = build3 (COMPONENT_REF, TREE_TYPE (field), > + unshare_expr (f.lhs), field, NULL_TREE); > + tree lhs_vector = build4 (ARRAY_REF, TREE_TYPE (rhs_vector), > + lhs_array, size_int (i), > + NULL_TREE, NULL_TREE); > + gassign *assign = gimple_build_assign (lhs_vector, rhs_vector); > + gsi_insert_after (f.gsi, assign, GSI_SAME_STMT); > + } > +return clobber; > + } > + > + rtx expand (function_expander &e) const override > + { > +return NULL_RTX; > + } > +}; > + > class read_vl : public function_base > { > public: > @@ -2285,6 +2323,7 @@ static CONSTEXPR const vlmul_ext vlmul_ext_obj; > static CONSTEXPR const vlmul_trunc vlmul_trunc_obj; > static CONSTEXPR const vset vset_obj; > static CONSTEXPR const vget vget_obj; > +static CONSTEXPR const vcreate vcreate_obj; > static CONSTEXPR const read_vl read_vl_obj; > static CONSTEXPR const vleff vleff_obj; > static CONSTEXPR const vlenb vlenb_obj; > @@ -2546,6 +2585,7 @@ BASE (vlmul_ext) > BASE (vlmul_trunc) > BASE (vset) > BASE (vget) > +BASE (vcreate) > BASE (read_vl) > BASE (vleff) > BASE (vlenb) > diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.h > b/gcc/config/riscv/riscv-vector-builtins-bases.h > index 69d4562091f..131041ea66f 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-bases.h > +++ b/gcc/config/riscv/riscv-vector-builtins-bases.h > @@ -267,6 +267,7 @@ extern const function_base *const vlmul_ext; > extern const function_base *const vlmul_trunc; > extern const function_base *const vset; > extern const function_base *const vget; > +extern const function_base *const vcreate; > extern const function_base *const read_vl; > extern const function_base *const vleff; > extern const function_base *const vlenb; > diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def > b/gcc/config/riscv/riscv-vector-builtins-functions.def > index 3ce06dc60b7..18ed2c2b8f6 100644 > --- a/gcc/config/riscv/riscv-vector-builtins-functions.def > +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def > @@ -621,6 +621,7 @@ DEF_RVV_FUNCTION (vget, vget, none_preds, > all_v_vget_lmul4_x2_ops) > // Tuple types > DEF_RVV_FUNCTION (vset, vset, none_preds, all_v_vset_tuple_ops) > DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_t
Re: [PATCH] RISC-V: Add vcreate intrinsics for RVV tuple types
Thanks for support it. LGTM from my side. Wait for kito's more comments. juzhe.zh...@rivai.ai From: Li Xu Date: 2023-09-12 10:08 To: gcc-patches CC: kito.cheng; palmer; juzhe.zhong; pan2.li; gaofei; wangfeng; xuli Subject: [PATCH] RISC-V: Add vcreate intrinsics for RVV tuple types From: xuli gcc/ChangeLog: * config/riscv/riscv-vector-builtins-bases.cc (class vcreate): (BASE): New class. * config/riscv/riscv-vector-builtins-bases.h: Ditto. * config/riscv/riscv-vector-builtins-functions.def (vcreate): Add vcreate support. * config/riscv/riscv-vector-builtins-shapes.cc (struct vcreate_def): Ditto. (SHAPE): Ditto. * config/riscv/riscv-vector-builtins-shapes.h: Ditto. * config/riscv/riscv-vector-builtins.cc: Add args type. gcc/testsuite/ChangeLog: * gcc.target/riscv/rvv/base/tuple_create.c: New test. --- .../riscv/riscv-vector-builtins-bases.cc | 40 ++ .../riscv/riscv-vector-builtins-bases.h | 1 + .../riscv/riscv-vector-builtins-functions.def | 1 + .../riscv/riscv-vector-builtins-shapes.cc | 50 +++ .../riscv/riscv-vector-builtins-shapes.h | 1 + gcc/config/riscv/riscv-vector-builtins.cc | 12 ++ .../gcc.target/riscv/rvv/base/tuple_create.c | 123 ++ 7 files changed, 228 insertions(+) create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/tuple_create.c diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index 8e679f72392..be3df2c1ea2 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -1824,6 +1824,44 @@ public: } }; +class vcreate : public function_base +{ +public: + gimple *fold (gimple_folder &f) const override + { +unsigned int nargs = gimple_call_num_args (f.call); +tree lhs_type = TREE_TYPE (f.lhs); + +/* Replace the call with a clobber of the result (to prevent it from + becoming upwards exposed) followed by stores into each individual + vector of tuple. + + The fold routines expect the replacement statement to have the + same lhs as the original call, so return the clobber statement + rather than the final vector store. */ +gassign *clobber = gimple_build_assign (f.lhs, build_clobber (lhs_type)); + +for (unsigned int i = nargs; i-- > 0; ) + { + tree rhs_vector = gimple_call_arg (f.call, i); + tree field = tuple_type_field (TREE_TYPE (f.lhs)); + tree lhs_array = build3 (COMPONENT_REF, TREE_TYPE (field), + unshare_expr (f.lhs), field, NULL_TREE); + tree lhs_vector = build4 (ARRAY_REF, TREE_TYPE (rhs_vector), + lhs_array, size_int (i), + NULL_TREE, NULL_TREE); + gassign *assign = gimple_build_assign (lhs_vector, rhs_vector); + gsi_insert_after (f.gsi, assign, GSI_SAME_STMT); + } +return clobber; + } + + rtx expand (function_expander &e) const override + { +return NULL_RTX; + } +}; + class read_vl : public function_base { public: @@ -2285,6 +2323,7 @@ static CONSTEXPR const vlmul_ext vlmul_ext_obj; static CONSTEXPR const vlmul_trunc vlmul_trunc_obj; static CONSTEXPR const vset vset_obj; static CONSTEXPR const vget vget_obj; +static CONSTEXPR const vcreate vcreate_obj; static CONSTEXPR const read_vl read_vl_obj; static CONSTEXPR const vleff vleff_obj; static CONSTEXPR const vlenb vlenb_obj; @@ -2546,6 +2585,7 @@ BASE (vlmul_ext) BASE (vlmul_trunc) BASE (vset) BASE (vget) +BASE (vcreate) BASE (read_vl) BASE (vleff) BASE (vlenb) diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.h b/gcc/config/riscv/riscv-vector-builtins-bases.h index 69d4562091f..131041ea66f 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.h +++ b/gcc/config/riscv/riscv-vector-builtins-bases.h @@ -267,6 +267,7 @@ extern const function_base *const vlmul_ext; extern const function_base *const vlmul_trunc; extern const function_base *const vset; extern const function_base *const vget; +extern const function_base *const vcreate; extern const function_base *const read_vl; extern const function_base *const vleff; extern const function_base *const vlenb; diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def b/gcc/config/riscv/riscv-vector-builtins-functions.def index 3ce06dc60b7..18ed2c2b8f6 100644 --- a/gcc/config/riscv/riscv-vector-builtins-functions.def +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def @@ -621,6 +621,7 @@ DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_lmul4_x2_ops) // Tuple types DEF_RVV_FUNCTION (vset, vset, none_preds, all_v_vset_tuple_ops) DEF_RVV_FUNCTION (vget, vget, none_preds, all_v_vget_tuple_ops) +DEF_RVV_FUNCTION (vcreate, vcreate, none_preds, all_v_vcreate_tuple_ops) DEF_RVV_FUNCTION (vlseg, seg_loadstore, full_preds, tuple_v_scalar_const_ptr_ops) DEF_RVV_FUNCTION (vsseg, seg_loadstore, none_m_preds, tuple_v_scalar_ptr_ops) DEF_RVV_FUNCTION (vlsseg, seg_loadstore, full_preds, tuple_v_scalar_const_ptr_ptrdiff_ops) diff --g