106f32e7eSjoerg //===- MemCpyOptimizer.h - memcpy optimization ------------------*- C++ -*-===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg // This pass performs various transformations related to eliminating memcpy
1006f32e7eSjoerg // calls, or transforming sets of stores into memset's.
1106f32e7eSjoerg //
1206f32e7eSjoerg //===----------------------------------------------------------------------===//
1306f32e7eSjoerg 
1406f32e7eSjoerg #ifndef LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
1506f32e7eSjoerg #define LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
1606f32e7eSjoerg 
1706f32e7eSjoerg #include "llvm/IR/BasicBlock.h"
1806f32e7eSjoerg #include "llvm/IR/PassManager.h"
1906f32e7eSjoerg #include <cstdint>
2006f32e7eSjoerg #include <functional>
2106f32e7eSjoerg 
2206f32e7eSjoerg namespace llvm {
2306f32e7eSjoerg 
24*da58b97aSjoerg class AAResults;
2506f32e7eSjoerg class AssumptionCache;
26*da58b97aSjoerg class CallBase;
2706f32e7eSjoerg class CallInst;
2806f32e7eSjoerg class DominatorTree;
2906f32e7eSjoerg class Function;
3006f32e7eSjoerg class Instruction;
31*da58b97aSjoerg class LoadInst;
3206f32e7eSjoerg class MemCpyInst;
3306f32e7eSjoerg class MemMoveInst;
3406f32e7eSjoerg class MemoryDependenceResults;
35*da58b97aSjoerg class MemorySSA;
36*da58b97aSjoerg class MemorySSAUpdater;
3706f32e7eSjoerg class MemSetInst;
3806f32e7eSjoerg class StoreInst;
3906f32e7eSjoerg class TargetLibraryInfo;
4006f32e7eSjoerg class Value;
4106f32e7eSjoerg 
4206f32e7eSjoerg class MemCpyOptPass : public PassInfoMixin<MemCpyOptPass> {
4306f32e7eSjoerg   MemoryDependenceResults *MD = nullptr;
4406f32e7eSjoerg   TargetLibraryInfo *TLI = nullptr;
45*da58b97aSjoerg   AAResults *AA = nullptr;
46*da58b97aSjoerg   AssumptionCache *AC = nullptr;
47*da58b97aSjoerg   DominatorTree *DT = nullptr;
48*da58b97aSjoerg   MemorySSA *MSSA = nullptr;
49*da58b97aSjoerg   MemorySSAUpdater *MSSAU = nullptr;
5006f32e7eSjoerg 
5106f32e7eSjoerg public:
5206f32e7eSjoerg   MemCpyOptPass() = default;
5306f32e7eSjoerg 
5406f32e7eSjoerg   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
5506f32e7eSjoerg 
5606f32e7eSjoerg   // Glue for the old PM.
57*da58b97aSjoerg   bool runImpl(Function &F, MemoryDependenceResults *MD, TargetLibraryInfo *TLI,
58*da58b97aSjoerg                AAResults *AA, AssumptionCache *AC, DominatorTree *DT,
59*da58b97aSjoerg                MemorySSA *MSSA);
6006f32e7eSjoerg 
6106f32e7eSjoerg private:
6206f32e7eSjoerg   // Helper functions
6306f32e7eSjoerg   bool processStore(StoreInst *SI, BasicBlock::iterator &BBI);
6406f32e7eSjoerg   bool processMemSet(MemSetInst *SI, BasicBlock::iterator &BBI);
65*da58b97aSjoerg   bool processMemCpy(MemCpyInst *M, BasicBlock::iterator &BBI);
6606f32e7eSjoerg   bool processMemMove(MemMoveInst *M);
67*da58b97aSjoerg   bool performCallSlotOptzn(Instruction *cpyLoad, Instruction *cpyStore,
68*da58b97aSjoerg                             Value *cpyDst, Value *cpySrc, uint64_t cpyLen,
69*da58b97aSjoerg                             Align cpyAlign, CallInst *C);
7006f32e7eSjoerg   bool processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep);
71*da58b97aSjoerg   bool processMemSetMemCpyDependence(MemCpyInst *MemCpy, MemSetInst *MemSet);
72*da58b97aSjoerg   bool performMemCpyToMemSetOptzn(MemCpyInst *MemCpy, MemSetInst *MemSet);
73*da58b97aSjoerg   bool processByValArgument(CallBase &CB, unsigned ArgNo);
7406f32e7eSjoerg   Instruction *tryMergingIntoMemset(Instruction *I, Value *StartPtr,
7506f32e7eSjoerg                                     Value *ByteVal);
76*da58b97aSjoerg   bool moveUp(StoreInst *SI, Instruction *P, const LoadInst *LI);
7706f32e7eSjoerg 
78*da58b97aSjoerg   void eraseInstruction(Instruction *I);
7906f32e7eSjoerg   bool iterateOnFunction(Function &F);
8006f32e7eSjoerg };
8106f32e7eSjoerg 
8206f32e7eSjoerg } // end namespace llvm
8306f32e7eSjoerg 
8406f32e7eSjoerg #endif // LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
85