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/ADT/STLExtras.h" 19#include "llvm/Analysis/AliasAnalysis.h" 20#include "llvm/Analysis/AssumptionCache.h" 21#include "llvm/Analysis/GlobalsModRef.h" 22#include "llvm/Analysis/MemoryDependenceAnalysis.h" 23#include "llvm/Analysis/TargetLibraryInfo.h" 24#include "llvm/IR/Dominators.h" 25#include "llvm/IR/Function.h" 26#include "llvm/IR/Instructions.h" 27#include "llvm/IR/IntrinsicInst.h" 28#include "llvm/IR/PassManager.h" 29 30namespace llvm { 31 32class MemCpyOptPass : public PassInfoMixin<MemCpyOptPass> { 33 MemoryDependenceResults *MD = nullptr; 34 TargetLibraryInfo *TLI = nullptr; 35 std::function<AliasAnalysis &()> LookupAliasAnalysis; 36 std::function<AssumptionCache &()> LookupAssumptionCache; 37 std::function<DominatorTree &()> LookupDomTree; 38 39public: 40 MemCpyOptPass() {} 41 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 42 // Glue for the old PM. 43 bool runImpl(Function &F, MemoryDependenceResults *MD_, 44 TargetLibraryInfo *TLI_, 45 std::function<AliasAnalysis &()> LookupAliasAnalysis_, 46 std::function<AssumptionCache &()> LookupAssumptionCache_, 47 std::function<DominatorTree &()> LookupDomTree_); 48 49private: 50 // Helper functions 51 bool processStore(StoreInst *SI, BasicBlock::iterator &BBI); 52 bool processMemSet(MemSetInst *SI, BasicBlock::iterator &BBI); 53 bool processMemCpy(MemCpyInst *M); 54 bool processMemMove(MemMoveInst *M); 55 bool performCallSlotOptzn(Instruction *cpy, Value *cpyDst, Value *cpySrc, 56 uint64_t cpyLen, unsigned cpyAlign, CallInst *C); 57 bool processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep); 58 bool processMemSetMemCpyDependence(MemCpyInst *M, MemSetInst *MDep); 59 bool performMemCpyToMemSetOptzn(MemCpyInst *M, MemSetInst *MDep); 60 bool processByValArgument(CallSite CS, unsigned ArgNo); 61 Instruction *tryMergingIntoMemset(Instruction *I, Value *StartPtr, 62 Value *ByteVal); 63 64 bool iterateOnFunction(Function &F); 65}; 66} 67 68#endif // LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H 69