[llvm] [RISCV] Teach the VL Optimizer about Zvzip instructions (PR #214405)

Pengcheng Wang via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 6 04:46:25 PDT 2026


================
@@ -2423,3 +2424,111 @@ body: |
     %2:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 3 /* ta, ma */
     PseudoVSOXSEG3EI32_V_M1_M2 $noreg, $noreg, %2, 1, 6 /* e64 */
 ...
+---
+name:            vzip_vv_vd
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: vzip_vv_vd
+    ; CHECK: early-clobber %0:vrm2 = PseudoVZIP_VV_M1 $noreg, $noreg, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: [[PseudoVADD_VV_M2_:%[0-9]+]]:vrm2 = PseudoVADD_VV_M2 $noreg, %0, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: $v8m2 = COPY [[PseudoVADD_VV_M2_]]
+    early-clobber %0:vrm2 = PseudoVZIP_VV_M1 $noreg, $noreg, $noreg, -1, 5, 0
+    %1:vrm2 = PseudoVADD_VV_M2 $noreg, %0, $noreg, 1, 5, 0
+    $v8m2 = COPY %1
+...
+---
+name:            vzip_vv_incompatible_eew
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: vzip_vv_incompatible_eew
+    ; CHECK: early-clobber %0:vrm2 = PseudoVZIP_VV_M1 $noreg, $noreg, $noreg, -1 /* vl=VLMAX */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: [[PseudoVADD_VV_M2_:%[0-9]+]]:vrm2 = PseudoVADD_VV_M2 $noreg, %0, $noreg, 1 /* vl */, 4 /* e16 */, 0 /* tu, mu */
+    ; CHECK-NEXT: $v8m2 = COPY [[PseudoVADD_VV_M2_]]
+    early-clobber %0:vrm2 = PseudoVZIP_VV_M1 $noreg, $noreg, $noreg, -1, 5, 0
+    %1:vrm2 = PseudoVADD_VV_M2 $noreg, %0, $noreg, 1, 4, 0
+    $v8m2 = COPY %1
+...
+---
+name:            vunzipe_v
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: vunzipe_v
+    ; CHECK: early-clobber %0:vr = PseudoVUNZIPE_V_M1 $noreg, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: [[PseudoVADD_VV_M1_:%[0-9]+]]:vr = PseudoVADD_VV_M1 $noreg, %0, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: $v8 = COPY [[PseudoVADD_VV_M1_]]
+    early-clobber %0:vr = PseudoVUNZIPE_V_M1 $noreg, $noreg, -1, 5, 0
+    %1:vr = PseudoVADD_VV_M1 $noreg, %0, $noreg, 1, 5, 0
+    $v8 = COPY %1
+...
+---
+name:            vunzipo_v
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: vunzipo_v
+    ; CHECK: early-clobber %0:vr = PseudoVUNZIPO_V_M1 $noreg, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: [[PseudoVADD_VV_M1_:%[0-9]+]]:vr = PseudoVADD_VV_M1 $noreg, %0, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: $v8 = COPY [[PseudoVADD_VV_M1_]]
+    early-clobber %0:vr = PseudoVUNZIPO_V_M1 $noreg, $noreg, -1, 5, 0
+    %1:vr = PseudoVADD_VV_M1 $noreg, %0, $noreg, 1, 5, 0
+    $v8 = COPY %1
+...
+---
+name:            vunzipe_incompatible_eew
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: vunzipe_incompatible_eew
+    ; CHECK: early-clobber %0:vr = PseudoVUNZIPE_V_M1 $noreg, $noreg, -1 /* vl=VLMAX */, 5 /* e32 */, 0 /* tu, mu */
+    ; CHECK-NEXT: [[PseudoVADD_VV_M1_:%[0-9]+]]:vr = PseudoVADD_VV_M1 $noreg, %0, $noreg, 1 /* vl */, 4 /* e16 */, 0 /* tu, mu */
+    ; CHECK-NEXT: $v8 = COPY [[PseudoVADD_VV_M1_]]
+    early-clobber %0:vr = PseudoVUNZIPE_V_M1 $noreg, $noreg, -1, 5, 0
+    %1:vr = PseudoVADD_VV_M1 $noreg, %0, $noreg, 1, 4, 0
+    $v8 = COPY %1
+...
+---
+name:            vunzipe_src_propagate
+body:             |
+  bb.0:
+    ; CHECK-LABEL: name: vunzipe_src_propagate
+    ; CHECK: %src:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, 1 /* vl */, 5 /* e32 */, 0 /* tu, mu */
----------------
wangpc-pp wrote:

Done in https://github.com/llvm/llvm-project/pull/214405/commits/a63fd12372cad0b19d020e3cb8ac6c0db9deb1da. TBH, Zvzip is too special.

https://github.com/llvm/llvm-project/pull/214405


More information about the llvm-commits mailing list