[PATCH] D28929: [ConstantFolding] Constant-fold llvm.sqrt(x) like other intrinsics.
Justin Lebar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 20 17:11:14 PST 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL292692: [ConstantFolding] Constant-fold llvm.sqrt(x) like other intrinsics. (authored by jlebar).
Changed prior to commit:
https://reviews.llvm.org/D28929?vs=85078&id=85219#toc
Repository:
rL LLVM
https://reviews.llvm.org/D28929
Files:
llvm/trunk/lib/Analysis/ConstantFolding.cpp
llvm/trunk/test/Transforms/InstCombine/constant-fold-math.ll
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
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)) ||
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D28929.85219.patch
Type: text/x-patch
Size: 2143 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170121/a852065a/attachment.bin>
More information about the llvm-commits
mailing list