diff options
Diffstat (limited to 'clang-r353983/include/llvm/Transforms/Scalar/MemCpyOptimizer.h')
| -rw-r--r-- | clang-r353983/include/llvm/Transforms/Scalar/MemCpyOptimizer.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/clang-r353983/include/llvm/Transforms/Scalar/MemCpyOptimizer.h b/clang-r353983/include/llvm/Transforms/Scalar/MemCpyOptimizer.h new file mode 100644 index 00000000..5386f58b --- /dev/null +++ b/clang-r353983/include/llvm/Transforms/Scalar/MemCpyOptimizer.h @@ -0,0 +1,78 @@ +//===- MemCpyOptimizer.h - memcpy optimization ------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This pass performs various transformations related to eliminating memcpy +// calls, or transforming sets of stores into memset's. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H +#define LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H + +#include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/IR/BasicBlock.h" +#include "llvm/IR/CallSite.h" +#include "llvm/IR/PassManager.h" +#include <cstdint> +#include <functional> + +namespace llvm { + +class AssumptionCache; +class CallInst; +class DominatorTree; +class Function; +class Instruction; +class MemCpyInst; +class MemMoveInst; +class MemoryDependenceResults; +class MemSetInst; +class StoreInst; +class TargetLibraryInfo; +class Value; + +class MemCpyOptPass : public PassInfoMixin<MemCpyOptPass> { + MemoryDependenceResults *MD = nullptr; + TargetLibraryInfo *TLI = nullptr; + std::function<AliasAnalysis &()> LookupAliasAnalysis; + std::function<AssumptionCache &()> LookupAssumptionCache; + std::function<DominatorTree &()> LookupDomTree; + +public: + MemCpyOptPass() = default; + + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + + // Glue for the old PM. + bool runImpl(Function &F, MemoryDependenceResults *MD_, + TargetLibraryInfo *TLI_, + std::function<AliasAnalysis &()> LookupAliasAnalysis_, + std::function<AssumptionCache &()> LookupAssumptionCache_, + std::function<DominatorTree &()> LookupDomTree_); + +private: + // Helper functions + bool processStore(StoreInst *SI, BasicBlock::iterator &BBI); + bool processMemSet(MemSetInst *SI, BasicBlock::iterator &BBI); + bool processMemCpy(MemCpyInst *M); + bool processMemMove(MemMoveInst *M); + bool performCallSlotOptzn(Instruction *cpy, Value *cpyDst, Value *cpySrc, + uint64_t cpyLen, unsigned cpyAlign, CallInst *C); + bool processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep); + bool processMemSetMemCpyDependence(MemCpyInst *M, MemSetInst *MDep); + bool performMemCpyToMemSetOptzn(MemCpyInst *M, MemSetInst *MDep); + bool processByValArgument(CallSite CS, unsigned ArgNo); + Instruction *tryMergingIntoMemset(Instruction *I, Value *StartPtr, + Value *ByteVal); + + bool iterateOnFunction(Function &F); +}; + +} // end namespace llvm + +#endif // LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H |
