diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/PHIElimination.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/PHIElimination.cpp | 66 |
1 files changed, 45 insertions, 21 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/PHIElimination.cpp b/contrib/llvm-project/llvm/lib/CodeGen/PHIElimination.cpp index dbb9a9ffdf60..18f8c001bd78 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/PHIElimination.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/PHIElimination.cpp @@ -330,9 +330,6 @@ void PHIElimination::LowerPHINode(MachineBasicBlock &MBB, if (IncomingReg) { LiveVariables::VarInfo &VI = LV->getVarInfo(IncomingReg); - // Increment use count of the newly created virtual register. - LV->setPHIJoin(IncomingReg); - MachineInstr *OldKill = nullptr; bool IsPHICopyAfterOldKill = false; @@ -392,7 +389,7 @@ void PHIElimination::LowerPHINode(MachineBasicBlock &MBB, if (IncomingReg) { // Add the region from the beginning of MBB to the copy instruction to // IncomingReg's live interval. - LiveInterval &IncomingLI = LIS->createEmptyInterval(IncomingReg); + LiveInterval &IncomingLI = LIS->getOrCreateEmptyInterval(IncomingReg); VNInfo *IncomingVNI = IncomingLI.getVNInfoAt(MBBStartIndex); if (!IncomingVNI) IncomingVNI = IncomingLI.getNextValue(MBBStartIndex, @@ -403,24 +400,47 @@ void PHIElimination::LowerPHINode(MachineBasicBlock &MBB, } LiveInterval &DestLI = LIS->getInterval(DestReg); - assert(!DestLI.empty() && "PHIs should have nonempty LiveIntervals."); - if (DestLI.endIndex().isDead()) { - // A dead PHI's live range begins and ends at the start of the MBB, but - // the lowered copy, which will still be dead, needs to begin and end at - // the copy instruction. - VNInfo *OrigDestVNI = DestLI.getVNInfoAt(MBBStartIndex); - assert(OrigDestVNI && "PHI destination should be live at block entry."); - DestLI.removeSegment(MBBStartIndex, MBBStartIndex.getDeadSlot()); - DestLI.createDeadDef(DestCopyIndex.getRegSlot(), - LIS->getVNInfoAllocator()); - DestLI.removeValNo(OrigDestVNI); - } else { - // Otherwise, remove the region from the beginning of MBB to the copy - // instruction from DestReg's live interval. - DestLI.removeSegment(MBBStartIndex, DestCopyIndex.getRegSlot()); - VNInfo *DestVNI = DestLI.getVNInfoAt(DestCopyIndex.getRegSlot()); + assert(!DestLI.empty() && "PHIs should have non-empty LiveIntervals."); + + SlotIndex NewStart = DestCopyIndex.getRegSlot(); + + SmallVector<LiveRange *> ToUpdate({&DestLI}); + for (auto &SR : DestLI.subranges()) + ToUpdate.push_back(&SR); + + for (auto LR : ToUpdate) { + auto DestSegment = LR->find(MBBStartIndex); + assert(DestSegment != LR->end() && + "PHI destination must be live in block"); + + if (LR->endIndex().isDead()) { + // A dead PHI's live range begins and ends at the start of the MBB, but + // the lowered copy, which will still be dead, needs to begin and end at + // the copy instruction. + VNInfo *OrigDestVNI = LR->getVNInfoAt(DestSegment->start); + assert(OrigDestVNI && "PHI destination should be live at block entry."); + LR->removeSegment(DestSegment->start, DestSegment->start.getDeadSlot()); + LR->createDeadDef(NewStart, LIS->getVNInfoAllocator()); + LR->removeValNo(OrigDestVNI); + continue; + } + + // Destination copies are not inserted in the same order as the PHI nodes + // they replace. Hence the start of the live range may need to be adjusted + // to match the actual slot index of the copy. + if (DestSegment->start > NewStart) { + VNInfo *VNI = LR->getVNInfoAt(DestSegment->start); + assert(VNI && "value should be defined for known segment"); + LR->addSegment( + LiveInterval::Segment(NewStart, DestSegment->start, VNI)); + } else if (DestSegment->start < NewStart) { + assert(DestSegment->start >= MBBStartIndex); + assert(DestSegment->end >= DestCopyIndex.getRegSlot()); + LR->removeSegment(DestSegment->start, NewStart); + } + VNInfo *DestVNI = LR->getVNInfoAt(NewStart); assert(DestVNI && "PHI destination should be live at its definition."); - DestVNI->def = DestCopyIndex.getRegSlot(); + DestVNI->def = NewStart; } } @@ -615,6 +635,10 @@ void PHIElimination::LowerPHINode(MachineBasicBlock &MBB, SlotIndex LastUseIndex = LIS->getInstructionIndex(*KillInst); SrcLI.removeSegment(LastUseIndex.getRegSlot(), LIS->getMBBEndIdx(&opBlock)); + for (auto &SR : SrcLI.subranges()) { + SR.removeSegment(LastUseIndex.getRegSlot(), + LIS->getMBBEndIdx(&opBlock)); + } } } } |
