mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 14:46:53 +00:00
Factor out the code for verifying the work of the scheduler,
extend it a bit, and make use of it in all schedulers, to ensure consistent checking. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59689 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f23de86fa3
commit
a1e6d363e5
@ -96,7 +96,7 @@ namespace llvm {
|
||||
Latency(0), NumPreds(0), NumSuccs(0), NumPredsLeft(0), NumSuccsLeft(0),
|
||||
isTwoAddress(false), isCommutable(false), hasPhysRegDefs(false),
|
||||
isPending(false), isAvailable(false), isScheduled(false),
|
||||
CycleBound(0), Cycle(0), Depth(0), Height(0),
|
||||
CycleBound(0), Cycle(~0u), Depth(0), Height(0),
|
||||
CopyDstRC(NULL), CopySrcRC(NULL) {}
|
||||
|
||||
/// SUnit - Construct an SUnit for post-regalloc scheduling to represent
|
||||
@ -106,7 +106,7 @@ namespace llvm {
|
||||
Latency(0), NumPreds(0), NumSuccs(0), NumPredsLeft(0), NumSuccsLeft(0),
|
||||
isTwoAddress(false), isCommutable(false), hasPhysRegDefs(false),
|
||||
isPending(false), isAvailable(false), isScheduled(false),
|
||||
CycleBound(0), Cycle(0), Depth(0), Height(0),
|
||||
CycleBound(0), Cycle(~0u), Depth(0), Height(0),
|
||||
CopyDstRC(NULL), CopySrcRC(NULL) {}
|
||||
|
||||
/// setNode - Assign the representative SDNode for this SUnit.
|
||||
@ -308,6 +308,12 @@ namespace llvm {
|
||||
/// the ScheduleDAG.
|
||||
virtual void addCustomGraphFeatures(GraphWriter<ScheduleDAG*> &GW) const {}
|
||||
|
||||
#ifndef NDEBUG
|
||||
/// VerifySchedule - Verify that all SUnits were scheduled and that
|
||||
/// their state is consistent.
|
||||
void VerifySchedule(bool isBottomUp);
|
||||
#endif
|
||||
|
||||
protected:
|
||||
void AddMemOperand(MachineInstr *MI, const MachineMemOperand &MO);
|
||||
|
||||
|
@ -229,18 +229,7 @@ void SchedulePostRATDList::ListScheduleTopDown() {
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Verify that all SUnits were scheduled.
|
||||
bool AnyNotSched = false;
|
||||
for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
|
||||
if (SUnits[i].NumPredsLeft != 0) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** List scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has not been scheduled!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
}
|
||||
assert(!AnyNotSched);
|
||||
VerifySchedule(/*isBottomUp=*/false);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -208,3 +208,57 @@ void SUnit::dumpAll(const ScheduleDAG *G) const {
|
||||
}
|
||||
cerr << "\n";
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
/// VerifySchedule - Verify that all SUnits were scheduled and that
|
||||
/// their state is consistent.
|
||||
///
|
||||
void ScheduleDAG::VerifySchedule(bool isBottomUp) {
|
||||
bool AnyNotSched = false;
|
||||
unsigned DeadNodes = 0;
|
||||
unsigned Noops = 0;
|
||||
for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
|
||||
if (!SUnits[i].isScheduled) {
|
||||
if (SUnits[i].NumPreds == 0 && SUnits[i].NumSuccs == 0) {
|
||||
++DeadNodes;
|
||||
continue;
|
||||
}
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** Scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has not been scheduled!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
if (SUnits[i].isScheduled && SUnits[i].Cycle > (unsigned)INT_MAX) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** Scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has an unexpected Cycle value!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
if (isBottomUp) {
|
||||
if (SUnits[i].NumSuccsLeft != 0) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** Scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has successors left!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
} else {
|
||||
if (SUnits[i].NumPredsLeft != 0) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** Scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has predecessors left!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0, e = Sequence.size(); i != e; ++i)
|
||||
if (!Sequence[i])
|
||||
++Noops;
|
||||
assert(!AnyNotSched);
|
||||
assert(Sequence.size() + DeadNodes - Noops == SUnits.size() &&
|
||||
"The number of nodes scheduled doesn't match the expected number!");
|
||||
}
|
||||
#endif
|
||||
|
@ -260,18 +260,7 @@ void ScheduleDAGList::ListScheduleTopDown() {
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Verify that all SUnits were scheduled.
|
||||
bool AnyNotSched = false;
|
||||
for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
|
||||
if (SUnits[i].NumPredsLeft != 0) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** List scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has not been scheduled!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
}
|
||||
assert(!AnyNotSched);
|
||||
VerifySchedule(/*isBottomUp=*/false);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1069,38 +1069,8 @@ void ScheduleDAGRRList::ListScheduleBottomUp() {
|
||||
// Reverse the order if it is bottom up.
|
||||
std::reverse(Sequence.begin(), Sequence.end());
|
||||
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Verify that all SUnits were scheduled.
|
||||
bool AnyNotSched = false;
|
||||
unsigned DeadNodes = 0;
|
||||
unsigned Noops = 0;
|
||||
for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
|
||||
if (!SUnits[i].isScheduled) {
|
||||
if (SUnits[i].NumPreds == 0 && SUnits[i].NumSuccs == 0) {
|
||||
++DeadNodes;
|
||||
continue;
|
||||
}
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** List scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has not been scheduled!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
if (SUnits[i].NumSuccsLeft != 0) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** List scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has successors left!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0, e = Sequence.size(); i != e; ++i)
|
||||
if (!Sequence[i])
|
||||
++Noops;
|
||||
assert(!AnyNotSched);
|
||||
assert(Sequence.size() + DeadNodes - Noops == SUnits.size() &&
|
||||
"The number of nodes scheduled doesn't match the expected number!");
|
||||
VerifySchedule(isBottomUp);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1197,43 +1167,12 @@ void ScheduleDAGRRList::ListScheduleTopDown() {
|
||||
++CurCycle;
|
||||
}
|
||||
|
||||
|
||||
#ifndef NDEBUG
|
||||
// Verify that all SUnits were scheduled.
|
||||
bool AnyNotSched = false;
|
||||
unsigned DeadNodes = 0;
|
||||
unsigned Noops = 0;
|
||||
for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
|
||||
if (!SUnits[i].isScheduled) {
|
||||
if (SUnits[i].NumPreds == 0 && SUnits[i].NumSuccs == 0) {
|
||||
++DeadNodes;
|
||||
continue;
|
||||
}
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** List scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has not been scheduled!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
if (SUnits[i].NumPredsLeft != 0) {
|
||||
if (!AnyNotSched)
|
||||
cerr << "*** List scheduling failed! ***\n";
|
||||
SUnits[i].dump(this);
|
||||
cerr << "has predecessors left!\n";
|
||||
AnyNotSched = true;
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0, e = Sequence.size(); i != e; ++i)
|
||||
if (!Sequence[i])
|
||||
++Noops;
|
||||
assert(!AnyNotSched);
|
||||
assert(Sequence.size() + DeadNodes - Noops == SUnits.size() &&
|
||||
"The number of nodes scheduled doesn't match the expected number!");
|
||||
VerifySchedule(isBottomUp);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// RegReductionPriorityQueue Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
Loading…
Reference in New Issue
Block a user