diff options
Diffstat (limited to 'lib/Transforms/Scalar/MemCpyOptimizer.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/MemCpyOptimizer.cpp | 19 | 
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp index bde0e5316c3a3..a3035cbfb0ee9 100644 --- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -28,6 +28,7 @@  #include "llvm/Support/IRBuilder.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetLibraryInfo.h"  #include <list>  using namespace llvm; @@ -299,12 +300,15 @@ void MemsetRanges::addRange(int64_t Start, int64_t Size, Value *Ptr,  namespace {    class MemCpyOpt : public FunctionPass {      MemoryDependenceAnalysis *MD; +    TargetLibraryInfo *TLI;      const TargetData *TD;    public:      static char ID; // Pass identification, replacement for typeid      MemCpyOpt() : FunctionPass(ID) {        initializeMemCpyOptPass(*PassRegistry::getPassRegistry());        MD = 0; +      TLI = 0; +      TD = 0;      }      bool runOnFunction(Function &F); @@ -316,6 +320,7 @@ namespace {        AU.addRequired<DominatorTree>();        AU.addRequired<MemoryDependenceAnalysis>();        AU.addRequired<AliasAnalysis>(); +      AU.addRequired<TargetLibraryInfo>();        AU.addPreserved<AliasAnalysis>();        AU.addPreserved<MemoryDependenceAnalysis>();      } @@ -346,6 +351,7 @@ INITIALIZE_PASS_BEGIN(MemCpyOpt, "memcpyopt", "MemCpy Optimization",                        false, false)  INITIALIZE_PASS_DEPENDENCY(DominatorTree)  INITIALIZE_PASS_DEPENDENCY(MemoryDependenceAnalysis) +INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)  INITIALIZE_AG_DEPENDENCY(AliasAnalysis)  INITIALIZE_PASS_END(MemCpyOpt, "memcpyopt", "MemCpy Optimization",                      false, false) @@ -688,7 +694,7 @@ bool MemCpyOpt::processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep,    if (M->getSource() == MDep->getSource())      return false; -  // Second, the length of the memcpy's must be the same, or the preceeding one +  // Second, the length of the memcpy's must be the same, or the preceding one    // must be larger than the following one.    ConstantInt *MDepLen = dyn_cast<ConstantInt>(MDep->getLength());    ConstantInt *MLen = dyn_cast<ConstantInt>(M->getLength()); @@ -804,6 +810,9 @@ bool MemCpyOpt::processMemCpy(MemCpyInst *M) {  bool MemCpyOpt::processMemMove(MemMoveInst *M) {    AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); +  if (!TLI->has(LibFunc::memmove)) +    return false; +      // See if the pointers alias.    if (!AA.isNoAlias(AA.getLocationForDest(M), AA.getLocationForSource(M)))      return false; @@ -935,6 +944,14 @@ bool MemCpyOpt::runOnFunction(Function &F) {    bool MadeChange = false;    MD = &getAnalysis<MemoryDependenceAnalysis>();    TD = getAnalysisIfAvailable<TargetData>(); +  TLI = &getAnalysis<TargetLibraryInfo>(); +   +  // If we don't have at least memset and memcpy, there is little point of doing +  // anything here.  These are required by a freestanding implementation, so if +  // even they are disabled, there is no point in trying hard. +  if (!TLI->has(LibFunc::memset) || !TLI->has(LibFunc::memcpy)) +    return false; +      while (1) {      if (!iterateOnFunction(F))        break;  | 
