From f5fef36d3aadce8cf097f525f4889550c50e6ea7 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Mon, 21 Nov 2016 20:24:12 +0000 Subject: [PATCH] Check proper live range in extendPHIRanges The function extendPHIRanges checks the main range of the original live interval, even when dealing with a subrange. This could also lead to an assert when the subrange is not live at the extension point, but the main range is. To avoid this, check the corresponding subrange of the original live range, instead of always checking the main range. Review (as a part of a bigger set of changes): https://reviews.llvm.org/D26359 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287571 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SplitKit.cpp | 14 ++++++++++---- lib/CodeGen/SplitKit.h | 10 +++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 2d5a9d6a92c..b881c6d650e 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/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 Undefs) { + LiveRange &LR, LaneBitmask LM, + ArrayRef 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(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 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/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 94a1a28b9ff..a75738aaf44 100644 --- a/lib/CodeGen/SplitKit.h +++ b/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 in other subranges for the same register. void extendPHIRange(MachineBasicBlock &B, LiveRangeCalc &LRC, - LiveRange &LR, ArrayRef); + LiveRange &LR, LaneBitmask LM, + ArrayRef Undefs); /// extendPHIKillRanges - Extend the ranges of all values killed by original /// parent PHIDefs. -- 2.50.1