diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/LiveInterval.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/LiveInterval.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/LiveInterval.cpp b/contrib/llvm-project/llvm/lib/CodeGen/LiveInterval.cpp index 70b2a77fe800..930dc116205a 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/LiveInterval.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/LiveInterval.cpp @@ -883,10 +883,11 @@ void LiveInterval::clearSubRanges() { static void stripValuesNotDefiningMask(unsigned Reg, LiveInterval::SubRange &SR, LaneBitmask LaneMask, const SlotIndexes &Indexes, - const TargetRegisterInfo &TRI) { + const TargetRegisterInfo &TRI, + unsigned ComposeSubRegIdx) { // Phys reg should not be tracked at subreg level. // Same for noreg (Reg == 0). - if (!TargetRegisterInfo::isVirtualRegister(Reg) || !Reg) + if (!Register::isVirtualRegister(Reg) || !Reg) return; // Remove the values that don't define those lanes. SmallVector<VNInfo *, 8> ToBeRemoved; @@ -905,7 +906,12 @@ static void stripValuesNotDefiningMask(unsigned Reg, LiveInterval::SubRange &SR, continue; if (MOI->getReg() != Reg) continue; - if ((TRI.getSubRegIndexLaneMask(MOI->getSubReg()) & LaneMask).none()) + LaneBitmask OrigMask = TRI.getSubRegIndexLaneMask(MOI->getSubReg()); + LaneBitmask ExpectedDefMask = + ComposeSubRegIdx + ? TRI.composeSubRegIndexLaneMask(ComposeSubRegIdx, OrigMask) + : OrigMask; + if ((ExpectedDefMask & LaneMask).none()) continue; hasDef = true; break; @@ -917,13 +923,15 @@ static void stripValuesNotDefiningMask(unsigned Reg, LiveInterval::SubRange &SR, for (VNInfo *VNI : ToBeRemoved) SR.removeValNo(VNI); - assert(!SR.empty() && "At least one value should be defined by this mask"); + // If the subrange is empty at this point, the MIR is invalid. Do not assert + // and let the verifier catch this case. } void LiveInterval::refineSubRanges( BumpPtrAllocator &Allocator, LaneBitmask LaneMask, std::function<void(LiveInterval::SubRange &)> Apply, - const SlotIndexes &Indexes, const TargetRegisterInfo &TRI) { + const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, + unsigned ComposeSubRegIdx) { LaneBitmask ToApply = LaneMask; for (SubRange &SR : subranges()) { LaneBitmask SRMask = SR.LaneMask; @@ -943,8 +951,10 @@ void LiveInterval::refineSubRanges( MatchingRange = createSubRangeFrom(Allocator, Matching, SR); // Now that the subrange is split in half, make sure we // only keep in the subranges the VNIs that touch the related half. - stripValuesNotDefiningMask(reg, *MatchingRange, Matching, Indexes, TRI); - stripValuesNotDefiningMask(reg, SR, SR.LaneMask, Indexes, TRI); + stripValuesNotDefiningMask(reg, *MatchingRange, Matching, Indexes, TRI, + ComposeSubRegIdx); + stripValuesNotDefiningMask(reg, SR, SR.LaneMask, Indexes, TRI, + ComposeSubRegIdx); } Apply(*MatchingRange); ToApply &= ~Matching; @@ -967,7 +977,7 @@ void LiveInterval::computeSubRangeUndefs(SmallVectorImpl<SlotIndex> &Undefs, LaneBitmask LaneMask, const MachineRegisterInfo &MRI, const SlotIndexes &Indexes) const { - assert(TargetRegisterInfo::isVirtualRegister(reg)); + assert(Register::isVirtualRegister(reg)); LaneBitmask VRegMask = MRI.getMaxLaneMaskForVReg(reg); assert((VRegMask & LaneMask).any()); const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo(); |
