* [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns after refactor vector mode
@ 2023-09-13 12:31 Lehua Ding
2023-09-14 14:10 ` 钟居哲
0 siblings, 1 reply; 3+ messages in thread
From: Lehua Ding @ 2023-09-13 12:31 UTC (permalink / raw)
To: gcc-patches
Cc: juzhe.zhong, kito.cheng, rdapp.gcc, palmer, jeffreyalaw, lehua.ding
This patch cleanups redundant reduction patterns after Juzhe change vector mode
from fixed-size to scalable-size. For example, whether it is zvl32b, zvl64b,
zvl128b, RVVM1SI indicates that it occupies a vector register. Therefore, it is
easy to map vector modes to LMUL1 vector modes with define_mode_attr without
creating a separate pattern for each LMUL1 Mode. For example, this patch can
combine four patterns (@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>,
@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>
@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>,
@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>) to a single pattern
@pred_reduc_<reduc><mode>.
gcc/ChangeLog:
* config/riscv/riscv-v.cc (expand_reduction): Adjust call.
* config/riscv/riscv-vector-builtins-bases.cc: Adjust call.
* config/riscv/vector-iterators.md: New iterators and attrs.
* config/riscv/vector.md (@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>):
Removed.
(@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><mode>): Added.
(@pred_widen_reduc_plus<v_su><VQI:mode><VHI_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<v_su><VHI:mode><VSI_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<v_su><mode>): Added.
(@pred_widen_reduc_plus<v_su><VSI:mode><VDI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VHF:mode><VHF_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VSF:mode><VSF_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VDF:mode><VDF_LMUL1:mode>): Removed.
(@pred_reduc_plus<order><VHF:mode><VHF_LMUL1:mode>): Removed.
(@pred_reduc_plus<order><VSF:mode><VSF_LMUL1:mode>): Removed.
(@pred_reduc_plus<order><mode>): Added.
(@pred_reduc_plus<order><VDF:mode><VDF_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<order><VHF:mode><VSF_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<order><VSF:mode><VDF_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<order><mode>): Added.
---
gcc/config/riscv/riscv-v.cc | 4 +-
.../riscv/riscv-vector-builtins-bases.cc | 15 +-
gcc/config/riscv/vector-iterators.md | 47 ++-
gcc/config/riscv/vector.md | 369 +++---------------
4 files changed, 101 insertions(+), 334 deletions(-)
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index 76e6094f45b..68b36d9dc4f 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -3230,7 +3230,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type)
= code_for_pred_reduc_plus (type == reduction_type::UNORDERED
? UNSPEC_UNORDERED
: UNSPEC_ORDERED,
- vmode, m1_mode);
+ vmode);
if (type == reduction_type::MASK_LEN_FOLD_LEFT)
{
rtx mask = ops[3];
@@ -3243,7 +3243,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type)
}
else
{
- insn_code icode = code_for_pred_reduc (code, vmode, m1_mode);
+ insn_code icode = code_for_pred_reduc (code, vmode);
emit_vlmax_insn (icode, REDUCE_OP, reduc_ops);
}
diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc
index ee218a03017..c54ea6f0560 100644
--- a/gcc/config/riscv/riscv-vector-builtins-bases.cc
+++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc
@@ -1541,8 +1541,7 @@ public:
rtx expand (function_expander &e) const override
{
- return e.use_exact_insn (
- code_for_pred_reduc (CODE, e.vector_mode (), e.ret_mode ()));
+ return e.use_exact_insn (code_for_pred_reduc (CODE, e.vector_mode ()));
}
};
@@ -1555,9 +1554,8 @@ public:
rtx expand (function_expander &e) const override
{
- return e.use_exact_insn (code_for_pred_widen_reduc_plus (UNSPEC,
- e.vector_mode (),
- e.ret_mode ()));
+ return e.use_exact_insn (
+ code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ()));
}
};
@@ -1576,7 +1574,7 @@ public:
rtx expand (function_expander &e) const override
{
return e.use_exact_insn (
- code_for_pred_reduc_plus (UNSPEC, e.vector_mode (), e.ret_mode ()));
+ code_for_pred_reduc_plus (UNSPEC, e.vector_mode ()));
}
};
@@ -1594,9 +1592,8 @@ public:
rtx expand (function_expander &e) const override
{
- return e.use_exact_insn (code_for_pred_widen_reduc_plus (UNSPEC,
- e.vector_mode (),
- e.ret_mode ()));
+ return e.use_exact_insn (
+ code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ()));
}
};
diff --git a/gcc/config/riscv/vector-iterators.md b/gcc/config/riscv/vector-iterators.md
index e70a9bc5c74..deb89cbcedc 100644
--- a/gcc/config/riscv/vector-iterators.md
+++ b/gcc/config/riscv/vector-iterators.md
@@ -671,6 +671,15 @@
RVVM8SI RVVM4SI RVVM2SI RVVM1SI (RVVMF2SI "TARGET_MIN_VLEN > 32")
])
+(define_mode_iterator VF_HS [
+ (RVVM8HF "TARGET_ZVFH") (RVVM4HF "TARGET_ZVFH") (RVVM2HF "TARGET_ZVFH")
+ (RVVM1HF "TARGET_ZVFH") (RVVMF2HF "TARGET_ZVFH")
+ (RVVMF4HF "TARGET_ZVFH && TARGET_MIN_VLEN > 32")
+
+ (RVVM8SF "TARGET_VECTOR_ELEN_FP_32") (RVVM4SF "TARGET_VECTOR_ELEN_FP_32") (RVVM2SF "TARGET_VECTOR_ELEN_FP_32")
+ (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32")
+])
+
(define_mode_iterator V_VLSI_QHS [
RVVM8QI RVVM4QI RVVM2QI RVVM1QI RVVMF2QI RVVMF4QI (RVVMF8QI "TARGET_MIN_VLEN > 32")
@@ -1237,32 +1246,32 @@
(RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
])
-(define_mode_iterator VQI_LMUL1 [
- RVVM1QI
-])
+(define_mode_attr V_LMUL1 [
+ (RVVM8QI "RVVM1QI") (RVVM4QI "RVVM1QI") (RVVM2QI "RVVM1QI") (RVVM1QI "RVVM1QI") (RVVMF2QI "RVVM1QI") (RVVMF4QI "RVVM1QI") (RVVMF8QI "RVVM1QI")
-(define_mode_iterator VHI_LMUL1 [
- RVVM1HI
-])
+ (RVVM8HI "RVVM1HI") (RVVM4HI "RVVM1HI") (RVVM2HI "RVVM1HI") (RVVM1HI "RVVM1HI") (RVVMF2HI "RVVM1HI") (RVVMF4HI "RVVM1HI")
-(define_mode_iterator VSI_LMUL1 [
- RVVM1SI
-])
+ (RVVM8SI "RVVM1SI") (RVVM4SI "RVVM1SI") (RVVM2SI "RVVM1SI") (RVVM1SI "RVVM1SI") (RVVMF2SI "RVVM1SI")
-(define_mode_iterator VDI_LMUL1 [
- (RVVM1DI "TARGET_VECTOR_ELEN_64")
-])
+ (RVVM8DI "RVVM1DI") (RVVM4DI "RVVM1DI") (RVVM2DI "RVVM1DI") (RVVM1DI "RVVM1DI")
-(define_mode_iterator VHF_LMUL1 [
- (RVVM1HF "TARGET_ZVFH")
-])
+ (RVVM8HF "RVVM1HF") (RVVM4HF "RVVM1HF") (RVVM2HF "RVVM1HF") (RVVM1HF "RVVM1HF") (RVVMF2HF "RVVM1HF") (RVVMF4HF "RVVM1HF")
-(define_mode_iterator VSF_LMUL1 [
- (RVVM1SF "TARGET_VECTOR_ELEN_FP_32")
+ (RVVM8SF "RVVM1SF") (RVVM4SF "RVVM1SF") (RVVM2SF "RVVM1SF") (RVVM1SF "RVVM1SF") (RVVMF2SF "RVVM1SF")
+
+ (RVVM8DF "RVVM1DF") (RVVM4DF "RVVM1DF") (RVVM2DF "RVVM1DF") (RVVM1DF "RVVM1DF")
])
-(define_mode_iterator VDF_LMUL1 [
- (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
+(define_mode_attr V_EXT_LMUL1 [
+ (RVVM8QI "RVVM1HI") (RVVM4QI "RVVM1HI") (RVVM2QI "RVVM1HI") (RVVM1QI "RVVM1HI") (RVVMF2QI "RVVM1HI") (RVVMF4QI "RVVM1HI") (RVVMF8QI "RVVM1HI")
+
+ (RVVM8HI "RVVM1SI") (RVVM4HI "RVVM1SI") (RVVM2HI "RVVM1SI") (RVVM1HI "RVVM1SI") (RVVMF2HI "RVVM1SI") (RVVMF4HI "RVVM1SI")
+
+ (RVVM8SI "RVVM1DI") (RVVM4SI "RVVM1DI") (RVVM2SI "RVVM1DI") (RVVM1SI "RVVM1DI") (RVVMF2SI "RVVM1DI")
+
+ (RVVM8HF "RVVM1SF") (RVVM4HF "RVVM1SF") (RVVM2HF "RVVM1SF") (RVVM1HF "RVVM1SF") (RVVMF2HF "RVVM1SF") (RVVMF4HF "RVVM1SF")
+
+ (RVVM8SF "RVVM1DF") (RVVM4SF "RVVM1DF") (RVVM2SF "RVVM1DF") (RVVM1SF "RVVM1DF") (RVVMF2SF "RVVM1DF")
])
(define_mode_attr VINDEX [
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index 58e659e5cd4..b6c8e63b0b2 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -7725,265 +7725,78 @@
;; - 14.4 Vector Widening Floating-Point Reduction Instructions
;; -------------------------------------------------------------------------------
-;; For reduction operations, we should have seperate patterns for
-;; different types. For each type, we will cover MIN_VLEN == 32, MIN_VLEN == 64
-;; and the MIN_VLEN >= 128 from the well defined iterators.
-;; Since reduction need LMUL = 1 scalar operand as the input operand
-;; and they are different.
-
-;; Integer Reduction for QI
-(define_insn "@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>"
- [(set (match_operand:VQI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VQI_LMUL1
- [(unspec:<VQI:VM>
- [(match_operand:<VQI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VQI
- (vec_duplicate:VQI
- (vec_select:<VEL>
- (match_operand:VQI_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VQI 3 "register_operand" " vr, vr"))
- (match_operand:VQI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vired")
- (set_attr "mode" "<VQI:MODE>")])
-
-;; Integer Reduction for HI
-(define_insn "@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>"
- [(set (match_operand:VHI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VHI_LMUL1
- [(unspec:<VHI:VM>
- [(match_operand:<VHI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VHI
- (vec_duplicate:VHI
- (vec_select:<VEL>
- (match_operand:VHI_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VHI 3 "register_operand" " vr, vr"))
- (match_operand:VHI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vired")
- (set_attr "mode" "<VHI:MODE>")])
-
-;; Integer Reduction for SI
-(define_insn "@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>"
- [(set (match_operand:VSI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VSI_LMUL1
- [(unspec:<VSI:VM>
- [(match_operand:<VSI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VSI
- (vec_duplicate:VSI
- (vec_select:<VEL>
- (match_operand:VSI_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VSI 3 "register_operand" " vr, vr"))
- (match_operand:VSI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vired")
- (set_attr "mode" "<VSI:MODE>")])
-
-;; Integer Reduction for DI
-(define_insn "@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>"
- [(set (match_operand:VDI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VDI_LMUL1
- [(unspec:<VDI:VM>
- [(match_operand:<VDI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+;; Integer Reduction (vred(sum|maxu|max|minu|min|and|or|xor).vs)
+(define_insn "@pred_reduc_<reduc><mode>"
+ [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr, vr")
+ (unspec:<V_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
(match_operand 5 "vector_length_operand" " rK, rK")
(match_operand 6 "const_int_operand" " i, i")
(match_operand 7 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VDI
- (vec_duplicate:VDI
+ (any_reduc:VI
+ (vec_duplicate:VI
(vec_select:<VEL>
- (match_operand:VDI_LMUL1 4 "register_operand" " vr, vr")
+ (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
(parallel [(const_int 0)])))
- (match_operand:VDI 3 "register_operand" " vr, vr"))
- (match_operand:VDI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
+ (match_operand:VI 3 "register_operand" " vr, vr"))
+ (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
"TARGET_VECTOR"
"vred<reduc>.vs\t%0,%3,%4%p1"
[(set_attr "type" "vired")
- (set_attr "mode" "<VDI:MODE>")])
-
-;; Integer Reduction Widen for QI, HI = QI op HI
-(define_insn "@pred_widen_reduc_plus<v_su><VQI:mode><VHI_LMUL1:mode>"
- [(set (match_operand:VHI_LMUL1 0 "register_operand" "=&vr,&vr")
- (unspec:VHI_LMUL1
- [(unspec:<VQI:VM>
- [(match_operand:<VQI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VQI 3 "register_operand" " vr, vr")
- (match_operand:VHI_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VHI_LMUL1 2 "vector_merge_operand" " vu, 0")] WREDUC))]
- "TARGET_VECTOR"
- "vwredsum<v_su>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "viwred")
- (set_attr "mode" "<VQI:MODE>")])
+ (set_attr "mode" "<MODE>")])
-;; Integer Reduction Widen for HI, SI = HI op SI
-(define_insn "@pred_widen_reduc_plus<v_su><VHI:mode><VSI_LMUL1:mode>"
- [(set (match_operand:VSI_LMUL1 0 "register_operand" "=&vr,&vr")
- (unspec:VSI_LMUL1
- [(unspec:<VHI:VM>
- [(match_operand:<VHI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
+;; Integer Reduction Sum Widen (vwredsum[u].vs)
+(define_insn "@pred_widen_reduc_plus<v_su><mode>"
+ [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr,&vr")
+ (unspec:<V_EXT_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VHI 3 "register_operand" " vr, vr")
- (match_operand:VSI_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VSI_LMUL1 2 "vector_merge_operand" " vu, 0")] WREDUC))]
+ (match_operand:VI_QHS 3 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] WREDUC))]
"TARGET_VECTOR"
"vwredsum<v_su>.vs\t%0,%3,%4%p1"
[(set_attr "type" "viwred")
- (set_attr "mode" "<VHI:MODE>")])
+ (set_attr "mode" "<MODE>")])
-;; Integer Reduction Widen for SI, DI = SI op DI
-(define_insn "@pred_widen_reduc_plus<v_su><VSI:mode><VDI_LMUL1:mode>"
- [(set (match_operand:VDI_LMUL1 0 "register_operand" "=&vr,&vr")
- (unspec:VDI_LMUL1
- [(unspec:<VSI:VM>
- [(match_operand:<VSI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VSI 3 "register_operand" " vr, vr")
- (match_operand:VDI_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VDI_LMUL1 2 "vector_merge_operand" " vu, 0")] WREDUC))]
- "TARGET_VECTOR"
- "vwredsum<v_su>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "viwred")
- (set_attr "mode" "<VSI:MODE>")])
-
-;; Float Reduction for HF
-(define_insn "@pred_reduc_<reduc><VHF:mode><VHF_LMUL1:mode>"
- [(set (match_operand:VHF_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VHF_LMUL1
- [(unspec:<VHF:VM>
- [(match_operand:<VHF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VHF
- (vec_duplicate:VHF
- (vec_select:<VEL>
- (match_operand:VHF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VHF 3 "register_operand" " vr, vr"))
- (match_operand:VHF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vfred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfredu")
- (set_attr "mode" "<VHF:MODE>")])
-
-;; Float Reduction for SF
-(define_insn "@pred_reduc_<reduc><VSF:mode><VSF_LMUL1:mode>"
- [(set (match_operand:VSF_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VSF_LMUL1
- [(unspec:<VSF:VM>
- [(match_operand:<VSF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VSF
- (vec_duplicate:VSF
- (vec_select:<VEL>
- (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VSF 3 "register_operand" " vr, vr"))
- (match_operand:VSF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vfred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfredu")
- (set_attr "mode" "<VSF:MODE>")])
-
-;; Float Reduction for DF
-(define_insn "@pred_reduc_<reduc><VDF:mode><VDF_LMUL1:mode>"
- [(set (match_operand:VDF_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VDF_LMUL1
- [(unspec:<VDF:VM>
- [(match_operand:<VDF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+;; Float Reduction (vfred(max|min).vs)
+(define_insn "@pred_reduc_<reduc><mode>"
+ [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr, vr")
+ (unspec:<V_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
(match_operand 5 "vector_length_operand" " rK, rK")
(match_operand 6 "const_int_operand" " i, i")
(match_operand 7 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VDF
- (vec_duplicate:VDF
+ (any_freduc:VF
+ (vec_duplicate:VF
(vec_select:<VEL>
- (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
+ (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
(parallel [(const_int 0)])))
- (match_operand:VDF 3 "register_operand" " vr, vr"))
- (match_operand:VDF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
+ (match_operand:VF 3 "register_operand" " vr, vr"))
+ (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
"TARGET_VECTOR"
"vfred<reduc>.vs\t%0,%3,%4%p1"
[(set_attr "type" "vfredu")
- (set_attr "mode" "<VDF:MODE>")])
-
-;; Float Ordered Reduction Sum for HF
-(define_insn "@pred_reduc_plus<order><VHF:mode><VHF_LMUL1:mode>"
- [(set (match_operand:VHF_LMUL1 0 "register_operand" "=vr,vr")
- (unspec:VHF_LMUL1
- [(unspec:VHF_LMUL1
- [(unspec:<VHF:VM>
- [(match_operand:<VHF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)
- (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (plus:VHF
- (vec_duplicate:VHF
- (vec_select:<VEL>
- (match_operand:VHF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VHF 3 "register_operand" " vr, vr"))
- (match_operand:VHF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
- "TARGET_VECTOR"
- "vfred<order>sum.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfred<order>")
- (set_attr "mode" "<VHF:MODE>")
- (set (attr "frm_mode")
- (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
+ (set_attr "mode" "<MODE>")])
-;; Float Ordered Reduction Sum for SF
-(define_insn "@pred_reduc_plus<order><VSF:mode><VSF_LMUL1:mode>"
- [(set (match_operand:VSF_LMUL1 0 "register_operand" "=vr,vr")
- (unspec:VSF_LMUL1
- [(unspec:VSF_LMUL1
- [(unspec:<VSF:VM>
- [(match_operand:<VSF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+;; Float Ordered Reduction Sum (vfred[ou]sum.vs)
+(define_insn "@pred_reduc_plus<order><mode>"
+ [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr,vr")
+ (unspec:<V_LMUL1>
+ [(unspec:<V_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
(match_operand 5 "vector_length_operand" " rK, rK")
(match_operand 6 "const_int_operand" " i, i")
(match_operand 7 "const_int_operand" " i, i")
@@ -7991,93 +7804,41 @@
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)
(reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (plus:VSF
- (vec_duplicate:VSF
+ (plus:VF
+ (vec_duplicate:VF
(vec_select:<VEL>
- (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
+ (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
(parallel [(const_int 0)])))
- (match_operand:VSF 3 "register_operand" " vr, vr"))
- (match_operand:VSF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
+ (match_operand:VF 3 "register_operand" " vr, vr"))
+ (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
"TARGET_VECTOR"
"vfred<order>sum.vs\t%0,%3,%4%p1"
[(set_attr "type" "vfred<order>")
- (set_attr "mode" "<VSF:MODE>")
- (set (attr "frm_mode")
- (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
-
-;; Float Ordered Reduction Sum for DF
-(define_insn "@pred_reduc_plus<order><VDF:mode><VDF_LMUL1:mode>"
- [(set (match_operand:VDF_LMUL1 0 "register_operand" "=vr,vr")
- (unspec:VDF_LMUL1
- [(unspec:VDF_LMUL1
- [(unspec:<VDF:VM>
- [(match_operand:<VDF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)
- (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (plus:VDF
- (vec_duplicate:VDF
- (vec_select:<VEL>
- (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VDF 3 "register_operand" " vr, vr"))
- (match_operand:VDF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
- "TARGET_VECTOR"
- "vfred<order>sum.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfred<order>")
- (set_attr "mode" "<VDF:MODE>")
- (set (attr "frm_mode")
- (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
-
-;; Float Widen Reduction for HF, aka SF = HF op SF
-(define_insn "@pred_widen_reduc_plus<order><VHF:mode><VSF_LMUL1:mode>"
- [(set (match_operand:VSF_LMUL1 0 "register_operand" "=&vr, &vr")
- (unspec:VSF_LMUL1
- [(unspec:VSF_LMUL1
- [(unspec:<VHF:VM>
- [(match_operand:<VHF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)
- (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VHF 3 "register_operand" " vr, vr")
- (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VSF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
- "TARGET_VECTOR"
- "vfwred<order>sum.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfwred<order>")
- (set_attr "mode" "<VHF:MODE>")
+ (set_attr "mode" "<MODE>")
(set (attr "frm_mode")
(symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
-;; Float Widen Reduction for SF, aka DF = SF * DF
-(define_insn "@pred_widen_reduc_plus<order><VSF:mode><VDF_LMUL1:mode>"
- [(set (match_operand:VDF_LMUL1 0 "register_operand" "=&vr, &vr")
- (unspec:VDF_LMUL1
- [(unspec:VDF_LMUL1
- [(unspec:<VSF:VM>
- [(match_operand:<VSF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
+;; Float Widen Reduction Sum (vfwred[ou]sum.vs)
+(define_insn "@pred_widen_reduc_plus<order><mode>"
+ [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr, &vr")
+ (unspec:<V_EXT_LMUL1>
+ [(unspec:<V_EXT_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)
(reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VSF 3 "register_operand" " vr, vr")
- (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VDF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
+ (match_operand:VF_HS 3 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
"TARGET_VECTOR"
"vfwred<order>sum.vs\t%0,%3,%4%p1"
[(set_attr "type" "vfwred<order>")
- (set_attr "mode" "<VSF:MODE>")
+ (set_attr "mode" "<MODE>")
(set (attr "frm_mode")
(symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
--
2.36.3
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns after refactor vector mode
2023-09-13 12:31 [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns after refactor vector mode Lehua Ding
@ 2023-09-14 14:10 ` 钟居哲
2023-09-14 15:01 ` Lehua Ding
0 siblings, 1 reply; 3+ messages in thread
From: 钟居哲 @ 2023-09-14 14:10 UTC (permalink / raw)
To: 丁乐华, gcc-patches
Cc: kito.cheng, rdapp.gcc, palmer, Jeff Law, 丁乐华
[-- Attachment #1: Type: text/plain, Size: 29204 bytes --]
Thanks for cleaning up.
LGTM.
juzhe.zhong@rivai.ai
From: Lehua Ding
Date: 2023-09-13 20:31
To: gcc-patches
CC: juzhe.zhong; kito.cheng; rdapp.gcc; palmer; jeffreyalaw; lehua.ding
Subject: [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns after refactor vector mode
This patch cleanups redundant reduction patterns after Juzhe change vector mode
from fixed-size to scalable-size. For example, whether it is zvl32b, zvl64b,
zvl128b, RVVM1SI indicates that it occupies a vector register. Therefore, it is
easy to map vector modes to LMUL1 vector modes with define_mode_attr without
creating a separate pattern for each LMUL1 Mode. For example, this patch can
combine four patterns (@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>,
@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>
@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>,
@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>) to a single pattern
@pred_reduc_<reduc><mode>.
gcc/ChangeLog:
* config/riscv/riscv-v.cc (expand_reduction): Adjust call.
* config/riscv/riscv-vector-builtins-bases.cc: Adjust call.
* config/riscv/vector-iterators.md: New iterators and attrs.
* config/riscv/vector.md (@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>):
Removed.
(@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><mode>): Added.
(@pred_widen_reduc_plus<v_su><VQI:mode><VHI_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<v_su><VHI:mode><VSI_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<v_su><mode>): Added.
(@pred_widen_reduc_plus<v_su><VSI:mode><VDI_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VHF:mode><VHF_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VSF:mode><VSF_LMUL1:mode>): Removed.
(@pred_reduc_<reduc><VDF:mode><VDF_LMUL1:mode>): Removed.
(@pred_reduc_plus<order><VHF:mode><VHF_LMUL1:mode>): Removed.
(@pred_reduc_plus<order><VSF:mode><VSF_LMUL1:mode>): Removed.
(@pred_reduc_plus<order><mode>): Added.
(@pred_reduc_plus<order><VDF:mode><VDF_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<order><VHF:mode><VSF_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<order><VSF:mode><VDF_LMUL1:mode>): Removed.
(@pred_widen_reduc_plus<order><mode>): Added.
---
gcc/config/riscv/riscv-v.cc | 4 +-
.../riscv/riscv-vector-builtins-bases.cc | 15 +-
gcc/config/riscv/vector-iterators.md | 47 ++-
gcc/config/riscv/vector.md | 369 +++---------------
4 files changed, 101 insertions(+), 334 deletions(-)
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index 76e6094f45b..68b36d9dc4f 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -3230,7 +3230,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type)
= code_for_pred_reduc_plus (type == reduction_type::UNORDERED
? UNSPEC_UNORDERED
: UNSPEC_ORDERED,
- vmode, m1_mode);
+ vmode);
if (type == reduction_type::MASK_LEN_FOLD_LEFT)
{
rtx mask = ops[3];
@@ -3243,7 +3243,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx init, reduction_type type)
}
else
{
- insn_code icode = code_for_pred_reduc (code, vmode, m1_mode);
+ insn_code icode = code_for_pred_reduc (code, vmode);
emit_vlmax_insn (icode, REDUCE_OP, reduc_ops);
}
diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc
index ee218a03017..c54ea6f0560 100644
--- a/gcc/config/riscv/riscv-vector-builtins-bases.cc
+++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc
@@ -1541,8 +1541,7 @@ public:
rtx expand (function_expander &e) const override
{
- return e.use_exact_insn (
- code_for_pred_reduc (CODE, e.vector_mode (), e.ret_mode ()));
+ return e.use_exact_insn (code_for_pred_reduc (CODE, e.vector_mode ()));
}
};
@@ -1555,9 +1554,8 @@ public:
rtx expand (function_expander &e) const override
{
- return e.use_exact_insn (code_for_pred_widen_reduc_plus (UNSPEC,
- e.vector_mode (),
- e.ret_mode ()));
+ return e.use_exact_insn (
+ code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ()));
}
};
@@ -1576,7 +1574,7 @@ public:
rtx expand (function_expander &e) const override
{
return e.use_exact_insn (
- code_for_pred_reduc_plus (UNSPEC, e.vector_mode (), e.ret_mode ()));
+ code_for_pred_reduc_plus (UNSPEC, e.vector_mode ()));
}
};
@@ -1594,9 +1592,8 @@ public:
rtx expand (function_expander &e) const override
{
- return e.use_exact_insn (code_for_pred_widen_reduc_plus (UNSPEC,
- e.vector_mode (),
- e.ret_mode ()));
+ return e.use_exact_insn (
+ code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ()));
}
};
diff --git a/gcc/config/riscv/vector-iterators.md b/gcc/config/riscv/vector-iterators.md
index e70a9bc5c74..deb89cbcedc 100644
--- a/gcc/config/riscv/vector-iterators.md
+++ b/gcc/config/riscv/vector-iterators.md
@@ -671,6 +671,15 @@
RVVM8SI RVVM4SI RVVM2SI RVVM1SI (RVVMF2SI "TARGET_MIN_VLEN > 32")
])
+(define_mode_iterator VF_HS [
+ (RVVM8HF "TARGET_ZVFH") (RVVM4HF "TARGET_ZVFH") (RVVM2HF "TARGET_ZVFH")
+ (RVVM1HF "TARGET_ZVFH") (RVVMF2HF "TARGET_ZVFH")
+ (RVVMF4HF "TARGET_ZVFH && TARGET_MIN_VLEN > 32")
+
+ (RVVM8SF "TARGET_VECTOR_ELEN_FP_32") (RVVM4SF "TARGET_VECTOR_ELEN_FP_32") (RVVM2SF "TARGET_VECTOR_ELEN_FP_32")
+ (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32")
+])
+
(define_mode_iterator V_VLSI_QHS [
RVVM8QI RVVM4QI RVVM2QI RVVM1QI RVVMF2QI RVVMF4QI (RVVMF8QI "TARGET_MIN_VLEN > 32")
@@ -1237,32 +1246,32 @@
(RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
])
-(define_mode_iterator VQI_LMUL1 [
- RVVM1QI
-])
+(define_mode_attr V_LMUL1 [
+ (RVVM8QI "RVVM1QI") (RVVM4QI "RVVM1QI") (RVVM2QI "RVVM1QI") (RVVM1QI "RVVM1QI") (RVVMF2QI "RVVM1QI") (RVVMF4QI "RVVM1QI") (RVVMF8QI "RVVM1QI")
-(define_mode_iterator VHI_LMUL1 [
- RVVM1HI
-])
+ (RVVM8HI "RVVM1HI") (RVVM4HI "RVVM1HI") (RVVM2HI "RVVM1HI") (RVVM1HI "RVVM1HI") (RVVMF2HI "RVVM1HI") (RVVMF4HI "RVVM1HI")
-(define_mode_iterator VSI_LMUL1 [
- RVVM1SI
-])
+ (RVVM8SI "RVVM1SI") (RVVM4SI "RVVM1SI") (RVVM2SI "RVVM1SI") (RVVM1SI "RVVM1SI") (RVVMF2SI "RVVM1SI")
-(define_mode_iterator VDI_LMUL1 [
- (RVVM1DI "TARGET_VECTOR_ELEN_64")
-])
+ (RVVM8DI "RVVM1DI") (RVVM4DI "RVVM1DI") (RVVM2DI "RVVM1DI") (RVVM1DI "RVVM1DI")
-(define_mode_iterator VHF_LMUL1 [
- (RVVM1HF "TARGET_ZVFH")
-])
+ (RVVM8HF "RVVM1HF") (RVVM4HF "RVVM1HF") (RVVM2HF "RVVM1HF") (RVVM1HF "RVVM1HF") (RVVMF2HF "RVVM1HF") (RVVMF4HF "RVVM1HF")
-(define_mode_iterator VSF_LMUL1 [
- (RVVM1SF "TARGET_VECTOR_ELEN_FP_32")
+ (RVVM8SF "RVVM1SF") (RVVM4SF "RVVM1SF") (RVVM2SF "RVVM1SF") (RVVM1SF "RVVM1SF") (RVVMF2SF "RVVM1SF")
+
+ (RVVM8DF "RVVM1DF") (RVVM4DF "RVVM1DF") (RVVM2DF "RVVM1DF") (RVVM1DF "RVVM1DF")
])
-(define_mode_iterator VDF_LMUL1 [
- (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
+(define_mode_attr V_EXT_LMUL1 [
+ (RVVM8QI "RVVM1HI") (RVVM4QI "RVVM1HI") (RVVM2QI "RVVM1HI") (RVVM1QI "RVVM1HI") (RVVMF2QI "RVVM1HI") (RVVMF4QI "RVVM1HI") (RVVMF8QI "RVVM1HI")
+
+ (RVVM8HI "RVVM1SI") (RVVM4HI "RVVM1SI") (RVVM2HI "RVVM1SI") (RVVM1HI "RVVM1SI") (RVVMF2HI "RVVM1SI") (RVVMF4HI "RVVM1SI")
+
+ (RVVM8SI "RVVM1DI") (RVVM4SI "RVVM1DI") (RVVM2SI "RVVM1DI") (RVVM1SI "RVVM1DI") (RVVMF2SI "RVVM1DI")
+
+ (RVVM8HF "RVVM1SF") (RVVM4HF "RVVM1SF") (RVVM2HF "RVVM1SF") (RVVM1HF "RVVM1SF") (RVVMF2HF "RVVM1SF") (RVVMF4HF "RVVM1SF")
+
+ (RVVM8SF "RVVM1DF") (RVVM4SF "RVVM1DF") (RVVM2SF "RVVM1DF") (RVVM1SF "RVVM1DF") (RVVMF2SF "RVVM1DF")
])
(define_mode_attr VINDEX [
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index 58e659e5cd4..b6c8e63b0b2 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -7725,265 +7725,78 @@
;; - 14.4 Vector Widening Floating-Point Reduction Instructions
;; -------------------------------------------------------------------------------
-;; For reduction operations, we should have seperate patterns for
-;; different types. For each type, we will cover MIN_VLEN == 32, MIN_VLEN == 64
-;; and the MIN_VLEN >= 128 from the well defined iterators.
-;; Since reduction need LMUL = 1 scalar operand as the input operand
-;; and they are different.
-
-;; Integer Reduction for QI
-(define_insn "@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>"
- [(set (match_operand:VQI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VQI_LMUL1
- [(unspec:<VQI:VM>
- [(match_operand:<VQI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VQI
- (vec_duplicate:VQI
- (vec_select:<VEL>
- (match_operand:VQI_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VQI 3 "register_operand" " vr, vr"))
- (match_operand:VQI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vired")
- (set_attr "mode" "<VQI:MODE>")])
-
-;; Integer Reduction for HI
-(define_insn "@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>"
- [(set (match_operand:VHI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VHI_LMUL1
- [(unspec:<VHI:VM>
- [(match_operand:<VHI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VHI
- (vec_duplicate:VHI
- (vec_select:<VEL>
- (match_operand:VHI_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VHI 3 "register_operand" " vr, vr"))
- (match_operand:VHI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vired")
- (set_attr "mode" "<VHI:MODE>")])
-
-;; Integer Reduction for SI
-(define_insn "@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>"
- [(set (match_operand:VSI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VSI_LMUL1
- [(unspec:<VSI:VM>
- [(match_operand:<VSI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VSI
- (vec_duplicate:VSI
- (vec_select:<VEL>
- (match_operand:VSI_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VSI 3 "register_operand" " vr, vr"))
- (match_operand:VSI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vired")
- (set_attr "mode" "<VSI:MODE>")])
-
-;; Integer Reduction for DI
-(define_insn "@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>"
- [(set (match_operand:VDI_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VDI_LMUL1
- [(unspec:<VDI:VM>
- [(match_operand:<VDI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+;; Integer Reduction (vred(sum|maxu|max|minu|min|and|or|xor).vs)
+(define_insn "@pred_reduc_<reduc><mode>"
+ [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr, vr")
+ (unspec:<V_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
(match_operand 5 "vector_length_operand" " rK, rK")
(match_operand 6 "const_int_operand" " i, i")
(match_operand 7 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VDI
- (vec_duplicate:VDI
+ (any_reduc:VI
+ (vec_duplicate:VI
(vec_select:<VEL>
- (match_operand:VDI_LMUL1 4 "register_operand" " vr, vr")
+ (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
(parallel [(const_int 0)])))
- (match_operand:VDI 3 "register_operand" " vr, vr"))
- (match_operand:VDI_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
+ (match_operand:VI 3 "register_operand" " vr, vr"))
+ (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
"TARGET_VECTOR"
"vred<reduc>.vs\t%0,%3,%4%p1"
[(set_attr "type" "vired")
- (set_attr "mode" "<VDI:MODE>")])
-
-;; Integer Reduction Widen for QI, HI = QI op HI
-(define_insn "@pred_widen_reduc_plus<v_su><VQI:mode><VHI_LMUL1:mode>"
- [(set (match_operand:VHI_LMUL1 0 "register_operand" "=&vr,&vr")
- (unspec:VHI_LMUL1
- [(unspec:<VQI:VM>
- [(match_operand:<VQI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VQI 3 "register_operand" " vr, vr")
- (match_operand:VHI_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VHI_LMUL1 2 "vector_merge_operand" " vu, 0")] WREDUC))]
- "TARGET_VECTOR"
- "vwredsum<v_su>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "viwred")
- (set_attr "mode" "<VQI:MODE>")])
+ (set_attr "mode" "<MODE>")])
-;; Integer Reduction Widen for HI, SI = HI op SI
-(define_insn "@pred_widen_reduc_plus<v_su><VHI:mode><VSI_LMUL1:mode>"
- [(set (match_operand:VSI_LMUL1 0 "register_operand" "=&vr,&vr")
- (unspec:VSI_LMUL1
- [(unspec:<VHI:VM>
- [(match_operand:<VHI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
+;; Integer Reduction Sum Widen (vwredsum[u].vs)
+(define_insn "@pred_widen_reduc_plus<v_su><mode>"
+ [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr,&vr")
+ (unspec:<V_EXT_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VHI 3 "register_operand" " vr, vr")
- (match_operand:VSI_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VSI_LMUL1 2 "vector_merge_operand" " vu, 0")] WREDUC))]
+ (match_operand:VI_QHS 3 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] WREDUC))]
"TARGET_VECTOR"
"vwredsum<v_su>.vs\t%0,%3,%4%p1"
[(set_attr "type" "viwred")
- (set_attr "mode" "<VHI:MODE>")])
+ (set_attr "mode" "<MODE>")])
-;; Integer Reduction Widen for SI, DI = SI op DI
-(define_insn "@pred_widen_reduc_plus<v_su><VSI:mode><VDI_LMUL1:mode>"
- [(set (match_operand:VDI_LMUL1 0 "register_operand" "=&vr,&vr")
- (unspec:VDI_LMUL1
- [(unspec:<VSI:VM>
- [(match_operand:<VSI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VSI 3 "register_operand" " vr, vr")
- (match_operand:VDI_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VDI_LMUL1 2 "vector_merge_operand" " vu, 0")] WREDUC))]
- "TARGET_VECTOR"
- "vwredsum<v_su>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "viwred")
- (set_attr "mode" "<VSI:MODE>")])
-
-;; Float Reduction for HF
-(define_insn "@pred_reduc_<reduc><VHF:mode><VHF_LMUL1:mode>"
- [(set (match_operand:VHF_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VHF_LMUL1
- [(unspec:<VHF:VM>
- [(match_operand:<VHF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VHF
- (vec_duplicate:VHF
- (vec_select:<VEL>
- (match_operand:VHF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VHF 3 "register_operand" " vr, vr"))
- (match_operand:VHF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vfred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfredu")
- (set_attr "mode" "<VHF:MODE>")])
-
-;; Float Reduction for SF
-(define_insn "@pred_reduc_<reduc><VSF:mode><VSF_LMUL1:mode>"
- [(set (match_operand:VSF_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VSF_LMUL1
- [(unspec:<VSF:VM>
- [(match_operand:<VSF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VSF
- (vec_duplicate:VSF
- (vec_select:<VEL>
- (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VSF 3 "register_operand" " vr, vr"))
- (match_operand:VSF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
- "TARGET_VECTOR"
- "vfred<reduc>.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfredu")
- (set_attr "mode" "<VSF:MODE>")])
-
-;; Float Reduction for DF
-(define_insn "@pred_reduc_<reduc><VDF:mode><VDF_LMUL1:mode>"
- [(set (match_operand:VDF_LMUL1 0 "register_operand" "=vr, vr")
- (unspec:VDF_LMUL1
- [(unspec:<VDF:VM>
- [(match_operand:<VDF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+;; Float Reduction (vfred(max|min).vs)
+(define_insn "@pred_reduc_<reduc><mode>"
+ [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr, vr")
+ (unspec:<V_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
(match_operand 5 "vector_length_operand" " rK, rK")
(match_operand 6 "const_int_operand" " i, i")
(match_operand 7 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
- (any_reduc:VDF
- (vec_duplicate:VDF
+ (any_freduc:VF
+ (vec_duplicate:VF
(vec_select:<VEL>
- (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
+ (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
(parallel [(const_int 0)])))
- (match_operand:VDF 3 "register_operand" " vr, vr"))
- (match_operand:VDF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
+ (match_operand:VF 3 "register_operand" " vr, vr"))
+ (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC))]
"TARGET_VECTOR"
"vfred<reduc>.vs\t%0,%3,%4%p1"
[(set_attr "type" "vfredu")
- (set_attr "mode" "<VDF:MODE>")])
-
-;; Float Ordered Reduction Sum for HF
-(define_insn "@pred_reduc_plus<order><VHF:mode><VHF_LMUL1:mode>"
- [(set (match_operand:VHF_LMUL1 0 "register_operand" "=vr,vr")
- (unspec:VHF_LMUL1
- [(unspec:VHF_LMUL1
- [(unspec:<VHF:VM>
- [(match_operand:<VHF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)
- (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (plus:VHF
- (vec_duplicate:VHF
- (vec_select:<VEL>
- (match_operand:VHF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VHF 3 "register_operand" " vr, vr"))
- (match_operand:VHF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
- "TARGET_VECTOR"
- "vfred<order>sum.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfred<order>")
- (set_attr "mode" "<VHF:MODE>")
- (set (attr "frm_mode")
- (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
+ (set_attr "mode" "<MODE>")])
-;; Float Ordered Reduction Sum for SF
-(define_insn "@pred_reduc_plus<order><VSF:mode><VSF_LMUL1:mode>"
- [(set (match_operand:VSF_LMUL1 0 "register_operand" "=vr,vr")
- (unspec:VSF_LMUL1
- [(unspec:VSF_LMUL1
- [(unspec:<VSF:VM>
- [(match_operand:<VSF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+;; Float Ordered Reduction Sum (vfred[ou]sum.vs)
+(define_insn "@pred_reduc_plus<order><mode>"
+ [(set (match_operand:<V_LMUL1> 0 "register_operand" "=vr,vr")
+ (unspec:<V_LMUL1>
+ [(unspec:<V_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
(match_operand 5 "vector_length_operand" " rK, rK")
(match_operand 6 "const_int_operand" " i, i")
(match_operand 7 "const_int_operand" " i, i")
@@ -7991,93 +7804,41 @@
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)
(reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (plus:VSF
- (vec_duplicate:VSF
+ (plus:VF
+ (vec_duplicate:VF
(vec_select:<VEL>
- (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
+ (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
(parallel [(const_int 0)])))
- (match_operand:VSF 3 "register_operand" " vr, vr"))
- (match_operand:VSF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
+ (match_operand:VF 3 "register_operand" " vr, vr"))
+ (match_operand:<V_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
"TARGET_VECTOR"
"vfred<order>sum.vs\t%0,%3,%4%p1"
[(set_attr "type" "vfred<order>")
- (set_attr "mode" "<VSF:MODE>")
- (set (attr "frm_mode")
- (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
-
-;; Float Ordered Reduction Sum for DF
-(define_insn "@pred_reduc_plus<order><VDF:mode><VDF_LMUL1:mode>"
- [(set (match_operand:VDF_LMUL1 0 "register_operand" "=vr,vr")
- (unspec:VDF_LMUL1
- [(unspec:VDF_LMUL1
- [(unspec:<VDF:VM>
- [(match_operand:<VDF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)
- (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (plus:VDF
- (vec_duplicate:VDF
- (vec_select:<VEL>
- (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
- (parallel [(const_int 0)])))
- (match_operand:VDF 3 "register_operand" " vr, vr"))
- (match_operand:VDF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_REDUC)] ORDER))]
- "TARGET_VECTOR"
- "vfred<order>sum.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfred<order>")
- (set_attr "mode" "<VDF:MODE>")
- (set (attr "frm_mode")
- (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
-
-;; Float Widen Reduction for HF, aka SF = HF op SF
-(define_insn "@pred_widen_reduc_plus<order><VHF:mode><VSF_LMUL1:mode>"
- [(set (match_operand:VSF_LMUL1 0 "register_operand" "=&vr, &vr")
- (unspec:VSF_LMUL1
- [(unspec:VSF_LMUL1
- [(unspec:<VHF:VM>
- [(match_operand:<VHF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
- (reg:SI VL_REGNUM)
- (reg:SI VTYPE_REGNUM)
- (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VHF 3 "register_operand" " vr, vr")
- (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VSF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
- "TARGET_VECTOR"
- "vfwred<order>sum.vs\t%0,%3,%4%p1"
- [(set_attr "type" "vfwred<order>")
- (set_attr "mode" "<VHF:MODE>")
+ (set_attr "mode" "<MODE>")
(set (attr "frm_mode")
(symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
-;; Float Widen Reduction for SF, aka DF = SF * DF
-(define_insn "@pred_widen_reduc_plus<order><VSF:mode><VDF_LMUL1:mode>"
- [(set (match_operand:VDF_LMUL1 0 "register_operand" "=&vr, &vr")
- (unspec:VDF_LMUL1
- [(unspec:VDF_LMUL1
- [(unspec:<VSF:VM>
- [(match_operand:<VSF:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
- (match_operand 5 "vector_length_operand" " rK, rK")
- (match_operand 6 "const_int_operand" " i, i")
- (match_operand 7 "const_int_operand" " i, i")
- (match_operand 8 "const_int_operand" " i, i")
+;; Float Widen Reduction Sum (vfwred[ou]sum.vs)
+(define_insn "@pred_widen_reduc_plus<order><mode>"
+ [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand" "=&vr, &vr")
+ (unspec:<V_EXT_LMUL1>
+ [(unspec:<V_EXT_LMUL1>
+ [(unspec:<VM>
+ [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+ (match_operand 5 "vector_length_operand" " rK, rK")
+ (match_operand 6 "const_int_operand" " i, i")
+ (match_operand 7 "const_int_operand" " i, i")
+ (match_operand 8 "const_int_operand" " i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)
(reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
- (match_operand:VSF 3 "register_operand" " vr, vr")
- (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
- (match_operand:VDF_LMUL1 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
+ (match_operand:VF_HS 3 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 4 "register_operand" " vr, vr")
+ (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" " vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
"TARGET_VECTOR"
"vfwred<order>sum.vs\t%0,%3,%4%p1"
[(set_attr "type" "vfwred<order>")
- (set_attr "mode" "<VSF:MODE>")
+ (set_attr "mode" "<MODE>")
(set (attr "frm_mode")
(symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
--
2.36.3
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns after refactor vector mode
2023-09-14 14:10 ` 钟居哲
@ 2023-09-14 15:01 ` Lehua Ding
0 siblings, 0 replies; 3+ messages in thread
From: Lehua Ding @ 2023-09-14 15:01 UTC (permalink / raw)
To: 钟居哲, gcc-patches
Cc: kito.cheng, rdapp.gcc, palmer, Jeff Law
Committed, thanks Juzhe.
On 2023/9/14 22:10, 钟居哲 wrote:
> Thanks for cleaning up.
> LGTM.
>
> ------------------------------------------------------------------------
> juzhe.zhong@rivai.ai
>
> *From:* Lehua Ding <mailto:lehua.ding@rivai.ai>
> *Date:* 2023-09-13 20:31
> *To:* gcc-patches <mailto:gcc-patches@gcc.gnu.org>
> *CC:* juzhe.zhong <mailto:juzhe.zhong@rivai.ai>; kito.cheng
> <mailto:kito.cheng@gmail.com>; rdapp.gcc
> <mailto:rdapp.gcc@gmail.com>; palmer <mailto:palmer@rivosinc.com>;
> jeffreyalaw <mailto:jeffreyalaw@gmail.com>; lehua.ding
> <mailto:lehua.ding@rivai.ai>
> *Subject:* [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns
> after refactor vector mode
> This patch cleanups redundant reduction patterns after Juzhe change
> vector mode
> from fixed-size to scalable-size. For example, whether it is zvl32b,
> zvl64b,
> zvl128b, RVVM1SI indicates that it occupies a vector register.
> Therefore, it is
> easy to map vector modes to LMUL1 vector modes with define_mode_attr
> without
> creating a separate pattern for each LMUL1 Mode. For example, this
> patch can
> combine four patterns (@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>,
> @pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>
> @pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>,
> @pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>) to a single pattern
> @pred_reduc_<reduc><mode>.
> gcc/ChangeLog:
> * config/riscv/riscv-v.cc (expand_reduction): Adjust call.
> * config/riscv/riscv-vector-builtins-bases.cc: Adjust call.
> * config/riscv/vector-iterators.md: New iterators and attrs.
> * config/riscv/vector.md
> (@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>):
> Removed.
> (@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>): Removed.
> (@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>): Removed.
> (@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>): Removed.
> (@pred_reduc_<reduc><mode>): Added.
> (@pred_widen_reduc_plus<v_su><VQI:mode><VHI_LMUL1:mode>): Removed.
> (@pred_widen_reduc_plus<v_su><VHI:mode><VSI_LMUL1:mode>): Removed.
> (@pred_widen_reduc_plus<v_su><mode>): Added.
> (@pred_widen_reduc_plus<v_su><VSI:mode><VDI_LMUL1:mode>): Removed.
> (@pred_reduc_<reduc><VHF:mode><VHF_LMUL1:mode>): Removed.
> (@pred_reduc_<reduc><VSF:mode><VSF_LMUL1:mode>): Removed.
> (@pred_reduc_<reduc><VDF:mode><VDF_LMUL1:mode>): Removed.
> (@pred_reduc_plus<order><VHF:mode><VHF_LMUL1:mode>): Removed.
> (@pred_reduc_plus<order><VSF:mode><VSF_LMUL1:mode>): Removed.
> (@pred_reduc_plus<order><mode>): Added.
> (@pred_reduc_plus<order><VDF:mode><VDF_LMUL1:mode>): Removed.
> (@pred_widen_reduc_plus<order><VHF:mode><VSF_LMUL1:mode>): Removed.
> (@pred_widen_reduc_plus<order><VSF:mode><VDF_LMUL1:mode>): Removed.
> (@pred_widen_reduc_plus<order><mode>): Added.
> ---
> gcc/config/riscv/riscv-v.cc | 4 +-
> .../riscv/riscv-vector-builtins-bases.cc | 15 +-
> gcc/config/riscv/vector-iterators.md | 47 ++-
> gcc/config/riscv/vector.md | 369 +++---------------
> 4 files changed, 101 insertions(+), 334 deletions(-)
> diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
> index 76e6094f45b..68b36d9dc4f 100644
> --- a/gcc/config/riscv/riscv-v.cc
> +++ b/gcc/config/riscv/riscv-v.cc
> @@ -3230,7 +3230,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx
> init, reduction_type type)
> = code_for_pred_reduc_plus (type == reduction_type::UNORDERED
> ? UNSPEC_UNORDERED
> : UNSPEC_ORDERED,
> - vmode, m1_mode);
> + vmode);
> if (type == reduction_type::MASK_LEN_FOLD_LEFT)
> {
> rtx mask = ops[3];
> @@ -3243,7 +3243,7 @@ expand_reduction (rtx_code code, rtx *ops, rtx
> init, reduction_type type)
> }
> else
> {
> - insn_code icode = code_for_pred_reduc (code, vmode, m1_mode);
> + insn_code icode = code_for_pred_reduc (code, vmode);
> emit_vlmax_insn (icode, REDUCE_OP, reduc_ops);
> }
> diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc
> b/gcc/config/riscv/riscv-vector-builtins-bases.cc
> index ee218a03017..c54ea6f0560 100644
> --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc
> +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc
> @@ -1541,8 +1541,7 @@ public:
> rtx expand (function_expander &e) const override
> {
> - return e.use_exact_insn (
> - code_for_pred_reduc (CODE, e.vector_mode (), e.ret_mode ()));
> + return e.use_exact_insn (code_for_pred_reduc (CODE,
> e.vector_mode ()));
> }
> };
> @@ -1555,9 +1554,8 @@ public:
> rtx expand (function_expander &e) const override
> {
> - return e.use_exact_insn (code_for_pred_widen_reduc_plus (UNSPEC,
> - e.vector_mode (),
> - e.ret_mode ()));
> + return e.use_exact_insn (
> + code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ()));
> }
> };
> @@ -1576,7 +1574,7 @@ public:
> rtx expand (function_expander &e) const override
> {
> return e.use_exact_insn (
> - code_for_pred_reduc_plus (UNSPEC, e.vector_mode (),
> e.ret_mode ()));
> + code_for_pred_reduc_plus (UNSPEC, e.vector_mode ()));
> }
> };
> @@ -1594,9 +1592,8 @@ public:
> rtx expand (function_expander &e) const override
> {
> - return e.use_exact_insn (code_for_pred_widen_reduc_plus (UNSPEC,
> - e.vector_mode (),
> - e.ret_mode ()));
> + return e.use_exact_insn (
> + code_for_pred_widen_reduc_plus (UNSPEC, e.vector_mode ()));
> }
> };
> diff --git a/gcc/config/riscv/vector-iterators.md
> b/gcc/config/riscv/vector-iterators.md
> index e70a9bc5c74..deb89cbcedc 100644
> --- a/gcc/config/riscv/vector-iterators.md
> +++ b/gcc/config/riscv/vector-iterators.md
> @@ -671,6 +671,15 @@
> RVVM8SI RVVM4SI RVVM2SI RVVM1SI (RVVMF2SI "TARGET_MIN_VLEN > 32")
> ])
> +(define_mode_iterator VF_HS [
> + (RVVM8HF "TARGET_ZVFH") (RVVM4HF "TARGET_ZVFH") (RVVM2HF
> "TARGET_ZVFH")
> + (RVVM1HF "TARGET_ZVFH") (RVVMF2HF "TARGET_ZVFH")
> + (RVVMF4HF "TARGET_ZVFH && TARGET_MIN_VLEN > 32")
> +
> + (RVVM8SF "TARGET_VECTOR_ELEN_FP_32") (RVVM4SF
> "TARGET_VECTOR_ELEN_FP_32") (RVVM2SF "TARGET_VECTOR_ELEN_FP_32")
> + (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") (RVVMF2SF
> "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32")
> +])
> +
> (define_mode_iterator V_VLSI_QHS [
> RVVM8QI RVVM4QI RVVM2QI RVVM1QI RVVMF2QI RVVMF4QI (RVVMF8QI
> "TARGET_MIN_VLEN > 32")
> @@ -1237,32 +1246,32 @@
> (RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF
> "TARGET_VECTOR_ELEN_FP_64")
> ])
> -(define_mode_iterator VQI_LMUL1 [
> - RVVM1QI
> -])
> +(define_mode_attr V_LMUL1 [
> + (RVVM8QI "RVVM1QI") (RVVM4QI "RVVM1QI") (RVVM2QI "RVVM1QI")
> (RVVM1QI "RVVM1QI") (RVVMF2QI "RVVM1QI") (RVVMF4QI "RVVM1QI")
> (RVVMF8QI "RVVM1QI")
> -(define_mode_iterator VHI_LMUL1 [
> - RVVM1HI
> -])
> + (RVVM8HI "RVVM1HI") (RVVM4HI "RVVM1HI") (RVVM2HI "RVVM1HI")
> (RVVM1HI "RVVM1HI") (RVVMF2HI "RVVM1HI") (RVVMF4HI "RVVM1HI")
> -(define_mode_iterator VSI_LMUL1 [
> - RVVM1SI
> -])
> + (RVVM8SI "RVVM1SI") (RVVM4SI "RVVM1SI") (RVVM2SI "RVVM1SI")
> (RVVM1SI "RVVM1SI") (RVVMF2SI "RVVM1SI")
> -(define_mode_iterator VDI_LMUL1 [
> - (RVVM1DI "TARGET_VECTOR_ELEN_64")
> -])
> + (RVVM8DI "RVVM1DI") (RVVM4DI "RVVM1DI") (RVVM2DI "RVVM1DI")
> (RVVM1DI "RVVM1DI")
> -(define_mode_iterator VHF_LMUL1 [
> - (RVVM1HF "TARGET_ZVFH")
> -])
> + (RVVM8HF "RVVM1HF") (RVVM4HF "RVVM1HF") (RVVM2HF "RVVM1HF")
> (RVVM1HF "RVVM1HF") (RVVMF2HF "RVVM1HF") (RVVMF4HF "RVVM1HF")
> -(define_mode_iterator VSF_LMUL1 [
> - (RVVM1SF "TARGET_VECTOR_ELEN_FP_32")
> + (RVVM8SF "RVVM1SF") (RVVM4SF "RVVM1SF") (RVVM2SF "RVVM1SF")
> (RVVM1SF "RVVM1SF") (RVVMF2SF "RVVM1SF")
> +
> + (RVVM8DF "RVVM1DF") (RVVM4DF "RVVM1DF") (RVVM2DF "RVVM1DF")
> (RVVM1DF "RVVM1DF")
> ])
> -(define_mode_iterator VDF_LMUL1 [
> - (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
> +(define_mode_attr V_EXT_LMUL1 [
> + (RVVM8QI "RVVM1HI") (RVVM4QI "RVVM1HI") (RVVM2QI "RVVM1HI")
> (RVVM1QI "RVVM1HI") (RVVMF2QI "RVVM1HI") (RVVMF4QI "RVVM1HI")
> (RVVMF8QI "RVVM1HI")
> +
> + (RVVM8HI "RVVM1SI") (RVVM4HI "RVVM1SI") (RVVM2HI "RVVM1SI")
> (RVVM1HI "RVVM1SI") (RVVMF2HI "RVVM1SI") (RVVMF4HI "RVVM1SI")
> +
> + (RVVM8SI "RVVM1DI") (RVVM4SI "RVVM1DI") (RVVM2SI "RVVM1DI")
> (RVVM1SI "RVVM1DI") (RVVMF2SI "RVVM1DI")
> +
> + (RVVM8HF "RVVM1SF") (RVVM4HF "RVVM1SF") (RVVM2HF "RVVM1SF")
> (RVVM1HF "RVVM1SF") (RVVMF2HF "RVVM1SF") (RVVMF4HF "RVVM1SF")
> +
> + (RVVM8SF "RVVM1DF") (RVVM4SF "RVVM1DF") (RVVM2SF "RVVM1DF")
> (RVVM1SF "RVVM1DF") (RVVMF2SF "RVVM1DF")
> ])
> (define_mode_attr VINDEX [
> diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
> index 58e659e5cd4..b6c8e63b0b2 100644
> --- a/gcc/config/riscv/vector.md
> +++ b/gcc/config/riscv/vector.md
> @@ -7725,265 +7725,78 @@
> ;; - 14.4 Vector Widening Floating-Point Reduction Instructions
> ;;
> -------------------------------------------------------------------------------
> -;; For reduction operations, we should have seperate patterns for
> -;; different types. For each type, we will cover MIN_VLEN == 32,
> MIN_VLEN == 64
> -;; and the MIN_VLEN >= 128 from the well defined iterators.
> -;; Since reduction need LMUL = 1 scalar operand as the input operand
> -;; and they are different.
> -
> -;; Integer Reduction for QI
> -(define_insn "@pred_reduc_<reduc><VQI:mode><VQI_LMUL1:mode>"
> - [(set (match_operand:VQI_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VQI_LMUL1
> - [(unspec:<VQI:VM>
> - [(match_operand:<VQI:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VQI
> - (vec_duplicate:VQI
> - (vec_select:<VEL>
> - (match_operand:VQI_LMUL1 4 "register_operand" " vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VQI 3 "register_operand" "
> vr, vr"))
> - (match_operand:VQI_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> - "TARGET_VECTOR"
> - "vred<reduc>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vired")
> - (set_attr "mode" "<VQI:MODE>")])
> -
> -;; Integer Reduction for HI
> -(define_insn "@pred_reduc_<reduc><VHI:mode><VHI_LMUL1:mode>"
> - [(set (match_operand:VHI_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VHI_LMUL1
> - [(unspec:<VHI:VM>
> - [(match_operand:<VHI:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VHI
> - (vec_duplicate:VHI
> - (vec_select:<VEL>
> - (match_operand:VHI_LMUL1 4 "register_operand" " vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VHI 3 "register_operand" "
> vr, vr"))
> - (match_operand:VHI_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> - "TARGET_VECTOR"
> - "vred<reduc>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vired")
> - (set_attr "mode" "<VHI:MODE>")])
> -
> -;; Integer Reduction for SI
> -(define_insn "@pred_reduc_<reduc><VSI:mode><VSI_LMUL1:mode>"
> - [(set (match_operand:VSI_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VSI_LMUL1
> - [(unspec:<VSI:VM>
> - [(match_operand:<VSI:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VSI
> - (vec_duplicate:VSI
> - (vec_select:<VEL>
> - (match_operand:VSI_LMUL1 4 "register_operand" " vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VSI 3 "register_operand" "
> vr, vr"))
> - (match_operand:VSI_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> - "TARGET_VECTOR"
> - "vred<reduc>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vired")
> - (set_attr "mode" "<VSI:MODE>")])
> -
> -;; Integer Reduction for DI
> -(define_insn "@pred_reduc_<reduc><VDI:mode><VDI_LMUL1:mode>"
> - [(set (match_operand:VDI_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VDI_LMUL1
> - [(unspec:<VDI:VM>
> - [(match_operand:<VDI:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> +;; Integer Reduction (vred(sum|maxu|max|minu|min|and|or|xor).vs)
> +(define_insn "@pred_reduc_<reduc><mode>"
> + [(set (match_operand:<V_LMUL1> 0 "register_operand"
> "=vr, vr")
> + (unspec:<V_LMUL1>
> + [(unspec:<VM>
> + [(match_operand:<VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> (match_operand 5 "vector_length_operand" "
> rK, rK")
> (match_operand 6 "const_int_operand" "
> i, i")
> (match_operand 7 "const_int_operand" "
> i, i")
> (reg:SI VL_REGNUM)
> (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VDI
> - (vec_duplicate:VDI
> + (any_reduc:VI
> + (vec_duplicate:VI
> (vec_select:<VEL>
> - (match_operand:VDI_LMUL1 4 "register_operand" " vr, vr")
> + (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
> (parallel [(const_int 0)])))
> - (match_operand:VDI 3 "register_operand" "
> vr, vr"))
> - (match_operand:VDI_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> + (match_operand:VI 3 "register_operand" "
> vr, vr"))
> + (match_operand:<V_LMUL1> 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> "TARGET_VECTOR"
> "vred<reduc>.vs\t%0,%3,%4%p1"
> [(set_attr "type" "vired")
> - (set_attr "mode" "<VDI:MODE>")])
> -
> -;; Integer Reduction Widen for QI, HI = QI op HI
> -(define_insn "@pred_widen_reduc_plus<v_su><VQI:mode><VHI_LMUL1:mode>"
> - [(set (match_operand:VHI_LMUL1 0 "register_operand"
> "=&vr,&vr")
> - (unspec:VHI_LMUL1
> - [(unspec:<VQI:VM>
> - [(match_operand:<VQI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" " rK, rK")
> - (match_operand 6 "const_int_operand" " i, i")
> - (match_operand 7 "const_int_operand" " i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (match_operand:VQI 3 "register_operand" " vr, vr")
> - (match_operand:VHI_LMUL1 4 "register_operand" " vr, vr")
> - (match_operand:VHI_LMUL1 2 "vector_merge_operand" " vu,
> 0")] WREDUC))]
> - "TARGET_VECTOR"
> - "vwredsum<v_su>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "viwred")
> - (set_attr "mode" "<VQI:MODE>")])
> + (set_attr "mode" "<MODE>")])
> -;; Integer Reduction Widen for HI, SI = HI op SI
> -(define_insn "@pred_widen_reduc_plus<v_su><VHI:mode><VSI_LMUL1:mode>"
> - [(set (match_operand:VSI_LMUL1 0 "register_operand"
> "=&vr,&vr")
> - (unspec:VSI_LMUL1
> - [(unspec:<VHI:VM>
> - [(match_operand:<VHI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" " rK, rK")
> - (match_operand 6 "const_int_operand" " i, i")
> - (match_operand 7 "const_int_operand" " i, i")
> +;; Integer Reduction Sum Widen (vwredsum[u].vs)
> +(define_insn "@pred_widen_reduc_plus<v_su><mode>"
> + [(set (match_operand:<V_EXT_LMUL1> 0 "register_operand"
> "=&vr,&vr")
> + (unspec:<V_EXT_LMUL1>
> + [(unspec:<VM>
> + [(match_operand:<VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> + (match_operand 5 "vector_length_operand" "
> rK, rK")
> + (match_operand 6 "const_int_operand" "
> i, i")
> + (match_operand 7 "const_int_operand" "
> i, i")
> (reg:SI VL_REGNUM)
> (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (match_operand:VHI 3 "register_operand" " vr, vr")
> - (match_operand:VSI_LMUL1 4 "register_operand" " vr, vr")
> - (match_operand:VSI_LMUL1 2 "vector_merge_operand" " vu,
> 0")] WREDUC))]
> + (match_operand:VI_QHS 3 "register_operand" "
> vr, vr")
> + (match_operand:<V_EXT_LMUL1> 4 "register_operand" "
> vr, vr")
> + (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" "
> vu, 0")] WREDUC))]
> "TARGET_VECTOR"
> "vwredsum<v_su>.vs\t%0,%3,%4%p1"
> [(set_attr "type" "viwred")
> - (set_attr "mode" "<VHI:MODE>")])
> + (set_attr "mode" "<MODE>")])
> -;; Integer Reduction Widen for SI, DI = SI op DI
> -(define_insn "@pred_widen_reduc_plus<v_su><VSI:mode><VDI_LMUL1:mode>"
> - [(set (match_operand:VDI_LMUL1 0 "register_operand"
> "=&vr,&vr")
> - (unspec:VDI_LMUL1
> - [(unspec:<VSI:VM>
> - [(match_operand:<VSI:VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" " rK, rK")
> - (match_operand 6 "const_int_operand" " i, i")
> - (match_operand 7 "const_int_operand" " i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (match_operand:VSI 3 "register_operand" " vr, vr")
> - (match_operand:VDI_LMUL1 4 "register_operand" " vr, vr")
> - (match_operand:VDI_LMUL1 2 "vector_merge_operand" " vu,
> 0")] WREDUC))]
> - "TARGET_VECTOR"
> - "vwredsum<v_su>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "viwred")
> - (set_attr "mode" "<VSI:MODE>")])
> -
> -;; Float Reduction for HF
> -(define_insn "@pred_reduc_<reduc><VHF:mode><VHF_LMUL1:mode>"
> - [(set (match_operand:VHF_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VHF_LMUL1
> - [(unspec:<VHF:VM>
> - [(match_operand:<VHF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VHF
> - (vec_duplicate:VHF
> - (vec_select:<VEL>
> - (match_operand:VHF_LMUL1 4 "register_operand" " vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VHF 3 "register_operand" "
> vr, vr"))
> - (match_operand:VHF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> - "TARGET_VECTOR"
> - "vfred<reduc>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vfredu")
> - (set_attr "mode" "<VHF:MODE>")])
> -
> -;; Float Reduction for SF
> -(define_insn "@pred_reduc_<reduc><VSF:mode><VSF_LMUL1:mode>"
> - [(set (match_operand:VSF_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VSF_LMUL1
> - [(unspec:<VSF:VM>
> - [(match_operand:<VSF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VSF
> - (vec_duplicate:VSF
> - (vec_select:<VEL>
> - (match_operand:VSF_LMUL1 4 "register_operand" " vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VSF 3 "register_operand" "
> vr, vr"))
> - (match_operand:VSF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> - "TARGET_VECTOR"
> - "vfred<reduc>.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vfredu")
> - (set_attr "mode" "<VSF:MODE>")])
> -
> -;; Float Reduction for DF
> -(define_insn "@pred_reduc_<reduc><VDF:mode><VDF_LMUL1:mode>"
> - [(set (match_operand:VDF_LMUL1 0 "register_operand"
> "=vr, vr")
> - (unspec:VDF_LMUL1
> - [(unspec:<VDF:VM>
> - [(match_operand:<VDF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> +;; Float Reduction (vfred(max|min).vs)
> +(define_insn "@pred_reduc_<reduc><mode>"
> + [(set (match_operand:<V_LMUL1> 0 "register_operand"
> "=vr, vr")
> + (unspec:<V_LMUL1>
> + [(unspec:<VM>
> + [(match_operand:<VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> (match_operand 5 "vector_length_operand" "
> rK, rK")
> (match_operand 6 "const_int_operand" "
> i, i")
> (match_operand 7 "const_int_operand" "
> i, i")
> (reg:SI VL_REGNUM)
> (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
> - (any_reduc:VDF
> - (vec_duplicate:VDF
> + (any_freduc:VF
> + (vec_duplicate:VF
> (vec_select:<VEL>
> - (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
> + (match_operand:<V_LMUL1> 4 "register_operand" " vr, vr")
> (parallel [(const_int 0)])))
> - (match_operand:VDF 3 "register_operand" "
> vr, vr"))
> - (match_operand:VDF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> + (match_operand:VF 3 "register_operand" "
> vr, vr"))
> + (match_operand:<V_LMUL1> 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC))]
> "TARGET_VECTOR"
> "vfred<reduc>.vs\t%0,%3,%4%p1"
> [(set_attr "type" "vfredu")
> - (set_attr "mode" "<VDF:MODE>")])
> -
> -;; Float Ordered Reduction Sum for HF
> -(define_insn "@pred_reduc_plus<order><VHF:mode><VHF_LMUL1:mode>"
> - [(set (match_operand:VHF_LMUL1 0
> "register_operand" "=vr,vr")
> - (unspec:VHF_LMUL1
> - [(unspec:VHF_LMUL1
> - [(unspec:<VHF:VM>
> - [(match_operand:<VHF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (match_operand 8 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)
> - (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
> - (plus:VHF
> - (vec_duplicate:VHF
> - (vec_select:<VEL>
> - (match_operand:VHF_LMUL1 4 "register_operand" "
> vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VHF 3 "register_operand" "
> vr, vr"))
> - (match_operand:VHF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC)] ORDER))]
> - "TARGET_VECTOR"
> - "vfred<order>sum.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vfred<order>")
> - (set_attr "mode" "<VHF:MODE>")
> - (set (attr "frm_mode")
> - (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
> + (set_attr "mode" "<MODE>")])
> -;; Float Ordered Reduction Sum for SF
> -(define_insn "@pred_reduc_plus<order><VSF:mode><VSF_LMUL1:mode>"
> - [(set (match_operand:VSF_LMUL1 0
> "register_operand" "=vr,vr")
> - (unspec:VSF_LMUL1
> - [(unspec:VSF_LMUL1
> - [(unspec:<VSF:VM>
> - [(match_operand:<VSF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> +;; Float Ordered Reduction Sum (vfred[ou]sum.vs)
> +(define_insn "@pred_reduc_plus<order><mode>"
> + [(set (match_operand:<V_LMUL1> 0
> "register_operand" "=vr,vr")
> + (unspec:<V_LMUL1>
> + [(unspec:<V_LMUL1>
> + [(unspec:<VM>
> + [(match_operand:<VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> (match_operand 5 "vector_length_operand" "
> rK, rK")
> (match_operand 6 "const_int_operand" "
> i, i")
> (match_operand 7 "const_int_operand" "
> i, i")
> @@ -7991,93 +7804,41 @@
> (reg:SI VL_REGNUM)
> (reg:SI VTYPE_REGNUM)
> (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
> - (plus:VSF
> - (vec_duplicate:VSF
> + (plus:VF
> + (vec_duplicate:VF
> (vec_select:<VEL>
> - (match_operand:VSF_LMUL1 4 "register_operand" "
> vr, vr")
> + (match_operand:<V_LMUL1> 4 "register_operand" "
> vr, vr")
> (parallel [(const_int 0)])))
> - (match_operand:VSF 3 "register_operand" "
> vr, vr"))
> - (match_operand:VSF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC)] ORDER))]
> + (match_operand:VF 3 "register_operand" "
> vr, vr"))
> + (match_operand:<V_LMUL1> 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC)] ORDER))]
> "TARGET_VECTOR"
> "vfred<order>sum.vs\t%0,%3,%4%p1"
> [(set_attr "type" "vfred<order>")
> - (set_attr "mode" "<VSF:MODE>")
> - (set (attr "frm_mode")
> - (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
> -
> -;; Float Ordered Reduction Sum for DF
> -(define_insn "@pred_reduc_plus<order><VDF:mode><VDF_LMUL1:mode>"
> - [(set (match_operand:VDF_LMUL1 0
> "register_operand" "=vr,vr")
> - (unspec:VDF_LMUL1
> - [(unspec:VDF_LMUL1
> - [(unspec:<VDF:VM>
> - [(match_operand:<VDF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (match_operand 8 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)
> - (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
> - (plus:VDF
> - (vec_duplicate:VDF
> - (vec_select:<VEL>
> - (match_operand:VDF_LMUL1 4 "register_operand" " vr, vr")
> - (parallel [(const_int 0)])))
> - (match_operand:VDF 3 "register_operand" "
> vr, vr"))
> - (match_operand:VDF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_REDUC)] ORDER))]
> - "TARGET_VECTOR"
> - "vfred<order>sum.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vfred<order>")
> - (set_attr "mode" "<VDF:MODE>")
> - (set (attr "frm_mode")
> - (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
> -
> -;; Float Widen Reduction for HF, aka SF = HF op SF
> -(define_insn "@pred_widen_reduc_plus<order><VHF:mode><VSF_LMUL1:mode>"
> - [(set (match_operand:VSF_LMUL1 0 "register_operand"
> "=&vr, &vr")
> - (unspec:VSF_LMUL1
> - [(unspec:VSF_LMUL1
> - [(unspec:<VHF:VM>
> - [(match_operand:<VHF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" " rK,
> rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (match_operand 8 "const_int_operand" "
> i, i")
> - (reg:SI VL_REGNUM)
> - (reg:SI VTYPE_REGNUM)
> - (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
> - (match_operand:VHF 3 "register_operand" " vr,
> vr")
> - (match_operand:VSF_LMUL1 4 "register_operand" " vr,
> vr")
> - (match_operand:VSF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
> - "TARGET_VECTOR"
> - "vfwred<order>sum.vs\t%0,%3,%4%p1"
> - [(set_attr "type" "vfwred<order>")
> - (set_attr "mode" "<VHF:MODE>")
> + (set_attr "mode" "<MODE>")
> (set (attr "frm_mode")
> (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
> -;; Float Widen Reduction for SF, aka DF = SF * DF
> -(define_insn "@pred_widen_reduc_plus<order><VSF:mode><VDF_LMUL1:mode>"
> - [(set (match_operand:VDF_LMUL1 0 "register_operand"
> "=&vr, &vr")
> - (unspec:VDF_LMUL1
> - [(unspec:VDF_LMUL1
> - [(unspec:<VSF:VM>
> - [(match_operand:<VSF:VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> - (match_operand 5 "vector_length_operand" "
> rK, rK")
> - (match_operand 6 "const_int_operand" "
> i, i")
> - (match_operand 7 "const_int_operand" "
> i, i")
> - (match_operand 8 "const_int_operand" "
> i, i")
> +;; Float Widen Reduction Sum (vfwred[ou]sum.vs)
> +(define_insn "@pred_widen_reduc_plus<order><mode>"
> + [(set (match_operand:<V_EXT_LMUL1> 0
> "register_operand" "=&vr, &vr")
> + (unspec:<V_EXT_LMUL1>
> + [(unspec:<V_EXT_LMUL1>
> + [(unspec:<VM>
> + [(match_operand:<VM> 1 "vector_mask_operand"
> "vmWc1,vmWc1")
> + (match_operand 5 "vector_length_operand" "
> rK, rK")
> + (match_operand 6 "const_int_operand" "
> i, i")
> + (match_operand 7 "const_int_operand" "
> i, i")
> + (match_operand 8 "const_int_operand" "
> i, i")
> (reg:SI VL_REGNUM)
> (reg:SI VTYPE_REGNUM)
> (reg:SI FRM_REGNUM)] UNSPEC_VPREDICATE)
> - (match_operand:VSF 3 "register_operand" "
> vr, vr")
> - (match_operand:VDF_LMUL1 4 "register_operand" "
> vr, vr")
> - (match_operand:VDF_LMUL1 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
> + (match_operand:VF_HS 3 "register_operand" "
> vr, vr")
> + (match_operand:<V_EXT_LMUL1> 4 "register_operand" "
> vr, vr")
> + (match_operand:<V_EXT_LMUL1> 2 "vector_merge_operand" "
> vu, 0")] UNSPEC_WREDUC_SUM)] ORDER))]
> "TARGET_VECTOR"
> "vfwred<order>sum.vs\t%0,%3,%4%p1"
> [(set_attr "type" "vfwred<order>")
> - (set_attr "mode" "<VSF:MODE>")
> + (set_attr "mode" "<MODE>")
> (set (attr "frm_mode")
> (symbol_ref "riscv_vector::get_frm_mode (operands[8])"))])
> --
> 2.36.3
>
--
Best,
Lehua
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-09-14 15:01 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-13 12:31 [PATCH 1/2] RISC-V: Cleanup redundant reduction patterns after refactor vector mode Lehua Ding
2023-09-14 14:10 ` 钟居哲
2023-09-14 15:01 ` Lehua Ding
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).