From: Ju-Zhe Zhong <juzhe.zh...@rivai.ai>

According to RVV ISA:
14. Vector Reduction Operations

"The destination vector register can overlap the source operands, including the 
mask register."

gcc/ChangeLog:

        * config/riscv/vector.md: Refine RA constraint.

---
 gcc/config/riscv/vector.md | 96 +++++++++++++++++++-------------------
 1 file changed, 48 insertions(+), 48 deletions(-)

diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index 4ea74372de5..75336b1a515 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -6259,44 +6259,44 @@
 ;; For example, The LMUL = 1 corresponding mode of VNx16QImode is VNx4QImode
 ;; for -march=rv*zve32* wheras VNx8QImode for -march=rv*zve64*
 (define_insn "@pred_reduc_<reduc><mode><vlmul1>"
-  [(set (match_operand:<VLMUL1> 0 "register_operand"          "=vd, vd, vr, 
vr")
+  [(set (match_operand:<VLMUL1> 0 "register_operand"            "=vr,   vr")
        (unspec:<VLMUL1>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"     " vm, vm,Wc1,Wc1")
-             (match_operand 5 "vector_length_operand"        " rK, rK, rK, rK")
-             (match_operand 6 "const_int_operand"            "  i,  i,  i,  i")
-             (match_operand 7 "const_int_operand"            "  i,  i,  i,  i")
+            [(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:VI
             (vec_duplicate:VI
               (vec_select:<VEL>
-                (match_operand:<VLMUL1> 4 "register_operand" " vr, vr, vr, vr")
+                (match_operand:<VLMUL1> 4 "register_operand" "   vr,   vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VI 3 "register_operand"           " vr, vr, vr, 
vr"))
-          (match_operand:<VLMUL1> 2 "vector_merge_operand"   " vu,  0, vu,  
0")] UNSPEC_REDUC))]
+            (match_operand:VI 3 "register_operand"           "   vr,   vr"))
+          (match_operand:<VLMUL1> 2 "vector_merge_operand"   "   vu,    0")] 
UNSPEC_REDUC))]
   "TARGET_VECTOR && TARGET_MIN_VLEN > 32"
   "vred<reduc>.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vired")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_reduc_<reduc><mode><vlmul1_zve32>"
-  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"          "=vd, vd, 
vr, vr")
+  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"            "=vr,   
vr")
        (unspec:<VLMUL1_ZVE32>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"           " vm, 
vm,Wc1,Wc1")
-             (match_operand 5 "vector_length_operand"              " rK, rK, 
rK, rK")
-             (match_operand 6 "const_int_operand"                  "  i,  i,  
i,  i")
-             (match_operand 7 "const_int_operand"                  "  i,  i,  
i,  i")
+            [(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:VI_ZVE32
             (vec_duplicate:VI_ZVE32
               (vec_select:<VEL>
-                (match_operand:<VLMUL1_ZVE32> 4 "register_operand" " vr, vr, 
vr, vr")
+                (match_operand:<VLMUL1_ZVE32> 4 "register_operand" "   vr,   
vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VI_ZVE32 3 "register_operand"           " vr, vr, 
vr, vr"))
-          (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   " vu,  0, 
vu,  0")] UNSPEC_REDUC))]
+            (match_operand:VI_ZVE32 3 "register_operand"           "   vr,   
vr"))
+          (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   "   vu,    
0")] UNSPEC_REDUC))]
   "TARGET_VECTOR && TARGET_MIN_VLEN == 32"
   "vred<reduc>.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vired")
@@ -6339,90 +6339,90 @@
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_reduc_<reduc><mode><vlmul1>"
-  [(set (match_operand:<VLMUL1> 0 "register_operand"          "=vd, vd, vr, 
vr")
+  [(set (match_operand:<VLMUL1> 0 "register_operand"             "=vr,   vr")
        (unspec:<VLMUL1>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"      " vm, 
vm,Wc1,Wc1")
-             (match_operand 5 "vector_length_operand"         " rK, rK, rK, 
rK")
-             (match_operand 6 "const_int_operand"             "  i,  i,  i,  
i")
-             (match_operand 7 "const_int_operand"             "  i,  i,  i,  
i")
+            [(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_freduc:VF
             (vec_duplicate:VF
               (vec_select:<VEL>
-                (match_operand:<VLMUL1> 4 "register_operand" " vr, vr, vr, vr")
+                (match_operand:<VLMUL1> 4 "register_operand" "   vr,   vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VF 3 "register_operand"           " vr, vr, vr, 
vr"))
-          (match_operand:<VLMUL1> 2 "vector_merge_operand"   " vu,  0, vu,  
0")] UNSPEC_REDUC))]
+            (match_operand:VF 3 "register_operand"           "   vr,   vr"))
+          (match_operand:<VLMUL1> 2 "vector_merge_operand"   "   vu,    0")] 
UNSPEC_REDUC))]
   "TARGET_VECTOR && TARGET_MIN_VLEN > 32"
   "vfred<reduc>.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vfredu")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_reduc_<reduc><mode><vlmul1_zve32>"
-  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"          "=vd, vd, 
vr, vr")
+  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"            "=vr,   
vr")
        (unspec:<VLMUL1_ZVE32>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"           " vm, 
vm,Wc1,Wc1")
-             (match_operand 5 "vector_length_operand"              " rK, rK, 
rK, rK")
-             (match_operand 6 "const_int_operand"                  "  i,  i,  
i,  i")
-             (match_operand 7 "const_int_operand"                  "  i,  i,  
i,  i")
+            [(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_freduc:VF_ZVE32
             (vec_duplicate:VF_ZVE32
               (vec_select:<VEL>
-                (match_operand:<VLMUL1_ZVE32> 4 "register_operand" " vr, vr, 
vr, vr")
+                (match_operand:<VLMUL1_ZVE32> 4 "register_operand" "   vr,   
vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VF_ZVE32 3 "register_operand"           " vr, vr, 
vr, vr"))
-          (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   " vu,  0, 
vu,  0")] UNSPEC_REDUC))]
+            (match_operand:VF_ZVE32 3 "register_operand"           "   vr,   
vr"))
+          (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   "   vu,    
0")] UNSPEC_REDUC))]
   "TARGET_VECTOR && TARGET_MIN_VLEN == 32"
   "vfred<reduc>.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vfredu")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_reduc_plus<order><mode><vlmul1>"
-  [(set (match_operand:<VLMUL1> 0 "register_operand"             "=vd, vd, vr, 
vr")
+  [(set (match_operand:<VLMUL1> 0 "register_operand"               "=vr,   vr")
        (unspec:<VLMUL1>
          [(unspec:<VLMUL1>
            [(unspec:<VM>
-              [(match_operand:<VM> 1 "vector_mask_operand"      " vm, 
vm,Wc1,Wc1")
-               (match_operand 5 "vector_length_operand"         " rK, rK, rK, 
rK")
-               (match_operand 6 "const_int_operand"             "  i,  i,  i,  
i")
-               (match_operand 7 "const_int_operand"             "  i,  i,  i,  
i")
+              [(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)
             (plus:VF
               (vec_duplicate:VF
                 (vec_select:<VEL>
-                  (match_operand:<VLMUL1> 4 "register_operand" " vr, vr, vr, 
vr")
+                  (match_operand:<VLMUL1> 4 "register_operand" "   vr,   vr")
                   (parallel [(const_int 0)])))
-              (match_operand:VF 3 "register_operand"           " vr, vr, vr, 
vr"))
-            (match_operand:<VLMUL1> 2 "vector_merge_operand"   " vu,  0, vu,  
0")] UNSPEC_REDUC)] ORDER))]
+              (match_operand:VF 3 "register_operand"           "   vr,   vr"))
+            (match_operand:<VLMUL1> 2 "vector_merge_operand"   "   vu,    0")] 
UNSPEC_REDUC)] ORDER))]
   "TARGET_VECTOR && TARGET_MIN_VLEN > 32"
   "vfred<order>sum.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vfred<order>")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_reduc_plus<order><mode><vlmul1_zve32>"
-  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"            "=vd, 
vd, vr, vr")
+  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"              "=vr,  
 vr")
        (unspec:<VLMUL1_ZVE32>
          [(unspec:<VLMUL1_ZVE32>
            [(unspec:<VM>
-              [(match_operand:<VM> 1 "vector_mask_operand"           " vm, 
vm,Wc1,Wc1")
-               (match_operand 5 "vector_length_operand"              " rK, rK, 
rK, rK")
-               (match_operand 6 "const_int_operand"                  "  i,  i, 
 i,  i")
-               (match_operand 7 "const_int_operand"                  "  i,  i, 
 i,  i")
+              [(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)
             (plus:VF_ZVE32
               (vec_duplicate:VF_ZVE32
                 (vec_select:<VEL>
-                  (match_operand:<VLMUL1_ZVE32> 4 "register_operand" " vr, vr, 
vr, vr")
+                  (match_operand:<VLMUL1_ZVE32> 4 "register_operand" "   vr,   
vr")
                   (parallel [(const_int 0)])))
-              (match_operand:VF_ZVE32 3 "register_operand"           " vr, vr, 
vr, vr"))
-            (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   " vu,  0, 
vu,  0")] UNSPEC_REDUC)] ORDER))]
+              (match_operand:VF_ZVE32 3 "register_operand"           "   vr,   
vr"))
+            (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   "   vu,   
 0")] UNSPEC_REDUC)] ORDER))]
   "TARGET_VECTOR && TARGET_MIN_VLEN == 32"
   "vfred<order>sum.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vfred<order>")
-- 
2.36.3

Reply via email to