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