RABasic fix. Regalloc is responsible for updating block live ins.
authorAndrew Trick <atrick@apple.com>
Sat, 20 Nov 2010 02:57:05 +0000 (02:57 +0000)
committerAndrew Trick <atrick@apple.com>
Sat, 20 Nov 2010 02:57:05 +0000 (02:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119896 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocBasic.cpp

index 605180f55c8764af04675f83299ebe166a033957..76c243c743ffc64a65eb102c4cf6f64f97b0763b 100644 (file)
@@ -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<MachineBasicBlock*, 8> 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");