Skip to content

Commit 609a833

Browse files
authored
ValueTracking: Handle minimumnum and maximumnum in computeKnownFPClass (llvm#138737)
For now use the same treatment as minnum/maxnum, but these should diverge. alive2 seems happy with this, except for some preexisting bugs with weird denormal modes.
1 parent 03f3f15 commit 609a833

File tree

3 files changed

+175
-109
lines changed

3 files changed

+175
-109
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5357,7 +5357,9 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
53575357
case Intrinsic::maxnum:
53585358
case Intrinsic::minnum:
53595359
case Intrinsic::minimum:
5360-
case Intrinsic::maximum: {
5360+
case Intrinsic::maximum:
5361+
case Intrinsic::minimumnum:
5362+
case Intrinsic::maximumnum: {
53615363
KnownFPClass KnownLHS, KnownRHS;
53625364
computeKnownFPClass(II->getArgOperand(0), DemandedElts, InterestedClasses,
53635365
KnownLHS, Depth + 1, Q);
@@ -5368,10 +5370,12 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
53685370
Known = KnownLHS | KnownRHS;
53695371

53705372
// If either operand is not NaN, the result is not NaN.
5371-
if (NeverNaN && (IID == Intrinsic::minnum || IID == Intrinsic::maxnum))
5373+
if (NeverNaN &&
5374+
(IID == Intrinsic::minnum || IID == Intrinsic::maxnum ||
5375+
IID == Intrinsic::minimumnum || IID == Intrinsic::maximumnum))
53725376
Known.knownNot(fcNan);
53735377

5374-
if (IID == Intrinsic::maxnum) {
5378+
if (IID == Intrinsic::maxnum || IID == Intrinsic::maximumnum) {
53755379
// If at least one operand is known to be positive, the result must be
53765380
// positive.
53775381
if ((KnownLHS.cannotBeOrderedLessThanZero() &&
@@ -5385,21 +5389,22 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
53855389
if (KnownLHS.cannotBeOrderedLessThanZero() ||
53865390
KnownRHS.cannotBeOrderedLessThanZero())
53875391
Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
5388-
} else if (IID == Intrinsic::minnum) {
5392+
} else if (IID == Intrinsic::minnum || IID == Intrinsic::minimumnum) {
53895393
// If at least one operand is known to be negative, the result must be
53905394
// negative.
53915395
if ((KnownLHS.cannotBeOrderedGreaterThanZero() &&
53925396
KnownLHS.isKnownNeverNaN()) ||
53935397
(KnownRHS.cannotBeOrderedGreaterThanZero() &&
53945398
KnownRHS.isKnownNeverNaN()))
53955399
Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
5396-
} else {
5400+
} else if (IID == Intrinsic::minimum) {
53975401
// If at least one operand is known to be negative, the result must be
53985402
// negative.
53995403
if (KnownLHS.cannotBeOrderedGreaterThanZero() ||
54005404
KnownRHS.cannotBeOrderedGreaterThanZero())
54015405
Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
5402-
}
5406+
} else
5407+
llvm_unreachable("unhandled intrinsic");
54035408

54045409
// Fixup zero handling if denormals could be returned as a zero.
54055410
//
@@ -5427,15 +5432,20 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
54275432
Known.signBitMustBeOne();
54285433
else
54295434
Known.signBitMustBeZero();
5430-
} else if ((IID == Intrinsic::maximum || IID == Intrinsic::minimum) ||
5435+
} else if ((IID == Intrinsic::maximum || IID == Intrinsic::minimum ||
5436+
IID == Intrinsic::maximumnum ||
5437+
IID == Intrinsic::minimumnum) ||
5438+
// FIXME: Should be using logical zero versions
54315439
((KnownLHS.isKnownNeverNegZero() ||
54325440
KnownRHS.isKnownNeverPosZero()) &&
54335441
(KnownLHS.isKnownNeverPosZero() ||
54345442
KnownRHS.isKnownNeverNegZero()))) {
5435-
if ((IID == Intrinsic::maximum || IID == Intrinsic::maxnum) &&
5443+
if ((IID == Intrinsic::maximum || IID == Intrinsic::maximumnum ||
5444+
IID == Intrinsic::maxnum) &&
54365445
(KnownLHS.SignBit == false || KnownRHS.SignBit == false))
54375446
Known.signBitMustBeZero();
5438-
else if ((IID == Intrinsic::minimum || IID == Intrinsic::minnum) &&
5447+
else if ((IID == Intrinsic::minimum || IID == Intrinsic::minimumnum ||
5448+
IID == Intrinsic::minnum) &&
54395449
(KnownLHS.SignBit == true || KnownRHS.SignBit == true))
54405450
Known.signBitMustBeOne();
54415451
}

0 commit comments

Comments
 (0)