19 #ifndef LLVM_CODEGEN_SLOTINDEXES_H 20 #define LLVM_CODEGEN_SLOTINDEXES_H 64 #ifdef EXPENSIVE_CHECKS 70 assert(((tmp & 0x1) == 0x0) &&
"Pointer already poisoned?");
75 bool isPoisoned()
const {
return (reinterpret_cast<intptr_t>(mi) & 0x1) == 0x1; }
76 #endif // EXPENSIVE_CHECKS 114 : lie(entry, slot) {}
116 IndexListEntry* listEntry()
const {
117 assert(isValid() &&
"Attempt to compare reserved index.");
118 #ifdef EXPENSIVE_CHECKS 120 "Attempt to access deleted list-entry.");
121 #endif // EXPENSIVE_CHECKS 126 return listEntry()->getIndex() | getSlot();
130 Slot getSlot()
const {
131 return static_cast<Slot
>(lie.
getInt());
138 InstrDist = 4 * Slot_Count
147 "Attempt to construct index with 0 pointer.");
157 explicit operator bool()
const {
return isValid(); }
167 return lie == other.lie;
171 return lie != other.lie;
177 return getIndex() < other.getIndex();
182 return getIndex() <= other.getIndex();
188 return getIndex() > other.getIndex();
194 return getIndex() >= other.getIndex();
199 return A.lie.getPointer() == B.lie.getPointer();
211 return !isEarlierInstr(B, A);
216 return other.getIndex() -
getIndex();
222 return (other.listEntry()->
getIndex() - listEntry()->getIndex())
227 bool isBlock()
const {
return getSlot() == Slot_Block; }
234 bool isRegister()
const {
return getSlot() == Slot_Register; }
237 bool isDead()
const {
return getSlot() == Slot_Dead; }
243 return SlotIndex(listEntry(), Slot_Block);
250 return SlotIndex(listEntry(), Slot_Dead);
256 return SlotIndex(listEntry(), EC ? Slot_EarlyClobber : Slot_Register);
261 return SlotIndex(listEntry(), Slot_Dead);
272 if (s == Slot_Dead) {
292 if (s == Slot_Block) {
312 using IdxMBBPair = std::pair<SlotIndex, MachineBasicBlock *>;
324 return LHS.first < RHS.first;
339 #ifdef EXPENSIVE_CHECKS 341 #endif // EXPENSIVE_CHECKS 355 IndexListEntry* createEntry(
MachineInstr *mi,
unsigned index) {
356 IndexListEntry *
entry =
357 static_cast<IndexListEntry *
>(ileAllocator.
Allocate(
358 sizeof(IndexListEntry),
alignof(IndexListEntry)));
366 void renumberIndexes(IndexList::iterator curItr);
381 void releaseMemory()
override;
389 void renumberIndexes();
398 assert(indexList.front().getIndex() == 0 &&
"First index is not 0?");
410 return mi2iMap.
count(&instr);
421 assert(!BundleNonDebug.isDebugInstr() &&
422 "Could not use a debug instruction to query mi2iMap.");
424 assert(itr != mi2iMap.
end() &&
"Instruction not found in maps.");
437 IndexList::iterator
I = Index.listEntry()->
getIterator();
438 IndexList::iterator
E = indexList.end();
443 return getLastIndex();
451 assert(MBB &&
"MI must be inserted in a basic block");
455 return getMBBStartIdx(MBB);
458 if (MapItr != mi2iMap.
end())
459 return MapItr->second;
468 assert(MBB &&
"MI must be inserted in a basic block");
473 return getMBBEndIdx(MBB);
475 if (MapItr != mi2iMap.
end())
476 return MapItr->second;
481 const std::pair<SlotIndex, SlotIndex> &
483 return MBBRanges[Num];
487 const std::pair<SlotIndex, SlotIndex> &
494 return getMBBRange(Num).first;
499 return getMBBRange(mbb).first;
504 return getMBBRange(Num).second;
509 return getMBBRange(mbb).second;
525 return advanceMBBIndex(idx2MBBMap.
begin(), Idx);
530 return idx2MBBMap.
begin();
535 return idx2MBBMap.
end();
541 return MI->getParent();
546 ((I != MBBIndexEnd() && I->first > index) ||
547 (I == MBBIndexEnd() && !idx2MBBMap.
empty())) ? std::prev(I) :
I;
549 assert(J != MBBIndexEnd() && J->first <= index &&
550 index < getMBBEndIdx(J->second) &&
551 "index does not correspond to an MBB");
559 assert(start < end &&
"Backwards ranges not allowed.");
561 if (itr == MBBIndexEnd()) {
562 itr = std::prev(itr);
567 if (itr->first < end)
570 itr = std::prev(itr);
572 if (itr->first <= start)
585 "Instructions inside bundles should use bundle start's slot.");
586 assert(mi2iMap.
find(&MI) == mi2iMap.
end() &&
"Instr already indexed.");
591 assert(MI.
getParent() !=
nullptr &&
"Instr must be added to function.");
594 IndexList::iterator prevItr, nextItr;
597 nextItr = getIndexAfter(MI).listEntry()->getIterator();
598 prevItr = std::prev(nextItr);
601 prevItr = getIndexBefore(MI).listEntry()->getIterator();
602 nextItr = std::next(prevItr);
607 unsigned dist = ((nextItr->getIndex() - prevItr->getIndex())/2) & ~3u;
608 unsigned newNumber = prevItr->getIndex() + dist;
611 IndexList::iterator newItr =
612 indexList.
insert(nextItr, createEntry(&MI, newNumber));
616 renumberIndexes(newItr);
618 SlotIndex newIndex(&*newItr, SlotIndex::Slot_Block);
619 mi2iMap.
insert(std::make_pair(&MI, newIndex));
631 void removeSingleMachineInstrFromMaps(
MachineInstr &MI);
638 if (mi2iItr == mi2iMap.
end())
640 SlotIndex replaceBaseIndex = mi2iItr->second;
641 IndexListEntry *miEntry(replaceBaseIndex.listEntry());
642 assert(miEntry->getInstr() == &MI &&
643 "Mismatched instruction in index tables.");
644 miEntry->setInstr(&NewMI);
645 mi2iMap.
erase(mi2iItr);
646 mi2iMap.
insert(std::make_pair(&NewMI, replaceBaseIndex));
647 return replaceBaseIndex;
655 IndexListEntry *startEntry =
nullptr;
656 IndexListEntry *endEntry =
nullptr;
657 IndexList::iterator newItr;
659 startEntry = &indexList.back();
660 endEntry = createEntry(
nullptr, 0);
663 startEntry = createEntry(
nullptr, 0);
664 endEntry = getMBBStartIdx(&*nextMBB).listEntry();
668 SlotIndex startIdx(startEntry, SlotIndex::Slot_Block);
669 SlotIndex endIdx(endEntry, SlotIndex::Slot_Block);
673 "Can't insert a new block at the beginning of a function.");
675 MBBRanges[prevMBB->getNumber()].second = startIdx;
678 "Blocks must be added in order");
679 MBBRanges.
push_back(std::make_pair(startIdx, endIdx));
682 renumberIndexes(newItr);
702 IndexListEntry *
entry = index.listEntry();
703 #ifdef EXPENSIVE_CHECKS 708 indexList.
erase(entry);
720 #endif // LLVM_CODEGEN_SLOTINDEXES_H
bool isRegister() const
isRegister - Returns true if this is a normal register use/def slot.
const_iterator end(StringRef path)
Get end iterator over path.
MBBIndexIterator advanceMBBIndex(MBBIndexIterator I, SlotIndex To) const
Move iterator to the next IdxMBBPair where the SlotIndex is greater or equal to To.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
iterator erase(iterator where)
This class represents lattice values for constants.
PointerTy getPointer() const
MachineBasicBlock * getMBBCoveringRange(SlotIndex start, SlotIndex end) const
Returns the MBB covering the given range, or null if the range covers more than one basic block...
SlotIndex getPrevIndex() const
Returns the previous index.
void push_back(const T &Elt)
MBBIndexIterator MBBIndexEnd() const
Return an iterator for the end of the idx2MBBMap.
bool isDead() const
isDead - Returns true if this is a dead def kill slot.
bool operator<(SlotIndex other) const
Compare two SlotIndex objects.
bool isValid() const
Returns true if this is a valid index.
This file defines the MallocAllocator and BumpPtrAllocator interfaces.
Custom traits to do nothing on deletion.
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
isEarlierInstr - Return true if A refers to an instruction earlier than B.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
SlotIndex getLastIndex()
Returns the base index of the last slot in this analysis.
bool operator<=(SlotIndex other) const
Compare two SlotIndex objects.
bool isBlock() const
isBlock - Returns true if this is a block boundary slot.
SlotIndex getNextIndex() const
Returns the next index.
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
SlotIndex getInstructionIndex(const MachineInstr &MI) const
Returns the base index for the given instruction.
SmallVectorImpl< IdxMBBPair >::const_iterator MBBIndexIterator
Iterator over the idx2MBBMap (sorted pairs of slot index of basic block begin and basic block) ...
SlotIndex getNextNonNullIndex(SlotIndex Index)
Returns the next non-null index, if one exists.
void eraseIndex(SlotIndex index)
Free the resources that were required to maintain a SlotIndex.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def...
MachineBasicBlock::instr_iterator getBundleStart(MachineBasicBlock::instr_iterator I)
Returns an iterator to the first instruction in the bundle containing I.
SlotIndex getIndexAfter(const MachineInstr &MI) const
getIndexAfter - Returns the index of the first indexed instruction after MI, or the end index of its ...
SlotIndex getNextSlot() const
Returns the next slot in the index list.
auto lower_bound(R &&Range, ForwardIt I) -> decltype(adl_begin(Range))
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Returns the first index in the given basic block.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
bool isInsideBundle() const
Return true if MI is in a bundle (but not the first MI in a bundle).
void setIndex(unsigned index)
BasicBlockListType::iterator iterator
bool operator==(SlotIndex other) const
Compare two SlotIndex objects for equality.
iterator find(const_arg_type_t< KeyT > Val)
SlotIndex insertMachineInstrInMaps(MachineInstr &MI, bool Late=false)
Insert the given machine instruction into the mapping.
MachineInstr * getInstr() const
Use delete by default for iplist and ilist.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
bool erase(const KeyT &Val)
void initializeSlotIndexesPass(PassRegistry &)
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Returns the last index in the given basic block.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
SlotIndex(const SlotIndex &li, Slot s)
void insertMBBInMaps(MachineBasicBlock *mbb)
Add the given MachineBasicBlock into the maps.
PointerIntPair - This class implements a pair of a pointer and small integer.
bool operator!=(SlotIndex other) const
Compare two SlotIndex objects for inequality.
Allocate memory in an ever growing pool, as if by bump-pointer.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void * Allocate(size_t Size, size_t Alignment)
Allocate space at the specified alignment.
unsigned getIndex() const
SlotIndex getIndexBefore(const MachineInstr &MI) const
getIndexBefore - Returns the index of the last indexed instruction before MI, or the start index of i...
bool hasIndex(const MachineInstr &instr) const
Returns true if the given machine instr is mapped to an index, otherwise returns false.
SlotIndex getMBBStartIdx(unsigned Num) const
Returns the first index in the given basic block number.
Represent the analysis usage information of a pass.
int getInstrDistance(SlotIndex other) const
Return the scaled distance from this index to the given one, where all slots on the same instruction ...
std::pair< SlotIndex, MachineBasicBlock * > IdxMBBPair
SlotIndex getZeroIndex()
Returns the zero index for this analysis.
MBBIndexIterator MBBIndexBegin() const
Returns an iterator for the begin of the idx2MBBMap.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
self_iterator getIterator()
void setInstr(MachineInstr *mi)
SlotIndex getMBBEndIdx(unsigned Num) const
Returns the last index in the given basic block number.
bool isDebugInstr() const
An intrusive list with ownership and callbacks specified/controlled by ilist_traits, only with API safe for polymorphic types.
bool operator()(const IdxMBBPair &LHS, const IdxMBBPair &RHS) const
void sort(IteratorTy Start, IteratorTy End)
isPodLike - This is a type trait that is used to determine whether a given type can be copied around ...
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
bool operator>(SlotIndex other) const
Compare two SlotIndex objects.
void push_back(pointer val)
IndexListEntry(MachineInstr *mi, unsigned index)
bool isEarlyClobber() const
isEarlyClobber - Returns true if this is an early-clobber slot.
IterT skipDebugInstructionsForward(IterT It, IterT End)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator...
const MachineBasicBlock * getParent() const
bool operator>=(SlotIndex other) const
Compare two SlotIndex objects.
Representation of each machine instruction.
pointer remove(iterator &IT)
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator end()
iterator insert(iterator where, pointer New)
static bool isEarlierEqualInstr(SlotIndex A, SlotIndex B)
Return true if A refers to the same instruction as B or an earlier one.
This class represents an entry in the slot index list held in the SlotIndexes pass.
const std::pair< SlotIndex, SlotIndex > & getMBBRange(const MachineBasicBlock *MBB) const
Return the (start,end) range of the given basic block.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
LLVM_NODISCARD bool empty() const
int distance(SlotIndex other) const
Return the distance from this index to the given one.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
MBBIndexIterator findMBBIndex(SlotIndex Idx) const
Get an iterator pointing to the IdxMBBPair with the biggest SlotIndex that is greater or equal to Idx...
raw_ostream & operator<<(raw_ostream &OS, const APInt &I)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
const std::pair< SlotIndex, SlotIndex > & getMBBRange(unsigned Num) const
Return the (start,end) range of the given basic block number.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool operator<(int64_t V1, const APSInt &V2)
void clearAndLeakNodesUnsafely()
Remove all nodes from the list like clear(), but do not call removeNodeFromList() or deleteNode()...
This class implements an extremely fast bulk output stream that can only output to a stream...
print Instructions which execute on loop entry
void print(raw_ostream &os) const
Print this index to the given raw_ostream.
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
iterator insertAfter(iterator where, pointer New)
SlotIndex - An opaque wrapper around machine indexes.
SlotIndex getBoundaryIndex() const
Returns the boundary index for associated with this index.
SlotIndex replaceMachineInstrInMaps(MachineInstr &MI, MachineInstr &NewMI)
ReplaceMachineInstrInMaps - Replacing a machine instr with a new one in maps used by register allocat...