1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- 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/IR/BasicBlock.h"
- #include "llvm/IR/PassManager.h"
- #include <cstdint>
- #include <functional>
- namespace llvm {
- class AAResults;
- class AssumptionCache;
- class CallBase;
- class CallInst;
- class DominatorTree;
- class Function;
- class Instruction;
- class LoadInst;
- class MemCpyInst;
- class MemMoveInst;
- class MemorySSA;
- class MemorySSAUpdater;
- class MemSetInst;
- class StoreInst;
- class TargetLibraryInfo;
- class Value;
- class MemCpyOptPass : public PassInfoMixin<MemCpyOptPass> {
- TargetLibraryInfo *TLI = nullptr;
- AAResults *AA = nullptr;
- AssumptionCache *AC = nullptr;
- DominatorTree *DT = nullptr;
- MemorySSA *MSSA = nullptr;
- MemorySSAUpdater *MSSAU = nullptr;
- public:
- MemCpyOptPass() = default;
- PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
- // Glue for the old PM.
- bool runImpl(Function &F, TargetLibraryInfo *TLI, AAResults *AA,
- AssumptionCache *AC, DominatorTree *DT, MemorySSA *MSSA);
- private:
- // Helper functions
- bool processStore(StoreInst *SI, BasicBlock::iterator &BBI);
- bool processMemSet(MemSetInst *SI, BasicBlock::iterator &BBI);
- bool processMemCpy(MemCpyInst *M, BasicBlock::iterator &BBI);
- bool processMemMove(MemMoveInst *M);
- bool performCallSlotOptzn(Instruction *cpyLoad, Instruction *cpyStore,
- Value *cpyDst, Value *cpySrc, TypeSize cpyLen,
- Align cpyAlign, CallInst *C);
- bool processMemCpyMemCpyDependence(MemCpyInst *M, MemCpyInst *MDep);
- bool processMemSetMemCpyDependence(MemCpyInst *MemCpy, MemSetInst *MemSet);
- bool performMemCpyToMemSetOptzn(MemCpyInst *MemCpy, MemSetInst *MemSet);
- bool processByValArgument(CallBase &CB, unsigned ArgNo);
- Instruction *tryMergingIntoMemset(Instruction *I, Value *StartPtr,
- Value *ByteVal);
- bool moveUp(StoreInst *SI, Instruction *P, const LoadInst *LI);
- void eraseInstruction(Instruction *I);
- bool iterateOnFunction(Function &F);
- };
- } // end namespace llvm
- #endif // LLVM_TRANSFORMS_SCALAR_MEMCPYOPTIMIZER_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|