[InstSimplify] move minnum/maxnum with Inf folds from instcombine

llvm-svn: 339396
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 1380543..9d317b4 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4812,7 +4812,7 @@
     }
     break;
   case Intrinsic::maxnum:
-  case Intrinsic::minnum:
+  case Intrinsic::minnum: {
     // If the arguments are the same, this is a no-op.
     if (Op0 == Op1) return Op0;
 
@@ -4831,7 +4831,22 @@
           (M1->getOperand(0) == Op0 || M1->getOperand(1) == Op0))
         return Op1;
 
+    // minnum(X, -Inf) --> -Inf (and commuted variant)
+    // maxnum(X, +Inf) --> +Inf (and commuted variant)
+    bool UseNegInf = IID == Intrinsic::minnum;
+    const APFloat *C;
+    if ((match(Op0, m_APFloat(C)) && C->isInfinity() &&
+         C->isNegative() == UseNegInf) ||
+        (match(Op1, m_APFloat(C)) && C->isInfinity() &&
+         C->isNegative() == UseNegInf))
+      return ConstantFP::getInfinity(ReturnType, UseNegInf);
+
+    // TODO: minnum(nnan x, inf) -> x
+    // TODO: minnum(nnan ninf x, flt_max) -> x
+    // TODO: maxnum(nnan x, -inf) -> x
+    // TODO: maxnum(nnan ninf x, -flt_max) -> x
     break;
+  }
   default:
     break;
   }