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