From f210626e4d7f42df9c517eb0b1d725ae8d3fb951 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 22 Apr 2026 15:31:47 +0100 Subject: [PATCH] [VPlan] Fold lhs | (headermask && rhs) -> vp.merge rhs, true, lhs, evl This is a combine on mask vectors that can show up with EVL tail folding. Split off from #190196 --- llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 8 ++++++++ llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp index d1ff014907dc9..0a71daba46a48 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp @@ -3161,6 +3161,14 @@ static VPRecipeBase *optimizeMaskToEVL(VPValue *HeaderMask, VPIRFlags::getDefaultFlags(Instruction::Sub), {}, DL); } + // lhs | (headermask && rhs) -> vp.merge rhs, true, lhs, evl + if (match(&CurRecipe, + m_c_BinaryOr(m_VPValue(LHS), + m_LogicalAnd(m_Specific(HeaderMask), m_VPValue(RHS))))) + return new VPWidenIntrinsicRecipe( + Intrinsic::vp_merge, {RHS, Plan->getTrue(), LHS, &EVL}, + TypeInfo.inferScalarType(LHS), {}, {}, DL); + return nullptr; } diff --git a/llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll b/llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll index 7feb0d8322868..f4d3030dd74be 100644 --- a/llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll +++ b/llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll @@ -97,9 +97,8 @@ define i64 @select_decreasing_induction_icmp_non_const_start(ptr %a, ptr %b, i64 ; CHECK-NEXT: [[VP_OP_LOAD4:%.*]] = call @llvm.vp.load.nxv4i64.p0(ptr align 8 [[TMP14]], splat (i1 true), i32 [[TMP4]]) ; CHECK-NEXT: [[TMP15:%.*]] = call @llvm.experimental.vp.reverse.nxv4i64( [[VP_OP_LOAD4]], splat (i1 true), i32 [[TMP4]]) ; CHECK-NEXT: [[TMP16:%.*]] = icmp sgt [[TMP12]], [[TMP15]] -; CHECK-NEXT: [[TMP17:%.*]] = call @llvm.vp.merge.nxv4i1( splat (i1 true), [[TMP16]], zeroinitializer, i32 [[TMP4]]) ; CHECK-NEXT: [[TMP18]] = call @llvm.vp.merge.nxv4i64( [[TMP16]], [[VEC_IND]], [[VEC_PHI]], i32 [[TMP4]]) -; CHECK-NEXT: [[TMP19]] = or [[VEC_PHI1]], [[TMP17]] +; CHECK-NEXT: [[TMP19]] = call @llvm.vp.merge.nxv4i1( [[TMP16]], splat (i1 true), [[VEC_PHI1]], i32 [[TMP4]]) ; CHECK-NEXT: [[CURRENT_ITERATION_NEXT]] = add i64 [[TMP5]], [[INDEX]] ; CHECK-NEXT: [[AVL_NEXT]] = sub nuw i64 [[AVL]], [[TMP5]] ; CHECK-NEXT: [[VEC_IND_NEXT]] = add nsw [[VEC_IND]], [[BROADCAST_SPLAT3]]