Fix for PR1596: AdjustCopiesBackFrom() should conservatively check if any of its...
authorEvan Cheng <evan.cheng@apple.com>
Tue, 14 Aug 2007 23:19:28 +0000 (23:19 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 14 Aug 2007 23:19:28 +0000 (23:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41084 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SimpleRegisterCoalescing.cpp

index fc88ffed5010852a476a5cad2fa8b08bb6344f31..93fb350e84d553a8cb96c5a9bc0f426817407420 100644 (file)
@@ -125,6 +125,19 @@ bool SimpleRegisterCoalescing::AdjustCopiesBackFrom(LiveInterval &IntA, LiveInte
   // live-range starts.  If there are no intervening live ranges between them in
   // IntB, we can merge them.
   if (ValLR+1 != BLR) return false;
+
+  // If a live interval is a physical register, conservatively check if any
+  // of its sub-registers is overlapping the live interval of the virtual
+  // register. If so, do not coalesce.
+  if (MRegisterInfo::isPhysicalRegister(IntB.reg) &&
+      *mri_->getSubRegisters(IntB.reg)) {
+    for (const unsigned* SR = mri_->getSubRegisters(IntB.reg); *SR; ++SR)
+      if (li_->hasInterval(*SR) && IntA.overlaps(li_->getInterval(*SR))) {
+        DOUT << "Interfere with sub-register ";
+        DEBUG(li_->getInterval(*SR).print(DOUT, mri_));
+        return false;
+      }
+  }
   
   DOUT << "\nExtending: "; IntB.print(DOUT, mri_);