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

gcc/ChangeLog:

        * config/riscv/vector-iterators.md (=vd,vr): Fine tune.
        (=vd,vd,vr,vr): Ditto.
        * config/riscv/vector.md: Ditto.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/base/merge_constraint-2.c: New test.

---
 gcc/config/riscv/vector-iterators.md          |   6 +-
 gcc/config/riscv/vector.md                    | 890 +++++++++---------
 .../riscv/rvv/base/merge_constraint-2.c       | 118 +++
 3 files changed, 566 insertions(+), 448 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-2.c

diff --git a/gcc/config/riscv/vector-iterators.md 
b/gcc/config/riscv/vector-iterators.md
index d44943ae7c3..266563a3aa0 100644
--- a/gcc/config/riscv/vector-iterators.md
+++ b/gcc/config/riscv/vector-iterators.md
@@ -813,9 +813,9 @@
                     (UNSPEC_VSLIDE1UP "1up") (UNSPEC_VSLIDE1DOWN "1down")
                     (UNSPEC_VFSLIDE1UP "1up") (UNSPEC_VFSLIDE1DOWN "1down")])
 
-(define_int_attr ud_constraint [(UNSPEC_VSLIDEUP "=&vr,&vr") 
(UNSPEC_VSLIDEDOWN "=vd,vr")
-                               (UNSPEC_VSLIDE1UP "=&vr,&vr") 
(UNSPEC_VSLIDE1DOWN "=vd,vr")
-                               (UNSPEC_VFSLIDE1UP "=&vr,&vr") 
(UNSPEC_VFSLIDE1DOWN "=vd,vr")])
+(define_int_attr ud_constraint [(UNSPEC_VSLIDEUP "=&vr,&vr,&vr,&vr") 
(UNSPEC_VSLIDEDOWN "=vd,vd,vr,vr")
+                               (UNSPEC_VSLIDE1UP "=&vr,&vr,&vr,&vr") 
(UNSPEC_VSLIDE1DOWN "=vd,vd,vr,vr")
+                               (UNSPEC_VFSLIDE1UP "=&vr,&vr,&vr,&vr") 
(UNSPEC_VFSLIDE1DOWN "=vd,vd,vr,vr")])
 
 (define_int_attr UNSPEC [(UNSPEC_VSLIDE1UP "UNSPEC_VSLIDE1UP")
                         (UNSPEC_VSLIDE1DOWN "UNSPEC_VSLIDE1DOWN")])
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index a4a68b67e24..d3013844e5f 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -4653,123 +4653,123 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_widen_mul_plus<su><mode>"
-  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus:VWEXTI
            (mult:VWEXTI
              (any_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
+               (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,   
vr"))
              (any_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-           (match_operand:VWEXTI 2 "register_operand"               "    0"))
-         (match_operand:VWEXTI 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+           (match_operand:VWEXTI 2 "register_operand"               "    0,    
0"))
+         (match_operand:VWEXTI 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vwmacc<u>.vv\t%0,%3,%4%p1"
   [(set_attr "type" "viwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_mul_plus<su><mode>_scalar"
-  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus:VWEXTI
            (mult:VWEXTI
              (any_extend:VWEXTI
                (vec_duplicate:<V_DOUBLE_TRUNC>
-                 (match_operand:<VSUBEL> 3 "register_operand"       "    r")))
+                 (match_operand:<VSUBEL> 3 "register_operand"       "    r,    
r")))
              (any_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-           (match_operand:VWEXTI 2 "register_operand"               "    0"))
-         (match_operand:VWEXTI 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+           (match_operand:VWEXTI 2 "register_operand"               "    0,    
0"))
+         (match_operand:VWEXTI 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vwmacc<u>.vx\t%0,%3,%4%p1"
   [(set_attr "type" "viwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_mul_plussu<mode>"
-  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus:VWEXTI
            (mult:VWEXTI
              (sign_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
+               (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,   
vr"))
              (zero_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-           (match_operand:VWEXTI 2 "register_operand"               "    0"))
-         (match_operand:VWEXTI 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+           (match_operand:VWEXTI 2 "register_operand"               "    0,    
0"))
+         (match_operand:VWEXTI 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vwmaccsu.vv\t%0,%3,%4%p1"
   [(set_attr "type" "viwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_mul_plussu<mode>_scalar"
-  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus:VWEXTI
            (mult:VWEXTI
              (sign_extend:VWEXTI
                (vec_duplicate:<V_DOUBLE_TRUNC>
-                 (match_operand:<VSUBEL> 3 "register_operand"       "    r")))
+                 (match_operand:<VSUBEL> 3 "register_operand"       "    r,    
r")))
              (zero_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-           (match_operand:VWEXTI 2 "register_operand"               "    0"))
-         (match_operand:VWEXTI 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+           (match_operand:VWEXTI 2 "register_operand"               "    0,    
0"))
+         (match_operand:VWEXTI 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vwmaccsu.vx\t%0,%3,%4%p1"
   [(set_attr "type" "viwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_mul_plusus<mode>_scalar"
-  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTI 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus:VWEXTI
            (mult:VWEXTI
              (zero_extend:VWEXTI
                (vec_duplicate:<V_DOUBLE_TRUNC>
-                 (match_operand:<VSUBEL> 3 "register_operand"       "    r")))
+                 (match_operand:<VSUBEL> 3 "register_operand"       "    r,    
r")))
              (sign_extend:VWEXTI
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-           (match_operand:VWEXTI 2 "register_operand"               "    0"))
-         (match_operand:VWEXTI 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+           (match_operand:VWEXTI 2 "register_operand"               "    0,    
0"))
+         (match_operand:VWEXTI 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vwmaccus.vx\t%0,%3,%4%p1"
   [(set_attr "type" "viwmuladd")
@@ -4908,55 +4908,55 @@
    (set_attr "mode" "<VB:MODE>")])
 
 (define_insn "@pred_<misc_op><mode>"
-  [(set (match_operand:VB 0 "register_operand"          "=&vr")
+  [(set (match_operand:VB 0 "register_operand"          "=&vr,  &vr")
        (if_then_else:VB
          (unspec:VB
-           [(match_operand:VB 1 "vector_mask_operand" "vmWc1")
-            (match_operand 4 "vector_length_operand"  "   rK")
-            (match_operand 5 "const_int_operand"      "    i")
-            (match_operand 6 "const_int_operand"      "    i")
+           [(match_operand:VB 1 "vector_mask_operand" "vmWc1,vmWc1")
+            (match_operand 4 "vector_length_operand"  "   rK,   rK")
+            (match_operand 5 "const_int_operand"      "    i,    i")
+            (match_operand 6 "const_int_operand"      "    i,    i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VB
-           [(match_operand:VB 3 "register_operand"    "   vr")] VMISC)
-         (match_operand:VB 2 "vector_merge_operand"   "  0vu")))]
+           [(match_operand:VB 3 "register_operand"    "   vr,   vr")] VMISC)
+         (match_operand:VB 2 "vector_merge_operand"   "   vu,    0")))]
   "TARGET_VECTOR"
   "vm<misc_op>.m\t%0,%3%p1"
   [(set_attr "type" "vmsfs")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_iota<mode>"
-  [(set (match_operand:VI 0 "register_operand"            "=&vr")
+  [(set (match_operand:VI 0 "register_operand"            "=&vr,  &vr")
        (if_then_else:VI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1")
-            (match_operand 4 "vector_length_operand"    "   rK")
-            (match_operand 5 "const_int_operand"        "    i")
-            (match_operand 6 "const_int_operand"        "    i")
-            (match_operand 7 "const_int_operand"        "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1")
+            (match_operand 4 "vector_length_operand"    "   rK,   rK")
+            (match_operand 5 "const_int_operand"        "    i,    i")
+            (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)
          (unspec:VI
-           [(match_operand:<VM> 3 "register_operand"    "   vr")] UNSPEC_VIOTA)
-         (match_operand:VI 2 "vector_merge_operand"     "  0vu")))]
+           [(match_operand:<VM> 3 "register_operand"    "   vr,   vr")] 
UNSPEC_VIOTA)
+         (match_operand:VI 2 "vector_merge_operand"     "   vu,    0")))]
   "TARGET_VECTOR"
   "viota.m\t%0,%3%p1"
   [(set_attr "type" "vmiota")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_series<mode>"
-  [(set (match_operand:VI 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VI 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (match_operand 3 "vector_length_operand"    " rK, rK")
-            (match_operand 4 "const_int_operand"        "  i,  i")
-            (match_operand 5 "const_int_operand"        "  i,  i")
-            (match_operand 6 "const_int_operand"        "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,Wc1")
+            (match_operand 3 "vector_length_operand"    " rK, rK, rK, rK")
+            (match_operand 4 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 5 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (vec_series:VI (const_int 0) (const_int 1))
-         (match_operand:VI 2 "vector_merge_operand"     "0vu,0vu")))]
+         (match_operand:VI 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vid.v\t%0%p1"
   [(set_attr "type" "vmidx")
@@ -4973,124 +4973,124 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_<optab><mode>"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (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")
+           [(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 8 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (any_float_binop:VF
-           (match_operand:VF 3 "register_operand"       " vr, vr")
-           (match_operand:VF 4 "register_operand"       " vr, vr"))
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+           (match_operand:VF 3 "register_operand"       " vr, vr, vr, vr")
+           (match_operand:VF 4 "register_operand"       " vr, vr, vr, vr"))
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vf<insn>.vv\t%0,%3,%4%p1"
   [(set_attr "type" "<float_insn_type>")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<optab><mode>_scalar"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (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")
+           [(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 8 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (commutative_float_binop:VF
            (vec_duplicate:VF
-             (match_operand:<VEL> 4 "register_operand"  "  f,  f"))
-           (match_operand:VF 3 "register_operand"       " vr, vr"))
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+             (match_operand:<VEL> 4 "register_operand"  "  f,  f,  f,  f"))
+           (match_operand:VF 3 "register_operand"       " vr, vr, vr, vr"))
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vf<insn>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "<float_insn_type>")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<optab><mode>_scalar"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (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")
+           [(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 8 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (non_commutative_float_binop:VF
-           (match_operand:VF 3 "register_operand"       " vr, vr")
+           (match_operand:VF 3 "register_operand"       " vr, vr, vr, vr")
            (vec_duplicate:VF
-             (match_operand:<VEL> 4 "register_operand"  "  f,  f")))
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+             (match_operand:<VEL> 4 "register_operand"  "  f,  f,  f,  f")))
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vf<insn>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "<float_insn_type>")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<optab><mode>_reverse_scalar"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (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")
+           [(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 8 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (non_commutative_float_binop:VF
            (vec_duplicate:VF
-             (match_operand:<VEL> 4 "register_operand"  "  f,  f"))
-           (match_operand:VF 3 "register_operand"       " vr, vr"))
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+             (match_operand:<VEL> 4 "register_operand"  "  f,  f,  f,  f"))
+           (match_operand:VF 3 "register_operand"       " vr, vr, vr, vr"))
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vfr<insn>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "<float_insn_type>")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<copysign><mode>"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (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")
+           [(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 8 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VF
-           [(match_operand:VF 3 "register_operand"       " vr, vr")
-            (match_operand:VF 4 "register_operand"       " vr, vr")] 
VCOPYSIGNS)
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+           [(match_operand:VF 3 "register_operand"       " vr, vr, vr, vr")
+            (match_operand:VF 4 "register_operand"       " vr, vr, vr, vr")] 
VCOPYSIGNS)
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vfsgnj<nx>.vv\t%0,%3,%4%p1"
   [(set_attr "type" "vfsgnj")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<copysign><mode>_scalar"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (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")
+           [(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 8 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VF
-           [(match_operand:VF 3 "register_operand"      " vr, vr")
-                (vec_duplicate:VF
-              (match_operand:<VEL> 4 "register_operand" "  f,  f"))] 
VCOPYSIGNS)
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+           [(match_operand:VF 3 "register_operand"      " vr, vr, vr, vr")
+            (vec_duplicate:VF
+              (match_operand:<VEL> 4 "register_operand" "  f,  f,  f,  f"))] 
VCOPYSIGNS)
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vfsgnj<nx>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "vfsgnj")
@@ -5711,19 +5711,19 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_<optab><mode>"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (match_operand 4 "vector_length_operand"    " rK, rK")
-            (match_operand 5 "const_int_operand"        "  i,  i")
-            (match_operand 6 "const_int_operand"        "  i,  i")
-            (match_operand 7 "const_int_operand"        "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,Wc1")
+            (match_operand 4 "vector_length_operand"    " rK, rK, rK, rK")
+            (match_operand 5 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (any_float_unop:VF
-           (match_operand:VF 3 "register_operand"       " vr, vr"))
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+           (match_operand:VF 3 "register_operand"       " vr, vr, vr, vr"))
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vf<insn>.v\t%0,%3%p1"
   [(set_attr "type" "<float_insn_type>")
@@ -5734,38 +5734,38 @@
    (set (attr "avl_type") (symbol_ref "INTVAL (operands[7])"))])
 
 (define_insn "@pred_<misc_op><mode>"
-  [(set (match_operand:VF 0 "register_operand"           "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"           "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" " vm,Wc1")
-            (match_operand 4 "vector_length_operand"    " rK, rK")
-            (match_operand 5 "const_int_operand"        "  i,  i")
-            (match_operand 6 "const_int_operand"        "  i,  i")
-            (match_operand 7 "const_int_operand"        "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand" " vm, vm,Wc1,Wc1")
+            (match_operand 4 "vector_length_operand"    " rK, rK, rK, rK")
+            (match_operand 5 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"        "  i,  i,  i,  i")
+            (match_operand 7 "const_int_operand"        "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VF
-           [(match_operand:VF 3 "register_operand"       " vr, vr")] VFMISC)
-         (match_operand:VF 2 "vector_merge_operand"     "0vu,0vu")))]
+           [(match_operand:VF 3 "register_operand"       " vr, vr, vr, vr")] 
VFMISC)
+         (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")))]
   "TARGET_VECTOR"
   "vf<misc_op>.v\t%0,%3%p1"
   [(set_attr "type" "<float_insn_type>")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_class<mode>"
-  [(set (match_operand:<VCONVERT> 0 "register_operand"   "=vd, vr")
+  [(set (match_operand:<VCONVERT> 0 "register_operand"       "=vd, vd, vr, vr")
        (if_then_else:<VCONVERT>
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"     " vm,Wc1")
-            (match_operand 4 "vector_length_operand"        " rK, rK")
-            (match_operand 5 "const_int_operand"            "  i,  i")
-            (match_operand 6 "const_int_operand"            "  i,  i")
-            (match_operand 7 "const_int_operand"            "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand"     " vm, vm,Wc1,Wc1")
+            (match_operand 4 "vector_length_operand"        " rK, rK, rK, rK")
+            (match_operand 5 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 7 "const_int_operand"            "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:<VCONVERT>
-           [(match_operand:VF 3 "register_operand"          " vr, vr")] 
UNSPEC_VFCLASS)
-         (match_operand:<VCONVERT> 2 "vector_merge_operand" "0vu,0vu")))]
+           [(match_operand:VF 3 "register_operand"          " vr, vr, vr, 
vr")] UNSPEC_VFCLASS)
+         (match_operand:<VCONVERT> 2 "vector_merge_operand" " vu,  0, vu,  
0")))]
   "TARGET_VECTOR"
   "vfclass.v\t%0,%3%p1"
   [(set_attr "type" "vfclass")
@@ -5781,88 +5781,88 @@
 
 ;; Vector Widening Add/Subtract/Multiply.
 (define_insn "@pred_dual_widen_<optab><mode>"
-  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"           "vmWc1")
-            (match_operand 5 "vector_length_operand"              "   rK")
-            (match_operand 6 "const_int_operand"                  "    i")
-            (match_operand 7 "const_int_operand"                  "    i")
-            (match_operand 8 "const_int_operand"                  "    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")
+            (match_operand 8 "const_int_operand"                  "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (any_widen_binop:VWEXTF
            (float_extend:VWEXTF
-             (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
+             (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,   
vr"))
            (float_extend:VWEXTF
-             (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-         (match_operand:VWEXTF 2 "vector_merge_operand"           "  0vu")))]
+             (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+         (match_operand:VWEXTF 2 "vector_merge_operand"           "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfw<insn>.vv\t%0,%3,%4%p1"
   [(set_attr "type" "vf<widen_binop_insn_type>")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_dual_widen_<optab><mode>_scalar"
-  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"           "vmWc1")
-            (match_operand 5 "vector_length_operand"              "   rK")
-            (match_operand 6 "const_int_operand"                  "    i")
-            (match_operand 7 "const_int_operand"                  "    i")
-            (match_operand 8 "const_int_operand"                  "    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")
+            (match_operand 8 "const_int_operand"                  "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (any_widen_binop:VWEXTF
            (float_extend:VWEXTF
-             (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
+             (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,   
vr"))
            (float_extend:VWEXTF
              (vec_duplicate:<V_DOUBLE_TRUNC>
-               (match_operand:<VSUBEL> 4 "register_operand"       "    f"))))
-         (match_operand:VWEXTF 2 "vector_merge_operand"           "  0vu")))]
+               (match_operand:<VSUBEL> 4 "register_operand"       "    f,    
f"))))
+         (match_operand:VWEXTF 2 "vector_merge_operand"           "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfw<insn>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "vf<widen_binop_insn_type>")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_single_widen_<plus_minus:optab><mode>"
-  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"           "vmWc1")
-            (match_operand 5 "vector_length_operand"              "   rK")
-            (match_operand 6 "const_int_operand"                  "    i")
-            (match_operand 7 "const_int_operand"                  "    i")
-            (match_operand 8 "const_int_operand"                  "    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")
+            (match_operand 8 "const_int_operand"                  "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus_minus:VWEXTF
-           (match_operand:VWEXTF 3 "register_operand"             "   vr")
+           (match_operand:VWEXTF 3 "register_operand"             "   vr,   
vr")
            (float_extend:VWEXTF
-             (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr")))
-         (match_operand:VWEXTF 2 "vector_merge_operand"           "  0vu")))]
+             (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr")))
+         (match_operand:VWEXTF 2 "vector_merge_operand"           "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfw<insn>.wv\t%0,%3,%4%p1"
   [(set_attr "type" "vf<widen_binop_insn_type>")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_single_widen_<plus_minus:optab><mode>_scalar"
-  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                  "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"           "vmWc1")
-            (match_operand 5 "vector_length_operand"              "   rK")
-            (match_operand 6 "const_int_operand"                  "    i")
-            (match_operand 7 "const_int_operand"                  "    i")
-            (match_operand 8 "const_int_operand"                  "    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")
+            (match_operand 8 "const_int_operand"                  "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus_minus:VWEXTF
-           (match_operand:VWEXTF 3 "register_operand"             "   vr")
+           (match_operand:VWEXTF 3 "register_operand"             "   vr,   
vr")
            (float_extend:VWEXTF
              (vec_duplicate:<V_DOUBLE_TRUNC>
-               (match_operand:<VSUBEL> 4 "register_operand"       "    f"))))
-         (match_operand:VWEXTF 2 "vector_merge_operand"           "  0vu")))]
+               (match_operand:<VSUBEL> 4 "register_operand"       "    f,    
f"))))
+         (match_operand:VWEXTF 2 "vector_merge_operand"           "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfw<insn>.wf\t%0,%3,%4%p1"
   [(set_attr "type" "vf<widen_binop_insn_type>")
@@ -5876,100 +5876,100 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_widen_mul_<optab><mode>"
-  [(set (match_operand:VWEXTF 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus_minus:VWEXTF
-           (match_operand:VWEXTF 2 "register_operand"               "    0")
+           (match_operand:VWEXTF 2 "register_operand"               "    0,    
0")
            (mult:VWEXTF
              (float_extend:VWEXTF
-               (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
+               (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,   
vr"))
              (float_extend:VWEXTF
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr"))))
-         (match_operand:VWEXTF 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr"))))
+         (match_operand:VWEXTF 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfw<macc_nmsac>.vv\t%0,%3,%4%p1"
   [(set_attr "type" "vfwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_mul_<optab><mode>_scalar"
-  [(set (match_operand:VWEXTF 0 "register_operand"                    "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                    "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"             "vmWc1")
-            (match_operand 6 "vector_length_operand"                "   rK")
-            (match_operand 7 "const_int_operand"                    "    i")
-            (match_operand 8 "const_int_operand"                    "    i")
-            (match_operand 9 "const_int_operand"                    "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"             
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                "   rK,   
rK")
+            (match_operand 7 "const_int_operand"                    "    i,    
i")
+            (match_operand 8 "const_int_operand"                    "    i,    
i")
+            (match_operand 9 "const_int_operand"                    "    i,    
i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (plus_minus:VWEXTF
-           (match_operand:VWEXTF 2 "register_operand"               "    0")
+           (match_operand:VWEXTF 2 "register_operand"               "    0,    
0")
            (mult:VWEXTF
              (float_extend:VWEXTF
                (vec_duplicate:<V_DOUBLE_TRUNC>
-                 (match_operand:<VSUBEL> 3 "register_operand"       "    f")))
+                 (match_operand:<VSUBEL> 3 "register_operand"       "    f,    
f")))
              (float_extend:VWEXTF
-               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr"))))
-         (match_operand:VWEXTF 5 "vector_merge_operand"             "  0vu")))]
+               (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,   
vr"))))
+         (match_operand:VWEXTF 5 "vector_merge_operand"             "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfw<macc_nmsac>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "vfwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_neg_mul_<optab><mode>"
-  [(set (match_operand:VWEXTF 0 "register_operand"                      "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                      "=&vr, 
 &vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"               "vmWc1")
-            (match_operand 6 "vector_length_operand"                  "   rK")
-            (match_operand 7 "const_int_operand"                      "    i")
-            (match_operand 8 "const_int_operand"                      "    i")
-            (match_operand 9 "const_int_operand"                      "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"               
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                  "   rK,  
 rK")
+            (match_operand 7 "const_int_operand"                      "    i,  
  i")
+            (match_operand 8 "const_int_operand"                      "    i,  
  i")
+            (match_operand 9 "const_int_operand"                      "    i,  
  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (neg:VWEXTF
            (plus_minus:VWEXTF
-             (match_operand:VWEXTF 2 "register_operand"               "    0")
+             (match_operand:VWEXTF 2 "register_operand"               "    0,  
  0")
              (mult:VWEXTF
                (float_extend:VWEXTF
-                 (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
+                 (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,  
 vr"))
                (float_extend:VWEXTF
-                 (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   
vr")))))
-         (match_operand:VWEXTF 5 "vector_merge_operand"               "  
0vu")))]
+                 (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,  
 vr")))))
+         (match_operand:VWEXTF 5 "vector_merge_operand"               "   vu,  
  0")))]
   "TARGET_VECTOR"
   "vfw<nmacc_msac>.vv\t%0,%3,%4%p1"
   [(set_attr "type" "vfwmuladd")
    (set_attr "mode" "<V_DOUBLE_TRUNC>")])
 
 (define_insn "@pred_widen_neg_mul_<optab><mode>_scalar"
-  [(set (match_operand:VWEXTF 0 "register_operand"                      "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                      "=&vr, 
 &vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"               "vmWc1")
-            (match_operand 6 "vector_length_operand"                  "   rK")
-            (match_operand 7 "const_int_operand"                      "    i")
-            (match_operand 8 "const_int_operand"                      "    i")
-            (match_operand 9 "const_int_operand"                      "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"               
"vmWc1,vmWc1")
+            (match_operand 6 "vector_length_operand"                  "   rK,  
 rK")
+            (match_operand 7 "const_int_operand"                      "    i,  
  i")
+            (match_operand 8 "const_int_operand"                      "    i,  
  i")
+            (match_operand 9 "const_int_operand"                      "    i,  
  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (neg:VWEXTF
            (plus_minus:VWEXTF
-             (match_operand:VWEXTF 2 "register_operand"               "    0")
+             (match_operand:VWEXTF 2 "register_operand"               "    0,  
  0")
              (mult:VWEXTF
                (float_extend:VWEXTF
                  (vec_duplicate:<V_DOUBLE_TRUNC>
-                   (match_operand:<VSUBEL> 3 "register_operand"       "    
f")))
+                   (match_operand:<VSUBEL> 3 "register_operand"       "    f,  
  f")))
                (float_extend:VWEXTF
-                 (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   
vr")))))
-         (match_operand:VWEXTF 5 "vector_merge_operand"               "  
0vu")))]
+                 (match_operand:<V_DOUBLE_TRUNC> 4 "register_operand" "   vr,  
 vr")))))
+         (match_operand:VWEXTF 5 "vector_merge_operand"               "   vu,  
  0")))]
   "TARGET_VECTOR"
   "vfw<nmacc_msac>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "vfwmuladd")
@@ -6167,21 +6167,21 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_merge<mode>_scalar"
-  [(set (match_operand:VF 0 "register_operand"      "=vd")
+  [(set (match_operand:VF 0 "register_operand"      "=vd,vd")
     (if_then_else:VF
-      (match_operand:<VM> 4 "register_operand"      " vm")
+      (match_operand:<VM> 4 "register_operand"      " vm,vm")
       (if_then_else:VF
         (unspec:<VM>
           [(match_dup 4)
-           (match_operand 5 "vector_length_operand" " rK")
-           (match_operand 6 "const_int_operand"     "  i")
-           (match_operand 7 "const_int_operand"     "  i")
+           (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)
         (vec_duplicate:VF
-          (match_operand:<VEL> 3 "register_operand" "  f"))
-        (match_operand:VF 2 "register_operand"      " vr"))
-      (match_operand:VF 1 "vector_merge_operand"    "0vu")))]
+          (match_operand:<VEL> 3 "register_operand" "  f, f"))
+        (match_operand:VF 2 "register_operand"      " vr,vr"))
+      (match_operand:VF 1 "vector_merge_operand"    " vu, 0")))]
   "TARGET_VECTOR"
   "vfmerge.vfm\t%0,%2,%3,%4"
   [(set_attr "type" "vfmerge")
@@ -6195,57 +6195,57 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_fcvt_x<v_su>_f<mode>"
-  [(set (match_operand:<VCONVERT> 0 "register_operand"       "=vd, vr")
+  [(set (match_operand:<VCONVERT> 0 "register_operand"       "=vd, vd, vr, vr")
        (if_then_else:<VCONVERT>
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"     " vm,Wc1")
-            (match_operand 4 "vector_length_operand"        " rK, rK")
-            (match_operand 5 "const_int_operand"            "  i,  i")
-            (match_operand 6 "const_int_operand"            "  i,  i")
-            (match_operand 7 "const_int_operand"            "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand"     " vm, vm,Wc1,Wc1")
+            (match_operand 4 "vector_length_operand"        " rK, rK, rK, rK")
+            (match_operand 5 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 7 "const_int_operand"            "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:<VCONVERT>
-            [(match_operand:VF 3 "register_operand"         " vr, vr")] VFCVTS)
-         (match_operand:<VCONVERT> 2 "vector_merge_operand" "0vu,0vu")))]
+            [(match_operand:VF 3 "register_operand"         " vr, vr, vr, 
vr")] VFCVTS)
+         (match_operand:<VCONVERT> 2 "vector_merge_operand" " vu,  0, vu,  
0")))]
   "TARGET_VECTOR"
   "vfcvt.x<v_su>.f.v\t%0,%3%p1"
   [(set_attr "type" "vfcvtftoi")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<fix_cvt><mode>"
-  [(set (match_operand:<VCONVERT> 0 "register_operand"       "=vd, vr")
+  [(set (match_operand:<VCONVERT> 0 "register_operand"       "=vd, vd, vr, vr")
        (if_then_else:<VCONVERT>
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"     " vm,Wc1")
-            (match_operand 4 "vector_length_operand"        " rK, rK")
-            (match_operand 5 "const_int_operand"            "  i,  i")
-            (match_operand 6 "const_int_operand"            "  i,  i")
-            (match_operand 7 "const_int_operand"            "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand"     " vm, vm,Wc1,Wc1")
+            (match_operand 4 "vector_length_operand"        " rK, rK, rK, rK")
+            (match_operand 5 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"            "  i,  i,  i,  i")
+            (match_operand 7 "const_int_operand"            "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (any_fix:<VCONVERT>
-            (match_operand:VF 3 "register_operand"          " vr, vr"))
-         (match_operand:<VCONVERT> 2 "vector_merge_operand" "0vu,0vu")))]
+            (match_operand:VF 3 "register_operand"          " vr, vr, vr, vr"))
+         (match_operand:<VCONVERT> 2 "vector_merge_operand" " vu,  0, vu,  
0")))]
   "TARGET_VECTOR"
   "vfcvt.rtz.x<u>.f.v\t%0,%3%p1"
   [(set_attr "type" "vfcvtftoi")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_<float_cvt><mode>"
-  [(set (match_operand:VF 0 "register_operand"              "=vd, vr")
+  [(set (match_operand:VF 0 "register_operand"              "=vd, vd, vr, vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"    " vm,Wc1")
-            (match_operand 4 "vector_length_operand"       " rK, rK")
-            (match_operand 5 "const_int_operand"           "  i,  i")
-            (match_operand 6 "const_int_operand"           "  i,  i")
-            (match_operand 7 "const_int_operand"           "  i,  i")
+           [(match_operand:<VM> 1 "vector_mask_operand"    " vm, vm,Wc1,Wc1")
+            (match_operand 4 "vector_length_operand"       " rK, rK, rK, rK")
+            (match_operand 5 "const_int_operand"           "  i,  i,  i,  i")
+            (match_operand 6 "const_int_operand"           "  i,  i,  i,  i")
+            (match_operand 7 "const_int_operand"           "  i,  i,  i,  i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (any_float:VF
-            (match_operand:<VCONVERT> 3 "register_operand" " vr, vr"))
-         (match_operand:VF 2 "vector_merge_operand"        "0vu,0vu")))]
+            (match_operand:<VCONVERT> 3 "register_operand" " vr, vr, vr, vr"))
+         (match_operand:VF 2 "vector_merge_operand"        " vu,  0, vu,  
0")))]
   "TARGET_VECTOR"
   "vfcvt.f.x<u>.v\t%0,%3%p1"
   [(set_attr "type" "vfcvtitof")
@@ -6259,76 +6259,76 @@
 ;; 
-------------------------------------------------------------------------------
 
 (define_insn "@pred_widen_fcvt_x<v_su>_f<mode>"
-  [(set (match_operand:VWCONVERTI 0 "register_operand"         "=&vr")
+  [(set (match_operand:VWCONVERTI 0 "register_operand"         "=&vr,  &vr")
        (if_then_else:VWCONVERTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"      "vmWc1")
-            (match_operand 4 "vector_length_operand"         "   rK")
-            (match_operand 5 "const_int_operand"             "    i")
-            (match_operand 6 "const_int_operand"             "    i")
-            (match_operand 7 "const_int_operand"             "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"      "vmWc1,vmWc1")
+            (match_operand 4 "vector_length_operand"         "   rK,   rK")
+            (match_operand 5 "const_int_operand"             "    i,    i")
+            (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)
          (unspec:VWCONVERTI
-            [(match_operand:<VNCONVERT> 3 "register_operand" "   vr")] VFCVTS)
-         (match_operand:VWCONVERTI 2 "vector_merge_operand"  "  0vu")))]
+            [(match_operand:<VNCONVERT> 3 "register_operand" "   vr,   vr")] 
VFCVTS)
+         (match_operand:VWCONVERTI 2 "vector_merge_operand"  "   vu,    0")))]
   "TARGET_VECTOR"
   "vfwcvt.x<v_su>.f.v\t%0,%3%p1"
   [(set_attr "type" "vfwcvtftoi")
    (set_attr "mode" "<VNCONVERT>")])
 
 (define_insn "@pred_widen_<fix_cvt><mode>"
-  [(set (match_operand:VWCONVERTI 0 "register_operand"        "=&vr")
+  [(set (match_operand:VWCONVERTI 0 "register_operand"        "=&vr,  &vr")
        (if_then_else:VWCONVERTI
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"     "vmWc1")
-            (match_operand 4 "vector_length_operand"        "   rK")
-            (match_operand 5 "const_int_operand"            "    i")
-            (match_operand 6 "const_int_operand"            "    i")
-            (match_operand 7 "const_int_operand"            "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"     "vmWc1,vmWc1")
+            (match_operand 4 "vector_length_operand"        "   rK,   rK")
+            (match_operand 5 "const_int_operand"            "    i,    i")
+            (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_fix:VWCONVERTI
-            (match_operand:<VNCONVERT> 3 "register_operand" "   vr"))
-         (match_operand:VWCONVERTI 2 "vector_merge_operand" "  0vu")))]
+            (match_operand:<VNCONVERT> 3 "register_operand" "   vr,   vr"))
+         (match_operand:VWCONVERTI 2 "vector_merge_operand" "   vu,    0")))]
   "TARGET_VECTOR"
   "vfwcvt.rtz.x<u>.f.v\t%0,%3%p1"
   [(set_attr "type" "vfwcvtftoi")
    (set_attr "mode" "<VNCONVERT>")])
 
 (define_insn "@pred_widen_<float_cvt><mode>"
-  [(set (match_operand:VF 0 "register_operand"                "=&vr")
+  [(set (match_operand:VF 0 "register_operand"                "=&vr,  &vr")
        (if_then_else:VF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"     "vmWc1")
-            (match_operand 4 "vector_length_operand"        "   rK")
-            (match_operand 5 "const_int_operand"            "    i")
-            (match_operand 6 "const_int_operand"            "    i")
-            (match_operand 7 "const_int_operand"            "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"     "vmWc1,vmWc1")
+            (match_operand 4 "vector_length_operand"        "   rK,   rK")
+            (match_operand 5 "const_int_operand"            "    i,    i")
+            (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_float:VF
-            (match_operand:<VNCONVERT> 3 "register_operand" "   vr"))
-         (match_operand:VF 2 "vector_merge_operand"         "  0vu")))]
+            (match_operand:<VNCONVERT> 3 "register_operand" "   vr,   vr"))
+         (match_operand:VF 2 "vector_merge_operand"         "   vu,    0")))]
   "TARGET_VECTOR"
   "vfwcvt.f.x<u>.v\t%0,%3%p1"
   [(set_attr "type" "vfwcvtitof")
    (set_attr "mode" "<VNCONVERT>")])
 
 (define_insn "@pred_extend<mode>"
-  [(set (match_operand:VWEXTF 0 "register_operand"                 "=&vr")
+  [(set (match_operand:VWEXTF 0 "register_operand"                 "=&vr,  
&vr")
        (if_then_else:VWEXTF
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"          "vmWc1")
-            (match_operand 4 "vector_length_operand"             "   rK")
-            (match_operand 5 "const_int_operand"                 "    i")
-            (match_operand 6 "const_int_operand"                 "    i")
-            (match_operand 7 "const_int_operand"                 "    i")
+           [(match_operand:<VM> 1 "vector_mask_operand"          "vmWc1,vmWc1")
+            (match_operand 4 "vector_length_operand"             "   rK,   rK")
+            (match_operand 5 "const_int_operand"                 "    i,    i")
+            (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)
          (float_extend:VWEXTF
-            (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr"))
-         (match_operand:VWEXTF 2 "vector_merge_operand"          "  0vu")))]
+            (match_operand:<V_DOUBLE_TRUNC> 3 "register_operand" "   vr,   
vr"))
+         (match_operand:VWEXTF 2 "vector_merge_operand"          "   vu,    
0")))]
   "TARGET_VECTOR"
   "vfwcvt.f.f.v\t%0,%3%p1"
   [(set_attr "type" "vfwcvtftof")
@@ -6454,189 +6454,189 @@
 ;; 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, vr")
+  [(set (match_operand:<VLMUL1> 0 "register_operand"          "=vd, vd, vr, 
vr")
        (unspec:<VLMUL1>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"     " vm,Wc1")
-             (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:<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")
              (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")
+                (match_operand:<VLMUL1> 4 "register_operand" " vr, vr, vr, vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VI 3 "register_operand"           " vr, vr"))
-          (match_operand:<VLMUL1> 2 "vector_merge_operand"   "0vu,0vu")] 
UNSPEC_REDUC))]
+            (match_operand:VI 3 "register_operand"           " vr, vr, vr, 
vr"))
+          (match_operand:<VLMUL1> 2 "vector_merge_operand"   " vu,  0, 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, vr")
+  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"          "=vd, vd, 
vr, vr")
        (unspec:<VLMUL1_ZVE32>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"           " vm,Wc1")
-             (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:<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")
              (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")
+                (match_operand:<VLMUL1_ZVE32> 4 "register_operand" " vr, vr, 
vr, vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VI_ZVE32 3 "register_operand"           " vr, vr"))
-          (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   "0vu,0vu")] 
UNSPEC_REDUC))]
+            (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))]
   "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_widen_reduc_plus<v_su><mode><vwlmul1>"
-  [(set (match_operand:<VWLMUL1> 0 "register_operand"           "=&vr")
+  [(set (match_operand:<VWLMUL1> 0 "register_operand"           "=&vr,  &vr")
        (unspec:<VWLMUL1>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"      "vmWc1")
-             (match_operand 5 "vector_length_operand"         "   rK")
-             (match_operand 6 "const_int_operand"             "    i")
-             (match_operand 7 "const_int_operand"             "    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)
-          (match_operand:VWI 3 "register_operand"             "   vr")
-          (match_operand:<VWLMUL1> 4 "register_operand"       "   vr")
-          (match_operand:<VWLMUL1> 2 "vector_merge_operand"   "  0vu")] 
WREDUC))]
+          (match_operand:VWI 3 "register_operand"             "   vr,   vr")
+          (match_operand:<VWLMUL1> 4 "register_operand"       "   vr,   vr")
+          (match_operand:<VWLMUL1> 2 "vector_merge_operand"   "   vu,    0")] 
WREDUC))]
   "TARGET_VECTOR && TARGET_MIN_VLEN > 32"
   "vwredsum<v_su>.vs\t%0,%3,%4%p1"
   [(set_attr "type" "viwred")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_widen_reduc_plus<v_su><mode><vwlmul1_zve32>"
-  [(set (match_operand:<VWLMUL1_ZVE32> 0 "register_operand"           "=&vr")
+  [(set (match_operand:<VWLMUL1_ZVE32> 0 "register_operand"           "=&vr,  
&vr")
        (unspec:<VWLMUL1_ZVE32>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"            "vmWc1")
-             (match_operand 5 "vector_length_operand"               "   rK")
-             (match_operand 6 "const_int_operand"                   "    i")
-             (match_operand 7 "const_int_operand"                   "    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)
-          (match_operand:VWI_ZVE32 3 "register_operand"             "   vr")
-          (match_operand:<VWLMUL1_ZVE32> 4 "register_operand"       "   vr")
-          (match_operand:<VWLMUL1_ZVE32> 2 "vector_merge_operand"   "  0vu")] 
WREDUC))]
+          (match_operand:VWI_ZVE32 3 "register_operand"             "   vr,   
vr")
+          (match_operand:<VWLMUL1_ZVE32> 4 "register_operand"       "   vr,   
vr")
+          (match_operand:<VWLMUL1_ZVE32> 2 "vector_merge_operand"   "   vu,    
0")] WREDUC))]
   "TARGET_VECTOR && TARGET_MIN_VLEN == 32"
   "vwredsum<v_su>.vs\t%0,%3,%4%p1"
   [(set_attr "type" "viwred")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_reduc_<reduc><mode><vlmul1>"
-  [(set (match_operand:<VLMUL1> 0 "register_operand"          "=vd, vr")
+  [(set (match_operand:<VLMUL1> 0 "register_operand"          "=vd, vd, vr, 
vr")
        (unspec:<VLMUL1>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"      " vm,Wc1")
-             (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:<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")
              (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")
+                (match_operand:<VLMUL1> 4 "register_operand" " vr, vr, vr, vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VF 3 "register_operand"           " vr, vr"))
-          (match_operand:<VLMUL1> 2 "vector_merge_operand"   "0vu,0vu")] 
UNSPEC_REDUC))]
+            (match_operand:VF 3 "register_operand"           " vr, vr, vr, 
vr"))
+          (match_operand:<VLMUL1> 2 "vector_merge_operand"   " vu,  0, 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, vr")
+  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"          "=vd, vd, 
vr, vr")
        (unspec:<VLMUL1_ZVE32>
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand"           " vm,Wc1")
-             (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:<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")
              (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")
+                (match_operand:<VLMUL1_ZVE32> 4 "register_operand" " vr, vr, 
vr, vr")
                 (parallel [(const_int 0)])))
-            (match_operand:VF_ZVE32 3 "register_operand"           " vr, vr"))
-          (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   "0vu,0vu")] 
UNSPEC_REDUC))]
+            (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))]
   "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, vr")
+  [(set (match_operand:<VLMUL1> 0 "register_operand"             "=vd, vd, vr, 
vr")
        (unspec:<VLMUL1>
          [(unspec:<VLMUL1>
            [(unspec:<VM>
-              [(match_operand:<VM> 1 "vector_mask_operand"      " vm,Wc1")
-               (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:<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")
                (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")
+                  (match_operand:<VLMUL1> 4 "register_operand" " vr, vr, vr, 
vr")
                   (parallel [(const_int 0)])))
-              (match_operand:VF 3 "register_operand"           " vr, vr"))
-            (match_operand:<VLMUL1> 2 "vector_merge_operand"   "0vu,0vu")] 
UNSPEC_REDUC)] ORDER))]
+              (match_operand:VF 3 "register_operand"           " vr, vr, vr, 
vr"))
+            (match_operand:<VLMUL1> 2 "vector_merge_operand"   " vu,  0, 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, vr")
+  [(set (match_operand:<VLMUL1_ZVE32> 0 "register_operand"            "=vd, 
vd, vr, vr")
        (unspec:<VLMUL1_ZVE32>
          [(unspec:<VLMUL1_ZVE32>
            [(unspec:<VM>
-              [(match_operand:<VM> 1 "vector_mask_operand"           " vm,Wc1")
-               (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:<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")
                (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")
+                  (match_operand:<VLMUL1_ZVE32> 4 "register_operand" " vr, vr, 
vr, vr")
                   (parallel [(const_int 0)])))
-              (match_operand:VF_ZVE32 3 "register_operand"           " vr, 
vr"))
-            (match_operand:<VLMUL1_ZVE32> 2 "vector_merge_operand"   
"0vu,0vu")] UNSPEC_REDUC)] ORDER))]
+              (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))]
   "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_widen_reduc_plus<order><mode><vwlmul1>"
-  [(set (match_operand:<VWLMUL1> 0 "register_operand"             "=&vr")
+  [(set (match_operand:<VWLMUL1> 0 "register_operand"             "=&vr,  &vr")
        (unspec:<VWLMUL1>
          [(unspec:<VWLMUL1>
            [(unspec:<VM>
-              [(match_operand:<VM> 1 "vector_mask_operand"      "vmWc1")
-               (match_operand 5 "vector_length_operand"         "   rK")
-               (match_operand 6 "const_int_operand"             "    i")
-               (match_operand 7 "const_int_operand"             "    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)
-            (match_operand:VWF 3 "register_operand"             "   vr")
-            (match_operand:<VWLMUL1> 4 "register_operand"       "   vr")
-            (match_operand:<VWLMUL1> 2 "vector_merge_operand"   "  0vu")] 
UNSPEC_WREDUC_SUM)] ORDER))]
+            (match_operand:VWF 3 "register_operand"             "   vr,   vr")
+            (match_operand:<VWLMUL1> 4 "register_operand"       "   vr,   vr")
+            (match_operand:<VWLMUL1> 2 "vector_merge_operand"   "   vu,    
0")] UNSPEC_WREDUC_SUM)] ORDER))]
   "TARGET_VECTOR && TARGET_MIN_VLEN > 32"
   "vfwred<order>sum.vs\t%0,%3,%4%p1"
   [(set_attr "type" "vfwred<order>")
@@ -6750,16 +6750,16 @@
   [(set (match_operand:V 0 "register_operand"             "<ud_constraint>")
        (unspec:V
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand" "     vm,    Wc1")
-             (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")
+            [(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 8 "const_int_operand"        "  i,  i,  i,  i")
              (reg:SI VL_REGNUM)
              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand:V 2 "vector_merge_operand"      "    0vu,    0vu")
-          (match_operand:V 3 "register_operand"          "     vr,     vr")
-          (match_operand 4 "pmode_reg_or_uimm5_operand"  "     rK,     rK")] 
VSLIDES))]
+          (match_operand:V 2 "vector_merge_operand"      " vu,  0, vu,  0")
+          (match_operand:V 3 "register_operand"          " vr, vr, vr, vr")
+          (match_operand 4 "pmode_reg_or_uimm5_operand"  " rK, rK, rK, rK")] 
VSLIDES))]
   "TARGET_VECTOR"
   "vslide<ud>.v%o4\t%0,%3,%4%p1"
   [(set_attr "type" "vslide<ud>")
@@ -6770,16 +6770,16 @@
   [(set (match_operand:VI_QHS 0 "register_operand"        "<ud_constraint>")
        (unspec:VI_QHS
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand" "     vm,    Wc1")
-             (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")
+            [(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 8 "const_int_operand"        "  i,  i,  i,  i")
              (reg:SI VL_REGNUM)
              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand:VI_QHS 2 "vector_merge_operand" "    0vu,    0vu")
-          (match_operand:VI_QHS 3 "register_operand"     "     vr,     vr")
-          (match_operand:<VEL> 4 "reg_or_0_operand"      "     rJ,     rJ")] 
VSLIDES1))]
+          (match_operand:VI_QHS 2 "vector_merge_operand" " vu,  0, vu,  0")
+          (match_operand:VI_QHS 3 "register_operand"     " vr, vr, vr, vr")
+          (match_operand:<VEL> 4 "reg_or_0_operand"      " rK, rK, rK, rK")] 
VSLIDES1))]
   "TARGET_VECTOR"
   "vslide<ud>.vx\t%0,%3,%z4%p1"
   [(set_attr "type" "vislide<ud>")
@@ -6811,16 +6811,16 @@
   [(set (match_operand:VI_D 0 "register_operand"          "<ud_constraint>")
        (unspec:VI_D
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand" "     vm,    Wc1")
-             (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")
+            [(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 8 "const_int_operand"        "  i,  i,  i,  i")
              (reg:SI VL_REGNUM)
              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand:VI_D 2 "vector_merge_operand"   "    0vu,    0vu")
-          (match_operand:VI_D 3 "register_operand"       "     vr,     vr")
-          (match_operand:<VEL> 4 "reg_or_0_operand"      "     rJ,     rJ")] 
VSLIDES1))]
+          (match_operand:VI_D 2 "vector_merge_operand"   " vu,  0, vu,  0")
+          (match_operand:VI_D 3 "register_operand"       " vr, vr, vr, vr")
+          (match_operand:<VEL> 4 "reg_or_0_operand"      " rK, rK, rK, rK")] 
VSLIDES1))]
   "TARGET_VECTOR"
   "vslide<ud>.vx\t%0,%3,%z4%p1"
   [(set_attr "type" "vislide<ud>")
@@ -6830,17 +6830,17 @@
   [(set (match_operand:VI_D 0 "register_operand"          "<ud_constraint>")
        (unspec:VI_D
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand" "     vm,    Wc1")
-             (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")
+            [(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 8 "const_int_operand"        "  i,  i,  i,  i")
              (reg:SI VL_REGNUM)
              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand:VI_D 2 "vector_merge_operand"   "    0vu,    0vu")
-          (match_operand:VI_D 3 "register_operand"       "     vr,     vr")
+          (match_operand:VI_D 2 "vector_merge_operand"   " vu,  0, vu,  0")
+          (match_operand:VI_D 3 "register_operand"       " vr, vr, vr, vr")
           (sign_extend:<VEL>
-            (match_operand:<VSUBEL> 4 "reg_or_0_operand" "     rJ,     rJ"))] 
VSLIDES1))]
+            (match_operand:<VSUBEL> 4 "reg_or_0_operand" " rJ, rJ, rJ, rJ"))] 
VSLIDES1))]
   "TARGET_VECTOR"
   "vslide<ud>.vx\t%0,%3,%z4%p1"
   [(set_attr "type" "vislide<ud>")
@@ -6851,16 +6851,16 @@
   [(set (match_operand:VF 0 "register_operand"            "<ud_constraint>")
        (unspec:VF
          [(unspec:<VM>
-            [(match_operand:<VM> 1 "vector_mask_operand" "     vm,    Wc1")
-             (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")
+            [(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 8 "const_int_operand"        "  i,  i,  i,  i")
              (reg:SI VL_REGNUM)
              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand:VF 2 "vector_merge_operand"     "    0vu,    0vu")
-          (match_operand:VF 3 "register_operand"         "     vr,     vr")
-          (match_operand:<VEL> 4 "register_operand"      "      f,      f")] 
VFSLIDES1))]
+          (match_operand:VF 2 "vector_merge_operand"     " vu,  0, vu,  0")
+          (match_operand:VF 3 "register_operand"         " vr, vr, vr, vr")
+          (match_operand:<VEL> 4 "register_operand"      "  f,  f,  f,  f")] 
VFSLIDES1))]
   "TARGET_VECTOR"
   "vfslide<ud>.vf\t%0,%3,%4%p1"
   [(set_attr "type" "vfslide<ud>")
@@ -6868,40 +6868,40 @@
 
 ;; vrgather
 (define_insn "@pred_gather<mode>"
-  [(set (match_operand:V 0 "register_operand"              "=&vr")
+  [(set (match_operand:V 0 "register_operand"              "=&vr,  &vr")
        (if_then_else:V
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"  "vmWc1")
-            (match_operand 5 "vector_length_operand"     "   rK")
-            (match_operand 6 "const_int_operand"         "    i")
-            (match_operand 7 "const_int_operand"         "    i")
-            (match_operand 8 "const_int_operand"         "    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")
+            (match_operand 8 "const_int_operand"         "    i,    i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:V
-           [(match_operand:V 3 "register_operand"        "   vr")
-            (match_operand:<VINDEX> 4 "register_operand" "   vr")] 
UNSPEC_VRGATHER)
-         (match_operand:V 2 "vector_merge_operand"       "  0vu")))]
+           [(match_operand:V 3 "register_operand"        "   vr,   vr")
+            (match_operand:<VINDEX> 4 "register_operand" "   vr,   vr")] 
UNSPEC_VRGATHER)
+         (match_operand:V 2 "vector_merge_operand"       "   vu,    0")))]
   "TARGET_VECTOR"
   "vrgather.vv\t%0,%3,%4%p1"
   [(set_attr "type" "vgather")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "@pred_gather<mode>_scalar"
-  [(set (match_operand:V 0 "register_operand"               "=&vr")
+  [(set (match_operand:V 0 "register_operand"               "=&vr,  &vr")
        (if_then_else:V
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"   "vmWc1")
-            (match_operand 5 "vector_length_operand"      "   rK")
-            (match_operand 6 "const_int_operand"          "    i")
-            (match_operand 7 "const_int_operand"          "    i")
-            (match_operand 8 "const_int_operand"          "    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")
+            (match_operand 8 "const_int_operand"          "    i,    i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:V
-           [(match_operand:V 3 "register_operand"         "   vr")
-            (match_operand 4 "pmode_reg_or_uimm5_operand" "   rK")] 
UNSPEC_VRGATHER)
-         (match_operand:V 2 "vector_merge_operand"        "  0vu")))]
+           [(match_operand:V 3 "register_operand"         "   vr,   vr")
+            (match_operand 4 "pmode_reg_or_uimm5_operand" "   rK,   rK")] 
UNSPEC_VRGATHER)
+         (match_operand:V 2 "vector_merge_operand"        "   vu,    0")))]
   "TARGET_VECTOR"
   "vrgather.v%o4\t%0,%3,%4%p1"
   [(set_attr "type" "vgather")
@@ -6909,20 +6909,20 @@
 
 ;; vrgatherei16
 (define_insn "@pred_gatherei16<mode>"
-  [(set (match_operand:VEI16 0 "register_operand"              "=&vr")
+  [(set (match_operand:VEI16 0 "register_operand"              "=&vr,  &vr")
        (if_then_else:VEI16
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand"      "vmWc1")
-            (match_operand 5 "vector_length_operand"         "   rK")
-            (match_operand 6 "const_int_operand"             "    i")
-            (match_operand 7 "const_int_operand"             "    i")
-            (match_operand 8 "const_int_operand"             "    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")
+            (match_operand 8 "const_int_operand"             "    i,    i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:VEI16
-           [(match_operand:VEI16 3 "register_operand"        "   vr")
-            (match_operand:<VINDEXEI16> 4 "register_operand" "   vr")] 
UNSPEC_VRGATHEREI16)
-         (match_operand:VEI16 2 "vector_merge_operand"       "  0vu")))]
+           [(match_operand:VEI16 3 "register_operand"        "   vr,   vr")
+            (match_operand:<VINDEXEI16> 4 "register_operand" "   vr,   vr")] 
UNSPEC_VRGATHEREI16)
+         (match_operand:VEI16 2 "vector_merge_operand"       "   vu,    0")))]
   "TARGET_VECTOR"
   "vrgatherei16.vv\t%0,%3,%4%p1"
   [(set_attr "type" "vgather")
@@ -6930,17 +6930,17 @@
 
 ;; vcompress
 (define_insn "@pred_compress<mode>"
-  [(set (match_operand:V 0 "register_operand"            "=&vr")
+  [(set (match_operand:V 0 "register_operand"            "=&vr,  &vr")
        (unspec:V
          [(unspec:<VM>
-           [(match_operand:<VM> 3 "register_operand"    "  vm")
-            (match_operand 4 "vector_length_operand"    "  rK")
-            (match_operand 5 "const_int_operand"        "   i")
-            (match_operand 6 "const_int_operand"        "   i")
+           [(match_operand:<VM> 3 "register_operand"    "  vm,  vm")
+            (match_operand 4 "vector_length_operand"    "  rK,  rK")
+            (match_operand 5 "const_int_operand"        "   i,   i")
+            (match_operand 6 "const_int_operand"        "   i,   i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand:V 2 "register_operand"          "  vr")
-          (match_operand:V 1 "vector_merge_operand"        " 0vu")] 
UNSPEC_VCOMPRESS))]
+          (match_operand:V 2 "register_operand"         "  vr,  vr")
+          (match_operand:V 1 "vector_merge_operand"     "  vu,   0")] 
UNSPEC_VCOMPRESS))]
   "TARGET_VECTOR"
   "vcompress.vm\t%0,%2,%3"
   [(set_attr "type" "vcompress")
@@ -6970,19 +6970,19 @@
    (set_attr "mode" "DI")])
 
 (define_insn "@pred_fault_load<mode>"
-  [(set (match_operand:V 0 "register_operand"              "=vd,    vr")
+  [(set (match_operand:V 0 "register_operand"              "=vd,    vd,    vr, 
   vr")
        (if_then_else:V
          (unspec:<VM>
-           [(match_operand:<VM> 1 "vector_mask_operand" "   vm,   Wc1")
-            (match_operand 4 "vector_length_operand"    "   rK,    rK")
-            (match_operand 5 "const_int_operand"        "    i,     i")
-            (match_operand 6 "const_int_operand"        "    i,     i")
-            (match_operand 7 "const_int_operand"        "    i,     i")
+           [(match_operand:<VM> 1 "vector_mask_operand" "   vm,    vm,   Wc1,  
 Wc1")
+            (match_operand 4 "vector_length_operand"    "   rK,    rK,    rK,  
  rK")
+            (match_operand 5 "const_int_operand"        "    i,     i,     i,  
   i")
+            (match_operand 6 "const_int_operand"        "    i,     i,     i,  
   i")
+            (match_operand 7 "const_int_operand"        "    i,     i,     i,  
   i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
          (unspec:V
-           [(match_operand:V 3 "memory_operand"         "    m,     m")] 
UNSPEC_VLEFF)
-         (match_operand:V 2 "vector_merge_operand"      "  0vu,   0vu")))
+           [(match_operand:V 3 "memory_operand"         "    m,     m,     m,  
   m")] UNSPEC_VLEFF)
+         (match_operand:V 2 "vector_merge_operand"      "   vu,     0,    vu,  
   0")))
    (set (reg:SI VL_REGNUM) (unspec:SI [(match_dup 0)] UNSPEC_VLEFF))]
   "TARGET_VECTOR"
   "vle<sew>ff.v\t%0,%3%p1"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-2.c
new file mode 100644
index 00000000000..8d9d5655839
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/merge_constraint-2.c
@@ -0,0 +1,118 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gcv -mabi=ilp32d -O3" } */
+
+#include "riscv_vector.h"
+
+void f0 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfadd_vv_f32m1 (v, v, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f1 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfadd_vf_f32m1 (v, 8.9, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f2 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfdiv_vv_f32m1 (v, v, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f4 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfdiv_vf_f32m1 (v, 8.9, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f5 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfrdiv_vf_f32m1 (v, 8.9, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f6 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfsgnj_vv_f32m1 (v, v, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f7 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfsgnj_vf_f32m1 (v, 8.9, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f8 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfsqrt_v_f32m1 (v, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f9 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfrec7_v_f32m1 (v, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+void f10 (int8_t* base1,int8_t* base2,int8_t* out,int n)
+{
+  vint8mf4_t v = __riscv_vle8_v_i8mf4 (base1, 32);
+  vbool32_t m = __riscv_vlm_v_b32 (base1 + 200, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vmerge_vxm_i8mf4 (v, 100, m, 32);
+    v = __riscv_vle8_v_i8mf4_tu (v, base2, 32);
+  }
+  __riscv_vse8_v_i8mf4 (out, v, 32);
+}
+
+void f11 (void* base1,void* base2,void* out,int n)
+{
+  vfloat32m1_t v = __riscv_vle32_v_f32m1 (base1, 32);
+  vbool32_t m = __riscv_vlm_v_b32 (base1 + 200, 32);
+  for (int i = 0; i < n; i++){
+    v = __riscv_vfmerge_vfm_f32m1 (v, 8.9, m, 32);
+    v = __riscv_vle32_v_f32m1_tu (v, base2, 32);
+  }
+  __riscv_vse32_v_f32m1 (out, v, 32);
+}
+
+/* { dg-final { scan-assembler-not {vmv1r} } } */
-- 
2.36.1


Reply via email to