diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp index 155c6738f6986..c69ec707e4f3a 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp @@ -3208,6 +3208,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 c6b907d82ce02..b8a7fb7bda860 100644 --- a/llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll +++ b/llvm/test/Transforms/LoopVectorize/RISCV/iv-select-cmp.ll @@ -96,9 +96,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]]