Revert r225500, it leads to infinite loops.
authorJoerg Sonnenberger <joerg@bec.de>
Sat, 10 Jan 2015 21:49:36 +0000 (21:49 +0000)
committerJoerg Sonnenberger <joerg@bec.de>
Sat, 10 Jan 2015 21:49:36 +0000 (21:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225590 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegisterCoalescer.cpp

index bce469c23220097e52455f9f21791f6a8a71f432..d58faf65f19f1069f6973f317943ab6fa97cb88e 100644 (file)
@@ -621,12 +621,13 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
   // the example above.
   SlotIndex CopyIdx = LIS->getInstructionIndex(CopyMI).getRegSlot();
   VNInfo *BValNo = IntB.getVNInfoAt(CopyIdx);
-  assert(BValNo != nullptr && BValNo->def == CopyIdx);
+  if (!BValNo || BValNo->def != CopyIdx)
+    return false;
 
   // AValNo is the value number in A that defines the copy, A3 in the example.
   VNInfo *AValNo = IntA.getVNInfoAt(CopyIdx.getRegSlot(true));
-  assert(AValNo && !AValNo->isUnused() && "COPY source not live");
-  if (AValNo->isPHIDef())
+  assert(AValNo && "COPY source not live");
+  if (AValNo->isPHIDef() || AValNo->isUnused())
     return false;
   MachineInstr *DefMI = LIS->getInstructionFromIndex(AValNo->def);
   if (!DefMI)
@@ -708,8 +709,6 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
                                          UE = MRI->use_end();
        UI != UE;) {
     MachineOperand &UseMO = *UI;
-    if (UseMO.isUndef())
-      continue;
     MachineInstr *UseMI = UseMO.getParent();
     ++UI;
     if (UseMI->isDebugValue()) {
@@ -720,8 +719,7 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
     }
     SlotIndex UseIdx = LIS->getInstructionIndex(UseMI).getRegSlot(true);
     LiveInterval::iterator US = IntA.FindSegmentContaining(UseIdx);
-    assert(US != IntA.end() && "Use must be live");
-    if (US->valno != AValNo)
+    if (US == IntA.end() || US->valno != AValNo)
       continue;
     // Kill flags are no longer accurate. They are recomputed after RA.
     UseMO.setIsKill(false);
@@ -772,7 +770,11 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
     SlotIndex AIdx = CopyIdx.getRegSlot(true);
     for (LiveInterval::SubRange &SA : IntA.subranges()) {
       VNInfo *ASubValNo = SA.getVNInfoAt(AIdx);
-      assert(ASubValNo != nullptr);
+      if (ASubValNo == nullptr) {
+        DEBUG(dbgs() << "No A Range at " << AIdx << " with mask "
+              << format("%04X", SA.LaneMask) << "\n");
+        continue;
+      }
 
       unsigned AMask = SA.LaneMask;
       for (LiveInterval::SubRange &SB : IntB.subranges()) {
@@ -824,7 +826,11 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
     SlotIndex AIdx = CopyIdx.getRegSlot(true);
     for (LiveInterval::SubRange &SA : IntA.subranges()) {
       VNInfo *ASubValNo = SA.getVNInfoAt(AIdx);
-      assert(ASubValNo != nullptr);
+      if (ASubValNo == nullptr) {
+        DEBUG(dbgs() << "No A Range at " << AIdx << " with mask "
+              << format("%04X", SA.LaneMask) << "\n");
+        continue;
+      }
       SA.removeValNo(ASubValNo);
     }
   }