Skip to content

Commit

Permalink
[SelectionDAG]: Deduce KnownNeverZero from SMIN and SMAX (#85722)
Browse files Browse the repository at this point in the history
  • Loading branch information
AtariDreams committed Mar 25, 2024
1 parent a0e9a8d commit f5a067b
Show file tree
Hide file tree
Showing 2 changed files with 250 additions and 93 deletions.
40 changes: 37 additions & 3 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5362,10 +5362,44 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const {
return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
isKnownNeverZero(Op.getOperand(0), Depth + 1);

// TODO for smin/smax: If either operand is known negative/positive
// For smin/smax: If either operand is known negative/positive
// respectively we don't need the other to be known at all.
case ISD::SMAX:
case ISD::SMIN:
case ISD::SMAX: {
KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
if (Op1.isStrictlyPositive())
return true;

KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
if (Op0.isStrictlyPositive())
return true;

if (Op1.isNonZero() && Op0.isNonZero())
return true;

if (KnownBits::smax(Op0, Op1).isNonZero())
return true;

return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
isKnownNeverZero(Op.getOperand(0), Depth + 1);
}
case ISD::SMIN: {
KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
if (Op1.isNegative())
return true;

KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
if (Op0.isNegative())
return true;

if (Op1.isNonZero() && Op0.isNonZero())
return true;

if (KnownBits::smin(Op0, Op1).isNonZero())
return true;

return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
isKnownNeverZero(Op.getOperand(0), Depth + 1);
}
case ISD::UMIN:
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
isKnownNeverZero(Op.getOperand(0), Depth + 1);
Expand Down

0 comments on commit f5a067b

Please sign in to comment.