Skip to content

[LiveDebugVariables] Add basic verification #68703

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions llvm/include/llvm/CodeGen/SlotIndexes.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,40 @@ class raw_ostream;
/// SlotIndex & SlotIndexes classes for the public interface to this
/// information.
class IndexListEntry : public ilist_node<IndexListEntry> {
MachineInstr *mi;
#if NDEBUG
// Disable poison checks such that setPoison will do nothing and isPoisoned
// will return false.
static constexpr unsigned PoisonBits = 0;
static constexpr unsigned PoisonVal = 0;
#else
static constexpr unsigned PoisonBits = 1;
static constexpr unsigned PoisonVal = 1;
#endif

PointerIntPair<MachineInstr *, PoisonBits, unsigned> mi;
unsigned index;

public:
IndexListEntry(MachineInstr *mi, unsigned index) : mi(mi), index(index) {}
IndexListEntry(MachineInstr *mi, unsigned index) : mi(mi, 0), index(index) {
}

MachineInstr* getInstr() const { return mi; }
MachineInstr* getInstr() const { return mi.getPointer(); }
void setInstr(MachineInstr *mi) {
this->mi = mi;
this->mi.setPointer(mi);
}

unsigned getIndex() const { return index; }
void setIndex(unsigned index) {
this->index = index;
}

void setPoison() {
mi.setInt(PoisonVal);
}

bool isPoisoned() const {
return mi.getInt();
}
};

template <>
Expand Down Expand Up @@ -285,6 +304,10 @@ class raw_ostream;
SlotIndex getPrevIndex() const {
return SlotIndex(&*--listEntry()->getIterator(), getSlot());
}

bool isPoisoned() const {
return listEntry()->isPoisoned();
}
};

inline raw_ostream& operator<<(raw_ostream &os, SlotIndex li) {
Expand Down
17 changes: 17 additions & 0 deletions llvm/lib/CodeGen/LiveDebugVariables.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,13 @@ class UserValue {
/// Return DebugLoc of this UserValue.
const DebugLoc &getDebugLoc() { return dl; }

void verify() const {
for (auto I = locInts.begin(), E = locInts.end(); I != E; ++I) {
assert(!I.start().isPoisoned());
assert(!I.stop().isPoisoned());
}
}

void print(raw_ostream &, const TargetRegisterInfo *);
};

Expand Down Expand Up @@ -654,6 +661,11 @@ class LDVImpl {
ModifiedMF = false;
}

void verify() const {
for (auto [DV, UV] : userVarMap)
UV->verify();
}

/// Map virtual register to an equivalence class.
void mapVirtReg(Register VirtReg, UserValue *EC);

Expand Down Expand Up @@ -1319,6 +1331,11 @@ void LiveDebugVariables::releaseMemory() {
static_cast<LDVImpl*>(pImpl)->clear();
}

void LiveDebugVariables::verifyAnalysis() const {
if (pImpl)
static_cast<LDVImpl *>(pImpl)->verify();
}

LiveDebugVariables::~LiveDebugVariables() {
if (pImpl)
delete static_cast<LDVImpl*>(pImpl);
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/CodeGen/LiveDebugVariables.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class LLVM_LIBRARY_VISIBILITY LiveDebugVariables : public MachineFunctionPass {
bool runOnMachineFunction(MachineFunction &) override;
void releaseMemory() override;
void getAnalysisUsage(AnalysisUsage &) const override;
void verifyAnalysis() const override;

MachineFunctionProperties getSetProperties() const override {
return MachineFunctionProperties().set(
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/CodeGen/SlotIndexes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ void SlotIndexes::removeMachineInstrFromMaps(MachineInstr &MI,
mi2iMap.erase(mi2iItr);
// FIXME: Eventually we want to actually delete these indexes.
MIEntry.setInstr(nullptr);
MIEntry.setPoison();
}

void SlotIndexes::removeSingleMachineInstrFromMaps(MachineInstr &MI) {
Expand All @@ -152,6 +153,7 @@ void SlotIndexes::removeSingleMachineInstrFromMaps(MachineInstr &MI) {
} else {
// FIXME: Eventually we want to actually delete these indexes.
MIEntry.setInstr(nullptr);
MIEntry.setPoison();
}
}

Expand Down