diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 13:13:10 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-12-30 13:13:10 +0000 | 
| commit | 7d523365ff1a3cc95bc058b33102500f61e8166d (patch) | |
| tree | b466a4817f79516eb1df8eae92bccf62ecc84003 /contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp | |
| parent | e3b65fde506060bec5cd110fcf03b440bd0eea1d (diff) | |
| parent | dd58ef019b700900793a1eb48b52123db01b654e (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp | 37 | 
1 files changed, 15 insertions, 22 deletions
diff --git a/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp b/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp index 08bbe0c3f379..5ce364ae661e 100644 --- a/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp +++ b/contrib/llvm/lib/CodeGen/LiveRangeEdit.cpp @@ -226,7 +226,7 @@ bool LiveRangeEdit::useIsKill(const LiveInterval &LI,      return true;    const TargetRegisterInfo &TRI = *MRI.getTargetRegisterInfo();    unsigned SubReg = MO.getSubReg(); -  unsigned LaneMask = TRI.getSubRegIndexLaneMask(SubReg); +  LaneBitmask LaneMask = TRI.getSubRegIndexLaneMask(SubReg);    for (const LiveInterval::SubRange &S : LI.subranges()) {      if ((S.LaneMask & LaneMask) != 0 && S.Query(Idx).isKill())        return true; @@ -349,8 +349,9 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,      ToShrink.pop_back();      if (foldAsLoad(LI, Dead))        continue; +    unsigned VReg = LI->reg;      if (TheDelegate) -      TheDelegate->LRE_WillShrinkVirtReg(LI->reg); +      TheDelegate->LRE_WillShrinkVirtReg(VReg);      if (!LIS.shrinkToUses(LI, &Dead))        continue; @@ -360,7 +361,7 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,      // them results in incorrect code.      bool BeingSpilled = false;      for (unsigned i = 0, e = RegsBeingSpilled.size(); i != e; ++i) { -      if (LI->reg == RegsBeingSpilled[i]) { +      if (VReg == RegsBeingSpilled[i]) {          BeingSpilled = true;          break;        } @@ -370,29 +371,21 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,      // LI may have been separated, create new intervals.      LI->RenumberValues(); -    ConnectedVNInfoEqClasses ConEQ(LIS); -    unsigned NumComp = ConEQ.Classify(LI); -    if (NumComp <= 1) -      continue; -    ++NumFracRanges; -    bool IsOriginal = VRM && VRM->getOriginal(LI->reg) == LI->reg; -    DEBUG(dbgs() << NumComp << " components: " << *LI << '\n'); -    SmallVector<LiveInterval*, 8> Dups(1, LI); -    for (unsigned i = 1; i != NumComp; ++i) { -      Dups.push_back(&createEmptyIntervalFrom(LI->reg)); +    SmallVector<LiveInterval*, 8> SplitLIs; +    LIS.splitSeparateComponents(*LI, SplitLIs); +    if (!SplitLIs.empty()) +      ++NumFracRanges; + +    unsigned Original = VRM ? VRM->getOriginal(VReg) : 0; +    for (const LiveInterval *SplitLI : SplitLIs) {        // If LI is an original interval that hasn't been split yet, make the new        // intervals their own originals instead of referring to LI. The original        // interval must contain all the split products, and LI doesn't. -      if (IsOriginal) -        VRM->setIsSplitFromReg(Dups.back()->reg, 0); +      if (Original != VReg && Original != 0) +        VRM->setIsSplitFromReg(SplitLI->reg, Original);        if (TheDelegate) -        TheDelegate->LRE_DidCloneVirtReg(Dups.back()->reg, LI->reg); +        TheDelegate->LRE_DidCloneVirtReg(SplitLI->reg, VReg);      } -    ConEQ.Distribute(&Dups[0], MRI); -    DEBUG({ -      for (unsigned i = 0; i != NumComp; ++i) -        dbgs() << '\t' << *Dups[i] << '\n'; -    });    }  } @@ -411,7 +404,7 @@ void  LiveRangeEdit::calculateRegClassAndHint(MachineFunction &MF,                                          const MachineLoopInfo &Loops,                                          const MachineBlockFrequencyInfo &MBFI) { -  VirtRegAuxInfo VRAI(MF, LIS, Loops, MBFI); +  VirtRegAuxInfo VRAI(MF, LIS, VRM, Loops, MBFI);    for (unsigned I = 0, Size = size(); I < Size; ++I) {      LiveInterval &LI = LIS.getInterval(get(I));      if (MRI.recomputeRegClass(LI.reg))  | 
