[PATCH] D147900: [ValueTracking] Use `select` condition to help determine if `select` is non-zero

Noah Goldstein via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 22 13:26:54 PDT 2023


goldstein.w.n marked an inline comment as done.
goldstein.w.n added inline comments.


================
Comment at: llvm/lib/Analysis/ValueTracking.cpp:2939
       return true;
     break;
+  }
----------------
nikic wrote:
> I have a hard time following the logic here at the end. What I expected to see was something like this:
> ```
>     auto SelectArmIsNonZero = [&](bool IsTrueArm) {
>       Value *Op = IsTrueArm ? I->getOperand(1) : I->getOperand(2);
>       if (isKnownNonZero(Op, DemandedElts, Depth, Q))
>         return true;
> 
>       // The condition of the select dominates the true/false arm. Check if the
>       // condition implies that a given arm is non-zero.
>       Value *X;
>       CmpInst::Predicate Pred;
>       if (!match(I->getOperand(0), m_c_ICmp(Pred, m_Specific(Op), m_Value(X))))
>         return false;
> 
>       if (!IsTrueArm)
>         Pred = ICmpInst::getInversePredicate(Pred);
> 
>       return cmpExcludesZero(Pred, X);
>     };
> 
>     if (SelectArmIsNonZero(/* IsTrueArm */ true) &&
>         SelectArmIsNonZero(/* IsTrueArm */ false))
>       return true;
> ```
Ah, that is indeed much clearer.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D147900/new/

https://reviews.llvm.org/D147900



More information about the llvm-commits mailing list