[llvm] [VPlan] Allow folding not (cmp eq) -> icmp ne with other select users (PR #154497)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 20 10:30:42 PDT 2025
================
@@ -1107,13 +1107,30 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
return Def->replaceAllUsesWith(A);
// Try to fold Not into compares by adjusting the predicate in-place.
- if (isa<VPWidenRecipe>(A) && A->getNumUsers() == 1) {
+ auto CanFold = [&A](VPUser *U) {
+ return match(
+ U, m_CombineOr(m_Not(m_Specific(A)),
+ m_Select(m_Specific(A), m_VPValue(), m_VPValue())));
+ };
+ if (isa<VPWidenRecipe>(A) && all_of(A->users(), CanFold)) {
auto *WideCmp = cast<VPWidenRecipe>(A);
if (WideCmp->getOpcode() == Instruction::ICmp ||
WideCmp->getOpcode() == Instruction::FCmp) {
WideCmp->setPredicate(
CmpInst::getInversePredicate(WideCmp->getPredicate()));
- Def->replaceAllUsesWith(WideCmp);
+ for (VPUser *U : to_vector(WideCmp->users())) {
+ auto *R = cast<VPSingleDefRecipe>(U);
+ // not (icmp eq) -> icmp ne
+ if (match(R, m_Not(m_Specific(WideCmp))))
+ R->replaceAllUsesWith(WideCmp);
+ // select (icmp eq), x, y -> select (icmp ne), y, x
+ else if (match(R, m_Select(m_Specific(WideCmp), m_VPValue(X),
+ m_VPValue(Y)))) {
+ R->setOperand(1, Y);
+ R->setOperand(2, X);
+ } else
----------------
artagnon wrote:
I'd probably have two separate matches `m_Not(m_Cmp(...))` and `m_Select(m_Cmp(...), ...)`, stripping the all_of, the llvm_unreachable, and the ugly opcode matching.
https://github.com/llvm/llvm-project/pull/154497
More information about the llvm-commits
mailing list