diff options
| author | Matthias Braun <matze@braunis.de> | 2014-12-18 19:58:52 +0000 |
|---|---|---|
| committer | Matthias Braun <matze@braunis.de> | 2014-12-18 19:58:52 +0000 |
| commit | 15abf3743ca781fc6958983c2d4cbb6324198413 (patch) | |
| tree | b56965ffb04ebd5ee5269fe058109e8e7a5a6067 /llvm/lib | |
| parent | da04fbb5351fa38d43c85f98c12ce346fc4e1bb6 (diff) | |
| download | bcm5719-llvm-15abf3743ca781fc6958983c2d4cbb6324198413.tar.gz bcm5719-llvm-15abf3743ca781fc6958983c2d4cbb6324198413.zip | |
LiveIntervalAnalysis: Cleanup computeDeadValues
- This also fixes a bug introduced in r223880 where values were not
correctly marked as Dead anymore.
- Cleanup computeDeadValues(): split up SubRange code variant, simplify
arguments.
llvm-svn: 224538
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/LiveIntervalAnalysis.cpp | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index 088ac4f7d8e..88fd7bf66e9 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -193,7 +193,7 @@ void LiveIntervals::computeVirtRegInterval(LiveInterval &LI) { assert(LI.empty() && "Should only compute empty intervals."); LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator()); LRCalc->calculate(LI); - computeDeadValues(LI, LI); + computeDeadValues(LI, nullptr); } void LiveIntervals::computeVirtRegs() { @@ -433,49 +433,46 @@ bool LiveIntervals::shrinkToUses(LiveInterval *li, createSegmentsForValues(NewLR, make_range(li->vni_begin(), li->vni_end())); extendSegmentsToUses(NewLR, *Indexes, WorkList, *li); - // Handle dead values. - bool CanSeparate; - computeDeadValues(NewLR, *li, &CanSeparate, li->reg, dead); - // Move the trimmed segments back. li->segments.swap(NewLR.segments); + + // Handle dead values. + bool CanSeparate = computeDeadValues(*li, dead); DEBUG(dbgs() << "Shrunk: " << *li << '\n'); return CanSeparate; } -void LiveIntervals::computeDeadValues(LiveRange &Segments, LiveRange &LR, - bool *CanSeparateRes, unsigned Reg, +bool LiveIntervals::computeDeadValues(LiveInterval &LI, SmallVectorImpl<MachineInstr*> *dead) { - bool CanSeparate = false; - for (auto VNI : LR.valnos) { + bool PHIRemoved = false; + for (auto VNI : LI.valnos) { if (VNI->isUnused()) continue; - LiveRange::iterator LRI = Segments.FindSegmentContaining(VNI->def); - assert(LRI != Segments.end() && "Missing segment for PHI"); - if (LRI->end != VNI->def.getDeadSlot()) + LiveRange::iterator I = LI.FindSegmentContaining(VNI->def); + assert(I != LI.end() && "Missing segment for VNI"); + if (I->end != VNI->def.getDeadSlot()) continue; if (VNI->isPHIDef()) { // This is a dead PHI. Remove it. VNI->markUnused(); - Segments.removeSegment(LRI->start, LRI->end); + LI.removeSegment(I); DEBUG(dbgs() << "Dead PHI at " << VNI->def << " may separate interval\n"); - CanSeparate = true; - } else if (dead != nullptr) { + PHIRemoved = true; + } else { // This is a dead def. Make sure the instruction knows. MachineInstr *MI = getInstructionFromIndex(VNI->def); assert(MI && "No instruction defining live value"); - MI->addRegisterDead(Reg, TRI); + MI->addRegisterDead(LI.reg, TRI); if (dead && MI->allDefsAreDead()) { DEBUG(dbgs() << "All defs dead: " << VNI->def << '\t' << *MI); dead->push_back(MI); } } } - if (CanSeparateRes != nullptr) - *CanSeparateRes = CanSeparate; + return PHIRemoved; } -bool LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) +void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) { DEBUG(dbgs() << "Shrink: " << SR << '\n'); assert(TargetRegisterInfo::isVirtualRegister(Reg) @@ -522,14 +519,26 @@ bool LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) createSegmentsForValues(NewLR, make_range(SR.vni_begin(), SR.vni_end())); extendSegmentsToUses(NewLR, *Indexes, WorkList, SR); - // Handle dead values. - bool CanSeparate; - computeDeadValues(NewLR, SR, &CanSeparate); - // Move the trimmed ranges back. SR.segments.swap(NewLR.segments); + + // Remove dead PHI value numbers + for (auto VNI : SR.valnos) { + if (VNI->isUnused()) + continue; + const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def); + assert(Segment != nullptr && "Missing segment for VNI"); + if (Segment->end != VNI->def.getDeadSlot()) + continue; + if (VNI->isPHIDef()) { + // This is a dead PHI. Remove it. + VNI->markUnused(); + SR.removeSegment(*Segment); + DEBUG(dbgs() << "Dead PHI at " << VNI->def << " may separate interval\n"); + } + } + DEBUG(dbgs() << "Shrunk: " << SR << '\n'); - return CanSeparate; } void LiveIntervals::extendToIndices(LiveRange &LR, |

