Skip to content

Commit dd38f1a

Browse files
committed
[SelectionDAG]: Deduce known bits from SMIN and SMAX
1 parent da100db commit dd38f1a

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5360,10 +5360,42 @@ bool SelectionDAG::isKnownNeverZero(SDValue Op, unsigned Depth) const {
53605360
return isKnownNeverZero(Op.getOperand(1), Depth + 1) ||
53615361
isKnownNeverZero(Op.getOperand(0), Depth + 1);
53625362

5363-
// TODO for smin/smax: If either operand is known negative/positive
5363+
// For smin/smax: If either operand is known negative/positive
53645364
// 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+
}
53675399
case ISD::UMIN:
53685400
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
53695401
isKnownNeverZero(Op.getOperand(0), Depth + 1);

llvm/test/CodeGen/X86/known-never-zero.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,7 @@ define i32 @smin_known_zero_2(i32 %x, i32 %y) {
273273
; CHECK-NEXT: cmpl $-54, %edi
274274
; CHECK-NEXT: movl $-54, %eax
275275
; CHECK-NEXT: cmovll %edi, %eax
276-
; CHECK-NEXT: bsfl %eax, %ecx
277-
; CHECK-NEXT: movl $32, %eax
278-
; CHECK-NEXT: cmovnel %ecx, %eax
276+
; CHECK-NEXT: rep bsfl %eax, %eax
279277
; CHECK-NEXT: retq
280278
%z = call i32 @llvm.smin.i32(i32 %x, i32 -54)
281279
%r = call i32 @llvm.cttz.i32(i32 %z, i1 false)
@@ -326,9 +324,7 @@ define i32 @smax_known_zero_2(i32 %x, i32 %y) {
326324
; CHECK-NEXT: cmpl $55, %edi
327325
; CHECK-NEXT: movl $54, %eax
328326
; CHECK-NEXT: cmovgel %edi, %eax
329-
; CHECK-NEXT: bsfl %eax, %ecx
330-
; CHECK-NEXT: movl $32, %eax
331-
; CHECK-NEXT: cmovnel %ecx, %eax
327+
; CHECK-NEXT: rep bsfl %eax, %eax
332328
; CHECK-NEXT: retq
333329
%z = call i32 @llvm.smax.i32(i32 %x, i32 54)
334330
%r = call i32 @llvm.cttz.i32(i32 %z, i1 false)

0 commit comments

Comments
 (0)