@@ -5362,10 +5362,44 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const {
5362
5362
return isKnownNeverZero (Op.getOperand (1 ), Depth + 1 ) ||
5363
5363
isKnownNeverZero (Op.getOperand (0 ), Depth + 1 );
5364
5364
5365
- // TODO for smin/smax: If either operand is known negative/positive
5365
+ // For smin/smax: If either operand is known negative/positive
5366
5366
// 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
+ }
5369
5403
case ISD::UMIN:
5370
5404
return isKnownNeverZero (Op.getOperand (1 ), Depth + 1 ) &&
5371
5405
isKnownNeverZero (Op.getOperand (0 ), Depth + 1 );
0 commit comments