LLVM 17.0.0git
Macros | Functions | Variables
MemCpyOptimizer.cpp File Reference
#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< boolEnableMemCpyOptWithoutLibcalls ("enable-memcpyopt-without-libcalls", cl::Hidden, cl::desc("Enable memcpyopt even when libcalls are disabled"))
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "memcpyopt"

Definition at line 61 of file MemCpyOptimizer.cpp.

Function Documentation

◆ accessedBetween()

static bool accessedBetween ( BatchAAResults AA,
MemoryLocation  Loc,
const MemoryUseOrDef Start,
const MemoryUseOrDef End,
Instruction **  SkippedLifetimeStart = nullptr 
)
static

◆ hasUndefContents()

static bool hasUndefContents ( MemorySSA MSSA,
BatchAAResults AA,
Value V,
MemoryDef Def,
Value Size 
)
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.

◆ mayBeVisibleThroughUnwinding()

static bool mayBeVisibleThroughUnwinding ( Value V,
Instruction Start,
Instruction End 
)
static

◆ STATISTIC() [1/5]

STATISTIC ( NumCallSlot  ,
"Number of call slot optimizations performed"   
)

References End.

◆ STATISTIC() [2/5]

STATISTIC ( NumCpyToSet  ,
"Number of memcpys converted to memset"   
)

◆ STATISTIC() [3/5]

STATISTIC ( NumMemCpyInstr  ,
"Number of memcpy instructions deleted"   
)

◆ STATISTIC() [4/5]

STATISTIC ( NumMemSetInfer  ,
"Number of memsets inferred"   
)

◆ STATISTIC() [5/5]

STATISTIC ( NumMoveToCpy  ,
"Number of memmoves converted to memcpy"   
)

◆ writtenBetween()

static bool writtenBetween ( MemorySSA MSSA,
BatchAAResults AA,
MemoryLocation  Loc,
const MemoryUseOrDef Start,
const MemoryUseOrDef End 
)
static

Variable Documentation

◆ EnableMemCpyOptWithoutLibcalls

cl::opt< bool > EnableMemCpyOptWithoutLibcalls("enable-memcpyopt-without-libcalls", cl::Hidden, cl::desc("Enable memcpyopt even when libcalls are disabled")) ( "enable-memcpyopt-without-libcalls"  ,
cl::Hidden  ,
cl::desc("Enable memcpyopt even when libcalls are disabled")   
)
static