1 //===---- MemCpyOptimizer.h - memcpy optimization ---------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This pass performs various transformations related to eliminating memcpy 11 // calls, or transforming sets of stores into memset's. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H 16 #define LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H 17 18 #include "llvm/Analysis/AliasAnalysis.h" 19 #include "llvm/Analysis/AssumptionCache.h" 20 #include "llvm/Analysis/MemoryDependenceAnalysis.h" 21 #include "llvm/Analysis/TargetLibraryInfo.h" 22 #include "llvm/IR/BasicBlock.h" 23 #include "llvm/IR/Dominators.h" 24 #include "llvm/IR/Function.h" 25 #include "llvm/IR/Instructions.h" 26 #include "llvm/IR/IntrinsicInst.h" 27 #include "llvm/IR/PassManager.h" 28 #include <cstdint> 29 #include <functional> 30 31 namespace llvm { 32 33 class MemCpyOptPass : public PassInfoMixin<MemCpyOptPass> { 34 MemoryDependenceResults *MD = nullptr; 35 TargetLibraryInfo *TLI = nullptr; 36 std::function<AliasAnalysis &()> LookupAliasAnalysis; 37 std::function<AssumptionCache &()> LookupAssumptionCache; 38 std::function<DominatorTree &()> LookupDomTree; 39 40 public: 41 MemCpyOptPass() = default; 42 43 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 44 // Glue for the old PM. 45 bool runImpl(Function &F, MemoryDependenceResults *MD_, 46 TargetLibraryInfo *TLI_, 47 std::function<AliasAnalysis &()> LookupAliasAnalysis_, 48 std::function<AssumptionCache &()> LookupAssumptionCache_, 49 std::function<DominatorTree &()> LookupDomTree_); 50 51 private: 52 // Helper functions 53 bool processStore(StoreInst *SI, BasicBlock::iterator &BBI); 54 bool processMemSet(MemSetInst *SI, BasicBlock::iterator &BBI); 55 bool processMemCpy(MemCpyInst *M); 56 bool processMemMove(MemMoveInst *M); 57 bool performCallSlotOptzn(Instruction *cpy, Value *cpyDst, Value *cpySrc, 58 uint64_t cpyLen, unsigned cpyAlign, CallInst *C); 59 bool processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep); 60 bool processMemSetMemCpyDependence(MemCpyInst *M, MemSetInst *MDep); 61 bool performMemCpyToMemSetOptzn(MemCpyInst *M, MemSetInst *MDep); 62 bool processByValArgument(CallSite CS, unsigned ArgNo); 63 Instruction *tryMergingIntoMemset(Instruction *I, Value *StartPtr, 64 Value *ByteVal); 65 66 bool iterateOnFunction(Function &F); 67 }; 68 69 } // end namespace llvm 70 71 #endif // LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H 72