[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