From 261b6330896736f674bdb2dd4556a0483f3cfe8d Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 10 Jul 2012 05:06:03 +0000 Subject: [PATCH] Teach LiveIntervals how to verify themselves and start using it in some of the trick merge routines. This adds a layer of testing that was necessary when implementing more efficient (and complex) merge logic for this datastructure. No functionality changed here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159981 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/LiveInterval.h | 9 ++++++++ lib/CodeGen/LiveInterval.cpp | 33 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/llvm/CodeGen/LiveInterval.h b/include/llvm/CodeGen/LiveInterval.h index 30acaff62b6..e26a47a6ee0 100644 --- a/include/llvm/CodeGen/LiveInterval.h +++ b/include/llvm/CodeGen/LiveInterval.h @@ -489,6 +489,15 @@ namespace llvm { void print(raw_ostream &OS) const; void dump() const; + /// \brief Walk the interval and assert if any invariants fail to hold. + /// + /// Note that this is a no-op when asserts are disabled. +#ifdef NDEBUG + void verify() const {} +#else + void verify() const; +#endif + private: Ranges::iterator addRangeFrom(LiveRange LR, Ranges::iterator From); diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp index 3d34c089b9f..e397440bd32 100644 --- a/lib/CodeGen/LiveInterval.cpp +++ b/lib/CodeGen/LiveInterval.cpp @@ -381,6 +381,8 @@ void LiveInterval::join(LiveInterval &Other, const int *RHSValNoAssignments, SmallVector &NewVNInfo, MachineRegisterInfo *MRI) { + verify(); + // Determine if any of our live range values are mapped. This is uncommon, so // we want to avoid the interval scan if not. bool MustMapCurValNos = false; @@ -456,6 +458,8 @@ void LiveInterval::join(LiveInterval &Other, assert(I->valno && "Adding a dead range?"); InsertPos = addRangeFrom(*I, InsertPos); } + + verify(); } /// MergeRangesInAsValue - Merge all of the intervals in RHS into this live @@ -464,6 +468,9 @@ void LiveInterval::join(LiveInterval &Other, /// the overlapping LiveRanges have the specified value number. void LiveInterval::MergeRangesInAsValue(const LiveInterval &RHS, VNInfo *LHSValNo) { + verify(); + RHS.verify(); + // TODO: Make this more efficient. iterator InsertPos = begin(); for (const_iterator I = RHS.begin(), E = RHS.end(); I != E; ++I) { @@ -472,6 +479,8 @@ void LiveInterval::MergeRangesInAsValue(const LiveInterval &RHS, Tmp.valno = LHSValNo; InsertPos = addRangeFrom(Tmp, InsertPos); } + + verify(); } @@ -483,6 +492,9 @@ void LiveInterval::MergeRangesInAsValue(const LiveInterval &RHS, void LiveInterval::MergeValueInAsValue( const LiveInterval &RHS, const VNInfo *RHSValNo, VNInfo *LHSValNo) { + verify(); + RHS.verify(); + // TODO: Make this more efficient. iterator InsertPos = begin(); for (const_iterator I = RHS.begin(), E = RHS.end(); I != E; ++I) { @@ -493,6 +505,8 @@ void LiveInterval::MergeValueInAsValue( Tmp.valno = LHSValNo; InsertPos = addRangeFrom(Tmp, InsertPos); } + + verify(); } @@ -575,6 +589,8 @@ void LiveInterval::Copy(const LiveInterval &RHS, const LiveRange &LR = RHS.ranges[i]; addRange(LiveRange(LR.start, LR.end, getValNumInfo(LR.valno->id))); } + + verify(); } unsigned LiveInterval::getSize() const { @@ -629,6 +645,23 @@ void LiveInterval::dump() const { dbgs() << *this << "\n"; } +#ifndef NDEBUG +void LiveInterval::verify() const { + for (const_iterator I = begin(), E = end(); I != E; ++I) { + assert(I->start.isValid()); + assert(I->end.isValid()); + assert(I->start < I->end); + assert(I->valno != 0); + assert(I->valno == valnos[I->valno->id]); + if (llvm::next(I) != E) { + assert(I->end <= llvm::next(I)->start); + if (I->end == llvm::next(I)->start) + assert(I->valno != llvm::next(I)->valno); + } + } +} +#endif + void LiveRange::print(raw_ostream &os) const { os << *this;