diff options
author | Meador Inge <meadori@codesourcery.com> | 2012-10-31 14:58:26 +0000 |
---|---|---|
committer | Meador Inge <meadori@codesourcery.com> | 2012-10-31 14:58:26 +0000 |
commit | 05a625a0edadcc25dab33c7476ed9a95b1c033e5 (patch) | |
tree | ea8434493f0185f16b9959f36cfa853ef22de35e /llvm/lib/Transforms/Utils | |
parent | a47ba2958f9c99757e09a981c51b5d20562f20bf (diff) | |
download | bcm5719-llvm-05a625a0edadcc25dab33c7476ed9a95b1c033e5.tar.gz bcm5719-llvm-05a625a0edadcc25dab33c7476ed9a95b1c033e5.zip |
instcombine: Migrate strto* optimizations
This patch migrates the strto* optimizations from the simplify-libcalls
pass into the instcombine library call simplifier.
llvm-svn: 167119
Diffstat (limited to 'llvm/lib/Transforms/Utils')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 1aac8c5745d..04e36c4b411 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -752,6 +752,26 @@ struct StrPBrkOpt : public LibCallOptimization { } }; +struct StrToOpt : public LibCallOptimization { + virtual Value *callOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { + FunctionType *FT = Callee->getFunctionType(); + if ((FT->getNumParams() != 2 && FT->getNumParams() != 3) || + !FT->getParamType(0)->isPointerTy() || + !FT->getParamType(1)->isPointerTy()) + return 0; + + Value *EndPtr = CI->getArgOperand(1); + if (isa<ConstantPointerNull>(EndPtr)) { + // With a null EndPtr, this function won't capture the main argument. + // It would be readonly too, except that it still may write to errno. + CI->addAttribute(1, Attributes::get(Callee->getContext(), + Attributes::NoCapture)); + } + + return 0; + } +}; + } // End anonymous namespace. namespace llvm { @@ -781,6 +801,7 @@ class LibCallSimplifierImpl { StrNCpyOpt StrNCpy; StrLenOpt StrLen; StrPBrkOpt StrPBrk; + StrToOpt StrTo; void initOptimizations(); public: @@ -814,6 +835,13 @@ void LibCallSimplifierImpl::initOptimizations() { Optimizations["strncpy"] = &StrNCpy; Optimizations["strlen"] = &StrLen; Optimizations["strpbrk"] = &StrPBrk; + Optimizations["strtol"] = &StrTo; + Optimizations["strtod"] = &StrTo; + Optimizations["strtof"] = &StrTo; + Optimizations["strtoul"] = &StrTo; + Optimizations["strtoll"] = &StrTo; + Optimizations["strtold"] = &StrTo; + Optimizations["strtoull"] = &StrTo; } Value *LibCallSimplifierImpl::optimizeCall(CallInst *CI) { |