Home | History | Annotate | Line # | Download | only in Scalar
      1 //===- MemCpyOptimizer.h - memcpy optimization ------------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This pass performs various transformations related to eliminating memcpy
     10 // calls, or transforming sets of stores into memset's.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
     15 #define LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
     16 
     17 #include "llvm/IR/BasicBlock.h"
     18 #include "llvm/IR/PassManager.h"
     19 #include <cstdint>
     20 #include <functional>
     21 
     22 namespace llvm {
     23 
     24 class AAResults;
     25 class AssumptionCache;
     26 class CallBase;
     27 class CallInst;
     28 class DominatorTree;
     29 class Function;
     30 class Instruction;
     31 class LoadInst;
     32 class MemCpyInst;
     33 class MemMoveInst;
     34 class MemoryDependenceResults;
     35 class MemorySSA;
     36 class MemorySSAUpdater;
     37 class MemSetInst;
     38 class StoreInst;
     39 class TargetLibraryInfo;
     40 class Value;
     41 
     42 class MemCpyOptPass : public PassInfoMixin<MemCpyOptPass> {
     43   MemoryDependenceResults *MD = nullptr;
     44   TargetLibraryInfo *TLI = nullptr;
     45   AAResults *AA = nullptr;
     46   AssumptionCache *AC = nullptr;
     47   DominatorTree *DT = nullptr;
     48   MemorySSA *MSSA = nullptr;
     49   MemorySSAUpdater *MSSAU = nullptr;
     50 
     51 public:
     52   MemCpyOptPass() = default;
     53 
     54   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
     55 
     56   // Glue for the old PM.
     57   bool runImpl(Function &F, MemoryDependenceResults *MD, TargetLibraryInfo *TLI,
     58                AAResults *AA, AssumptionCache *AC, DominatorTree *DT,
     59                MemorySSA *MSSA);
     60 
     61 private:
     62   // Helper functions
     63   bool processStore(StoreInst *SI, BasicBlock::iterator &BBI);
     64   bool processMemSet(MemSetInst *SI, BasicBlock::iterator &BBI);
     65   bool processMemCpy(MemCpyInst *M, BasicBlock::iterator &BBI);
     66   bool processMemMove(MemMoveInst *M);
     67   bool performCallSlotOptzn(Instruction *cpyLoad, Instruction *cpyStore,
     68                             Value *cpyDst, Value *cpySrc, uint64_t cpyLen,
     69                             Align cpyAlign, CallInst *C);
     70   bool processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep);
     71   bool processMemSetMemCpyDependence(MemCpyInst *MemCpy, MemSetInst *MemSet);
     72   bool performMemCpyToMemSetOptzn(MemCpyInst *MemCpy, MemSetInst *MemSet);
     73   bool processByValArgument(CallBase &CB, unsigned ArgNo);
     74   Instruction *tryMergingIntoMemset(Instruction *I, Value *StartPtr,
     75                                     Value *ByteVal);
     76   bool moveUp(StoreInst *SI, Instruction *P, const LoadInst *LI);
     77 
     78   void eraseInstruction(Instruction *I);
     79   bool iterateOnFunction(Function &F);
     80 };
     81 
     82 } // end namespace llvm
     83 
     84 #endif // LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
     85