Skip to content

Commit f5a067b

Browse files
authored
[SelectionDAG]: Deduce KnownNeverZero from SMIN and SMAX (#85722)
1 parent a0e9a8d commit f5a067b

File tree

2 files changed

+250
-93
lines changed

2 files changed

+250
-93
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5362,10 +5362,44 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const {
53625362
return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
53635363
isKnownNeverZero(Op.getOperand(0), Depth + 1);
53645364

5365-
// TODO for smin/smax: If either operand is known negative/positive
5365+
// For smin/smax: If either operand is known negative/positive
53665366
// respectively we don't need the other to be known at all.
5367-
case ISD::SMAX:
5368-
case ISD::SMIN:
5367+
case ISD::SMAX: {
5368+
KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5369+
if (Op1.isStrictlyPositive())
5370+
return true;
5371+
5372+
KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5373+
if (Op0.isStrictlyPositive())
5374+
return true;
5375+
5376+
if (Op1.isNonZero() && Op0.isNonZero())
5377+
return true;
5378+
5379+
if (KnownBits::smax(Op0, Op1).isNonZero())
5380+
return true;
5381+
5382+
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5383+
isKnownNeverZero(Op.getOperand(0), Depth + 1);
5384+
}
5385+
case ISD::SMIN: {
5386+
KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5387+
if (Op1.isNegative())
5388+
return true;
5389+
5390+
KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5391+
if (Op0.isNegative())
5392+
return true;
5393+
5394+
if (Op1.isNonZero() && Op0.isNonZero())
5395+
return true;
5396+
5397+
if (KnownBits::smin(Op0, Op1).isNonZero())
5398+
return true;
5399+
5400+
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5401+
isKnownNeverZero(Op.getOperand(0), Depth + 1);
5402+
}
53695403
case ISD::UMIN:
53705404
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
53715405
isKnownNeverZero(Op.getOperand(0), Depth + 1);

0 commit comments

Comments
 (0)