Index: llvm/trunk/lib/Analysis/ConstantFolding.cpp =================================================================== --- llvm/trunk/lib/Analysis/ConstantFolding.cpp +++ llvm/trunk/lib/Analysis/ConstantFolding.cpp @@ -1630,6 +1630,8 @@ return ConstantFoldFP(sin, V, Ty); case Intrinsic::cos: return ConstantFoldFP(cos, V, Ty); + case Intrinsic::sqrt: + return ConstantFoldFP(sqrt, V, Ty); } if (!TLI) @@ -1683,19 +1685,6 @@ else if ((Name == "log10" && V > 0 && TLI->has(LibFunc::log10)) || (Name == "log10f" && V > 0 && TLI->has(LibFunc::log10f))) return ConstantFoldFP(log10, V, Ty); - else if (IntrinsicID == Intrinsic::sqrt && - (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy())) { - if (V >= -0.0) - return ConstantFoldFP(sqrt, V, Ty); - else { - // Unlike the sqrt definitions in C/C++, POSIX, and IEEE-754 - which - // all guarantee or favor returning NaN - the square root of a - // negative number is not defined for the LLVM sqrt intrinsic. - // This is because the intrinsic should only be emitted in place of - // libm's sqrt function when using "no-nans-fp-math". - return UndefValue::get(Ty); - } - } break; case 'r': if ((Name == "round" && TLI->has(LibFunc::round)) || Index: llvm/trunk/test/Transforms/InstCombine/constant-fold-math.ll =================================================================== --- llvm/trunk/test/Transforms/InstCombine/constant-fold-math.ll +++ llvm/trunk/test/Transforms/InstCombine/constant-fold-math.ll @@ -45,9 +45,10 @@ ret double %x } -; The sqrt intrinsic is undefined for negative inputs besides -0.0. +; Currently we don't constant-fold intrinsics whose corresponding libcalls +; raise an fp exception. ; CHECK-LABEL: @bad_sqrt -; CHECK-NEXT: ret double undef +; CHECK-NEXT: call double @llvm.sqrt.f64(double -2 define double @bad_sqrt() { %x = call double @llvm.sqrt.f64(double -2.000000e+00) ret double %x