[llvm] [LV] Trim VFs that cause vector splitting when tail-folding with EVL (PR #222836)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 21 03:34:01 PDT 2026
================
@@ -332,38 +332,38 @@ define i32 @chained_reduce_iv_derived_first_link(ptr %c, ptr %d, i64 %N) #0 {
; MAXBW-NEXT: [[ENTRY:.*:]]
; MAXBW-NEXT: br label %[[VECTOR_PH:.*]]
; MAXBW: [[VECTOR_PH]]:
-; MAXBW-NEXT: [[TMP0:%.*]] = call <vscale x 16 x i8> @llvm.stepvector.nxv16i8()
+; MAXBW-NEXT: [[TMP0:%.*]] = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8()
; MAXBW-NEXT: br label %[[VECTOR_BODY:.*]]
; MAXBW: [[VECTOR_BODY]]:
; MAXBW-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[CURRENT_ITERATION_NEXT:%.*]], %[[VECTOR_BODY]] ]
-; MAXBW-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 4 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[PARTIAL_REDUCE2:%.*]], %[[VECTOR_BODY]] ]
-; MAXBW-NEXT: [[VEC_IND:%.*]] = phi <vscale x 16 x i8> [ [[TMP0]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
+; MAXBW-NEXT: [[VEC_PHI:%.*]] = phi <vscale x 2 x i32> [ zeroinitializer, %[[VECTOR_PH]] ], [ [[PARTIAL_REDUCE2:%.*]], %[[VECTOR_BODY]] ]
+; MAXBW-NEXT: [[VEC_IND:%.*]] = phi <vscale x 8 x i8> [ [[TMP0]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
; MAXBW-NEXT: [[AVL:%.*]] = phi i64 [ [[N]], %[[VECTOR_PH]] ], [ [[AVL_NEXT:%.*]], %[[VECTOR_BODY]] ]
-; MAXBW-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true)
+; MAXBW-NEXT: [[TMP1:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 8, i1 true)
; MAXBW-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
; MAXBW-NEXT: [[TMP3:%.*]] = trunc i64 [[TMP2]] to i8
-; MAXBW-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <vscale x 16 x i8> poison, i8 [[TMP3]], i64 0
-; MAXBW-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <vscale x 16 x i8> [[BROADCAST_SPLATINSERT]], <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
-; MAXBW-NEXT: [[TMP4:%.*]] = sext <vscale x 16 x i8> [[VEC_IND]] to <vscale x 16 x i32>
-; MAXBW-NEXT: [[TMP5:%.*]] = mul <vscale x 16 x i32> [[TMP4]], [[TMP4]]
-; MAXBW-NEXT: [[TMP6:%.*]] = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> splat (i1 true), <vscale x 16 x i32> [[TMP5]], <vscale x 16 x i32> zeroinitializer, i32 [[TMP1]])
-; MAXBW-NEXT: [[PARTIAL_REDUCE:%.*]] = call <vscale x 4 x i32> @llvm.vector.partial.reduce.add.nxv4i32.nxv16i32(<vscale x 4 x i32> [[VEC_PHI]], <vscale x 16 x i32> [[TMP6]])
----------------
lukel97 wrote:
I don't think we end up splitting this type here. llc seems to be able to lower the existing partial reduction without splitting:
```asm
.LBB0_1: # %vector.body
# =>This Inner Loop Header: Depth=1
vmv2r.v v14, v12
vsetvli a4, a2, e8, m2, tu, ma
vmv.v.v v14, v10
add a5, a0, a3
vsetvli a6, zero, e32, m2, ta, ma
vdot4a.vv v8, v10, v14
vsetvli zero, a2, e8, m2, ta, ma
vle8.v v14, (a5)
vmv2r.v v16, v12
add a5, a1, a3
vsetvli zero, zero, e8, m2, tu, ma
vle8.v v16, (a5)
vsetvli a5, zero, e32, m2, ta, ma
vdot4a.vv v8, v14, v16
vsetvli a5, zero, e8, m2, ta, ma
vadd.vx v10, v10, a4
sub a2, a2, a4
add a3, a4, a3
bnez a2, .LBB0_1
```
as a side observation, we need to teach RISCVVLOptimizer about vdot4a
https://github.com/llvm/llvm-project/pull/222836
More information about the llvm-commits
mailing list