59#define DEBUG_TYPE "mem2reg"
61STATISTIC(NumLocalPromoted,
"Number of alloca's promoted within one block");
62STATISTIC(NumSingleStore,
"Number of alloca's promoted with a single store");
63STATISTIC(NumDeadAlloca,
"Number of dead alloca's removed");
64STATISTIC(NumPHIInsert,
"Number of PHI nodes inserted");
70 Type *ExpectedType =
nullptr;
78 ExpectedType = LI->getType();
79 else if (LI->getType() != ExpectedType)
82 if (
SI->getValueOperand() == AI)
88 Type *StoreType =
SI->getValueOperand()->getType();
90 ExpectedType = StoreType;
91 else if (StoreType != ExpectedType)
94 if (!
II->isLifetimeStartOrEnd() && !
II->isDroppable() &&
95 II->getIntrinsicID() != Intrinsic::fake_use)
101 if (!GEPI->hasAllZeroIndices())
131class AssignmentTrackingInfo {
138 void init(AllocaInst *AI) {
139 SmallSet<DebugVariable, 2> Vars;
141 if (Vars.
insert(DebugVariable(DVR)).second)
142 DVRAssigns.push_back(DVR);
148 void updateForDeletedStore(
149 StoreInst *ToDelete, DIBuilder &DIB,
150 SmallPtrSet<DbgVariableRecord *, 8> *DVRAssignsToDelete)
const {
153 if (DVRAssigns.empty())
162 SmallSet<DebugVariableAggregate, 2> VarHasDbgAssignForStore;
163 auto InsertValueForAssign = [&](
auto *DbgAssign,
auto *&AssignList) {
164 VarHasDbgAssignForStore.
insert(DebugVariableAggregate(DbgAssign));
165 AssignList->insert(DbgAssign);
166 createDebugValue(DIB, DbgAssign->getValue(), DbgAssign->getVariable(),
167 DbgAssign->getExpression(), DbgAssign->getDebugLoc(),
171 InsertValueForAssign(Assign, DVRAssignsToDelete);
181 auto ConvertUnlinkedAssignToValue = [&](DbgVariableRecord *
Assign) {
182 if (VarHasDbgAssignForStore.
contains(DebugVariableAggregate(Assign)))
186 for_each(DVRAssigns, ConvertUnlinkedAssignToValue);
191 void updateForNewPhi(PHINode *NewPhi, DIBuilder &DIB)
const {
195 for (
auto *DVR : DVRAssigns)
199 void clear() { DVRAssigns.clear(); }
200 bool empty() {
return DVRAssigns.empty(); }
204 using DPUserVec = SmallVector<DbgVariableRecord *, 1>;
209 StoreInst *OnlyStore;
211 bool OnlyUsedInOneBlock;
220 AssignmentTrackingInfo AssignmentTracking;
223 DefiningBlocks.clear();
227 OnlyUsedInOneBlock =
true;
230 AssignmentTracking.clear();
235 void AnalyzeAlloca(AllocaInst *AI) {
241 for (User *U : AI->
users()) {
246 DefiningBlocks.push_back(
SI->getParent());
249 ValueType =
SI->getValueOperand()->getType();
251 assert(ValueType ==
SI->getValueOperand()->getType() &&
252 "All stores were checked to have used the same type");
262 "All loads where checked to have used the same type");
265 if (OnlyUsedInOneBlock) {
267 OnlyBlock =
User->getParent();
268 else if (OnlyBlock !=
User->getParent())
269 OnlyUsedInOneBlock =
false;
274 std::copy_if(AllDPUsers.
begin(), AllDPUsers.
end(),
275 std::back_inserter(DPUsers),
276 [](DbgVariableRecord *DVR) { return !DVR->isDbgAssign(); });
277 AssignmentTracking.init(AI);
281template <
typename T>
class VectorWithUndo {
286 void undo(
size_t S) {
288 while (S < Undo.size()) {
289 Vals[Undo.back().first] = Undo.back().second;
294 void resize(
size_t Sz) { Vals.resize(Sz); }
296 size_t undoSize()
const {
return Undo.size(); }
298 const T &operator[](
size_t Idx)
const {
return Vals[Idx]; }
300 void set(
size_t Idx,
const T &Val) {
301 if (Vals[Idx] == Val)
303 Undo.emplace_back(Idx, Vals[Idx]);
307 void init(
size_t Idx,
const T &Val) {
314struct RenamePassData {
315 RenamePassData(BasicBlock *
B, BasicBlock *
P,
size_t V,
size_t L)
316 : BB(
B), Pred(
P), UndoVals(
V), UndoLocs(
L) {}
330class LargeBlockInfo {
336 DenseMap<const Instruction *, unsigned> InstNumbers;
341 static bool isInterestingInstruction(
const Instruction *
I) {
347 unsigned getInstructionIndex(
const Instruction *
I) {
348 assert(isInterestingInstruction(
I) &&
349 "Not a load/store to/from an alloca?");
352 auto It = InstNumbers.find(
I);
353 if (It != InstNumbers.end())
361 for (
const Instruction &BBI : *BB)
362 if (isInterestingInstruction(&BBI))
363 InstNumbers[&BBI] = InstNo++;
364 It = InstNumbers.find(
I);
366 assert(It != InstNumbers.end() &&
"Didn't insert instruction?");
370 void deleteValue(
const Instruction *
I) { InstNumbers.erase(
I); }
372 void clear() { InstNumbers.clear(); }
375struct PromoteMem2Reg {
377 std::vector<AllocaInst *> Allocas;
385 const SimplifyQuery SQ;
388 DenseMap<AllocaInst *, unsigned> AllocaLookup;
395 DenseMap<std::pair<unsigned, unsigned>, PHINode *> NewPhiNodes;
399 DenseMap<PHINode *, unsigned> PhiToAllocaMap;
413 SmallPtrSet<DbgVariableRecord *, 8> DVRAssignsToDelete;
420 SmallVector<unsigned> BBNumPreds;
423 VectorWithUndo<Value *> IncomingVals;
426 VectorWithUndo<DebugLoc> IncomingLocs;
432 bool NoSignedZeros =
false;
437 : Allocas(Allocas.
begin(), Allocas.
end()), DT(DT),
439 AC(AC), SQ(DT.
getRoot()->getDataLayout(),
445 void RemoveFromAllocasList(
unsigned &AllocaIdx) {
446 Allocas[AllocaIdx] = Allocas.back();
451 unsigned getNumPreds(
const BasicBlock *BB) {
453 unsigned &NP = BBNumPreds[BB->
getNumber()];
460 const SmallPtrSetImpl<BasicBlock *> &DefBlocks,
461 SmallPtrSetImpl<BasicBlock *> &LiveInBlocks);
462 void RenamePass(BasicBlock *BB, BasicBlock *Pred);
463 bool QueuePhiNode(BasicBlock *BB,
unsigned AllocaIdx,
unsigned &
Version);
466 void cleanUpDbgAssigns() {
467 for (
auto *DVR : DVRAssignsToDelete)
468 DVR->eraseFromParent();
469 DVRAssignsToDelete.clear();
472 void pushToWorklist(BasicBlock *BB, BasicBlock *Pred) {
473 Worklist.emplace_back(BB, Pred, IncomingVals.undoSize(),
474 IncomingLocs.undoSize());
477 RenamePassData popFromWorklist() {
478 RenamePassData
R = Worklist.back();
480 IncomingVals.undo(
R.UndoVals);
481 IncomingLocs.undo(
R.UndoLocs);
516 if (AC && LI->
getMetadata(LLVMContext::MD_nonnull) &&
530 Type *PromotedType =
nullptr;
537 PromotedType =
SI->getValueOperand()->getType();
548 if (
I->isDroppable()) {
549 I->dropDroppableUse(U);
553 if (!
I->getType()->isVoidTy()) {
574 if (
II->isLifetimeStartOrEnd()) {
578 Store->setDebugLoc(
II->getDebugLoc());
581 I->eraseFromParent();
603 bool RequireDominatingStore =
609 Info.UsingBlocks.clear();
613 if (UserInst == OnlyStore)
621 if (RequireDominatingStore) {
626 if (StoreIndex == -1)
627 StoreIndex = LBI.getInstructionIndex(OnlyStore);
629 if (
unsigned(StoreIndex) > LBI.getInstructionIndex(LI)) {
631 Info.UsingBlocks.push_back(StoreBB);
638 Info.UsingBlocks.push_back(LI->
getParent());
656 if (!Info.UsingBlocks.empty())
661 Info.AssignmentTracking.updateForDeletedStore(Info.OnlyStore, DIB,
683 Info.OnlyStore->eraseFromParent();
684 LBI.deleteValue(Info.OnlyStore);
707 AllocaInst *AI,
const AllocaInfo &Info, LargeBlockInfo &LBI,
717 StoresByIndexTy StoresByIndex;
721 StoresByIndex.
push_back(std::make_pair(LBI.getInstructionIndex(
SI),
SI));
734 unsigned LoadIdx = LBI.getInstructionIndex(LI);
739 std::make_pair(LoadIdx,
static_cast<StoreInst *
>(
nullptr)),
742 if (
I == StoresByIndex.begin()) {
743 if (StoresByIndex.empty())
753 ReplVal = std::prev(
I)->second->getOperand(0);
773 Info.AssignmentTracking.updateForDeletedStore(
SI, DIB, DVRAssignsToDelete);
781 SI->eraseFromParent();
800void PromoteMem2Reg::run() {
803 AllocaATInfo.
resize(Allocas.size());
804 AllocaDPUsers.
resize(Allocas.size());
805 AllocaValueTypes.
resize(Allocas.size());
811 NoSignedZeros =
F.getFnAttribute(
"no-signed-zeros-fp-math").getValueAsBool();
813 for (
unsigned AllocaNum = 0; AllocaNum != Allocas.size(); ++AllocaNum) {
814 AllocaInst *AI = Allocas[AllocaNum];
818 "All allocas should be in the same function, which is same as DF!");
827 RemoveFromAllocasList(AllocaNum);
834 Info.AnalyzeAlloca(AI);
838 if (
Info.DefiningBlocks.size() == 1) {
840 &DVRAssignsToDelete)) {
842 RemoveFromAllocasList(AllocaNum);
850 if (
Info.OnlyUsedInOneBlock &&
852 &DVRAssignsToDelete)) {
854 RemoveFromAllocasList(AllocaNum);
859 if (BBNumPreds.
empty())
860 BBNumPreds.
resize(
F.getMaxBlockNumber());
863 if (!
Info.AssignmentTracking.empty())
864 AllocaATInfo[AllocaNum] =
Info.AssignmentTracking;
865 if (!
Info.DPUsers.empty())
866 AllocaDPUsers[AllocaNum] =
Info.DPUsers;
867 AllocaValueTypes[AllocaNum] =
Info.ValueType;
870 AllocaLookup[Allocas[AllocaNum]] = AllocaNum;
874 Info.DefiningBlocks);
878 SmallPtrSet<BasicBlock *, 32> LiveInBlocks;
885 IDF.setLiveInBlocks(LiveInBlocks);
886 IDF.setDefiningBlocks(DefBlocks);
888 IDF.calculate(PHIBlocks);
889 llvm::sort(PHIBlocks, [](BasicBlock *
A, BasicBlock *
B) {
890 return A->getNumber() <
B->getNumber();
894 for (BasicBlock *BB : PHIBlocks)
895 QueuePhiNode(BB, AllocaNum, CurrentVersion);
898 if (Allocas.empty()) {
907 IncomingVals.resize(Allocas.size());
908 for (
unsigned i = 0, e = Allocas.size(); i != e; ++i)
914 IncomingLocs.resize(Allocas.size());
915 for (
unsigned i = 0, e = Allocas.size(); i != e; ++i)
919 Visited.
resize(
F.getMaxBlockNumber(),
false);
922 pushToWorklist(&
F.front(),
nullptr);
925 RenamePassData RPD = popFromWorklist();
926 RenamePass(RPD.BB, RPD.Pred);
927 }
while (!Worklist.
empty());
930 for (Instruction *
A : Allocas) {
938 A->eraseFromParent();
942 for (
auto &DbgUsers : AllocaDPUsers) {
943 for (DbgVariableRecord *DbgItem : DbgUsers)
944 if (DbgItem->isAddressOfVariable() ||
945 DbgItem->getExpression()->startsWithDeref())
946 DbgItem->eraseFromParent();
953 bool EliminatedAPHI =
true;
954 while (EliminatedAPHI) {
955 EliminatedAPHI =
false;
961 EliminatedAPHI = NewPhiNodes.
remove_if([&](
const auto &Entry) {
962 PHINode *PN =
Entry.second;
978 for (
const auto &PhiNode : NewPhiNodes) {
981 PHINode *SomePHI = PhiNode.second;
983 if (&BB->
front() != SomePHI)
999 return A->getNumber() <
B->getNumber();
1010 "PHI node has entry for a block which is not a predecessor!");
1025 for (BasicBlock *Pred : Preds)
1030 NewPhiNodes.clear();
1031 cleanUpDbgAssigns();
1039void PromoteMem2Reg::ComputeLiveInBlocks(
1040 AllocaInst *AI, AllocaInfo &Info,
1041 const SmallPtrSetImpl<BasicBlock *> &DefBlocks,
1042 SmallPtrSetImpl<BasicBlock *> &LiveInBlocks) {
1046 SmallVector<BasicBlock *, 64> LiveInBlockWorklist(
Info.UsingBlocks.begin(),
1047 Info.UsingBlocks.end());
1052 for (
unsigned i = 0, e = LiveInBlockWorklist.size(); i != e; ++i) {
1054 if (!DefBlocks.
count(BB))
1061 if (
SI->getOperand(1) != AI)
1066 LiveInBlockWorklist[i] = LiveInBlockWorklist.back();
1067 LiveInBlockWorklist.pop_back();
1083 while (!LiveInBlockWorklist.empty()) {
1084 BasicBlock *BB = LiveInBlockWorklist.pop_back_val();
1088 if (!LiveInBlocks.
insert(BB).second)
1100 LiveInBlockWorklist.push_back(
P);
1108bool PromoteMem2Reg::QueuePhiNode(BasicBlock *BB,
unsigned AllocaNo,
1111 PHINode *&PN = NewPhiNodes[std::make_pair(BB->
getNumber(), AllocaNo)];
1123 PhiToAllocaMap[PN] = AllocaNo;
1130 bool ApplyMergedLoc) {
1142void PromoteMem2Reg::RenamePass(BasicBlock *BB, BasicBlock *Pred) {
1148 if (PhiToAllocaMap.
count(APN)) {
1155 unsigned NewPHINumOperands = APN->getNumOperands();
1158 assert(NumEdges &&
"Must be at least one edge from Pred to BB!");
1163 unsigned AllocaNo = PhiToAllocaMap[APN];
1167 APN->getNumIncomingValues() > 0);
1170 for (
unsigned i = 0; i != NumEdges; ++i)
1171 APN->addIncoming(IncomingVals[AllocaNo], Pred);
1179 APN->setHasNoSignedZeros(
true);
1182 IncomingVals.set(AllocaNo, APN);
1183 AllocaATInfo[AllocaNo].updateForNewPhi(APN, DIB);
1184 for (DbgVariableRecord *DbgItem : AllocaDPUsers[AllocaNo])
1185 if (DbgItem->isAddressOfVariable())
1196 }
while (APN->getNumOperands() == NewPHINumOperands);
1213 auto AI = AllocaLookup.
find(Src);
1214 if (AI == AllocaLookup.
end())
1217 Value *
V = IncomingVals[AI->second];
1230 auto ai = AllocaLookup.
find(Dest);
1231 if (ai == AllocaLookup.
end())
1235 unsigned AllocaNo = ai->second;
1236 IncomingVals.set(AllocaNo,
SI->getOperand(0));
1239 IncomingLocs.set(AllocaNo,
SI->getDebugLoc());
1240 AllocaATInfo[AllocaNo].updateForDeletedStore(SI, DIB,
1241 &DVRAssignsToDelete);
1242 for (DbgVariableRecord *DbgItem : AllocaDPUsers[ai->second])
1243 if (DbgItem->isAddressOfVariable())
1245 SI->eraseFromParent();
1252 SmallPtrSet<BasicBlock *, 8> VisitedSuccs;
1255 if (VisitedSuccs.
insert(S).second)
1256 pushToWorklist(S, BB);
1262 if (Allocas.
empty())
1265 PromoteMem2Reg(Allocas, DT, AC).run();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis false
static const Function * getParent(const Value *V)
This file implements the BitVector class.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static DeltaTreeNode * getRoot(void *Root)
This file defines the DenseMap class.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
Module.h This file contains the declarations for the Module class.
uint64_t IntrinsicInst * II
static StringRef getName(Value *V)
static void ComputeLiveInBlocks(const SmallPtrSetImpl< BasicBlock * > &UsingBlocks, const SmallPtrSetImpl< BasicBlock * > &DefBlocks, SmallPtrSetImpl< BasicBlock * > &LiveInBlocks, PredIteratorCache &PredCache)
Given sets of UsingBlocks and DefBlocks, compute the set of LiveInBlocks.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
A cache of @llvm.assume calls within a function.
LLVM_ABI void registerAssumption(AssumeInst *CI)
Add an @llvm.assume intrinsic to this function's cache.
LLVM Basic Block Representation.
unsigned getNumber() const
iterator begin()
Instruction iterator methods.
const Function * getParent() const
Return the enclosing method, or null if none.
const Instruction & front() const
InstListType::iterator iterator
Instruction iterators...
This class represents a no-op cast from one type to another.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
BitVector & set()
Set all bits in the bitvector.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool startsWithDeref() const
Return whether the first element a DW_OP_deref.
A parsed version of the target data layout string in and methods for querying it.
LLVM_ABI void eraseFromParent()
Record of a variable value-assignment, aka a non instruction representation of the dbg....
bool isValueOfVariable() const
Determine if this describes the value of a local variable.
bool isAddressOfVariable() const
Does this describe the address of a local variable.
DIExpression * getExpression() const
static LLVM_ABI DbgVariableRecord * createDbgVariableRecord(Value *Location, DILocalVariable *DV, DIExpression *Expr, const DILocation *DI)
static DebugLoc getCompilerGenerated()
iterator find(const_arg_type_t< KeyT > Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
bool remove_if(Predicate Pred)
Remove entries that match the given predicate.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
Class representing an expression and its matching format.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
Instruction * user_back()
Specialize the methods defined in Value, as we know that an instruction can only be used by other ins...
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)
Merge 2 debug locations and apply it to the Instruction.
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
An instruction for reading from memory.
Value * getPointerOperand()
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
bool contains(const T &V) const
Check if the SmallSet contains the given element.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
typename SuperClass::iterator iterator
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
A Use represents the edge between a Value definition and its users.
LLVM_ABI bool isDroppable() const
A droppable user is a user for which uses can be dropped without affecting correctness and should be ...
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
static LLVM_ABI void dropDroppableUse(Use &U)
Remove the droppable use U.
iterator_range< use_iterator > uses()
const ParentTy * getParent() const
self_iterator getIterator()
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
SmallVector< DbgVariableRecord * > getDVRAssignmentMarkers(const Instruction *Inst)
Return a range of dbg_assign records for which Inst performs the assignment they encode.
LLVM_ABI void deleteAssignmentMarkers(const Instruction *Inst)
Delete the llvm.dbg.assign intrinsics linked to Inst.
initializer< Ty > init(const Ty &Val)
DXILDebugInfoMap run(Module &M)
@ User
could "use" a pointer
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
UnaryFunction for_each(R &&Range, UnaryFunction F)
Provide wrappers to std::for_each which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI void PromoteMemToReg(ArrayRef< AllocaInst * > Allocas, DominatorTree &DT, AssumptionCache *AC=nullptr)
Promote the specified list of alloca instructions into scalar registers, inserting PHI nodes as appro...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto successors(const MachineBasicBlock *BB)
@ Store
The extracted value is stored (ExtractElement only).
LLVM_ABI bool onlyUsedByLifetimeMarkersOrDroppableInsts(const Value *V)
Return true if the only users of this pointer are lifetime markers or droppable instructions.
LLVM_ABI void InsertDebugValueAtStoreLoc(DbgVariableRecord *DVR, StoreInst *SI, DIBuilder &Builder)
===------------------------------------------------------------------—===// Dbg Intrinsic utilities
constexpr from_range_t from_range
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto pred_size(const MachineBasicBlock *BB)
LLVM_ABI bool isAllocaPromotable(const AllocaInst *AI)
Return true if this alloca is legal for promotion.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
auto reverse(ContainerTy &&C)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void ConvertDebugDeclareToDebugValue(DbgVariableRecord *DVR, StoreInst *SI, DIBuilder &Builder)
Inserts a dbg.value record before a store to an alloca'd value that has an associated dbg....
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
IDFCalculator< false > ForwardIDFCalculator
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
LLVM_ABI bool onlyUsedByLifetimeMarkers(const Value *V)
Return true if the only users of this pointer are lifetime markers.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto predecessors(const MachineBasicBlock *BB)
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Function object to check whether the first component of a container supported by std::get (like std::...