From 9d29cbad32814f31c91cd2464a3c74df412b0aac Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Sat, 9 Apr 2011 02:59:05 +0000 Subject: Precompute interference for neighbor blocks as long as there is no interference. This doesn't require seeking in the live interval union, so it is very cheap. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129187 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/InterferenceCache.cpp | 53 +++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 21 deletions(-) (limited to 'lib/CodeGen/InterferenceCache.cpp') diff --git a/lib/CodeGen/InterferenceCache.cpp b/lib/CodeGen/InterferenceCache.cpp index 0aff128c16..b1014a97fa 100644 --- a/lib/CodeGen/InterferenceCache.cpp +++ b/lib/CodeGen/InterferenceCache.cpp @@ -26,7 +26,7 @@ void InterferenceCache::init(MachineFunction *mf, TRI = tri; PhysRegEntries.assign(TRI->getNumRegs(), 0); for (unsigned i = 0; i != CacheEntries; ++i) - Entries[i].clear(indexes); + Entries[i].clear(mf, indexes); } InterferenceCache::Entry *InterferenceCache::get(unsigned PhysReg) { @@ -91,10 +91,6 @@ bool InterferenceCache::Entry::valid(LiveIntervalUnion *LIUArray, } void InterferenceCache::Entry::update(unsigned MBBNum) { - BlockInterference *BI = &Blocks[MBBNum]; - BI->Tag = Tag; - BI->First = BI->Last = SlotIndex(); - SlotIndex Start, Stop; tie(Start, Stop) = Indexes->getMBBRange(MBBNum); @@ -109,23 +105,39 @@ void InterferenceCache::Entry::update(unsigned MBBNum) { PrevPos = Start; } - // Check for first interference. - for (unsigned i = 0, e = Iters.size(); i != e; ++i) { - Iter &I = Iters[i]; - if (!I.valid()) - continue; - SlotIndex StartI = I.start(); - if (StartI >= Stop) - continue; - if (!BI->First.isValid() || StartI < BI->First) - BI->First = StartI; - } + MachineFunction::const_iterator MFI = MF->getBlockNumbered(MBBNum); + BlockInterference *BI = &Blocks[MBBNum]; + for (;;) { + BI->Tag = Tag; + BI->First = BI->Last = SlotIndex(); + + // Check for first interference. + for (unsigned i = 0, e = Iters.size(); i != e; ++i) { + Iter &I = Iters[i]; + if (!I.valid()) + continue; + SlotIndex StartI = I.start(); + if (StartI >= Stop) + continue; + if (!BI->First.isValid() || StartI < BI->First) + BI->First = StartI; + } - // No interference in block. - if (!BI->First.isValid()) - return; + PrevPos = Stop; + if (BI->First.isValid()) + break; + + // No interference in this block? Go ahead and precompute the next block. + if (++MFI == MF->end()) + return; + MBBNum = MFI->getNumber(); + BI = &Blocks[MBBNum]; + if (BI->Tag == Tag) + return; + tie(Start, Stop) = Indexes->getMBBRange(MBBNum); + } - // Check for last interference. + // Check for last interference in block. for (unsigned i = 0, e = Iters.size(); i != e; ++i) { Iter &I = Iters[i]; if (!I.valid() || I.start() >= Stop) @@ -140,5 +152,4 @@ void InterferenceCache::Entry::update(unsigned MBBNum) { if (Backup) ++I; } - PrevPos = Stop; } -- cgit v1.2.3-18-g5258