[ConstantFolding] Constant-fold llvm.sqrt(x) like other intrinsics.
authorJustin Lebar <jlebar@google.com>
Sat, 21 Jan 2017 00:59:57 +0000 (00:59 +0000)
committerJustin Lebar <jlebar@google.com>
Sat, 21 Jan 2017 00:59:57 +0000 (00:59 +0000)
commit8b18a347b6021cf5bea7b6f7c6fd0b8c42f26adb
treef0e5a2da9b6e689d803714d386a0940fcf457691
parentda57dbf8f7b0395a00e33889cba1564fa3d85d3b
[ConstantFolding] Constant-fold llvm.sqrt(x) like other intrinsics.

Summary:
Currently we return undef, but we're in the process of changing the
LangRef so that llvm.sqrt behaves like the other math intrinsics,
matching the return value of the standard libcall but not setting errno.

This change is legal even without the LangRef change because currently
calling llvm.sqrt(x) where x is negative is spec'ed to be UB.  But in
practice it's also safe because we're simply constant-folding fewer
inputs: Inputs >= -0 get constant-folded as before, but inputs < -0 now
aren't constant-folded, because ConstantFoldFP aborts if the host math
function raises an fp exception.

Reviewers: hfinkel, efriedma, sanjoy

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D28929

llvm-svn: 292692
llvm/lib/Analysis/ConstantFolding.cpp
llvm/test/Transforms/InstCombine/constant-fold-math.ll