diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.cpp | 14 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.h | 10 |
2 files changed, 17 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp index 2d5a9d6a92c..b881c6d650e 100644 --- a/llvm/lib/CodeGen/SplitKit.cpp +++ b/llvm/lib/CodeGen/SplitKit.cpp @@ -1092,13 +1092,19 @@ static bool removeDeadSegment(SlotIndex Def, LiveRange &LR) { } void SplitEditor::extendPHIRange(MachineBasicBlock &B, LiveRangeCalc &LRC, - LiveRange &LR, ArrayRef<SlotIndex> Undefs) { + LiveRange &LR, LaneBitmask LM, + ArrayRef<SlotIndex> Undefs) { for (MachineBasicBlock *P : B.predecessors()) { SlotIndex End = LIS.getMBBEndIdx(P); SlotIndex LastUse = End.getPrevSlot(); // The predecessor may not have a live-out value. That is OK, like an // undef PHI operand. - if (Edit->getParent().liveAt(LastUse)) + LiveInterval &PLI = Edit->getParent(); + // Need the cast because the inputs to ?: would otherwise be deemed + // "incompatible": SubRange vs LiveInterval. + LiveRange &PSR = (LM != ~0u) ? getSubRangeForMask(LM, PLI) + : static_cast<LiveRange&>(PLI); + if (PSR.liveAt(LastUse)) LRC.extend(LR, End, /*PhysReg=*/0, Undefs); } } @@ -1120,7 +1126,7 @@ void SplitEditor::extendPHIKillRanges() { LiveRangeCalc &LRC = getLRCalc(RegIdx); MachineBasicBlock &B = *LIS.getMBBFromIndex(V->def); if (!removeDeadSegment(V->def, LI)) - extendPHIRange(B, LRC, LI, /*Undefs=*/{}); + extendPHIRange(B, LRC, LI, ~0u, /*Undefs=*/{}); } SmallVector<SlotIndex, 4> Undefs; @@ -1141,7 +1147,7 @@ void SplitEditor::extendPHIKillRanges() { &LIS.getVNInfoAllocator()); Undefs.clear(); LI.computeSubRangeUndefs(Undefs, PS.LaneMask, MRI, *LIS.getSlotIndexes()); - extendPHIRange(B, SubLRC, S, Undefs); + extendPHIRange(B, SubLRC, S, PS.LaneMask, Undefs); } } } diff --git a/llvm/lib/CodeGen/SplitKit.h b/llvm/lib/CodeGen/SplitKit.h index 94a1a28b9ff..a75738aaf44 100644 --- a/llvm/lib/CodeGen/SplitKit.h +++ b/llvm/lib/CodeGen/SplitKit.h @@ -386,10 +386,14 @@ private: /// Return true if any ranges were skipped. bool transferValues(); - /// Live range @p LR has a live PHI def at the beginning of block @p B. - /// Extend the range @p LR of all predecessor values that reach this def. + /// Live range @p LR corresponding to the lane Mask @p LM has a live + /// PHI def at the beginning of block @p B. Extend the range @p LR of + /// all predecessor values that reach this def. If @p LR is a subrange, + /// the array @p Undefs is the set of all locations where it is undefined + /// via <def,read-undef> in other subranges for the same register. void extendPHIRange(MachineBasicBlock &B, LiveRangeCalc &LRC, - LiveRange &LR, ArrayRef<SlotIndex>); + LiveRange &LR, LaneBitmask LM, + ArrayRef<SlotIndex> Undefs); /// extendPHIKillRanges - Extend the ranges of all values killed by original /// parent PHIDefs. |