LGTM On Fri, Sep 15, 2023 at 1:06 PM Lehua Ding <lehua.d...@rivai.ai> wrote:
> This patch refactors expand_reduction, remove the reduction_type argument > and add insn_flags argument to determine the passing of the operands. > ops has also been modified to restrict it to only two cases and to remove > operand that are not in use. > > gcc/ChangeLog: > > * config/riscv/autovec-opt.md: Adjust. > * config/riscv/autovec.md: Ditto. > * config/riscv/riscv-protos.h (enum class): Delete enum > reduction_type. > (expand_reduction): Adjust expand_reduction prototype. > * config/riscv/riscv-v.cc (need_mask_operand_p): New helper > function. > (expand_reduction): Refactor expand_reduction. > > --- > gcc/config/riscv/autovec-opt.md | 22 +++++++----- > gcc/config/riscv/autovec.md | 51 ++++++++++++++++++---------- > gcc/config/riscv/riscv-protos.h | 9 +---- > gcc/config/riscv/riscv-v.cc | 60 +++++++++++++++++---------------- > 4 files changed, 79 insertions(+), 63 deletions(-) > > diff --git a/gcc/config/riscv/autovec-opt.md > b/gcc/config/riscv/autovec-opt.md > index df516849527..b47bae16193 100644 > --- a/gcc/config/riscv/autovec-opt.md > +++ b/gcc/config/riscv/autovec-opt.md > @@ -1208,7 +1208,8 @@ > "&& 1" > [(const_int 0)] > { > - riscv_vector::expand_reduction (<WREDUC_UNSPEC>, operands, > + riscv_vector::expand_reduction (<WREDUC_UNSPEC>, > riscv_vector::REDUCE_OP, > + operands, > CONST0_RTX (<V_DOUBLE_EXTEND_VEL>mode)); > DONE; > } > @@ -1226,7 +1227,9 @@ > "&& 1" > [(const_int 0)] > { > - riscv_vector::expand_reduction (UNSPEC_WREDUC_SUM_UNORDERED, operands, > + riscv_vector::expand_reduction (UNSPEC_WREDUC_SUM_UNORDERED, > + riscv_vector::REDUCE_OP_FRM_DYN, > + operands, > CONST0_RTX (<V_DOUBLE_EXTEND_VEL>mode)); > DONE; > } > @@ -1245,9 +1248,9 @@ > "&& 1" > [(const_int 0)] > { > - riscv_vector::expand_reduction (UNSPEC_WREDUC_SUM_ORDERED, operands, > - operands[1], > - riscv_vector::reduction_type::FOLD_LEFT); > + riscv_vector::expand_reduction (UNSPEC_WREDUC_SUM_ORDERED, > + riscv_vector::REDUCE_OP_FRM_DYN, > + operands, operands[1]); > DONE; > } > [(set_attr "type" "vector")]) > @@ -1271,9 +1274,12 @@ > if (rtx_equal_p (operands[4], const0_rtx)) > emit_move_insn (operands[0], operands[1]); > else > - riscv_vector::expand_reduction (UNSPEC_WREDUC_SUM_ORDERED, operands, > - operands[1], > - > riscv_vector::reduction_type::MASK_LEN_FOLD_LEFT); > + { > + rtx ops[] = {operands[0], operands[2], operands[3], operands[4]}; > + riscv_vector::expand_reduction (UNSPEC_WREDUC_SUM_ORDERED, > + riscv_vector::REDUCE_OP_M_FRM_DYN, > + ops, operands[1]); > + } > DONE; > } > [(set_attr "type" "vector")]) > diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md > index 8537b9d41f6..c6175a3b1f6 100644 > --- a/gcc/config/riscv/autovec.md > +++ b/gcc/config/riscv/autovec.md > @@ -2096,7 +2096,8 @@ > "&& 1" > [(const_int 0)] > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_SUM, operands, CONST0_RTX > (<VEL>mode)); > + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM, > riscv_vector::REDUCE_OP, > + operands, CONST0_RTX (<VEL>mode)); > DONE; > } > [(set_attr "type" "vector")]) > @@ -2108,7 +2109,8 @@ > { > int prec = GET_MODE_PRECISION (<VEL>mode); > rtx min = immed_wide_int_const (wi::min_value (prec, SIGNED), > <VEL>mode); > - riscv_vector::expand_reduction (UNSPEC_REDUC_MAX, operands, min); > + riscv_vector::expand_reduction (UNSPEC_REDUC_MAX, > riscv_vector::REDUCE_OP, > + operands, min); > DONE; > }) > > @@ -2117,7 +2119,8 @@ > (match_operand:VI 1 "register_operand")] > "TARGET_VECTOR" > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_MAXU, operands, CONST0_RTX > (<VEL>mode)); > + riscv_vector::expand_reduction (UNSPEC_REDUC_MAXU, > riscv_vector::REDUCE_OP, > + operands, CONST0_RTX (<VEL>mode)); > DONE; > }) > > @@ -2128,7 +2131,8 @@ > { > int prec = GET_MODE_PRECISION (<VEL>mode); > rtx max = immed_wide_int_const (wi::max_value (prec, SIGNED), > <VEL>mode); > - riscv_vector::expand_reduction (UNSPEC_REDUC_MIN, operands, max); > + riscv_vector::expand_reduction (UNSPEC_REDUC_MIN, > riscv_vector::REDUCE_OP, > + operands, max); > DONE; > }) > > @@ -2139,7 +2143,8 @@ > { > int prec = GET_MODE_PRECISION (<VEL>mode); > rtx max = immed_wide_int_const (wi::max_value (prec, UNSIGNED), > <VEL>mode); > - riscv_vector::expand_reduction (UNSPEC_REDUC_MINU, operands, max); > + riscv_vector::expand_reduction (UNSPEC_REDUC_MINU, > riscv_vector::REDUCE_OP, > + operands, max); > DONE; > }) > > @@ -2148,7 +2153,8 @@ > (match_operand:VI 1 "register_operand")] > "TARGET_VECTOR" > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_AND, operands, CONSTM1_RTX > (<VEL>mode)); > + riscv_vector::expand_reduction (UNSPEC_REDUC_AND, > riscv_vector::REDUCE_OP, > + operands, CONSTM1_RTX (<VEL>mode)); > DONE; > }) > > @@ -2157,7 +2163,8 @@ > (match_operand:VI 1 "register_operand")] > "TARGET_VECTOR" > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_OR, operands, CONST0_RTX > (<VEL>mode)); > + riscv_vector::expand_reduction (UNSPEC_REDUC_OR, > riscv_vector::REDUCE_OP, > + operands, CONST0_RTX (<VEL>mode)); > DONE; > }) > > @@ -2166,7 +2173,8 @@ > (match_operand:VI 1 "register_operand")] > "TARGET_VECTOR" > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_XOR, operands, CONST0_RTX > (<VEL>mode)); > + riscv_vector::expand_reduction (UNSPEC_REDUC_XOR, > riscv_vector::REDUCE_OP, > + operands, CONST0_RTX (<VEL>mode)); > DONE; > }) > > @@ -2189,8 +2197,9 @@ > "&& 1" > [(const_int 0)] > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_UNORDERED, operands, > - CONST0_RTX (<VEL>mode)); > + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_UNORDERED, > + riscv_vector::REDUCE_OP_FRM_DYN, > + operands, CONST0_RTX (<VEL>mode)); > DONE; > } > [(set_attr "type" "vector")]) > @@ -2203,7 +2212,8 @@ > REAL_VALUE_TYPE rv; > real_inf (&rv, true); > rtx f = const_double_from_real_value (rv, <VEL>mode); > - riscv_vector::expand_reduction (UNSPEC_REDUC_MAX, operands, f); > + riscv_vector::expand_reduction (UNSPEC_REDUC_MAX, > riscv_vector::REDUCE_OP, > + operands, f); > DONE; > }) > > @@ -2215,7 +2225,8 @@ > REAL_VALUE_TYPE rv; > real_inf (&rv, false); > rtx f = const_double_from_real_value (rv, <VEL>mode); > - riscv_vector::expand_reduction (UNSPEC_REDUC_MIN, operands, f); > + riscv_vector::expand_reduction (UNSPEC_REDUC_MIN, > riscv_vector::REDUCE_OP, > + operands, f); > DONE; > }) > > @@ -2238,9 +2249,10 @@ > "&& 1" > [(const_int 0)] > { > - riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_ORDERED, operands, > - operands[1], > - riscv_vector::reduction_type::FOLD_LEFT); > + rtx ops[] = {operands[0], operands[2]}; > + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_ORDERED, > + riscv_vector::REDUCE_OP_FRM_DYN, > + ops, operands[1]); > DONE; > } > [(set_attr "type" "vector")]) > @@ -2263,9 +2275,12 @@ > if (rtx_equal_p (operands[4], const0_rtx)) > emit_move_insn (operands[0], operands[1]); > else > - riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_ORDERED, operands, > - operands[1], > - > riscv_vector::reduction_type::MASK_LEN_FOLD_LEFT); > + { > + rtx ops[] = {operands[0], operands[2], operands[3], operands[4]}; > + riscv_vector::expand_reduction (UNSPEC_REDUC_SUM_ORDERED, > + riscv_vector::REDUCE_OP_M_FRM_DYN, > + ops, operands[1]); > + } > DONE; > } > [(set_attr "type" "vector")]) > diff --git a/gcc/config/riscv/riscv-protos.h > b/gcc/config/riscv/riscv-protos.h > index 44fa36c32ab..bb94a7e0441 100644 > --- a/gcc/config/riscv/riscv-protos.h > +++ b/gcc/config/riscv/riscv-protos.h > @@ -414,12 +414,6 @@ enum mask_policy > /* Return true if VALUE is agnostic or any policy. */ > #define IS_AGNOSTIC(VALUE) (bool) (VALUE & 0x1 || (VALUE >> 1 & 0x1)) > > -enum class reduction_type > -{ > - UNORDERED, > - FOLD_LEFT, > - MASK_LEN_FOLD_LEFT, > -}; > enum tail_policy get_prefer_tail_policy (); > enum mask_policy get_prefer_mask_policy (); > rtx get_avl_type_rtx (enum avl_type); > @@ -433,8 +427,7 @@ void expand_vec_cmp (rtx, rtx_code, rtx, rtx); > bool expand_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool); > void expand_cond_len_unop (unsigned, rtx *); > void expand_cond_len_binop (unsigned, rtx *); > -void expand_reduction (unsigned, rtx *, rtx, > - reduction_type = reduction_type::UNORDERED); > +void expand_reduction (unsigned, unsigned, rtx *, rtx); > #endif > bool sew64_scalar_helper (rtx *, rtx *, rtx, machine_mode, > bool, void (*)(rtx *, rtx)); > diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc > index 668594b65ed..7e9fd9ec741 100644 > --- a/gcc/config/riscv/riscv-v.cc > +++ b/gcc/config/riscv/riscv-v.cc > @@ -67,6 +67,18 @@ const_vlmax_p (machine_mode mode) > : false; > } > > +/* Helper functions for insn_flags && insn_types */ > + > +/* Return true if caller need pass mask operand for insn pattern with > + INSN_FLAGS. */ > + > +static bool > +need_mask_operand_p (unsigned insn_flags) > +{ > + return (insn_flags & HAS_MASK_P) > + && !(insn_flags & (USE_ONE_TRUE_MASK_P | USE_ALL_TRUES_MASK_P)); > +} > + > template <int MAX_OPERANDS> class insn_expander > { > public: > @@ -3206,48 +3218,38 @@ expand_cond_len_ternop (unsigned icode, rtx *ops) > expand_cond_len_op (icode, TERNARY_OP_P, cond_ops, len); > } > > -/* Expand reduction operations. */ > +/* Expand reduction operations. > + Case 1: ops = {scalar_dest, vector_src} > + Case 2: ops = {scalar_dest, vector_src, mask, vl} > +*/ > void > -expand_reduction (unsigned unspec, rtx *ops, rtx init, reduction_type > type) > +expand_reduction (unsigned unspec, unsigned insn_flags, rtx *ops, rtx > init) > { > - rtx vector = type == reduction_type::UNORDERED ? ops[1] : ops[2]; > - machine_mode vmode = GET_MODE (vector); > - machine_mode vel_mode = GET_MODE (ops[0]); > + rtx scalar_dest = ops[0]; > + rtx vector_src = ops[1]; > + machine_mode vmode = GET_MODE (vector_src); > + machine_mode vel_mode = GET_MODE (scalar_dest); > machine_mode m1_mode = get_m1_mode (vel_mode).require (); > > rtx m1_tmp = gen_reg_rtx (m1_mode); > rtx scalar_move_ops[] = {m1_tmp, init}; > emit_nonvlmax_insn (code_for_pred_broadcast (m1_mode), SCALAR_MOVE_OP, > - scalar_move_ops, > - type == reduction_type::MASK_LEN_FOLD_LEFT > - ? ops[4] > - : CONST1_RTX (Pmode)); > + scalar_move_ops, > + need_mask_operand_p (insn_flags) ? ops[3] > + : CONST1_RTX > (Pmode)); > rtx m1_tmp2 = gen_reg_rtx (m1_mode); > - rtx reduc_ops[] = {m1_tmp2, vector, m1_tmp}; > + rtx reduc_ops[] = {m1_tmp2, vector_src, m1_tmp}; > + insn_code icode = code_for_pred (unspec, vmode); > > - if (unspec == UNSPEC_REDUC_SUM_ORDERED > - || unspec == UNSPEC_WREDUC_SUM_ORDERED > - || unspec == UNSPEC_REDUC_SUM_UNORDERED > - || unspec == UNSPEC_WREDUC_SUM_UNORDERED) > + if (need_mask_operand_p (insn_flags)) > { > - insn_code icode = code_for_pred (unspec, vmode); > - if (type == reduction_type::MASK_LEN_FOLD_LEFT) > - { > - rtx mask = ops[3]; > - rtx mask_len_reduc_ops[] = {m1_tmp2, mask, vector, m1_tmp}; > - emit_nonvlmax_insn (icode, REDUCE_OP_M_FRM_DYN, > mask_len_reduc_ops, > - ops[4]); > - } > - else > - emit_vlmax_insn (icode, REDUCE_OP_FRM_DYN, reduc_ops); > + rtx mask_len_reduc_ops[] = {m1_tmp2, ops[2], vector_src, m1_tmp}; > + emit_nonvlmax_insn (icode, insn_flags, mask_len_reduc_ops, ops[3]); > } > else > - { > - insn_code icode = code_for_pred (unspec, vmode); > - emit_vlmax_insn (icode, REDUCE_OP, reduc_ops); > - } > + emit_vlmax_insn (icode, insn_flags, reduc_ops); > > - emit_insn (gen_pred_extract_first (m1_mode, ops[0], m1_tmp2)); > + emit_insn (gen_pred_extract_first (m1_mode, scalar_dest, m1_tmp2)); > } > > /* Prepare ops for ternary operations. > -- > 2.36.3 > >