14
14
#include " llvm/CodeGen/GlobalISel/GISelValueTracking.h"
15
15
#include " llvm/ADT/APFloat.h"
16
16
#include " llvm/ADT/FloatingPointMode.h"
17
- #include " llvm/CodeGen/GlobalISel/MachineFloatingPointPredicateUtils.h"
18
17
#include " llvm/ADT/ScopeExit.h"
19
18
#include " llvm/ADT/StringExtras.h"
20
19
#include " llvm/Analysis/ValueTracking.h"
21
20
#include " llvm/Analysis/VectorUtils.h"
22
21
#include " llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
23
22
#include " llvm/CodeGen/GlobalISel/MIPatternMatch.h"
23
+ #include " llvm/CodeGen/GlobalISel/MachineFloatingPointPredicateUtils.h"
24
24
#include " llvm/CodeGen/GlobalISel/Utils.h"
25
25
#include " llvm/CodeGen/LowLevelTypeUtils.h"
26
26
#include " llvm/CodeGen/MachineFrameInfo.h"
@@ -957,7 +957,9 @@ void GISelValueTracking::computeKnownFPClass(Register R,
957
957
case TargetOpcode::G_FMINNUM_IEEE:
958
958
case TargetOpcode::G_FMAXIMUM:
959
959
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: {
961
963
Register LHS = MI.getOperand (1 ).getReg ();
962
964
Register RHS = MI.getOperand (2 ).getReg ();
963
965
KnownFPClass KnownLHS, KnownRHS;
@@ -972,10 +974,14 @@ void GISelValueTracking::computeKnownFPClass(Register R,
972
974
973
975
// If either operand is not NaN, the result is not NaN.
974
976
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))
976
980
Known.knownNot (fcNan);
977
981
978
- if (Opcode == TargetOpcode::G_FMAXNUM) {
982
+ if (Opcode == TargetOpcode::G_FMAXNUM ||
983
+ Opcode == TargetOpcode::G_FMAXIMUMNUM ||
984
+ Opcode == TargetOpcode::G_FMAXNUM_IEEE) {
979
985
// If at least one operand is known to be positive, the result must be
980
986
// positive.
981
987
if ((KnownLHS.cannotBeOrderedLessThanZero () &&
@@ -989,24 +995,24 @@ void GISelValueTracking::computeKnownFPClass(Register R,
989
995
if (KnownLHS.cannotBeOrderedLessThanZero () ||
990
996
KnownRHS.cannotBeOrderedLessThanZero ())
991
997
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) {
993
1001
// If at least one operand is known to be negative, the result must be
994
1002
// negative.
995
1003
if ((KnownLHS.cannotBeOrderedGreaterThanZero () &&
996
1004
KnownLHS.isKnownNeverNaN ()) ||
997
1005
(KnownRHS.cannotBeOrderedGreaterThanZero () &&
998
1006
KnownRHS.isKnownNeverNaN ()))
999
1007
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) {
1005
1009
// If at least one operand is known to be negative, the result must be
1006
1010
// negative.
1007
1011
if (KnownLHS.cannotBeOrderedGreaterThanZero () ||
1008
1012
KnownRHS.cannotBeOrderedGreaterThanZero ())
1009
1013
Known.knownNot (KnownFPClass::OrderedGreaterThanZeroMask);
1014
+ } else {
1015
+ llvm_unreachable (" unhandled intrinsic" );
1010
1016
}
1011
1017
1012
1018
// Fixup zero handling if denormals could be returned as a zero.
@@ -1032,16 +1038,25 @@ void GISelValueTracking::computeKnownFPClass(Register R,
1032
1038
Known.signBitMustBeZero ();
1033
1039
} else if ((Opcode == TargetOpcode::G_FMAXIMUM ||
1034
1040
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
1035
1046
((KnownLHS.isKnownNeverNegZero () ||
1036
1047
KnownRHS.isKnownNeverPosZero ()) &&
1037
1048
(KnownLHS.isKnownNeverPosZero () ||
1038
1049
KnownRHS.isKnownNeverNegZero ()))) {
1039
1050
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) &&
1041
1054
(KnownLHS.SignBit == false || KnownRHS.SignBit == false ))
1042
1055
Known.signBitMustBeZero ();
1043
1056
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) &&
1045
1060
(KnownLHS.SignBit == true || KnownRHS.SignBit == true ))
1046
1061
Known.signBitMustBeOne ();
1047
1062
}
0 commit comments