[llvm] [RISCV] Improve cleanup phase of RISCV Insert VSETVLI pass (PR #67144)

Ju-Zhe Zhong via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 13 02:03:14 PDT 2023


================
@@ -834,8 +834,7 @@ define <vscale x 2 x i32> @pre_lmul(<vscale x 2 x i32> %x, <vscale x 2 x i32> %y
 ; CHECK-LABEL: pre_lmul:
 ; CHECK:       # %bb.0: # %entry
 ; CHECK-NEXT:    andi a0, a0, 1
-; CHECK-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
-; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
+; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
 ; CHECK-NEXT:    vadd.vv v8, v8, v9
----------------
zhongjuzhe wrote:

It seems incorrect.

According to the LLVM IR, is should be processing VLMAX number of element of SEW = 64, LMUL = 1.

Suppose RVV VLEN = 128bit:

SEW = 64, LMUL = 1, the vsetvlmax output should be 2 elements.
SEW = 32, LMUL = 1, the vsetvlmax output should be 4 elements.
According to LLVM IR:
%vl = tail call i64 @llvm.riscv.vsetvlimax.i64(i64 3, i64 0)
%a = call <vscale x 2 x i32> @llvm.riscv.vadd.nxv2i32(<vscale x 2 x i32> undef, <vscale x 2 x i32> %x, <vscale x 2 x i32> %y, i64 %vl)

%vl output should be 2 elements, then later "vadd" should be processing 2 elements.

Here the new assembly after this patch is:
; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma
; CHECK-NEXT: vadd.vv v8, v8, v9
The "vadd.vv" is processing 4 elements.

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


More information about the llvm-commits mailing list