Special handling of zero-sized live intervals.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 3 Apr 2008 16:40:27 +0000 (16:40 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 3 Apr 2008 16:40:27 +0000 (16:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49167 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveInterval.h
lib/CodeGen/RegAllocLinearScan.cpp

index a50fef96b3e4c0b873557f39507c2164f1242b0e..3fb0c1dc4e82ca6abbd79fbf52347ac01039d9ec 100644 (file)
@@ -275,14 +275,16 @@ namespace llvm {
 
     /// beginNumber - Return the lowest numbered slot covered by interval.
     unsigned beginNumber() const {
-      assert(!empty() && "empty interval for register");
+      if (empty())
+        return 0;
       return ranges.front().start;
     }
 
     /// endNumber - return the maximum point of the interval of the whole,
     /// exclusive.
     unsigned endNumber() const {
-      assert(!empty() && "empty interval for register");
+      if (empty())
+        return 0;
       return ranges.back().end;
     }
 
index 6925de3abf155cdfe046b15c26ff1c78b3585e4b..19c7da1d52537f50f02ee00631799f7ac495ba15 100644 (file)
@@ -322,11 +322,13 @@ void RALinScan::linearScan()
     ++NumIters;
     DOUT << "\n*** CURRENT ***: " << *cur << '\n';
 
-    processActiveIntervals(cur->beginNumber());
-    processInactiveIntervals(cur->beginNumber());
+    if (!cur->empty()) {
+      processActiveIntervals(cur->beginNumber());
+      processInactiveIntervals(cur->beginNumber());
 
-    assert(TargetRegisterInfo::isVirtualRegister(cur->reg) &&
-           "Can only allocate virtual registers!");
+      assert(TargetRegisterInfo::isVirtualRegister(cur->reg) &&
+             "Can only allocate virtual registers!");
+    }
 
     // Allocating a virtual register. try to find a free
     // physical register or spill an interval (possibly this one) in order to
@@ -508,11 +510,23 @@ void RALinScan::assignRegOrStackSlotAtInterval(LiveInterval* cur)
 {
   DOUT << "\tallocating current interval: ";
 
+  // This is an implicitly defined live interval, just assign any register.
+  const TargetRegisterClass *RC = reginfo_->getRegClass(cur->reg);
+  if (cur->empty()) {
+    unsigned physReg = cur->preference;
+    if (!physReg)
+      physReg = *RC->allocation_order_begin(*mf_);
+    DOUT <<  tri_->getName(physReg) << '\n';
+    // Note the register is not really in use.
+    vrm_->assignVirt2Phys(cur->reg, physReg);
+    handled_.push_back(cur);
+    return;
+  }
+
   PhysRegTracker backupPrt = *prt_;
 
   std::vector<std::pair<unsigned, float> > SpillWeightsToAdd;
   unsigned StartPosition = cur->beginNumber();
-  const TargetRegisterClass *RC = reginfo_->getRegClass(cur->reg);
   const TargetRegisterClass *RCLeader = RelatedRegClasses.getLeaderValue(RC);
 
   // If this live interval is defined by a move instruction and its source is