diff options
author | Anders Carlsson <andersca@mac.com> | 2010-11-30 06:19:18 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-11-30 06:19:18 +0000 |
commit | 303023d9ffba419ffdd68862ea790e00c4f30cbf (patch) | |
tree | 96df7e5dfe97e9404b0fd13be884aa6bd15ca614 /lib/Transforms/Scalar/SimplifyLibCalls.cpp | |
parent | 1d0629558320666685694a4ea80b0b242242efb6 (diff) | |
download | llvm-303023d9ffba419ffdd68862ea790e00c4f30cbf.tar.gz llvm-303023d9ffba419ffdd68862ea790e00c4f30cbf.tar.bz2 llvm-303023d9ffba419ffdd68862ea790e00c4f30cbf.tar.xz |
Add a puts optimization that converts puts() to putchar('\n').
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120398 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/SimplifyLibCalls.cpp')
-rw-r--r-- | lib/Transforms/Scalar/SimplifyLibCalls.cpp | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index 5b22b23b6b..43c6f6dda2 100644 --- a/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -1345,6 +1345,34 @@ struct FPrintFOpt : public LibCallOptimization { } }; +//===---------------------------------------===// +// 'puts' Optimizations + +struct PutsOpt : public LibCallOptimization { + virtual Value *CallOptimizer(Function *Callee, CallInst *CI, IRBuilder<> &B) { + // Require one fixed pointer argument and an integer/void result. + const FunctionType *FT = Callee->getFunctionType(); + if (FT->getNumParams() < 1 || !FT->getParamType(0)->isPointerTy() || + !(FT->getReturnType()->isIntegerTy() || + FT->getReturnType()->isVoidTy())) + return 0; + + // Check for a constant string. + std::string Str; + if (!GetConstantStringInfo(CI->getArgOperand(0), Str)) + return 0; + + if (Str.empty()) { + // puts("") -> putchar('\n') + Value *Res = EmitPutChar(B.getInt32('\n'), B, TD); + if (CI->use_empty()) return CI; + return B.CreateIntCast(Res, CI->getType(), true); + } + + return 0; + } +}; + } // end anonymous namespace. //===----------------------------------------------------------------------===// @@ -1370,6 +1398,7 @@ namespace { // Formatting and IO Optimizations SPrintFOpt SPrintF; PrintFOpt PrintF; FWriteOpt FWrite; FPutsOpt FPuts; FPrintFOpt FPrintF; + PutsOpt Puts; bool Modified; // This is only used by doInitialization. public: @@ -1484,6 +1513,7 @@ void SimplifyLibCalls::InitOptimizations() { Optimizations["fwrite"] = &FWrite; Optimizations["fputs"] = &FPuts; Optimizations["fprintf"] = &FPrintF; + Optimizations["puts"] = &Puts; } @@ -2298,9 +2328,6 @@ bool SimplifyLibCalls::doInitialization(Module &M) { // * pow(sqrt(x),y) -> pow(x,y*0.5) // * pow(pow(x,y),z)-> pow(x,y*z) // -// puts: -// * puts("") -> putchar('\n') -// // round, roundf, roundl: // * round(cnst) -> cnst' // |