LLVM 17.0.0git
|
#include "llvm/Transforms/Scalar/MemCpyOptimizer.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/MemorySSA.h"
#include "llvm/Analysis/MemorySSAUpdater.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/Local.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <optional>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "memcpyopt" |
Functions | |
STATISTIC (NumMemCpyInstr, "Number of memcpy instructions deleted") | |
STATISTIC (NumMemSetInfer, "Number of memsets inferred") | |
STATISTIC (NumMoveToCpy, "Number of memmoves converted to memcpy") | |
STATISTIC (NumCpyToSet, "Number of memcpys converted to memset") | |
STATISTIC (NumCallSlot, "Number of call slot optimizations performed") | |
static bool | mayBeVisibleThroughUnwinding (Value *V, Instruction *Start, Instruction *End) |
static bool | accessedBetween (BatchAAResults &AA, MemoryLocation Loc, const MemoryUseOrDef *Start, const MemoryUseOrDef *End, Instruction **SkippedLifetimeStart=nullptr) |
static bool | writtenBetween (MemorySSA *MSSA, BatchAAResults &AA, MemoryLocation Loc, const MemoryUseOrDef *Start, const MemoryUseOrDef *End) |
static bool | hasUndefContents (MemorySSA *MSSA, BatchAAResults &AA, Value *V, MemoryDef *Def, Value *Size) |
Determine whether the instruction has undefined content for the given Size, either because it was freshly alloca'd or started its lifetime. | |
Variables | |
static cl::opt< bool > | EnableMemCpyOptWithoutLibcalls ("enable-memcpyopt-without-libcalls", cl::Hidden, cl::desc("Enable memcpyopt even when libcalls are disabled")) |
#define DEBUG_TYPE "memcpyopt" |
Definition at line 61 of file MemCpyOptimizer.cpp.
|
static |
Definition at line 286 of file MemCpyOptimizer.cpp.
References assert(), End, llvm::BatchAAResults::getModRefInfo(), I, llvm::isModOrRefSet(), and llvm::make_range().
|
static |
Determine whether the instruction has undefined content for the given Size, either because it was freshly alloca'd or started its lifetime.
Definition at line 1309 of file MemCpyOptimizer.cpp.
References DL, llvm::getUnderlyingObject(), llvm::MemorySSA::isLiveOnEntryDef(), llvm::BatchAAResults::isMustAlias(), and Size.
|
static |
Definition at line 257 of file MemCpyOptimizer.cpp.
References llvm::any_of(), assert(), End, llvm::getUnderlyingObject(), I, llvm::isNotVisibleOnUnwind(), and llvm::make_range().
STATISTIC | ( | NumCallSlot | , |
"Number of call slot optimizations performed" | |||
) |
References End.
STATISTIC | ( | NumCpyToSet | , |
"Number of memcpys converted to memset" | |||
) |
STATISTIC | ( | NumMemCpyInstr | , |
"Number of memcpy instructions deleted" | |||
) |
STATISTIC | ( | NumMemSetInfer | , |
"Number of memsets inferred" | |||
) |
STATISTIC | ( | NumMoveToCpy | , |
"Number of memmoves converted to memcpy" | |||
) |
|
static |
Definition at line 310 of file MemCpyOptimizer.cpp.
References llvm::any_of(), llvm::MemorySSA::dominates(), End, llvm::MemorySSAWalker::getClobberingMemoryAccess(), llvm::MemorySSA::getWalker(), and llvm::make_range().