diff options
author | Chad Rosier <mcrosier@apple.com> | 2011-11-29 23:57:10 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2011-11-29 23:57:10 +0000 |
commit | 3d925d24e8c54cde05228258c25cc21687cad922 (patch) | |
tree | a6e70c41ffa5b720f5933c591f9a9ff6d9d47a43 | |
parent | 6029b6ddafad45791c9e9d8e8ddd96978294beef (diff) | |
download | external_llvm-3d925d24e8c54cde05228258c25cc21687cad922.zip external_llvm-3d925d24e8c54cde05228258c25cc21687cad922.tar.gz external_llvm-3d925d24e8c54cde05228258c25cc21687cad922.tar.bz2 |
Add support for sqrt, sqrtl, and sqrtf in TargetLibraryInfo. Disable
(fptrunc (sqrt (fpext x))) -> (sqrtf x) transformation if -fno-builtin is
specified.
rdar://10466410
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145460 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Target/TargetLibraryInfo.h | 9 | ||||
-rw-r--r-- | lib/Target/TargetLibraryInfo.cpp | 3 | ||||
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineCasts.cpp | 7 | ||||
-rw-r--r-- | lib/Transforms/InstCombine/InstructionCombining.cpp | 2 | ||||
-rw-r--r-- | test/Transforms/InstCombine/fold-sqrt-sqrtf.ll | 17 |
5 files changed, 35 insertions, 3 deletions
diff --git a/include/llvm/Target/TargetLibraryInfo.h b/include/llvm/Target/TargetLibraryInfo.h index 7770a11..c4c2627 100644 --- a/include/llvm/Target/TargetLibraryInfo.h +++ b/include/llvm/Target/TargetLibraryInfo.h @@ -35,6 +35,15 @@ namespace llvm { /// int siprintf(char *str, const char *format, ...); siprintf, + + /// double sqrt(double x); + sqrt, + + /// long double sqrtl(long double x); + sqrtl, + + /// float sqrtf(float x); + sqrtf, /// int fiprintf(FILE *stream, const char *format, ...); fiprintf, diff --git a/lib/Target/TargetLibraryInfo.cpp b/lib/Target/TargetLibraryInfo.cpp index aa2e014..d6dbde5 100644 --- a/lib/Target/TargetLibraryInfo.cpp +++ b/lib/Target/TargetLibraryInfo.cpp @@ -28,6 +28,9 @@ const char* TargetLibraryInfo::StandardNames[LibFunc::NumLibFuncs] = "memset_pattern16", "iprintf", "siprintf", + "sqrt", + "sqrtl", + "sqrtf", "fiprintf", "fwrite", "fputs" diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp index f10e48a..63065e3 100644 --- a/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -14,6 +14,7 @@ #include "InstCombine.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetLibraryInfo.h" #include "llvm/Support/PatternMatch.h" using namespace llvm; using namespace PatternMatch; @@ -1213,10 +1214,10 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) { } // Fold (fptrunc (sqrt (fpext x))) -> (sqrtf x) - // NOTE: This should be disabled by -fno-builtin-sqrt if we ever support it. + const TargetLibraryInfo &TLI = getAnalysis<TargetLibraryInfo>(); CallInst *Call = dyn_cast<CallInst>(CI.getOperand(0)); - if (Call && Call->getCalledFunction() && - Call->getCalledFunction()->getName() == "sqrt" && + if (Call && Call->getCalledFunction() && TLI.has(LibFunc::sqrtf) && + Call->getCalledFunction()->getName() == TLI.getName(LibFunc::sqrt) && Call->getNumArgOperands() == 1 && Call->hasOneUse()) { CastInst *Arg = dyn_cast<CastInst>(Call->getArgOperand(0)); diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp index a7a6311..60c7fef 100644 --- a/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -41,6 +41,7 @@ #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/MemoryBuiltins.h" #include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetLibraryInfo.h" #include "llvm/Transforms/Utils/Local.h" #include "llvm/Support/CFG.h" #include "llvm/Support/Debug.h" @@ -79,6 +80,7 @@ INITIALIZE_PASS(InstCombiner, "instcombine", void InstCombiner::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); + AU.addRequired<TargetLibraryInfo>(); } diff --git a/test/Transforms/InstCombine/fold-sqrt-sqrtf.ll b/test/Transforms/InstCombine/fold-sqrt-sqrtf.ll new file mode 100644 index 0000000..bd92b4a --- /dev/null +++ b/test/Transforms/InstCombine/fold-sqrt-sqrtf.ll @@ -0,0 +1,17 @@ +; RUN: opt -instcombine -S -disable-simplify-libcalls < %s | FileCheck %s +; rdar://10466410 + +; Instcombine tries to fold (fptrunc (sqrt (fpext x))) -> (sqrtf x), but this +; shouldn't fold when sqrtf isn't available. +define float @foo(float %f) uwtable ssp { +entry: +; CHECK: %conv = fpext float %f to double +; CHECK: %call = tail call double @sqrt(double %conv) +; CHECK: %conv1 = fptrunc double %call to float + %conv = fpext float %f to double + %call = tail call double @sqrt(double %conv) + %conv1 = fptrunc double %call to float + ret float %conv1 +} + +declare double @sqrt(double) |