1 //===- LiveIntervals.cpp - Live Interval Analysis -------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 /// \file This file implements the LiveInterval analysis pass which is used
11 /// by the Linear Scan Register allocator. This pass linearizes the
12 /// basic blocks of the function in DFS order and computes live intervals for
13 /// each virtual and physical register.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #include "llvm/CodeGen/LiveIntervals.h"
18 #include "LiveRangeCalc.h"
19 #include "llvm/ADT/ArrayRef.h"
20 #include "llvm/ADT/DepthFirstIterator.h"
21 #include "llvm/ADT/SmallPtrSet.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/ADT/iterator_range.h"
24 #include "llvm/Analysis/AliasAnalysis.h"
25 #include "llvm/CodeGen/LiveInterval.h"
26 #include "llvm/CodeGen/LiveVariables.h"
27 #include "llvm/CodeGen/MachineBasicBlock.h"
28 #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
29 #include "llvm/CodeGen/MachineDominators.h"
30 #include "llvm/CodeGen/MachineFunction.h"
31 #include "llvm/CodeGen/MachineInstr.h"
32 #include "llvm/CodeGen/MachineInstrBundle.h"
33 #include "llvm/CodeGen/MachineOperand.h"
34 #include "llvm/CodeGen/MachineRegisterInfo.h"
35 #include "llvm/CodeGen/Passes.h"
36 #include "llvm/CodeGen/SlotIndexes.h"
37 #include "llvm/CodeGen/TargetRegisterInfo.h"
38 #include "llvm/CodeGen/TargetSubtargetInfo.h"
39 #include "llvm/CodeGen/VirtRegMap.h"
40 #include "llvm/Config/llvm-config.h"
41 #include "llvm/MC/LaneBitmask.h"
42 #include "llvm/MC/MCRegisterInfo.h"
43 #include "llvm/Pass.h"
44 #include "llvm/Support/BlockFrequency.h"
45 #include "llvm/Support/CommandLine.h"
46 #include "llvm/Support/Compiler.h"
47 #include "llvm/Support/Debug.h"
48 #include "llvm/Support/MathExtras.h"
49 #include "llvm/Support/raw_ostream.h"
50 #include <algorithm>
51 #include <cassert>
52 #include <cstdint>
53 #include <iterator>
54 #include <tuple>
55 #include <utility>
56
57 using namespace llvm;
58
59 #define DEBUG_TYPE "regalloc"
60
61 char LiveIntervals::ID = 0;
62 char &llvm::LiveIntervalsID = LiveIntervals::ID;
63 INITIALIZE_PASS_BEGIN(LiveIntervals, "liveintervals",
64 "Live Interval Analysis", false, false)
65 INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
66 INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
67 INITIALIZE_PASS_DEPENDENCY(SlotIndexes)
68 INITIALIZE_PASS_END(LiveIntervals, "liveintervals",
69 "Live Interval Analysis", false, false)
70
71 #ifndef NDEBUG
72 static cl::opt<bool> EnablePrecomputePhysRegs(
73 "precompute-phys-liveness", cl::Hidden,
74 cl::desc("Eagerly compute live intervals for all physreg units."));
75 #else
76 static bool EnablePrecomputePhysRegs = false;
77 #endif // NDEBUG
78
79 namespace llvm {
80
81 cl::opt<bool> UseSegmentSetForPhysRegs(
82 "use-segment-set-for-physregs", cl::Hidden, cl::init(true),
83 cl::desc(
84 "Use segment set for the computation of the live ranges of physregs."));
85
86 } // end namespace llvm
87
getAnalysisUsage(AnalysisUsage & AU) const88 void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
89 AU.setPreservesCFG();
90 AU.addRequired<AAResultsWrapperPass>();
91 AU.addPreserved<AAResultsWrapperPass>();
92 AU.addPreserved<LiveVariables>();
93 AU.addPreservedID(MachineLoopInfoID);
94 AU.addRequiredTransitiveID(MachineDominatorsID);
95 AU.addPreservedID(MachineDominatorsID);
96 AU.addPreserved<SlotIndexes>();
97 AU.addRequiredTransitive<SlotIndexes>();
98 MachineFunctionPass::getAnalysisUsage(AU);
99 }
100
LiveIntervals()101 LiveIntervals::LiveIntervals() : MachineFunctionPass(ID) {
102 initializeLiveIntervalsPass(*PassRegistry::getPassRegistry());
103 }
104
~LiveIntervals()105 LiveIntervals::~LiveIntervals() {
106 delete LRCalc;
107 }
108
releaseMemory()109 void LiveIntervals::releaseMemory() {
110 // Free the live intervals themselves.
111 for (unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i)
112 delete VirtRegIntervals[TargetRegisterInfo::index2VirtReg(i)];
113 VirtRegIntervals.clear();
114 RegMaskSlots.clear();
115 RegMaskBits.clear();
116 RegMaskBlocks.clear();
117
118 for (LiveRange *LR : RegUnitRanges)
119 delete LR;
120 RegUnitRanges.clear();
121
122 // Release VNInfo memory regions, VNInfo objects don't need to be dtor'd.
123 VNInfoAllocator.Reset();
124 }
125
runOnMachineFunction(MachineFunction & fn)126 bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) {
127 MF = &fn;
128 MRI = &MF->getRegInfo();
129 TRI = MF->getSubtarget().getRegisterInfo();
130 TII = MF->getSubtarget().getInstrInfo();
131 AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
132 Indexes = &getAnalysis<SlotIndexes>();
133 DomTree = &getAnalysis<MachineDominatorTree>();
134
135 if (!LRCalc)
136 LRCalc = new LiveRangeCalc();
137
138 // Allocate space for all virtual registers.
139 VirtRegIntervals.resize(MRI->getNumVirtRegs());
140
141 computeVirtRegs();
142 computeRegMasks();
143 computeLiveInRegUnits();
144
145 if (EnablePrecomputePhysRegs) {
146 // For stress testing, precompute live ranges of all physical register
147 // units, including reserved registers.
148 for (unsigned i = 0, e = TRI->getNumRegUnits(); i != e; ++i)
149 getRegUnit(i);
150 }
151 LLVM_DEBUG(dump());
152 return true;
153 }
154
print(raw_ostream & OS,const Module *) const155 void LiveIntervals::print(raw_ostream &OS, const Module* ) const {
156 OS << "********** INTERVALS **********\n";
157
158 // Dump the regunits.
159 for (unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit)
160 if (LiveRange *LR = RegUnitRanges[Unit])
161 OS << printRegUnit(Unit, TRI) << ' ' << *LR << '\n';
162
163 // Dump the virtregs.
164 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
165 unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
166 if (hasInterval(Reg))
167 OS << getInterval(Reg) << '\n';
168 }
169
170 OS << "RegMasks:";
171 for (SlotIndex Idx : RegMaskSlots)
172 OS << ' ' << Idx;
173 OS << '\n';
174
175 printInstrs(OS);
176 }
177
printInstrs(raw_ostream & OS) const178 void LiveIntervals::printInstrs(raw_ostream &OS) const {
179 OS << "********** MACHINEINSTRS **********\n";
180 MF->print(OS, Indexes);
181 }
182
183 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dumpInstrs() const184 LLVM_DUMP_METHOD void LiveIntervals::dumpInstrs() const {
185 printInstrs(dbgs());
186 }
187 #endif
188
createInterval(unsigned reg)189 LiveInterval* LiveIntervals::createInterval(unsigned reg) {
190 float Weight = TargetRegisterInfo::isPhysicalRegister(reg) ? huge_valf : 0.0F;
191 return new LiveInterval(reg, Weight);
192 }
193
194 /// Compute the live interval of a virtual register, based on defs and uses.
computeVirtRegInterval(LiveInterval & LI)195 void LiveIntervals::computeVirtRegInterval(LiveInterval &LI) {
196 assert(LRCalc && "LRCalc not initialized.");
197 assert(LI.empty() && "Should only compute empty intervals.");
198 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
199 LRCalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg));
200 computeDeadValues(LI, nullptr);
201 }
202
computeVirtRegs()203 void LiveIntervals::computeVirtRegs() {
204 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
205 unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
206 if (MRI->reg_nodbg_empty(Reg))
207 continue;
208 createAndComputeVirtRegInterval(Reg);
209 }
210 }
211
computeRegMasks()212 void LiveIntervals::computeRegMasks() {
213 RegMaskBlocks.resize(MF->getNumBlockIDs());
214
215 // Find all instructions with regmask operands.
216 for (const MachineBasicBlock &MBB : *MF) {
217 std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()];
218 RMB.first = RegMaskSlots.size();
219
220 // Some block starts, such as EH funclets, create masks.
221 if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) {
222 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
223 RegMaskBits.push_back(Mask);
224 }
225
226 for (const MachineInstr &MI : MBB) {
227 for (const MachineOperand &MO : MI.operands()) {
228 if (!MO.isRegMask())
229 continue;
230 RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot());
231 RegMaskBits.push_back(MO.getRegMask());
232 }
233 }
234
235 // Some block ends, such as funclet returns, create masks. Put the mask on
236 // the last instruction of the block, because MBB slot index intervals are
237 // half-open.
238 if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) {
239 assert(!MBB.empty() && "empty return block?");
240 RegMaskSlots.push_back(
241 Indexes->getInstructionIndex(MBB.back()).getRegSlot());
242 RegMaskBits.push_back(Mask);
243 }
244
245 // Compute the number of register mask instructions in this block.
246 RMB.second = RegMaskSlots.size() - RMB.first;
247 }
248 }
249
250 //===----------------------------------------------------------------------===//
251 // Register Unit Liveness
252 //===----------------------------------------------------------------------===//
253 //
254 // Fixed interference typically comes from ABI boundaries: Function arguments
255 // and return values are passed in fixed registers, and so are exception
256 // pointers entering landing pads. Certain instructions require values to be
257 // present in specific registers. That is also represented through fixed
258 // interference.
259 //
260
261 /// Compute the live range of a register unit, based on the uses and defs of
262 /// aliasing registers. The range should be empty, or contain only dead
263 /// phi-defs from ABI blocks.
computeRegUnitRange(LiveRange & LR,unsigned Unit)264 void LiveIntervals::computeRegUnitRange(LiveRange &LR, unsigned Unit) {
265 assert(LRCalc && "LRCalc not initialized.");
266 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
267
268 // The physregs aliasing Unit are the roots and their super-registers.
269 // Create all values as dead defs before extending to uses. Note that roots
270 // may share super-registers. That's OK because createDeadDefs() is
271 // idempotent. It is very rare for a register unit to have multiple roots, so
272 // uniquing super-registers is probably not worthwhile.
273 bool IsReserved = false;
274 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
275 bool IsRootReserved = true;
276 for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);
277 Super.isValid(); ++Super) {
278 unsigned Reg = *Super;
279 if (!MRI->reg_empty(Reg))
280 LRCalc->createDeadDefs(LR, Reg);
281 // A register unit is considered reserved if all its roots and all their
282 // super registers are reserved.
283 if (!MRI->isReserved(Reg))
284 IsRootReserved = false;
285 }
286 IsReserved |= IsRootReserved;
287 }
288 assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
289 "reserved computation mismatch");
290
291 // Now extend LR to reach all uses.
292 // Ignore uses of reserved registers. We only track defs of those.
293 if (!IsReserved) {
294 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
295 for (MCSuperRegIterator Super(*Root, TRI, /*IncludeSelf=*/true);
296 Super.isValid(); ++Super) {
297 unsigned Reg = *Super;
298 if (!MRI->reg_empty(Reg))
299 LRCalc->extendToUses(LR, Reg);
300 }
301 }
302 }
303
304 // Flush the segment set to the segment vector.
305 if (UseSegmentSetForPhysRegs)
306 LR.flushSegmentSet();
307 }
308
309 /// Precompute the live ranges of any register units that are live-in to an ABI
310 /// block somewhere. Register values can appear without a corresponding def when
311 /// entering the entry block or a landing pad.
computeLiveInRegUnits()312 void LiveIntervals::computeLiveInRegUnits() {
313 RegUnitRanges.resize(TRI->getNumRegUnits());
314 LLVM_DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n");
315
316 // Keep track of the live range sets allocated.
317 SmallVector<unsigned, 8> NewRanges;
318
319 // Check all basic blocks for live-ins.
320 for (const MachineBasicBlock &MBB : *MF) {
321 // We only care about ABI blocks: Entry + landing pads.
322 if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty())
323 continue;
324
325 // Create phi-defs at Begin for all live-in registers.
326 SlotIndex Begin = Indexes->getMBBStartIdx(&MBB);
327 LLVM_DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB));
328 for (const auto &LI : MBB.liveins()) {
329 for (MCRegUnitIterator Units(LI.PhysReg, TRI); Units.isValid(); ++Units) {
330 unsigned Unit = *Units;
331 LiveRange *LR = RegUnitRanges[Unit];
332 if (!LR) {
333 // Use segment set to speed-up initial computation of the live range.
334 LR = RegUnitRanges[Unit] = new LiveRange(UseSegmentSetForPhysRegs);
335 NewRanges.push_back(Unit);
336 }
337 VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator());
338 (void)VNI;
339 LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id);
340 }
341 }
342 LLVM_DEBUG(dbgs() << '\n');
343 }
344 LLVM_DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n");
345
346 // Compute the 'normal' part of the ranges.
347 for (unsigned Unit : NewRanges)
348 computeRegUnitRange(*RegUnitRanges[Unit], Unit);
349 }
350
createSegmentsForValues(LiveRange & LR,iterator_range<LiveInterval::vni_iterator> VNIs)351 static void createSegmentsForValues(LiveRange &LR,
352 iterator_range<LiveInterval::vni_iterator> VNIs) {
353 for (VNInfo *VNI : VNIs) {
354 if (VNI->isUnused())
355 continue;
356 SlotIndex Def = VNI->def;
357 LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI));
358 }
359 }
360
extendSegmentsToUses(LiveRange & Segments,ShrinkToUsesWorkList & WorkList,unsigned Reg,LaneBitmask LaneMask)361 void LiveIntervals::extendSegmentsToUses(LiveRange &Segments,
362 ShrinkToUsesWorkList &WorkList,
363 unsigned Reg, LaneBitmask LaneMask) {
364 // Keep track of the PHIs that are in use.
365 SmallPtrSet<VNInfo*, 8> UsedPHIs;
366 // Blocks that have already been added to WorkList as live-out.
367 SmallPtrSet<const MachineBasicBlock*, 16> LiveOut;
368
369 auto getSubRange = [](const LiveInterval &I, LaneBitmask M)
370 -> const LiveRange& {
371 if (M.none())
372 return I;
373 for (const LiveInterval::SubRange &SR : I.subranges()) {
374 if ((SR.LaneMask & M).any()) {
375 assert(SR.LaneMask == M && "Expecting lane masks to match exactly");
376 return SR;
377 }
378 }
379 llvm_unreachable("Subrange for mask not found");
380 };
381
382 const LiveInterval &LI = getInterval(Reg);
383 const LiveRange &OldRange = getSubRange(LI, LaneMask);
384
385 // Extend intervals to reach all uses in WorkList.
386 while (!WorkList.empty()) {
387 SlotIndex Idx = WorkList.back().first;
388 VNInfo *VNI = WorkList.back().second;
389 WorkList.pop_back();
390 const MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Idx.getPrevSlot());
391 SlotIndex BlockStart = Indexes->getMBBStartIdx(MBB);
392
393 // Extend the live range for VNI to be live at Idx.
394 if (VNInfo *ExtVNI = Segments.extendInBlock(BlockStart, Idx)) {
395 assert(ExtVNI == VNI && "Unexpected existing value number");
396 (void)ExtVNI;
397 // Is this a PHIDef we haven't seen before?
398 if (!VNI->isPHIDef() || VNI->def != BlockStart ||
399 !UsedPHIs.insert(VNI).second)
400 continue;
401 // The PHI is live, make sure the predecessors are live-out.
402 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
403 if (!LiveOut.insert(Pred).second)
404 continue;
405 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
406 // A predecessor is not required to have a live-out value for a PHI.
407 if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop))
408 WorkList.push_back(std::make_pair(Stop, PVNI));
409 }
410 continue;
411 }
412
413 // VNI is live-in to MBB.
414 LLVM_DEBUG(dbgs() << " live-in at " << BlockStart << '\n');
415 Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
416
417 // Make sure VNI is live-out from the predecessors.
418 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
419 if (!LiveOut.insert(Pred).second)
420 continue;
421 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
422 if (VNInfo *OldVNI = OldRange.getVNInfoBefore(Stop)) {
423 assert(OldVNI == VNI && "Wrong value out of predecessor");
424 (void)OldVNI;
425 WorkList.push_back(std::make_pair(Stop, VNI));
426 } else {
427 #ifndef NDEBUG
428 // There was no old VNI. Verify that Stop is jointly dominated
429 // by <undef>s for this live range.
430 assert(LaneMask.any() &&
431 "Missing value out of predecessor for main range");
432 SmallVector<SlotIndex,8> Undefs;
433 LI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
434 assert(LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes) &&
435 "Missing value out of predecessor for subrange");
436 #endif
437 }
438 }
439 }
440 }
441
shrinkToUses(LiveInterval * li,SmallVectorImpl<MachineInstr * > * dead)442 bool LiveIntervals::shrinkToUses(LiveInterval *li,
443 SmallVectorImpl<MachineInstr*> *dead) {
444 LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n');
445 assert(TargetRegisterInfo::isVirtualRegister(li->reg)
446 && "Can only shrink virtual registers");
447
448 // Shrink subregister live ranges.
449 bool NeedsCleanup = false;
450 for (LiveInterval::SubRange &S : li->subranges()) {
451 shrinkToUses(S, li->reg);
452 if (S.empty())
453 NeedsCleanup = true;
454 }
455 if (NeedsCleanup)
456 li->removeEmptySubRanges();
457
458 // Find all the values used, including PHI kills.
459 ShrinkToUsesWorkList WorkList;
460
461 // Visit all instructions reading li->reg.
462 unsigned Reg = li->reg;
463 for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) {
464 if (UseMI.isDebugValue() || !UseMI.readsVirtualRegister(Reg))
465 continue;
466 SlotIndex Idx = getInstructionIndex(UseMI).getRegSlot();
467 LiveQueryResult LRQ = li->Query(Idx);
468 VNInfo *VNI = LRQ.valueIn();
469 if (!VNI) {
470 // This shouldn't happen: readsVirtualRegister returns true, but there is
471 // no live value. It is likely caused by a target getting <undef> flags
472 // wrong.
473 LLVM_DEBUG(
474 dbgs() << Idx << '\t' << UseMI
475 << "Warning: Instr claims to read non-existent value in "
476 << *li << '\n');
477 continue;
478 }
479 // Special case: An early-clobber tied operand reads and writes the
480 // register one slot early.
481 if (VNInfo *DefVNI = LRQ.valueDefined())
482 Idx = DefVNI->def;
483
484 WorkList.push_back(std::make_pair(Idx, VNI));
485 }
486
487 // Create new live ranges with only minimal live segments per def.
488 LiveRange NewLR;
489 createSegmentsForValues(NewLR, make_range(li->vni_begin(), li->vni_end()));
490 extendSegmentsToUses(NewLR, WorkList, Reg, LaneBitmask::getNone());
491
492 // Move the trimmed segments back.
493 li->segments.swap(NewLR.segments);
494
495 // Handle dead values.
496 bool CanSeparate = computeDeadValues(*li, dead);
497 LLVM_DEBUG(dbgs() << "Shrunk: " << *li << '\n');
498 return CanSeparate;
499 }
500
computeDeadValues(LiveInterval & LI,SmallVectorImpl<MachineInstr * > * dead)501 bool LiveIntervals::computeDeadValues(LiveInterval &LI,
502 SmallVectorImpl<MachineInstr*> *dead) {
503 bool MayHaveSplitComponents = false;
504 for (VNInfo *VNI : LI.valnos) {
505 if (VNI->isUnused())
506 continue;
507 SlotIndex Def = VNI->def;
508 LiveRange::iterator I = LI.FindSegmentContaining(Def);
509 assert(I != LI.end() && "Missing segment for VNI");
510
511 // Is the register live before? Otherwise we may have to add a read-undef
512 // flag for subregister defs.
513 unsigned VReg = LI.reg;
514 if (MRI->shouldTrackSubRegLiveness(VReg)) {
515 if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
516 MachineInstr *MI = getInstructionFromIndex(Def);
517 MI->setRegisterDefReadUndef(VReg);
518 }
519 }
520
521 if (I->end != Def.getDeadSlot())
522 continue;
523 if (VNI->isPHIDef()) {
524 // This is a dead PHI. Remove it.
525 VNI->markUnused();
526 LI.removeSegment(I);
527 LLVM_DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n");
528 MayHaveSplitComponents = true;
529 } else {
530 // This is a dead def. Make sure the instruction knows.
531 MachineInstr *MI = getInstructionFromIndex(Def);
532 assert(MI && "No instruction defining live value");
533 MI->addRegisterDead(LI.reg, TRI);
534 if (dead && MI->allDefsAreDead()) {
535 LLVM_DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI);
536 dead->push_back(MI);
537 }
538 }
539 }
540 return MayHaveSplitComponents;
541 }
542
shrinkToUses(LiveInterval::SubRange & SR,unsigned Reg)543 void LiveIntervals::shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg) {
544 LLVM_DEBUG(dbgs() << "Shrink: " << SR << '\n');
545 assert(TargetRegisterInfo::isVirtualRegister(Reg)
546 && "Can only shrink virtual registers");
547 // Find all the values used, including PHI kills.
548 ShrinkToUsesWorkList WorkList;
549
550 // Visit all instructions reading Reg.
551 SlotIndex LastIdx;
552 for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
553 // Skip "undef" uses.
554 if (!MO.readsReg())
555 continue;
556 // Maybe the operand is for a subregister we don't care about.
557 unsigned SubReg = MO.getSubReg();
558 if (SubReg != 0) {
559 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
560 if ((LaneMask & SR.LaneMask).none())
561 continue;
562 }
563 // We only need to visit each instruction once.
564 MachineInstr *UseMI = MO.getParent();
565 SlotIndex Idx = getInstructionIndex(*UseMI).getRegSlot();
566 if (Idx == LastIdx)
567 continue;
568 LastIdx = Idx;
569
570 LiveQueryResult LRQ = SR.Query(Idx);
571 VNInfo *VNI = LRQ.valueIn();
572 // For Subranges it is possible that only undef values are left in that
573 // part of the subregister, so there is no real liverange at the use
574 if (!VNI)
575 continue;
576
577 // Special case: An early-clobber tied operand reads and writes the
578 // register one slot early.
579 if (VNInfo *DefVNI = LRQ.valueDefined())
580 Idx = DefVNI->def;
581
582 WorkList.push_back(std::make_pair(Idx, VNI));
583 }
584
585 // Create a new live ranges with only minimal live segments per def.
586 LiveRange NewLR;
587 createSegmentsForValues(NewLR, make_range(SR.vni_begin(), SR.vni_end()));
588 extendSegmentsToUses(NewLR, WorkList, Reg, SR.LaneMask);
589
590 // Move the trimmed ranges back.
591 SR.segments.swap(NewLR.segments);
592
593 // Remove dead PHI value numbers
594 for (VNInfo *VNI : SR.valnos) {
595 if (VNI->isUnused())
596 continue;
597 const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def);
598 assert(Segment != nullptr && "Missing segment for VNI");
599 if (Segment->end != VNI->def.getDeadSlot())
600 continue;
601 if (VNI->isPHIDef()) {
602 // This is a dead PHI. Remove it.
603 LLVM_DEBUG(dbgs() << "Dead PHI at " << VNI->def
604 << " may separate interval\n");
605 VNI->markUnused();
606 SR.removeSegment(*Segment);
607 }
608 }
609
610 LLVM_DEBUG(dbgs() << "Shrunk: " << SR << '\n');
611 }
612
extendToIndices(LiveRange & LR,ArrayRef<SlotIndex> Indices,ArrayRef<SlotIndex> Undefs)613 void LiveIntervals::extendToIndices(LiveRange &LR,
614 ArrayRef<SlotIndex> Indices,
615 ArrayRef<SlotIndex> Undefs) {
616 assert(LRCalc && "LRCalc not initialized.");
617 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
618 for (SlotIndex Idx : Indices)
619 LRCalc->extend(LR, Idx, /*PhysReg=*/0, Undefs);
620 }
621
pruneValue(LiveRange & LR,SlotIndex Kill,SmallVectorImpl<SlotIndex> * EndPoints)622 void LiveIntervals::pruneValue(LiveRange &LR, SlotIndex Kill,
623 SmallVectorImpl<SlotIndex> *EndPoints) {
624 LiveQueryResult LRQ = LR.Query(Kill);
625 VNInfo *VNI = LRQ.valueOutOrDead();
626 if (!VNI)
627 return;
628
629 MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill);
630 SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
631
632 // If VNI isn't live out from KillMBB, the value is trivially pruned.
633 if (LRQ.endPoint() < MBBEnd) {
634 LR.removeSegment(Kill, LRQ.endPoint());
635 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
636 return;
637 }
638
639 // VNI is live out of KillMBB.
640 LR.removeSegment(Kill, MBBEnd);
641 if (EndPoints) EndPoints->push_back(MBBEnd);
642
643 // Find all blocks that are reachable from KillMBB without leaving VNI's live
644 // range. It is possible that KillMBB itself is reachable, so start a DFS
645 // from each successor.
646 using VisitedTy = df_iterator_default_set<MachineBasicBlock*,9>;
647 VisitedTy Visited;
648 for (MachineBasicBlock *Succ : KillMBB->successors()) {
649 for (df_ext_iterator<MachineBasicBlock*, VisitedTy>
650 I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited);
651 I != E;) {
652 MachineBasicBlock *MBB = *I;
653
654 // Check if VNI is live in to MBB.
655 SlotIndex MBBStart, MBBEnd;
656 std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB);
657 LiveQueryResult LRQ = LR.Query(MBBStart);
658 if (LRQ.valueIn() != VNI) {
659 // This block isn't part of the VNI segment. Prune the search.
660 I.skipChildren();
661 continue;
662 }
663
664 // Prune the search if VNI is killed in MBB.
665 if (LRQ.endPoint() < MBBEnd) {
666 LR.removeSegment(MBBStart, LRQ.endPoint());
667 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
668 I.skipChildren();
669 continue;
670 }
671
672 // VNI is live through MBB.
673 LR.removeSegment(MBBStart, MBBEnd);
674 if (EndPoints) EndPoints->push_back(MBBEnd);
675 ++I;
676 }
677 }
678 }
679
680 //===----------------------------------------------------------------------===//
681 // Register allocator hooks.
682 //
683
addKillFlags(const VirtRegMap * VRM)684 void LiveIntervals::addKillFlags(const VirtRegMap *VRM) {
685 // Keep track of regunit ranges.
686 SmallVector<std::pair<const LiveRange*, LiveRange::const_iterator>, 8> RU;
687 // Keep track of subregister ranges.
688 SmallVector<std::pair<const LiveInterval::SubRange*,
689 LiveRange::const_iterator>, 4> SRs;
690
691 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
692 unsigned Reg = TargetRegisterInfo::index2VirtReg(i);
693 if (MRI->reg_nodbg_empty(Reg))
694 continue;
695 const LiveInterval &LI = getInterval(Reg);
696 if (LI.empty())
697 continue;
698
699 // Find the regunit intervals for the assigned register. They may overlap
700 // the virtual register live range, cancelling any kills.
701 RU.clear();
702 for (MCRegUnitIterator Unit(VRM->getPhys(Reg), TRI); Unit.isValid();
703 ++Unit) {
704 const LiveRange &RURange = getRegUnit(*Unit);
705 if (RURange.empty())
706 continue;
707 RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end)));
708 }
709
710 if (MRI->subRegLivenessEnabled()) {
711 SRs.clear();
712 for (const LiveInterval::SubRange &SR : LI.subranges()) {
713 SRs.push_back(std::make_pair(&SR, SR.find(LI.begin()->end)));
714 }
715 }
716
717 // Every instruction that kills Reg corresponds to a segment range end
718 // point.
719 for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE;
720 ++RI) {
721 // A block index indicates an MBB edge.
722 if (RI->end.isBlock())
723 continue;
724 MachineInstr *MI = getInstructionFromIndex(RI->end);
725 if (!MI)
726 continue;
727
728 // Check if any of the regunits are live beyond the end of RI. That could
729 // happen when a physreg is defined as a copy of a virtreg:
730 //
731 // %eax = COPY %5
732 // FOO %5 <--- MI, cancel kill because %eax is live.
733 // BAR killed %eax
734 //
735 // There should be no kill flag on FOO when %5 is rewritten as %eax.
736 for (auto &RUP : RU) {
737 const LiveRange &RURange = *RUP.first;
738 LiveRange::const_iterator &I = RUP.second;
739 if (I == RURange.end())
740 continue;
741 I = RURange.advanceTo(I, RI->end);
742 if (I == RURange.end() || I->start >= RI->end)
743 continue;
744 // I is overlapping RI.
745 goto CancelKill;
746 }
747
748 if (MRI->subRegLivenessEnabled()) {
749 // When reading a partial undefined value we must not add a kill flag.
750 // The regalloc might have used the undef lane for something else.
751 // Example:
752 // %1 = ... ; R32: %1
753 // %2:high16 = ... ; R64: %2
754 // = read killed %2 ; R64: %2
755 // = read %1 ; R32: %1
756 // The <kill> flag is correct for %2, but the register allocator may
757 // assign R0L to %1, and R0 to %2 because the low 32bits of R0
758 // are actually never written by %2. After assignment the <kill>
759 // flag at the read instruction is invalid.
760 LaneBitmask DefinedLanesMask;
761 if (!SRs.empty()) {
762 // Compute a mask of lanes that are defined.
763 DefinedLanesMask = LaneBitmask::getNone();
764 for (auto &SRP : SRs) {
765 const LiveInterval::SubRange &SR = *SRP.first;
766 LiveRange::const_iterator &I = SRP.second;
767 if (I == SR.end())
768 continue;
769 I = SR.advanceTo(I, RI->end);
770 if (I == SR.end() || I->start >= RI->end)
771 continue;
772 // I is overlapping RI
773 DefinedLanesMask |= SR.LaneMask;
774 }
775 } else
776 DefinedLanesMask = LaneBitmask::getAll();
777
778 bool IsFullWrite = false;
779 for (const MachineOperand &MO : MI->operands()) {
780 if (!MO.isReg() || MO.getReg() != Reg)
781 continue;
782 if (MO.isUse()) {
783 // Reading any undefined lanes?
784 LaneBitmask UseMask = TRI->getSubRegIndexLaneMask(MO.getSubReg());
785 if ((UseMask & ~DefinedLanesMask).any())
786 goto CancelKill;
787 } else if (MO.getSubReg() == 0) {
788 // Writing to the full register?
789 assert(MO.isDef());
790 IsFullWrite = true;
791 }
792 }
793
794 // If an instruction writes to a subregister, a new segment starts in
795 // the LiveInterval. But as this is only overriding part of the register
796 // adding kill-flags is not correct here after registers have been
797 // assigned.
798 if (!IsFullWrite) {
799 // Next segment has to be adjacent in the subregister write case.
800 LiveRange::const_iterator N = std::next(RI);
801 if (N != LI.end() && N->start == RI->end)
802 goto CancelKill;
803 }
804 }
805
806 MI->addRegisterKilled(Reg, nullptr);
807 continue;
808 CancelKill:
809 MI->clearRegisterKills(Reg, nullptr);
810 }
811 }
812 }
813
814 MachineBasicBlock*
intervalIsInOneMBB(const LiveInterval & LI) const815 LiveIntervals::intervalIsInOneMBB(const LiveInterval &LI) const {
816 // A local live range must be fully contained inside the block, meaning it is
817 // defined and killed at instructions, not at block boundaries. It is not
818 // live in or out of any block.
819 //
820 // It is technically possible to have a PHI-defined live range identical to a
821 // single block, but we are going to return false in that case.
822
823 SlotIndex Start = LI.beginIndex();
824 if (Start.isBlock())
825 return nullptr;
826
827 SlotIndex Stop = LI.endIndex();
828 if (Stop.isBlock())
829 return nullptr;
830
831 // getMBBFromIndex doesn't need to search the MBB table when both indexes
832 // belong to proper instructions.
833 MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start);
834 MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop);
835 return MBB1 == MBB2 ? MBB1 : nullptr;
836 }
837
838 bool
hasPHIKill(const LiveInterval & LI,const VNInfo * VNI) const839 LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const {
840 for (const VNInfo *PHI : LI.valnos) {
841 if (PHI->isUnused() || !PHI->isPHIDef())
842 continue;
843 const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def);
844 // Conservatively return true instead of scanning huge predecessor lists.
845 if (PHIMBB->pred_size() > 100)
846 return true;
847 for (const MachineBasicBlock *Pred : PHIMBB->predecessors())
848 if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred)))
849 return true;
850 }
851 return false;
852 }
853
getSpillWeight(bool isDef,bool isUse,const MachineBlockFrequencyInfo * MBFI,const MachineInstr & MI)854 float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
855 const MachineBlockFrequencyInfo *MBFI,
856 const MachineInstr &MI) {
857 return getSpillWeight(isDef, isUse, MBFI, MI.getParent());
858 }
859
getSpillWeight(bool isDef,bool isUse,const MachineBlockFrequencyInfo * MBFI,const MachineBasicBlock * MBB)860 float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
861 const MachineBlockFrequencyInfo *MBFI,
862 const MachineBasicBlock *MBB) {
863 BlockFrequency Freq = MBFI->getBlockFreq(MBB);
864 const float Scale = 1.0f / MBFI->getEntryFreq();
865 return (isDef + isUse) * (Freq.getFrequency() * Scale);
866 }
867
868 LiveRange::Segment
addSegmentToEndOfBlock(unsigned reg,MachineInstr & startInst)869 LiveIntervals::addSegmentToEndOfBlock(unsigned reg, MachineInstr &startInst) {
870 LiveInterval& Interval = createEmptyInterval(reg);
871 VNInfo *VN = Interval.getNextValue(
872 SlotIndex(getInstructionIndex(startInst).getRegSlot()),
873 getVNInfoAllocator());
874 LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()),
875 getMBBEndIdx(startInst.getParent()), VN);
876 Interval.addSegment(S);
877
878 return S;
879 }
880
881 //===----------------------------------------------------------------------===//
882 // Register mask functions
883 //===----------------------------------------------------------------------===//
884
checkRegMaskInterference(LiveInterval & LI,BitVector & UsableRegs)885 bool LiveIntervals::checkRegMaskInterference(LiveInterval &LI,
886 BitVector &UsableRegs) {
887 if (LI.empty())
888 return false;
889 LiveInterval::iterator LiveI = LI.begin(), LiveE = LI.end();
890
891 // Use a smaller arrays for local live ranges.
892 ArrayRef<SlotIndex> Slots;
893 ArrayRef<const uint32_t*> Bits;
894 if (MachineBasicBlock *MBB = intervalIsInOneMBB(LI)) {
895 Slots = getRegMaskSlotsInBlock(MBB->getNumber());
896 Bits = getRegMaskBitsInBlock(MBB->getNumber());
897 } else {
898 Slots = getRegMaskSlots();
899 Bits = getRegMaskBits();
900 }
901
902 // We are going to enumerate all the register mask slots contained in LI.
903 // Start with a binary search of RegMaskSlots to find a starting point.
904 ArrayRef<SlotIndex>::iterator SlotI =
905 std::lower_bound(Slots.begin(), Slots.end(), LiveI->start);
906 ArrayRef<SlotIndex>::iterator SlotE = Slots.end();
907
908 // No slots in range, LI begins after the last call.
909 if (SlotI == SlotE)
910 return false;
911
912 bool Found = false;
913 while (true) {
914 assert(*SlotI >= LiveI->start);
915 // Loop over all slots overlapping this segment.
916 while (*SlotI < LiveI->end) {
917 // *SlotI overlaps LI. Collect mask bits.
918 if (!Found) {
919 // This is the first overlap. Initialize UsableRegs to all ones.
920 UsableRegs.clear();
921 UsableRegs.resize(TRI->getNumRegs(), true);
922 Found = true;
923 }
924 // Remove usable registers clobbered by this mask.
925 UsableRegs.clearBitsNotInMask(Bits[SlotI-Slots.begin()]);
926 if (++SlotI == SlotE)
927 return Found;
928 }
929 // *SlotI is beyond the current LI segment.
930 LiveI = LI.advanceTo(LiveI, *SlotI);
931 if (LiveI == LiveE)
932 return Found;
933 // Advance SlotI until it overlaps.
934 while (*SlotI < LiveI->start)
935 if (++SlotI == SlotE)
936 return Found;
937 }
938 }
939
940 //===----------------------------------------------------------------------===//
941 // IntervalUpdate class.
942 //===----------------------------------------------------------------------===//
943
944 /// Toolkit used by handleMove to trim or extend live intervals.
945 class LiveIntervals::HMEditor {
946 private:
947 LiveIntervals& LIS;
948 const MachineRegisterInfo& MRI;
949 const TargetRegisterInfo& TRI;
950 SlotIndex OldIdx;
951 SlotIndex NewIdx;
952 SmallPtrSet<LiveRange*, 8> Updated;
953 bool UpdateFlags;
954
955 public:
HMEditor(LiveIntervals & LIS,const MachineRegisterInfo & MRI,const TargetRegisterInfo & TRI,SlotIndex OldIdx,SlotIndex NewIdx,bool UpdateFlags)956 HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI,
957 const TargetRegisterInfo& TRI,
958 SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
959 : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
960 UpdateFlags(UpdateFlags) {}
961
962 // FIXME: UpdateFlags is a workaround that creates live intervals for all
963 // physregs, even those that aren't needed for regalloc, in order to update
964 // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill
965 // flags, and postRA passes will use a live register utility instead.
getRegUnitLI(unsigned Unit)966 LiveRange *getRegUnitLI(unsigned Unit) {
967 if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
968 return &LIS.getRegUnit(Unit);
969 return LIS.getCachedRegUnit(Unit);
970 }
971
972 /// Update all live ranges touched by MI, assuming a move from OldIdx to
973 /// NewIdx.
updateAllRanges(MachineInstr * MI)974 void updateAllRanges(MachineInstr *MI) {
975 LLVM_DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": "
976 << *MI);
977 bool hasRegMask = false;
978 for (MachineOperand &MO : MI->operands()) {
979 if (MO.isRegMask())
980 hasRegMask = true;
981 if (!MO.isReg())
982 continue;
983 if (MO.isUse()) {
984 if (!MO.readsReg())
985 continue;
986 // Aggressively clear all kill flags.
987 // They are reinserted by VirtRegRewriter.
988 MO.setIsKill(false);
989 }
990
991 unsigned Reg = MO.getReg();
992 if (!Reg)
993 continue;
994 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
995 LiveInterval &LI = LIS.getInterval(Reg);
996 if (LI.hasSubRanges()) {
997 unsigned SubReg = MO.getSubReg();
998 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
999 : MRI.getMaxLaneMaskForVReg(Reg);
1000 for (LiveInterval::SubRange &S : LI.subranges()) {
1001 if ((S.LaneMask & LaneMask).none())
1002 continue;
1003 updateRange(S, Reg, S.LaneMask);
1004 }
1005 }
1006 updateRange(LI, Reg, LaneBitmask::getNone());
1007 continue;
1008 }
1009
1010 // For physregs, only update the regunits that actually have a
1011 // precomputed live range.
1012 for (MCRegUnitIterator Units(Reg, &TRI); Units.isValid(); ++Units)
1013 if (LiveRange *LR = getRegUnitLI(*Units))
1014 updateRange(*LR, *Units, LaneBitmask::getNone());
1015 }
1016 if (hasRegMask)
1017 updateRegMaskSlots();
1018 }
1019
1020 private:
1021 /// Update a single live range, assuming an instruction has been moved from
1022 /// OldIdx to NewIdx.
updateRange(LiveRange & LR,unsigned Reg,LaneBitmask LaneMask)1023 void updateRange(LiveRange &LR, unsigned Reg, LaneBitmask LaneMask) {
1024 if (!Updated.insert(&LR).second)
1025 return;
1026 LLVM_DEBUG({
1027 dbgs() << " ";
1028 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
1029 dbgs() << printReg(Reg);
1030 if (LaneMask.any())
1031 dbgs() << " L" << PrintLaneMask(LaneMask);
1032 } else {
1033 dbgs() << printRegUnit(Reg, &TRI);
1034 }
1035 dbgs() << ":\t" << LR << '\n';
1036 });
1037 if (SlotIndex::isEarlierInstr(OldIdx, NewIdx))
1038 handleMoveDown(LR);
1039 else
1040 handleMoveUp(LR, Reg, LaneMask);
1041 LLVM_DEBUG(dbgs() << " -->\t" << LR << '\n');
1042 LR.verify();
1043 }
1044
1045 /// Update LR to reflect an instruction has been moved downwards from OldIdx
1046 /// to NewIdx (OldIdx < NewIdx).
handleMoveDown(LiveRange & LR)1047 void handleMoveDown(LiveRange &LR) {
1048 LiveRange::iterator E = LR.end();
1049 // Segment going into OldIdx.
1050 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1051
1052 // No value live before or after OldIdx? Nothing to do.
1053 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
1054 return;
1055
1056 LiveRange::iterator OldIdxOut;
1057 // Do we have a value live-in to OldIdx?
1058 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1059 // If the live-in value already extends to NewIdx, there is nothing to do.
1060 if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end))
1061 return;
1062 // Aggressively remove all kill flags from the old kill point.
1063 // Kill flags shouldn't be used while live intervals exist, they will be
1064 // reinserted by VirtRegRewriter.
1065 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
1066 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1067 if (MO->isReg() && MO->isUse())
1068 MO->setIsKill(false);
1069
1070 // Is there a def before NewIdx which is not OldIdx?
1071 LiveRange::iterator Next = std::next(OldIdxIn);
1072 if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) &&
1073 SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1074 // If we are here then OldIdx was just a use but not a def. We only have
1075 // to ensure liveness extends to NewIdx.
1076 LiveRange::iterator NewIdxIn =
1077 LR.advanceTo(Next, NewIdx.getBaseIndex());
1078 // Extend the segment before NewIdx if necessary.
1079 if (NewIdxIn == E ||
1080 !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) {
1081 LiveRange::iterator Prev = std::prev(NewIdxIn);
1082 Prev->end = NewIdx.getRegSlot();
1083 }
1084 // Extend OldIdxIn.
1085 OldIdxIn->end = Next->start;
1086 return;
1087 }
1088
1089 // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR
1090 // invalid by overlapping ranges.
1091 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1092 OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
1093 // If this was not a kill, then there was no def and we're done.
1094 if (!isKill)
1095 return;
1096
1097 // Did we have a Def at OldIdx?
1098 OldIdxOut = Next;
1099 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1100 return;
1101 } else {
1102 OldIdxOut = OldIdxIn;
1103 }
1104
1105 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1106 // to the segment starting there.
1107 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1108 "No def?");
1109 VNInfo *OldIdxVNI = OldIdxOut->valno;
1110 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1111
1112 // If the defined value extends beyond NewIdx, just move the beginning
1113 // of the segment to NewIdx.
1114 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1115 if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) {
1116 OldIdxVNI->def = NewIdxDef;
1117 OldIdxOut->start = OldIdxVNI->def;
1118 return;
1119 }
1120
1121 // If we are here then we have a Definition at OldIdx which ends before
1122 // NewIdx.
1123
1124 // Is there an existing Def at NewIdx?
1125 LiveRange::iterator AfterNewIdx
1126 = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot());
1127 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1128 if (!OldIdxDefIsDead &&
1129 SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) {
1130 // OldIdx is not a dead def, and NewIdxDef is inside a new interval.
1131 VNInfo *DefVNI;
1132 if (OldIdxOut != LR.begin() &&
1133 !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end,
1134 OldIdxOut->start)) {
1135 // There is no gap between OldIdxOut and its predecessor anymore,
1136 // merge them.
1137 LiveRange::iterator IPrev = std::prev(OldIdxOut);
1138 DefVNI = OldIdxVNI;
1139 IPrev->end = OldIdxOut->end;
1140 } else {
1141 // The value is live in to OldIdx
1142 LiveRange::iterator INext = std::next(OldIdxOut);
1143 assert(INext != E && "Must have following segment");
1144 // We merge OldIdxOut and its successor. As we're dealing with subreg
1145 // reordering, there is always a successor to OldIdxOut in the same BB
1146 // We don't need INext->valno anymore and will reuse for the new segment
1147 // we create later.
1148 DefVNI = OldIdxVNI;
1149 INext->start = OldIdxOut->end;
1150 INext->valno->def = INext->start;
1151 }
1152 // If NewIdx is behind the last segment, extend that and append a new one.
1153 if (AfterNewIdx == E) {
1154 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1155 // one position.
1156 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn -| end
1157 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end
1158 std::copy(std::next(OldIdxOut), E, OldIdxOut);
1159 // The last segment is undefined now, reuse it for a dead def.
1160 LiveRange::iterator NewSegment = std::prev(E);
1161 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1162 DefVNI);
1163 DefVNI->def = NewIdxDef;
1164
1165 LiveRange::iterator Prev = std::prev(NewSegment);
1166 Prev->end = NewIdxDef;
1167 } else {
1168 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1169 // one position.
1170 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -|
1171 // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -|
1172 std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
1173 LiveRange::iterator Prev = std::prev(AfterNewIdx);
1174 // We have two cases:
1175 if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) {
1176 // Case 1: NewIdx is inside a liverange. Split this liverange at
1177 // NewIdxDef into the segment "Prev" followed by "NewSegment".
1178 LiveRange::iterator NewSegment = AfterNewIdx;
1179 *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
1180 Prev->valno->def = NewIdxDef;
1181
1182 *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
1183 DefVNI->def = Prev->start;
1184 } else {
1185 // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and
1186 // turn Prev into a segment from NewIdx to AfterNewIdx->start.
1187 *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
1188 DefVNI->def = NewIdxDef;
1189 assert(DefVNI != AfterNewIdx->valno);
1190 }
1191 }
1192 return;
1193 }
1194
1195 if (AfterNewIdx != E &&
1196 SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) {
1197 // There is an existing def at NewIdx. The def at OldIdx is coalesced into
1198 // that value.
1199 assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?");
1200 LR.removeValNo(OldIdxVNI);
1201 } else {
1202 // There was no existing def at NewIdx. We need to create a dead def
1203 // at NewIdx. Shift segments over the old OldIdxOut segment, this frees
1204 // a new segment at the place where we want to construct the dead def.
1205 // |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -|
1206 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -|
1207 assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators");
1208 std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
1209 // We can reuse OldIdxVNI now.
1210 LiveRange::iterator NewSegment = std::prev(AfterNewIdx);
1211 VNInfo *NewSegmentVNI = OldIdxVNI;
1212 NewSegmentVNI->def = NewIdxDef;
1213 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1214 NewSegmentVNI);
1215 }
1216 }
1217
1218 /// Update LR to reflect an instruction has been moved upwards from OldIdx
1219 /// to NewIdx (NewIdx < OldIdx).
handleMoveUp(LiveRange & LR,unsigned Reg,LaneBitmask LaneMask)1220 void handleMoveUp(LiveRange &LR, unsigned Reg, LaneBitmask LaneMask) {
1221 LiveRange::iterator E = LR.end();
1222 // Segment going into OldIdx.
1223 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1224
1225 // No value live before or after OldIdx? Nothing to do.
1226 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
1227 return;
1228
1229 LiveRange::iterator OldIdxOut;
1230 // Do we have a value live-in to OldIdx?
1231 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1232 // If the live-in value isn't killed here, then we have no Def at
1233 // OldIdx, moreover the value must be live at NewIdx so there is nothing
1234 // to do.
1235 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1236 if (!isKill)
1237 return;
1238
1239 // At this point we have to move OldIdxIn->end back to the nearest
1240 // previous use or (dead-)def but no further than NewIdx.
1241 SlotIndex DefBeforeOldIdx
1242 = std::max(OldIdxIn->start.getDeadSlot(),
1243 NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
1244 OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, Reg, LaneMask);
1245
1246 // Did we have a Def at OldIdx? If not we are done now.
1247 OldIdxOut = std::next(OldIdxIn);
1248 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1249 return;
1250 } else {
1251 OldIdxOut = OldIdxIn;
1252 OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E;
1253 }
1254
1255 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1256 // to the segment starting there.
1257 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1258 "No def?");
1259 VNInfo *OldIdxVNI = OldIdxOut->valno;
1260 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1261 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1262
1263 // Is there an existing def at NewIdx?
1264 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1265 LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot());
1266 if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) {
1267 assert(NewIdxOut->valno != OldIdxVNI &&
1268 "Same value defined more than once?");
1269 // If OldIdx was a dead def remove it.
1270 if (!OldIdxDefIsDead) {
1271 // Remove segment starting at NewIdx and move begin of OldIdxOut to
1272 // NewIdx so it can take its place.
1273 OldIdxVNI->def = NewIdxDef;
1274 OldIdxOut->start = NewIdxDef;
1275 LR.removeValNo(NewIdxOut->valno);
1276 } else {
1277 // Simply remove the dead def at OldIdx.
1278 LR.removeValNo(OldIdxVNI);
1279 }
1280 } else {
1281 // Previously nothing was live after NewIdx, so all we have to do now is
1282 // move the begin of OldIdxOut to NewIdx.
1283 if (!OldIdxDefIsDead) {
1284 // Do we have any intermediate Defs between OldIdx and NewIdx?
1285 if (OldIdxIn != E &&
1286 SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) {
1287 // OldIdx is not a dead def and NewIdx is before predecessor start.
1288 LiveRange::iterator NewIdxIn = NewIdxOut;
1289 assert(NewIdxIn == LR.find(NewIdx.getBaseIndex()));
1290 const SlotIndex SplitPos = NewIdxDef;
1291 OldIdxVNI = OldIdxIn->valno;
1292
1293 // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut.
1294 OldIdxOut->valno->def = OldIdxIn->start;
1295 *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
1296 OldIdxOut->valno);
1297 // OldIdxIn and OldIdxVNI are now undef and can be overridden.
1298 // We Slide [NewIdxIn, OldIdxIn) down one position.
1299 // |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -|
1300 // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -|
1301 std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
1302 // NewIdxIn is now considered undef so we can reuse it for the moved
1303 // value.
1304 LiveRange::iterator NewSegment = NewIdxIn;
1305 LiveRange::iterator Next = std::next(NewSegment);
1306 if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1307 // There is no gap between NewSegment and its predecessor.
1308 *NewSegment = LiveRange::Segment(Next->start, SplitPos,
1309 Next->valno);
1310 *Next = LiveRange::Segment(SplitPos, Next->end, OldIdxVNI);
1311 Next->valno->def = SplitPos;
1312 } else {
1313 // There is a gap between NewSegment and its predecessor
1314 // Value becomes live in.
1315 *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI);
1316 NewSegment->valno->def = SplitPos;
1317 }
1318 } else {
1319 // Leave the end point of a live def.
1320 OldIdxOut->start = NewIdxDef;
1321 OldIdxVNI->def = NewIdxDef;
1322 if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end))
1323 OldIdxIn->end = NewIdx.getRegSlot();
1324 }
1325 } else if (OldIdxIn != E
1326 && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx)
1327 && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) {
1328 // OldIdxVNI is a dead def that has been moved into the middle of
1329 // another value in LR. That can happen when LR is a whole register,
1330 // but the dead def is a write to a subreg that is dead at NewIdx.
1331 // The dead def may have been moved across other values
1332 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1333 // down one position.
1334 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1335 // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1336 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1337 // Modify the segment at NewIdxOut and the following segment to meet at
1338 // the point of the dead def, with the following segment getting
1339 // OldIdxVNI as its value number.
1340 *NewIdxOut = LiveRange::Segment(
1341 NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno);
1342 *(NewIdxOut + 1) = LiveRange::Segment(
1343 NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
1344 OldIdxVNI->def = NewIdxDef;
1345 // Modify subsequent segments to be defined by the moved def OldIdxVNI.
1346 for (auto Idx = NewIdxOut + 2; Idx <= OldIdxOut; ++Idx)
1347 Idx->valno = OldIdxVNI;
1348 // Aggressively remove all dead flags from the former dead definition.
1349 // Kill/dead flags shouldn't be used while live intervals exist; they
1350 // will be reinserted by VirtRegRewriter.
1351 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
1352 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1353 if (MO->isReg() && !MO->isUse())
1354 MO->setIsDead(false);
1355 } else {
1356 // OldIdxVNI is a dead def. It may have been moved across other values
1357 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1358 // down one position.
1359 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1360 // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1361 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1362 // OldIdxVNI can be reused now to build a new dead def segment.
1363 LiveRange::iterator NewSegment = NewIdxOut;
1364 VNInfo *NewSegmentVNI = OldIdxVNI;
1365 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1366 NewSegmentVNI);
1367 NewSegmentVNI->def = NewIdxDef;
1368 }
1369 }
1370 }
1371
updateRegMaskSlots()1372 void updateRegMaskSlots() {
1373 SmallVectorImpl<SlotIndex>::iterator RI =
1374 std::lower_bound(LIS.RegMaskSlots.begin(), LIS.RegMaskSlots.end(),
1375 OldIdx);
1376 assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
1377 "No RegMask at OldIdx.");
1378 *RI = NewIdx.getRegSlot();
1379 assert((RI == LIS.RegMaskSlots.begin() ||
1380 SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) &&
1381 "Cannot move regmask instruction above another call");
1382 assert((std::next(RI) == LIS.RegMaskSlots.end() ||
1383 SlotIndex::isEarlierInstr(*RI, *std::next(RI))) &&
1384 "Cannot move regmask instruction below another call");
1385 }
1386
1387 // Return the last use of reg between NewIdx and OldIdx.
findLastUseBefore(SlotIndex Before,unsigned Reg,LaneBitmask LaneMask)1388 SlotIndex findLastUseBefore(SlotIndex Before, unsigned Reg,
1389 LaneBitmask LaneMask) {
1390 if (TargetRegisterInfo::isVirtualRegister(Reg)) {
1391 SlotIndex LastUse = Before;
1392 for (MachineOperand &MO : MRI.use_nodbg_operands(Reg)) {
1393 if (MO.isUndef())
1394 continue;
1395 unsigned SubReg = MO.getSubReg();
1396 if (SubReg != 0 && LaneMask.any()
1397 && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
1398 continue;
1399
1400 const MachineInstr &MI = *MO.getParent();
1401 SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI);
1402 if (InstSlot > LastUse && InstSlot < OldIdx)
1403 LastUse = InstSlot.getRegSlot();
1404 }
1405 return LastUse;
1406 }
1407
1408 // This is a regunit interval, so scanning the use list could be very
1409 // expensive. Scan upwards from OldIdx instead.
1410 assert(Before < OldIdx && "Expected upwards move");
1411 SlotIndexes *Indexes = LIS.getSlotIndexes();
1412 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before);
1413
1414 // OldIdx may not correspond to an instruction any longer, so set MII to
1415 // point to the next instruction after OldIdx, or MBB->end().
1416 MachineBasicBlock::iterator MII = MBB->end();
1417 if (MachineInstr *MI = Indexes->getInstructionFromIndex(
1418 Indexes->getNextNonNullIndex(OldIdx)))
1419 if (MI->getParent() == MBB)
1420 MII = MI;
1421
1422 MachineBasicBlock::iterator Begin = MBB->begin();
1423 while (MII != Begin) {
1424 if ((--MII)->isDebugInstr())
1425 continue;
1426 SlotIndex Idx = Indexes->getInstructionIndex(*MII);
1427
1428 // Stop searching when Before is reached.
1429 if (!SlotIndex::isEarlierInstr(Before, Idx))
1430 return Before;
1431
1432 // Check if MII uses Reg.
1433 for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
1434 if (MO->isReg() && !MO->isUndef() &&
1435 TargetRegisterInfo::isPhysicalRegister(MO->getReg()) &&
1436 TRI.hasRegUnit(MO->getReg(), Reg))
1437 return Idx.getRegSlot();
1438 }
1439 // Didn't reach Before. It must be the first instruction in the block.
1440 return Before;
1441 }
1442 };
1443
handleMove(MachineInstr & MI,bool UpdateFlags)1444 void LiveIntervals::handleMove(MachineInstr &MI, bool UpdateFlags) {
1445 assert(!MI.isBundled() && "Can't handle bundled instructions yet.");
1446 SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
1447 Indexes->removeMachineInstrFromMaps(MI);
1448 SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI);
1449 assert(getMBBStartIdx(MI.getParent()) <= OldIndex &&
1450 OldIndex < getMBBEndIdx(MI.getParent()) &&
1451 "Cannot handle moves across basic block boundaries.");
1452
1453 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1454 HME.updateAllRanges(&MI);
1455 }
1456
handleMoveIntoBundle(MachineInstr & MI,MachineInstr & BundleStart,bool UpdateFlags)1457 void LiveIntervals::handleMoveIntoBundle(MachineInstr &MI,
1458 MachineInstr &BundleStart,
1459 bool UpdateFlags) {
1460 SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
1461 SlotIndex NewIndex = Indexes->getInstructionIndex(BundleStart);
1462 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1463 HME.updateAllRanges(&MI);
1464 }
1465
repairOldRegInRange(const MachineBasicBlock::iterator Begin,const MachineBasicBlock::iterator End,const SlotIndex endIdx,LiveRange & LR,const unsigned Reg,LaneBitmask LaneMask)1466 void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin,
1467 const MachineBasicBlock::iterator End,
1468 const SlotIndex endIdx,
1469 LiveRange &LR, const unsigned Reg,
1470 LaneBitmask LaneMask) {
1471 LiveInterval::iterator LII = LR.find(endIdx);
1472 SlotIndex lastUseIdx;
1473 if (LII == LR.begin()) {
1474 // This happens when the function is called for a subregister that only
1475 // occurs _after_ the range that is to be repaired.
1476 return;
1477 }
1478 if (LII != LR.end() && LII->start < endIdx)
1479 lastUseIdx = LII->end;
1480 else
1481 --LII;
1482
1483 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1484 --I;
1485 MachineInstr &MI = *I;
1486 if (MI.isDebugInstr())
1487 continue;
1488
1489 SlotIndex instrIdx = getInstructionIndex(MI);
1490 bool isStartValid = getInstructionFromIndex(LII->start);
1491 bool isEndValid = getInstructionFromIndex(LII->end);
1492
1493 // FIXME: This doesn't currently handle early-clobber or multiple removed
1494 // defs inside of the region to repair.
1495 for (MachineInstr::mop_iterator OI = MI.operands_begin(),
1496 OE = MI.operands_end();
1497 OI != OE; ++OI) {
1498 const MachineOperand &MO = *OI;
1499 if (!MO.isReg() || MO.getReg() != Reg)
1500 continue;
1501
1502 unsigned SubReg = MO.getSubReg();
1503 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1504 if ((Mask & LaneMask).none())
1505 continue;
1506
1507 if (MO.isDef()) {
1508 if (!isStartValid) {
1509 if (LII->end.isDead()) {
1510 SlotIndex prevStart;
1511 if (LII != LR.begin())
1512 prevStart = std::prev(LII)->start;
1513
1514 // FIXME: This could be more efficient if there was a
1515 // removeSegment method that returned an iterator.
1516 LR.removeSegment(*LII, true);
1517 if (prevStart.isValid())
1518 LII = LR.find(prevStart);
1519 else
1520 LII = LR.begin();
1521 } else {
1522 LII->start = instrIdx.getRegSlot();
1523 LII->valno->def = instrIdx.getRegSlot();
1524 if (MO.getSubReg() && !MO.isUndef())
1525 lastUseIdx = instrIdx.getRegSlot();
1526 else
1527 lastUseIdx = SlotIndex();
1528 continue;
1529 }
1530 }
1531
1532 if (!lastUseIdx.isValid()) {
1533 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1534 LiveRange::Segment S(instrIdx.getRegSlot(),
1535 instrIdx.getDeadSlot(), VNI);
1536 LII = LR.addSegment(S);
1537 } else if (LII->start != instrIdx.getRegSlot()) {
1538 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1539 LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI);
1540 LII = LR.addSegment(S);
1541 }
1542
1543 if (MO.getSubReg() && !MO.isUndef())
1544 lastUseIdx = instrIdx.getRegSlot();
1545 else
1546 lastUseIdx = SlotIndex();
1547 } else if (MO.isUse()) {
1548 // FIXME: This should probably be handled outside of this branch,
1549 // either as part of the def case (for defs inside of the region) or
1550 // after the loop over the region.
1551 if (!isEndValid && !LII->end.isBlock())
1552 LII->end = instrIdx.getRegSlot();
1553 if (!lastUseIdx.isValid())
1554 lastUseIdx = instrIdx.getRegSlot();
1555 }
1556 }
1557 }
1558 }
1559
1560 void
repairIntervalsInRange(MachineBasicBlock * MBB,MachineBasicBlock::iterator Begin,MachineBasicBlock::iterator End,ArrayRef<unsigned> OrigRegs)1561 LiveIntervals::repairIntervalsInRange(MachineBasicBlock *MBB,
1562 MachineBasicBlock::iterator Begin,
1563 MachineBasicBlock::iterator End,
1564 ArrayRef<unsigned> OrigRegs) {
1565 // Find anchor points, which are at the beginning/end of blocks or at
1566 // instructions that already have indexes.
1567 while (Begin != MBB->begin() && !Indexes->hasIndex(*Begin))
1568 --Begin;
1569 while (End != MBB->end() && !Indexes->hasIndex(*End))
1570 ++End;
1571
1572 SlotIndex endIdx;
1573 if (End == MBB->end())
1574 endIdx = getMBBEndIdx(MBB).getPrevSlot();
1575 else
1576 endIdx = getInstructionIndex(*End);
1577
1578 Indexes->repairIndexesInRange(MBB, Begin, End);
1579
1580 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1581 --I;
1582 MachineInstr &MI = *I;
1583 if (MI.isDebugInstr())
1584 continue;
1585 for (MachineInstr::const_mop_iterator MOI = MI.operands_begin(),
1586 MOE = MI.operands_end();
1587 MOI != MOE; ++MOI) {
1588 if (MOI->isReg() &&
1589 TargetRegisterInfo::isVirtualRegister(MOI->getReg()) &&
1590 !hasInterval(MOI->getReg())) {
1591 createAndComputeVirtRegInterval(MOI->getReg());
1592 }
1593 }
1594 }
1595
1596 for (unsigned Reg : OrigRegs) {
1597 if (!TargetRegisterInfo::isVirtualRegister(Reg))
1598 continue;
1599
1600 LiveInterval &LI = getInterval(Reg);
1601 // FIXME: Should we support undefs that gain defs?
1602 if (!LI.hasAtLeastOneValue())
1603 continue;
1604
1605 for (LiveInterval::SubRange &S : LI.subranges())
1606 repairOldRegInRange(Begin, End, endIdx, S, Reg, S.LaneMask);
1607
1608 repairOldRegInRange(Begin, End, endIdx, LI, Reg);
1609 }
1610 }
1611
removePhysRegDefAt(unsigned Reg,SlotIndex Pos)1612 void LiveIntervals::removePhysRegDefAt(unsigned Reg, SlotIndex Pos) {
1613 for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
1614 if (LiveRange *LR = getCachedRegUnit(*Unit))
1615 if (VNInfo *VNI = LR->getVNInfoAt(Pos))
1616 LR->removeValNo(VNI);
1617 }
1618 }
1619
removeVRegDefAt(LiveInterval & LI,SlotIndex Pos)1620 void LiveIntervals::removeVRegDefAt(LiveInterval &LI, SlotIndex Pos) {
1621 // LI may not have the main range computed yet, but its subranges may
1622 // be present.
1623 VNInfo *VNI = LI.getVNInfoAt(Pos);
1624 if (VNI != nullptr) {
1625 assert(VNI->def.getBaseIndex() == Pos.getBaseIndex());
1626 LI.removeValNo(VNI);
1627 }
1628
1629 // Also remove the value defined in subranges.
1630 for (LiveInterval::SubRange &S : LI.subranges()) {
1631 if (VNInfo *SVNI = S.getVNInfoAt(Pos))
1632 if (SVNI->def.getBaseIndex() == Pos.getBaseIndex())
1633 S.removeValNo(SVNI);
1634 }
1635 LI.removeEmptySubRanges();
1636 }
1637
splitSeparateComponents(LiveInterval & LI,SmallVectorImpl<LiveInterval * > & SplitLIs)1638 void LiveIntervals::splitSeparateComponents(LiveInterval &LI,
1639 SmallVectorImpl<LiveInterval*> &SplitLIs) {
1640 ConnectedVNInfoEqClasses ConEQ(*this);
1641 unsigned NumComp = ConEQ.Classify(LI);
1642 if (NumComp <= 1)
1643 return;
1644 LLVM_DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n');
1645 unsigned Reg = LI.reg;
1646 const TargetRegisterClass *RegClass = MRI->getRegClass(Reg);
1647 for (unsigned I = 1; I < NumComp; ++I) {
1648 unsigned NewVReg = MRI->createVirtualRegister(RegClass);
1649 LiveInterval &NewLI = createEmptyInterval(NewVReg);
1650 SplitLIs.push_back(&NewLI);
1651 }
1652 ConEQ.Distribute(LI, SplitLIs.data(), *MRI);
1653 }
1654
constructMainRangeFromSubranges(LiveInterval & LI)1655 void LiveIntervals::constructMainRangeFromSubranges(LiveInterval &LI) {
1656 assert(LRCalc && "LRCalc not initialized.");
1657 LRCalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
1658 LRCalc->constructMainRangeFromSubranges(LI);
1659 }
1660