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