Skip to content

Commit 89d057d

Browse files
committed
[SelectionDAG]: Deduce known bits from SMIN and SMAX
1 parent 102b0e5 commit 89d057d

File tree

2 files changed

+33
-9
lines changed

2 files changed

+33
-9
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

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

5364-
// TODO for smin/smax: If either operand is known negative/positive
5364+
// For smin/smax: If either operand is known negative/positive
53655365
// respectively we don't need the other to be known at all.
5366-
case ISD::SMAX:
5367-
case ISD::SMIN:
5366+
case ISD::SMAX: {
5367+
KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5368+
if (Op1.isStrictlyPositive())
5369+
return true;
5370+
5371+
KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5372+
if (Op0.isStrictlyPositive())
5373+
return true;
5374+
5375+
if (Op1.isNonZero() && Op0.isNonZero())
5376+
return true;
5377+
5378+
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5379+
isKnownNeverZero(Op.getOperand(0), Depth + 1);
5380+
}
5381+
case ISD::SMIN: {
5382+
KnownBits Op1 = computeKnownBits(Op.getOperand(1), Depth + 1);
5383+
if (Op1.isNegative())
5384+
return true;
5385+
5386+
KnownBits Op0 = computeKnownBits(Op.getOperand(0), Depth + 1);
5387+
if (Op0.isNegative())
5388+
return true;
5389+
5390+
if (Op1.isNonZero() && Op0.isNonZero())
5391+
return true;
5392+
5393+
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
5394+
isKnownNeverZero(Op.getOperand(0), Depth + 1);
5395+
}
53685396
case ISD::UMIN:
53695397
return isKnownNeverZero(Op.getOperand(1), Depth + 1) &&
53705398
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
@@ -276,9 +276,7 @@ define i32 @smin_known_zero(i32 %x, i32 %y) {
276276
; CHECK-NEXT: cmpl $-54, %edi
277277
; CHECK-NEXT: movl $-54, %eax
278278
; CHECK-NEXT: cmovll %edi, %eax
279-
; CHECK-NEXT: bsfl %eax, %ecx
280-
; CHECK-NEXT: movl $32, %eax
281-
; CHECK-NEXT: cmovnel %ecx, %eax
279+
; CHECK-NEXT: rep bsfl %eax, %eax
282280
; CHECK-NEXT: retq
283281
%z = call i32 @llvm.smin.i32(i32 %x, i32 -54)
284282
%r = call i32 @llvm.cttz.i32(i32 %z, i1 false)
@@ -368,9 +366,7 @@ define i32 @smax_known_nonzero_2(i32 %x, i32 %y) {
368366
; CHECK-NEXT: cmpl $55, %edi
369367
; CHECK-NEXT: movl $54, %eax
370368
; CHECK-NEXT: cmovgel %edi, %eax
371-
; CHECK-NEXT: bsfl %eax, %ecx
372-
; CHECK-NEXT: movl $32, %eax
373-
; CHECK-NEXT: cmovnel %ecx, %eax
369+
; CHECK-NEXT: rep bsfl %eax, %eax
374370
; CHECK-NEXT: retq
375371
%z = call i32 @llvm.smax.i32(i32 %x, i32 54)
376372
%r = call i32 @llvm.cttz.i32(i32 %z, i1 false)

0 commit comments

Comments
 (0)