diff options
author | Chris Lattner <sabre@nondot.org> | 2008-01-28 04:41:43 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-01-28 04:41:43 +0000 |
commit | d3c51ad1ab5462a45c079a93137f8300ab502ee3 (patch) | |
tree | c1b664489ca56b7fab0ed038b62f45e9f955d225 /lib | |
parent | 6ee4875361f2d01af044c55e6c0589dedfadbde9 (diff) | |
download | external_llvm-d3c51ad1ab5462a45c079a93137f8300ab502ee3.zip external_llvm-d3c51ad1ab5462a45c079a93137f8300ab502ee3.tar.gz external_llvm-d3c51ad1ab5462a45c079a93137f8300ab502ee3.tar.bz2 |
Transform calls to memcpy into llvm.memcpy calls, patch by Eli Friedman.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46433 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/IPO/SimplifyLibCalls.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/SimplifyLibCalls.cpp b/lib/Transforms/IPO/SimplifyLibCalls.cpp index 0bd3f84..1f2a1b0 100644 --- a/lib/Transforms/IPO/SimplifyLibCalls.cpp +++ b/lib/Transforms/IPO/SimplifyLibCalls.cpp @@ -919,6 +919,36 @@ struct VISIBILITY_HIDDEN memcmpOptimization : public LibCallOptimization { } } memcmpOptimizer; +/// This LibCallOptimization will simplify a call to the memcpy library +/// function. It simply converts them into calls to llvm.memcpy.*; +/// the resulting call should be optimized later. +/// @brief Simplify the memcpy library function. +struct VISIBILITY_HIDDEN MemCpyOptimization : public LibCallOptimization { +public: + MemCpyOptimization() : LibCallOptimization("memcpy", + "Number of 'memcpy' calls simplified") {} + + /// @brief Make sure that the "memcpy" function has the right prototype + virtual bool ValidateCalledFunction(const Function *F, SimplifyLibCalls &SLC){ + const FunctionType *FT = F->getFunctionType(); + const Type* voidPtr = PointerType::getUnqual(Type::Int8Ty); + return FT->getReturnType() == voidPtr && FT->getNumParams() == 3 && + FT->getParamType(0) == voidPtr && + FT->getParamType(1) == voidPtr && + FT->getParamType(2) == SLC.getIntPtrType(); + } + + /// @brief Perform the memcpy optimization + virtual bool OptimizeCall(CallInst *CI, SimplifyLibCalls &SLC) { + Value *MemcpyOps[] = { + CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), + ConstantInt::get(Type::Int32Ty, 1) // align = 1 always. + }; + new CallInst(SLC.get_memcpy(), MemcpyOps, MemcpyOps + 4, "", CI); + // memcpy always returns the destination + return ReplaceCallWith(CI, CI->getOperand(1)); + } +} MemCpyOptimizer; /// This LibCallOptimization will simplify a call to the memcpy library /// function by expanding it out to a single store of size 0, 1, 2, 4, or 8 |