From 316df4bfe3db625a4394ff018c51d61f223aad86 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Sat, 20 Nov 2010 02:57:05 +0000 Subject: [PATCH] RABasic fix. Regalloc is responsible for updating block live ins. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119896 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/RegAllocBasic.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/lib/CodeGen/RegAllocBasic.cpp b/lib/CodeGen/RegAllocBasic.cpp index 605180f55c8..76c243c743f 100644 --- a/lib/CodeGen/RegAllocBasic.cpp +++ b/lib/CodeGen/RegAllocBasic.cpp @@ -107,6 +107,9 @@ public: virtual bool runOnMachineFunction(MachineFunction &mf); static char ID; + +private: + void addMBBLiveIns(); }; char RABasic::ID = 0; @@ -465,6 +468,31 @@ unsigned RABasic::selectOrSplit(LiveInterval &lvr, return 0; } +// Add newly allocated physical register to the MBB live in sets. +void RABasic::addMBBLiveIns() { + SmallVector liveInMBBs; + MachineBasicBlock &entryMBB = *mf_->begin(); + + for (unsigned preg = 0; preg < physReg2liu_.numRegs(); ++preg) { + LiveIntervalUnion &liu = physReg2liu_[preg]; + for (LiveIntervalUnion::SegmentIter segI = liu.begin(), segE = liu.end(); + segI != segE; ++segI) { + // Find the set of basic blocks which this range is live into... + if (lis_->findLiveInMBBs(segI->start, segI->end, liveInMBBs)) { + // And add the physreg for this interval to their live-in sets. + for (unsigned i = 0; i != liveInMBBs.size(); ++i) { + if (liveInMBBs[i] != &entryMBB) { + if (!liveInMBBs[i]->isLiveIn(preg)) { + liveInMBBs[i]->addLiveIn(preg); + } + } + } + liveInMBBs.clear(); + } + } + } +} + namespace llvm { Spiller *createInlineSpiller(MachineFunctionPass &pass, MachineFunction &mf, @@ -496,6 +524,8 @@ bool RABasic::runOnMachineFunction(MachineFunction &mf) { allocatePhysRegs(); + addMBBLiveIns(); + // Diagnostic output before rewriting DEBUG(dbgs() << "Post alloc VirtRegMap:\n" << *vrm_ << "\n"); -- 2.34.1