diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 97e4fa565c7..c97d9fc8d39 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -21,6 +21,7 @@ #include "llvm/ADT/StringExtras.h" #include #include +#include using namespace llvm; ConstantBool *ConstantBool::True = new ConstantBool(true); @@ -442,6 +443,16 @@ bool ConstantFP::isValueValidForType(const Type *Ty, double Val) { // TODO: Figure out how to test if a double can be cast to a float! case Type::FloatTyID: + return + (std::numeric_limits::has_infinity && + std::numeric_limits::has_infinity && + Val == std::numeric_limits::infinity()) || + (std::numeric_limits::has_quiet_NaN && + std::numeric_limits::has_quiet_NaN && + Val == std::numeric_limits::quiet_NaN()) || + (Val >= -std::numeric_limits::max() && + Val <= std::numeric_limits::max()); + case Type::DoubleTyID: return true; // This is the largest type... }