diff --git a/docs/LangRef.html b/docs/LangRef.html
index 14c0eb520ee..a6a5fab506c 100644
--- a/docs/LangRef.html
+++ b/docs/LangRef.html
@@ -125,6 +125,7 @@
'llvm.memmove' Intrinsic
'llvm.memset' Intrinsic
'llvm.isnan' Intrinsic
+ 'llvm.isunordered' Intrinsic
Debugger intrinsics
diff --git a/include/llvm/Intrinsics.h b/include/llvm/Intrinsics.h
index 8cca2cd3266..85e7802c77c 100644
--- a/include/llvm/Intrinsics.h
+++ b/include/llvm/Intrinsics.h
@@ -61,6 +61,7 @@ namespace Intrinsic {
// libm related functions.
isnan, // Return true if fp argument is a NAN.
+ isunordered, // Return true if fp arguments are unordered
// Input/Output intrinsics.
readport,
diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp
index b6ebe0991b3..a4ec31d4196 100644
--- a/lib/CodeGen/IntrinsicLowering.cpp
+++ b/lib/CodeGen/IntrinsicLowering.cpp
@@ -208,6 +208,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
Type::BoolTy, isnanFCache);
break;
}
+ case Intrinsic::isunordered: {
+ static Function *isunorderedFCache = 0;
+ ReplaceCallWith("isunordered", CI, CI->op_begin()+1, CI->op_end(),
+ Type::BoolTy, isunorderedFCache);
+ break;
+ }
}
assert(CI->use_empty() &&
diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp
index a0f86d55e54..4f6c997255d 100644
--- a/lib/VMCore/Function.cpp
+++ b/lib/VMCore/Function.cpp
@@ -224,6 +224,7 @@ unsigned Function::getIntrinsicID() const {
break;
case 'i':
if (getName() == "llvm.isnan") return Intrinsic::isnan;
+ if (getName() == "llvm.isunordered") return Intrinsic::isunordered;
break;
case 'l':
if (getName() == "llvm.longjmp") return Intrinsic::longjmp;
diff --git a/lib/VMCore/IntrinsicLowering.cpp b/lib/VMCore/IntrinsicLowering.cpp
index b6ebe0991b3..a4ec31d4196 100644
--- a/lib/VMCore/IntrinsicLowering.cpp
+++ b/lib/VMCore/IntrinsicLowering.cpp
@@ -208,6 +208,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
Type::BoolTy, isnanFCache);
break;
}
+ case Intrinsic::isunordered: {
+ static Function *isunorderedFCache = 0;
+ ReplaceCallWith("isunordered", CI, CI->op_begin()+1, CI->op_end(),
+ Type::BoolTy, isunorderedFCache);
+ break;
+ }
}
assert(CI->use_empty() &&
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 244d3464903..d221de9e65a 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -688,7 +688,7 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
break;
}
- case Intrinsic::isnan:
+ case Intrinsic::isnan:
Assert1(FT->getNumParams() == 1 && FT->getParamType(0)->isFloatingPoint(),
"Illegal prototype for llvm.isnan", IF);
Assert1(FT->getReturnType() == Type::BoolTy,
@@ -696,6 +696,16 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
NumArgs = 1;
break;
+ case Intrinsic::isunordered:
+ Assert1(FT->getNumParams() == 2 &&
+ FT->getParamType(0)->isFloatingPoint() &&
+ FT->getParamType(1)->isFloatingPoint(),
+ "Illegal prototype for llvm.isunordered", IF);
+ Assert1(FT->getReturnType() == Type::BoolTy,
+ "Illegal prototype for llvm.isunordered", IF);
+ NumArgs = 2;
+ break;
+
case Intrinsic::setjmp: NumArgs = 1; break;
case Intrinsic::longjmp: NumArgs = 2; break;
case Intrinsic::sigsetjmp: NumArgs = 2; break;
diff --git a/test/Feature/intrinsics.ll b/test/Feature/intrinsics.ll
index 53a78b5417c..51f738c9efd 100644
--- a/test/Feature/intrinsics.ll
+++ b/test/Feature/intrinsics.ll
@@ -2,6 +2,9 @@
declare bool %llvm.isnan(float)
declare bool %llvm.isnan(double)
+declare bool %llvm.isunordered(float, float)
+declare bool %llvm.isunordered(double, double)
+
implementation
; Test llvm intrinsics
@@ -9,5 +12,7 @@ implementation
void %libm() {
call bool %llvm.isnan(float 0.0)
call bool %llvm.isnan(double 10.0)
+ call bool %llvm.isunordered(float 0.0, float 1.0)
+ call bool %llvm.isunordered(double 0.0, double 1.0)
ret void
}