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