return ConstantFoldFP(sin, V, Ty);
case Intrinsic::cos:
return ConstantFoldFP(cos, V, Ty);
+ case Intrinsic::sqrt:
+ return ConstantFoldFP(sqrt, V, Ty);
}
if (!TLI)
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)) ||
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