summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/InstructionSimplify.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/InstructionSimplify.cpp')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 13805437b54..9d317b46b9e 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4812,7 +4812,7 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1,
}
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 @@ static Value *simplifyBinaryIntrinsic(Function *F, Value *Op0, Value *Op1,
(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;
}
OpenPOWER on IntegriCloud