summaryrefslogtreecommitdiff
path: root/lib/CodeGen/LiveIntervalUnion.cpp
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2010-11-09 19:01:17 +0000
committerAndrew Trick <atrick@apple.com>2010-11-09 19:01:17 +0000
commit39a5ce46a51c8e855a2f52c9f733d9d5dd8a65c4 (patch)
treede8d33781eae84fd49c167abd78e9d30e67276eb /lib/CodeGen/LiveIntervalUnion.cpp
parent5df08d8f55f47aafc671c358d971dbcc10dfdeef (diff)
downloadllvm-39a5ce46a51c8e855a2f52c9f733d9d5dd8a65c4.tar.gz
llvm-39a5ce46a51c8e855a2f52c9f733d9d5dd8a65c4.tar.bz2
llvm-39a5ce46a51c8e855a2f52c9f733d9d5dd8a65c4.tar.xz
Adds RABasic verification and tracing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118604 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalUnion.cpp')
-rw-r--r--lib/CodeGen/LiveIntervalUnion.cpp51
1 files changed, 46 insertions, 5 deletions
diff --git a/lib/CodeGen/LiveIntervalUnion.cpp b/lib/CodeGen/LiveIntervalUnion.cpp
index ec502cd51e..9d4de6a7c2 100644
--- a/lib/CodeGen/LiveIntervalUnion.cpp
+++ b/lib/CodeGen/LiveIntervalUnion.cpp
@@ -15,6 +15,7 @@
#define DEBUG_TYPE "regalloc"
#include "LiveIntervalUnion.h"
+#include "llvm/ADT/SparseBitVector.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
@@ -73,12 +74,9 @@ void LiveIntervalUnion::unify(LiveInterval &lvr) {
#ifndef NDEBUG
// check for overlap (inductively)
if (segPos != segments_.begin()) {
- SegmentIter prevPos = segPos;
- --prevPos;
- assert(prevPos->end <= segment.start && "overlapping segments" );
+ assert(prior(segPos)->end <= segment.start && "overlapping segments" );
}
- SegmentIter nextPos = segPos;
- ++nextPos;
+ SegmentIter nextPos = next(segPos);
if (nextPos != segments_.end())
assert(segment.end <= nextPos->start && "overlapping segments" );
#endif // NDEBUG
@@ -98,6 +96,49 @@ void LiveIntervalUnion::extract(const LiveInterval &lvr) {
}
}
+raw_ostream& llvm::operator<<(raw_ostream& os, const LiveSegment &ls) {
+ return os << '[' << ls.start << ',' << ls.end << ':' <<
+ ls.liveVirtReg->reg << ")";
+}
+
+void LiveSegment::dump() const {
+ dbgs() << *this << "\n";
+}
+
+void
+LiveIntervalUnion::print(raw_ostream &os,
+ const AbstractRegisterDescription *rdesc) const {
+ os << "LIU ";
+ if (rdesc != NULL)
+ os << rdesc->getName(repReg_);
+ else {
+ os << repReg_;
+ }
+ for (SegmentIter segI = segments_.begin(), segEnd = segments_.end();
+ segI != segEnd; ++segI) {
+ dbgs() << " " << *segI;
+ }
+ os << "\n";
+}
+
+void LiveIntervalUnion::dump(const AbstractRegisterDescription *rdesc) const {
+ print(dbgs(), rdesc);
+}
+
+#ifndef NDEBUG
+// Verify the live intervals in this union and add them to the visited set.
+void LiveIntervalUnion::verify(LvrBitSet& visitedVRegs) {
+ SegmentIter segI = segments_.begin();
+ SegmentIter segEnd = segments_.end();
+ if (segI == segEnd) return;
+ visitedVRegs.set(segI->liveVirtReg->reg);
+ for (++segI; segI != segEnd; ++segI) {
+ visitedVRegs.set(segI->liveVirtReg->reg);
+ assert(prior(segI)->end <= segI->start && "overlapping segments" );
+ }
+}
+#endif //!NDEBUG
+
// Private interface accessed by Query.
//
// Find a pair of segments that intersect, one in the live virtual register