From: Joerg Sonnenberger Date: Sat, 10 Jan 2015 21:49:36 +0000 (+0000) Subject: Revert r225500, it leads to infinite loops. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=3073d3960a7afd74c3dbf95b4832274480d6dea4;p=oota-llvm.git Revert r225500, it leads to infinite loops. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225590 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/RegisterCoalescer.cpp b/lib/CodeGen/RegisterCoalescer.cpp index bce469c2322..d58faf65f19 100644 --- a/lib/CodeGen/RegisterCoalescer.cpp +++ b/lib/CodeGen/RegisterCoalescer.cpp @@ -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); } }