LLVM 20.0.0git
|
#include "llvm/Transforms/Scalar/MemCpyOptimizer.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/ScopeExit.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/CFG.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/GlobalsModRef.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/Loads.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/MemorySSA.h"
#include "llvm/Analysis/MemorySSAUpdater.h"
#include "llvm/Analysis/PostDominators.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/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 (NumMemMoveInstr, "Number of memmove 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") | |
STATISTIC (NumStackMove, "Number of stack-move 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 void | combineAAMetadata (Instruction *ReplInst, Instruction *I) |
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. | |
static bool | isZeroSize (Value *Size) |
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 64 of file MemCpyOptimizer.cpp.
|
static |
Definition at line 295 of file MemCpyOptimizer.cpp.
References assert(), End, llvm::BatchAAResults::getModRefInfo(), I, II, llvm::isModOrRefSet(), and llvm::make_range().
|
static |
Definition at line 345 of file MemCpyOptimizer.cpp.
References llvm::combineMetadata(), and I.
|
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 1382 of file MemCpyOptimizer.cpp.
References DL, llvm::getUnderlyingObject(), II, llvm::MemorySSA::isLiveOnEntryDef(), llvm::BatchAAResults::isMustAlias(), and Size.
Definition at line 1702 of file MemCpyOptimizer.cpp.
References llvm::CallingConv::C, I, llvm::simplifyInstruction(), and Size.
|
static |
Definition at line 265 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" | |||
) |
STATISTIC | ( | NumCpyToSet | , |
"Number of memcpys converted to memset" | |||
) |
STATISTIC | ( | NumMemCpyInstr | , |
"Number of memcpy instructions deleted" | |||
) |
STATISTIC | ( | NumMemMoveInstr | , |
"Number of memmove instructions deleted" | |||
) |
STATISTIC | ( | NumMemSetInfer | , |
"Number of memsets inferred" | |||
) |
STATISTIC | ( | NumMoveToCpy | , |
"Number of memmoves converted to memcpy" | |||
) |
STATISTIC | ( | NumStackMove | , |
"Number of stack-move optimizations performed" | |||
) |
References End.
|
static |
Definition at line 319 of file MemCpyOptimizer.cpp.
References llvm::any_of(), llvm::MemorySSA::dominates(), End, llvm::MemorySSAWalker::getClobberingMemoryAccess(), llvm::MemorySSA::getWalker(), and llvm::make_range().