Skip to content

Commit 0a5ced6

Browse files
committed
handle G_FMINIMUMNUM and G_FMAXIMUMNUM
1 parent 3b3e412 commit 0a5ced6

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,9 @@ void GISelValueTracking::computeKnownFPClass(Register R,
957957
case TargetOpcode::G_FMINNUM_IEEE:
958958
case TargetOpcode::G_FMAXIMUM:
959959
case TargetOpcode::G_FMINIMUM:
960-
case TargetOpcode::G_FMAXNUM_IEEE: {
960+
case TargetOpcode::G_FMAXNUM_IEEE:
961+
case TargetOpcode::G_FMAXIMUMNUM:
962+
case TargetOpcode::G_FMINIMUMNUM: {
961963
Register LHS = MI.getOperand(1).getReg();
962964
Register RHS = MI.getOperand(2).getReg();
963965
KnownFPClass KnownLHS, KnownRHS;
@@ -972,10 +974,14 @@ void GISelValueTracking::computeKnownFPClass(Register R,
972974

973975
// If either operand is not NaN, the result is not NaN.
974976
if (NeverNaN && (Opcode == TargetOpcode::G_FMINNUM ||
975-
Opcode == TargetOpcode::G_FMAXNUM))
977+
Opcode == TargetOpcode::G_FMAXNUM ||
978+
Opcode == TargetOpcode::G_FMINIMUMNUM ||
979+
Opcode == TargetOpcode::G_FMAXIMUMNUM))
976980
Known.knownNot(fcNan);
977981

978-
if (Opcode == TargetOpcode::G_FMAXNUM) {
982+
if (Opcode == TargetOpcode::G_FMAXNUM ||
983+
Opcode == TargetOpcode::G_FMAXIMUMNUM ||
984+
Opcode == TargetOpcode::G_FMAXNUM_IEEE) {
979985
// If at least one operand is known to be positive, the result must be
980986
// positive.
981987
if ((KnownLHS.cannotBeOrderedLessThanZero() &&
@@ -989,24 +995,24 @@ void GISelValueTracking::computeKnownFPClass(Register R,
989995
if (KnownLHS.cannotBeOrderedLessThanZero() ||
990996
KnownRHS.cannotBeOrderedLessThanZero())
991997
Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
992-
} else if (Opcode == TargetOpcode::G_FMINNUM) {
998+
} else if (Opcode == TargetOpcode::G_FMINNUM ||
999+
Opcode == TargetOpcode::G_FMINIMUMNUM ||
1000+
Opcode == TargetOpcode::G_FMINNUM_IEEE) {
9931001
// If at least one operand is known to be negative, the result must be
9941002
// negative.
9951003
if ((KnownLHS.cannotBeOrderedGreaterThanZero() &&
9961004
KnownLHS.isKnownNeverNaN()) ||
9971005
(KnownRHS.cannotBeOrderedGreaterThanZero() &&
9981006
KnownRHS.isKnownNeverNaN()))
9991007
Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
1000-
} else if (Opcode == TargetOpcode::G_FMINNUM_IEEE) {
1001-
// TODO:
1002-
} else if (Opcode == TargetOpcode::G_FMAXNUM_IEEE) {
1003-
// TODO:
1004-
} else {
1008+
} else if (Opcode == TargetOpcode::G_FMINIMUM) {
10051009
// If at least one operand is known to be negative, the result must be
10061010
// negative.
10071011
if (KnownLHS.cannotBeOrderedGreaterThanZero() ||
10081012
KnownRHS.cannotBeOrderedGreaterThanZero())
10091013
Known.knownNot(KnownFPClass::OrderedGreaterThanZeroMask);
1014+
} else {
1015+
llvm_unreachable("unhandled intrinsic");
10101016
}
10111017

10121018
// Fixup zero handling if denormals could be returned as a zero.
@@ -1032,16 +1038,25 @@ void GISelValueTracking::computeKnownFPClass(Register R,
10321038
Known.signBitMustBeZero();
10331039
} else if ((Opcode == TargetOpcode::G_FMAXIMUM ||
10341040
Opcode == TargetOpcode::G_FMINIMUM) ||
1041+
Opcode == TargetOpcode::G_FMAXIMUMNUM ||
1042+
Opcode == TargetOpcode::G_FMINIMUMNUM ||
1043+
Opcode == TargetOpcode::G_FMAXNUM_IEEE ||
1044+
Opcode == TargetOpcode::G_FMINNUM_IEEE ||
1045+
// FIXME: Should be using logical zero versions
10351046
((KnownLHS.isKnownNeverNegZero() ||
10361047
KnownRHS.isKnownNeverPosZero()) &&
10371048
(KnownLHS.isKnownNeverPosZero() ||
10381049
KnownRHS.isKnownNeverNegZero()))) {
10391050
if ((Opcode == TargetOpcode::G_FMAXIMUM ||
1040-
Opcode == TargetOpcode::G_FMAXNUM) &&
1051+
Opcode == TargetOpcode::G_FMAXNUM ||
1052+
Opcode == TargetOpcode::G_FMAXIMUMNUM ||
1053+
Opcode == TargetOpcode::G_FMAXNUM_IEEE) &&
10411054
(KnownLHS.SignBit == false || KnownRHS.SignBit == false))
10421055
Known.signBitMustBeZero();
10431056
else if ((Opcode == TargetOpcode::G_FMINIMUM ||
1044-
Opcode == TargetOpcode::G_FMINNUM) &&
1057+
Opcode == TargetOpcode::G_FMINNUM ||
1058+
Opcode == TargetOpcode::G_FMINIMUMNUM ||
1059+
Opcode == TargetOpcode::G_FMINNUM_IEEE) &&
10451060
(KnownLHS.SignBit == true || KnownRHS.SignBit == true))
10461061
Known.signBitMustBeOne();
10471062
}

0 commit comments

Comments
 (0)