LLVM 24.0.0git
LiveIntervals.cpp
Go to the documentation of this file.
1//===- LiveIntervals.cpp - Live Interval Analysis -------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file This file implements the LiveInterval analysis pass which is used
10/// by the Linear Scan Register allocator. This pass linearizes the
11/// basic blocks of the function in DFS order and computes live intervals for
12/// each virtual and physical register.
13//
14//===----------------------------------------------------------------------===//
15
17#include "llvm/ADT/ArrayRef.h"
34#include "llvm/CodeGen/Passes.h"
40#include "llvm/Config/llvm-config.h"
42#include "llvm/IR/Statepoint.h"
44#include "llvm/MC/LaneBitmask.h"
46#include "llvm/Pass.h"
49#include "llvm/Support/Debug.h"
52#include <algorithm>
53#include <cassert>
54#include <cstdint>
55#include <iterator>
56#include <tuple>
57#include <utility>
58
59using namespace llvm;
60
61#define DEBUG_TYPE "regalloc"
62
63AnalysisKey LiveIntervalsAnalysis::Key;
64
68 auto Res = Result(MF, MFAM.getResult<SlotIndexesAnalysis>(MF),
70 LLVM_DEBUG(Res.dump());
71 return Res;
72}
73
77 OS << "Live intervals for machine function: " << MF.getName() << ":\n";
80}
81
85 "Live Interval Analysis", false, false)
89 "Live Interval Analysis", false, true)
90
92 LIS.Indexes = &getAnalysis<SlotIndexesWrapperPass>().getSI();
93 LIS.DomTree = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
94 LIS.analyze(MF);
96 return false;
97}
98
99#ifndef NDEBUG
101 "precompute-phys-liveness", cl::Hidden,
102 cl::desc("Eagerly compute live intervals for all physreg units."));
103#else
104static bool EnablePrecomputePhysRegs = false;
105#endif // NDEBUG
106
108 "use-segment-set-for-physregs", cl::Hidden, cl::init(true),
109 cl::desc(
110 "Use segment set for the computation of the live ranges of physregs."));
111
122
125
127
129 MachineFunction &MF, const PreservedAnalyses &PA,
130 MachineFunctionAnalysisManager::Invalidator &Inv) {
131 auto PAC = PA.getChecker<LiveIntervalsAnalysis>();
132
133 if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesOn<MachineFunction>>())
134 return true;
135
136 // LiveIntervals holds pointers to these results, so check for their
137 // invalidation.
138 return Inv.invalidate<SlotIndexesAnalysis>(MF, PA) ||
139 Inv.invalidate<MachineDominatorTreeAnalysis>(MF, PA);
140}
141
142void LiveIntervals::clear() {
143 // Free the live intervals themselves.
144 for (unsigned i = 0, e = VirtRegIntervals.size(); i != e; ++i)
145 delete VirtRegIntervals[Register::index2VirtReg(i)];
146 VirtRegIntervals.clear();
147 RegMaskSlots.clear();
148 RegMaskBits.clear();
149 RegMaskBlocks.clear();
150
151 for (LiveRange *LR : RegUnitRanges)
152 delete LR;
153 RegUnitRanges.clear();
154
155 // Release VNInfo memory regions, VNInfo objects don't need to be dtor'd.
156 VNInfoAllocator.Reset();
157}
158
159void LiveIntervals::analyze(MachineFunction &fn) {
160 MF = &fn;
161 MRI = &MF->getRegInfo();
163 TII = MF->getSubtarget().getInstrInfo();
164
165 if (!LICalc)
166 LICalc = std::make_unique<LiveIntervalCalc>();
167
168 // Allocate space for all virtual registers.
169 VirtRegIntervals.resize(MRI->getNumVirtRegs());
170
171 computeVirtRegs();
172 computeRegMasks();
173 computeLiveInRegUnits();
174
176 // For stress testing, precompute live ranges of all physical register
177 // units, including reserved registers.
178 for (MCRegUnit Unit : TRI->regunits())
179 getRegUnit(Unit);
180 }
181}
182
184 OS << "********** INTERVALS **********\n";
185
186 // Dump the regunits.
187 for (unsigned Unit = 0, UnitE = RegUnitRanges.size(); Unit != UnitE; ++Unit)
188 if (LiveRange *LR = RegUnitRanges[Unit])
189 OS << printRegUnit(static_cast<MCRegUnit>(Unit), TRI) << ' ' << *LR
190 << '\n';
191
192 // Dump the virtregs.
193 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
195 if (hasInterval(Reg))
196 OS << getInterval(Reg) << '\n';
197 }
198
199 OS << "RegMasks:";
200 for (SlotIndex Idx : RegMaskSlots)
201 OS << ' ' << Idx;
202 OS << '\n';
203
204 printInstrs(OS);
205}
206
207void LiveIntervals::printInstrs(raw_ostream &OS) const {
208 OS << "********** MACHINEINSTRS **********\n";
209 MF->print(OS, Indexes);
210}
211
212#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
213LLVM_DUMP_METHOD void LiveIntervals::dumpInstrs() const {
214 printInstrs(dbgs());
215}
216#endif
217
218#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
220#endif
221
222LiveInterval *LiveIntervals::createInterval(Register reg) {
223 float Weight = reg.isPhysical() ? huge_valf : 0.0F;
224 return new LiveInterval(reg, Weight);
225}
226
227/// Compute the live interval of a virtual register, based on defs and uses.
228bool LiveIntervals::computeVirtRegInterval(LiveInterval &LI) {
229 assert(LICalc && "LICalc not initialized.");
230 assert(LI.empty() && "Should only compute empty intervals.");
231 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
232 LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg()));
233 return computeDeadValues(LI, nullptr);
234}
235
236void LiveIntervals::computeVirtRegs() {
237 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
239 if (MRI->reg_nodbg_empty(Reg))
240 continue;
241 LiveInterval &LI = createEmptyInterval(Reg);
242 bool NeedSplit = computeVirtRegInterval(LI);
243 if (NeedSplit) {
245 splitSeparateComponents(LI, SplitLIs);
246 }
247 }
248}
249
250void LiveIntervals::computeRegMasks() {
251 RegMaskBlocks.resize(MF->getNumBlockIDs());
252
253 // Find all instructions with regmask operands.
254 for (const MachineBasicBlock &MBB : *MF) {
255 std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()];
256 RMB.first = RegMaskSlots.size();
257
258 // Some block starts, such as EH funclets, create masks.
259 if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) {
260 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
261 RegMaskBits.push_back(Mask);
262 }
263
264 // Unwinders may clobber additional registers.
265 // FIXME: This functionality can possibly be merged into
266 // MachineBasicBlock::getBeginClobberMask().
267 if (MBB.isEHPad())
268 if (auto *Mask = TRI->getCustomEHPadPreservedMask(*MBB.getParent())) {
269 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
270 RegMaskBits.push_back(Mask);
271 }
272
273 for (const MachineInstr &MI : MBB) {
274 for (const MachineOperand &MO : MI.operands()) {
275 if (!MO.isRegMask())
276 continue;
277 RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot());
278 RegMaskBits.push_back(MO.getRegMask());
279 }
280 }
281
282 // Some block ends, such as funclet returns, create masks. Put the mask on
283 // the last instruction of the block, because MBB slot index intervals are
284 // half-open.
285 if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) {
286 assert(!MBB.empty() && "empty return block?");
287 RegMaskSlots.push_back(
288 Indexes->getInstructionIndex(MBB.back()).getRegSlot());
289 RegMaskBits.push_back(Mask);
290 }
291
292 // Compute the number of register mask instructions in this block.
293 RMB.second = RegMaskSlots.size() - RMB.first;
294 }
295}
296
297void LiveIntervals::reassignRegMaskSlots(MachineBasicBlock &Orig,
298 MachineBasicBlock &SplitBB) {
299 assert(&Orig != &SplitBB && "expected distinct blocks");
300 std::pair<unsigned, unsigned> &OrigRMB = RegMaskBlocks[Orig.getNumber()];
301 std::pair<unsigned, unsigned> &SplitRMB = RegMaskBlocks[SplitBB.getNumber()];
302
303 // RegMaskSlots is sorted, so the slots that moved are those at or after
304 // SplitBB's start index.
305 ArrayRef<SlotIndex> OrigSlots =
306 getRegMaskSlots().slice(OrigRMB.first, OrigRMB.second);
307 unsigned KeptCount = llvm::lower_bound(OrigSlots, getMBBStartIdx(&SplitBB)) -
308 OrigSlots.begin();
309 if (KeptCount == OrigRMB.second)
310 return; // No regmask slots moved into SplitBB.
311
312 SplitRMB.first = OrigRMB.first + KeptCount;
313 SplitRMB.second = OrigRMB.second - KeptCount;
314 OrigRMB.second = KeptCount;
315}
316
317void LiveIntervals::insertMBBInMapsImpl(
318 MachineBasicBlock *MBB, [[maybe_unused]] bool AssumeRegMaskEmpty) {
319#ifdef EXPENSIVE_CHECKS
320 assert((!AssumeRegMaskEmpty ||
321 none_of(*MBB,
322 [](const MachineInstr &MI) {
323 return any_of(MI.operands(), [](const MachineOperand &MO) {
324 return MO.isRegMask();
325 });
326 })) &&
327 "insertMBBInMaps expects a block with no regmask operands; use "
328 "LiveIntervals::splitAt() to split a block containing calls");
329#endif
330 Indexes->insertMBBInMaps(MBB);
331 assert(unsigned(MBB->getNumber()) == RegMaskBlocks.size() &&
332 "Blocks must be added in order.");
333 RegMaskBlocks.push_back(std::make_pair(RegMaskSlots.size(), 0));
334}
335
336//===----------------------------------------------------------------------===//
337// Register Unit Liveness
338//===----------------------------------------------------------------------===//
339//
340// Fixed interference typically comes from ABI boundaries: Function arguments
341// and return values are passed in fixed registers, and so are exception
342// pointers entering landing pads. Certain instructions require values to be
343// present in specific registers. That is also represented through fixed
344// interference.
345//
346
347/// Compute the live range of a register unit, based on the uses and defs of
348/// aliasing registers. The range should be empty, or contain only dead
349/// phi-defs from ABI blocks.
350void LiveIntervals::computeRegUnitRange(LiveRange &LR, MCRegUnit Unit) {
351 assert(LICalc && "LICalc not initialized.");
352 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
353
354 // The physregs aliasing Unit are the roots and their super-registers.
355 // Create all values as dead defs before extending to uses. Note that roots
356 // may share super-registers. That's OK because createDeadDefs() is
357 // idempotent. It is very rare for a register unit to have multiple roots, so
358 // uniquing super-registers is probably not worthwhile.
359 bool IsReserved = false;
360 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
361 bool IsRootReserved = true;
362 for (MCPhysReg Reg : TRI->superregs_inclusive(*Root)) {
363 if (!MRI->reg_empty(Reg))
364 LICalc->createDeadDefs(LR, Reg);
365 // A register unit is considered reserved if all its roots and all their
366 // super registers are reserved.
367 if (!MRI->isReserved(Reg))
368 IsRootReserved = false;
369 }
370 IsReserved |= IsRootReserved;
371 }
372 assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
373 "reserved computation mismatch");
374
375 // Now extend LR to reach all uses.
376 // Ignore uses of reserved registers. We only track defs of those.
377 if (!IsReserved) {
378 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
379 for (MCPhysReg Reg : TRI->superregs_inclusive(*Root)) {
380 if (!MRI->reg_empty(Reg))
381 LICalc->extendToUses(LR, Reg);
382 }
383 }
384 }
385
386 // Flush the segment set to the segment vector.
388 LR.flushSegmentSet();
389}
390
391/// Precompute the live ranges of any register units that are live-in to an ABI
392/// block somewhere. Register values can appear without a corresponding def when
393/// entering the entry block or a landing pad.
394void LiveIntervals::computeLiveInRegUnits() {
395 RegUnitRanges.resize(TRI->getNumRegUnits());
396 LLVM_DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n");
397
398 // Keep track of the live range sets allocated.
400
401 // Check all basic blocks for live-ins.
402 for (const MachineBasicBlock &MBB : *MF) {
403 // We only care about ABI blocks: Entry + landing pads.
404 if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty())
405 continue;
406
407 // Create phi-defs at Begin for all live-in registers.
408 SlotIndex Begin = Indexes->getMBBStartIdx(&MBB);
409 LLVM_DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB));
410 for (const auto &LI : MBB.liveins()) {
411 for (MCRegUnit Unit : TRI->regunits(LI.PhysReg)) {
412 LiveRange *LR = RegUnitRanges[static_cast<unsigned>(Unit)];
413 if (!LR) {
414 // Use segment set to speed-up initial computation of the live range.
415 LR = RegUnitRanges[static_cast<unsigned>(Unit)] =
417 NewRanges.push_back(Unit);
418 }
419 VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator());
420 (void)VNI;
421 LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id);
422 }
423 }
424 LLVM_DEBUG(dbgs() << '\n');
425 }
426 LLVM_DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n");
427
428 // Compute the 'normal' part of the ranges.
429 for (MCRegUnit Unit : NewRanges)
430 computeRegUnitRange(*RegUnitRanges[static_cast<unsigned>(Unit)], Unit);
431}
432
435 for (VNInfo *VNI : VNIs) {
436 if (VNI->isUnused())
437 continue;
438 SlotIndex Def = VNI->def;
439 LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI));
440 }
441}
442
443void LiveIntervals::extendSegmentsToUses(LiveRange &Segments,
444 ShrinkToUsesWorkList &WorkList,
445 Register Reg, LaneBitmask LaneMask) {
446 // Keep track of the PHIs that are in use.
447 SmallPtrSet<VNInfo*, 8> UsedPHIs;
448 // Blocks that have already been added to WorkList as live-out.
449 SmallPtrSet<const MachineBasicBlock*, 16> LiveOut;
450
451 auto getSubRange = [](const LiveInterval &I, LaneBitmask M)
452 -> const LiveRange& {
453 if (M.none())
454 return I;
455 for (const LiveInterval::SubRange &SR : I.subranges()) {
456 if ((SR.LaneMask & M).any()) {
457 assert(SR.LaneMask == M && "Expecting lane masks to match exactly");
458 return SR;
459 }
460 }
461 llvm_unreachable("Subrange for mask not found");
462 };
463
464 const LiveInterval &LI = getInterval(Reg);
465 const LiveRange &OldRange = getSubRange(LI, LaneMask);
466
467 // Extend intervals to reach all uses in WorkList.
468 while (!WorkList.empty()) {
469 SlotIndex Idx = WorkList.back().first;
470 VNInfo *VNI = WorkList.back().second;
471 WorkList.pop_back();
472 const MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Idx.getPrevSlot());
473 SlotIndex BlockStart = Indexes->getMBBStartIdx(MBB);
474
475 // Extend the live range for VNI to be live at Idx.
476 if (VNInfo *ExtVNI = Segments.extendInBlock(BlockStart, Idx)) {
477 assert(ExtVNI == VNI && "Unexpected existing value number");
478 (void)ExtVNI;
479 // Is this a PHIDef we haven't seen before?
480 if (!VNI->isPHIDef() || VNI->def != BlockStart ||
481 !UsedPHIs.insert(VNI).second)
482 continue;
483 // The PHI is live, make sure the predecessors are live-out.
484 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
485 if (!LiveOut.insert(Pred).second)
486 continue;
487 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
488 // A predecessor is not required to have a live-out value for a PHI.
489 if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop))
490 WorkList.push_back(std::make_pair(Stop, PVNI));
491 }
492 continue;
493 }
494
495 // VNI is live-in to MBB.
496 LLVM_DEBUG(dbgs() << " live-in at " << BlockStart << '\n');
497 Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
498
499 // Make sure VNI is live-out from the predecessors.
500 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
501 if (!LiveOut.insert(Pred).second)
502 continue;
503 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
504 if (VNInfo *OldVNI = OldRange.getVNInfoBefore(Stop)) {
505 assert(OldVNI == VNI && "Wrong value out of predecessor");
506 (void)OldVNI;
507 WorkList.push_back(std::make_pair(Stop, VNI));
508 } else {
509#ifndef NDEBUG
510 // There was no old VNI. Verify that Stop is jointly dominated
511 // by <undef>s for this live range.
512 assert(LaneMask.any() &&
513 "Missing value out of predecessor for main range");
515 LI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
516 assert(LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes) &&
517 "Missing value out of predecessor for subrange");
518#endif
519 }
520 }
521 }
522}
523
526 LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n');
527 assert(li->reg().isVirtual() && "Can only shrink virtual registers");
528
529 // Shrink subregister live ranges.
530 bool NeedsCleanup = false;
531 for (LiveInterval::SubRange &S : li->subranges()) {
532 shrinkToUses(S, li->reg());
533 if (S.empty())
534 NeedsCleanup = true;
535 }
536 if (NeedsCleanup)
538
539 // Find all the values used, including PHI kills.
540 ShrinkToUsesWorkList WorkList;
541
542 // Visit all instructions reading li->reg().
543 Register Reg = li->reg();
544 for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) {
545 if (UseMI.isDebugInstr() || !UseMI.readsVirtualRegister(Reg))
546 continue;
548 LiveQueryResult LRQ = li->Query(Idx);
549 VNInfo *VNI = LRQ.valueIn();
550 if (!VNI) {
551 // This shouldn't happen: readsVirtualRegister returns true, but there is
552 // no live value. It is likely caused by a target getting <undef> flags
553 // wrong.
555 dbgs() << Idx << '\t' << UseMI
556 << "Warning: Instr claims to read non-existent value in "
557 << *li << '\n');
558 continue;
559 }
560 // Special case: An early-clobber tied operand reads and writes the
561 // register one slot early.
562 if (VNInfo *DefVNI = LRQ.valueDefined())
563 Idx = DefVNI->def;
564
565 WorkList.push_back(std::make_pair(Idx, VNI));
566 }
567
568 // Create new live ranges with only minimal live segments per def.
569 LiveRange NewLR;
570 createSegmentsForValues(NewLR, li->vnis());
571 extendSegmentsToUses(NewLR, WorkList, Reg, LaneBitmask::getNone());
572
573 // Move the trimmed segments back.
574 li->segments.swap(NewLR.segments);
575
576 // Handle dead values.
577 bool CanSeparate = computeDeadValues(*li, dead);
578 LLVM_DEBUG(dbgs() << "Shrunk: " << *li << '\n');
579 return CanSeparate;
580}
581
582bool LiveIntervals::computeDeadValues(LiveInterval &LI,
584 bool MayHaveSplitComponents = false;
585
586 for (VNInfo *VNI : LI.valnos) {
587 if (VNI->isUnused())
588 continue;
589 SlotIndex Def = VNI->def;
591 assert(I != LI.end() && "Missing segment for VNI");
592
593 // Is the register live before? Otherwise we may have to add a read-undef
594 // flag for subregister defs.
595 Register VReg = LI.reg();
596 if (MRI->shouldTrackSubRegLiveness(VReg)) {
597 if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
599 MI->setRegisterDefReadUndef(VReg);
600 }
601 }
602
603 if (I->end != Def.getDeadSlot())
604 continue;
605 if (VNI->isPHIDef()) {
606 // This is a dead PHI. Remove it.
607 VNI->markUnused();
608 LI.removeSegment(I);
609 LLVM_DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n");
610 } else {
611 // This is a dead def. Make sure the instruction knows.
612 MachineInstr *MI = getInstructionFromIndex(Def);
613 assert(MI && "No instruction defining live value");
614 MI->addRegisterDead(LI.reg(), TRI);
615
616 if (dead && MI->allDefsAreDead()) {
617 LLVM_DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI);
618 dead->push_back(MI);
619 }
620 }
621 MayHaveSplitComponents = true;
622 }
623 return MayHaveSplitComponents;
624}
625
627 LLVM_DEBUG(dbgs() << "Shrink: " << SR << '\n');
628 assert(Reg.isVirtual() && "Can only shrink virtual registers");
629 // Find all the values used, including PHI kills.
630 ShrinkToUsesWorkList WorkList;
631
632 // Visit all instructions reading Reg.
633 SlotIndex LastIdx;
634 for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
635 // Skip "undef" uses.
636 if (!MO.readsReg())
637 continue;
638 // Maybe the operand is for a subregister we don't care about.
639 unsigned SubReg = MO.getSubReg();
640 if (SubReg != 0) {
641 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
642 if ((LaneMask & SR.LaneMask).none())
643 continue;
644 }
645 // We only need to visit each instruction once.
646 MachineInstr *UseMI = MO.getParent();
648 if (Idx == LastIdx)
649 continue;
650 LastIdx = Idx;
651
652 LiveQueryResult LRQ = SR.Query(Idx);
653 VNInfo *VNI = LRQ.valueIn();
654 // For Subranges it is possible that only undef values are left in that
655 // part of the subregister, so there is no real liverange at the use
656 if (!VNI)
657 continue;
658
659 // Special case: An early-clobber tied operand reads and writes the
660 // register one slot early.
661 if (VNInfo *DefVNI = LRQ.valueDefined())
662 Idx = DefVNI->def;
663
664 WorkList.push_back(std::make_pair(Idx, VNI));
665 }
666
667 // Create a new live ranges with only minimal live segments per def.
668 LiveRange NewLR;
669 createSegmentsForValues(NewLR, SR.vnis());
670 extendSegmentsToUses(NewLR, WorkList, Reg, SR.LaneMask);
671
672 // Move the trimmed ranges back.
673 SR.segments.swap(NewLR.segments);
674
675 // Remove dead PHI value numbers
676 for (VNInfo *VNI : SR.valnos) {
677 if (VNI->isUnused())
678 continue;
679 const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def);
680 assert(Segment != nullptr && "Missing segment for VNI");
681 if (Segment->end != VNI->def.getDeadSlot())
682 continue;
683 if (VNI->isPHIDef()) {
684 // This is a dead PHI. Remove it.
685 LLVM_DEBUG(dbgs() << "Dead PHI at " << VNI->def
686 << " may separate interval\n");
687 VNI->markUnused();
688 SR.removeSegment(*Segment);
689 }
690 }
691
692 LLVM_DEBUG(dbgs() << "Shrunk: " << SR << '\n');
693}
694
696 ArrayRef<SlotIndex> Indices,
697 ArrayRef<SlotIndex> Undefs) {
698 assert(LICalc && "LICalc not initialized.");
699 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
700 for (SlotIndex Idx : Indices)
701 LICalc->extend(LR, Idx, /*PhysReg=*/0, Undefs);
702}
703
705 SmallVectorImpl<SlotIndex> *EndPoints) {
706 LiveQueryResult LRQ = LR.Query(Kill);
707 // LR may have liveness reachable from early clobber slot, which may be
708 // only live-in instead of live-out of the instruction.
709 // For example, LR =[1r, 3r), Kill = 3e, we have to prune [3e, 3r) of LR.
710 VNInfo *VNI = LRQ.valueOutOrDead() ? LRQ.valueOutOrDead() : LRQ.valueIn();
711 if (!VNI)
712 return;
713
714 MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill);
715 SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
716
717 // If VNI isn't live out from KillMBB, the value is trivially pruned.
718 if (LRQ.endPoint() < MBBEnd) {
719 LR.removeSegment(Kill, LRQ.endPoint());
720 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
721 return;
722 }
723
724 // VNI is live out of KillMBB.
725 LR.removeSegment(Kill, MBBEnd);
726 if (EndPoints) EndPoints->push_back(MBBEnd);
727
728 // Find all blocks that are reachable from KillMBB without leaving VNI's live
729 // range. It is possible that KillMBB itself is reachable, so start a DFS
730 // from each successor.
732 VisitedTy Visited;
733 for (MachineBasicBlock *Succ : KillMBB->successors()) {
735 I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited);
736 I != E;) {
738
739 // Check if VNI is live in to MBB.
740 SlotIndex MBBStart, MBBEnd;
741 std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB);
742 LiveQueryResult LRQ = LR.Query(MBBStart);
743 if (LRQ.valueIn() != VNI) {
744 // This block isn't part of the VNI segment. Prune the search.
745 I.skipChildren();
746 continue;
747 }
748
749 // Prune the search if VNI is killed in MBB.
750 if (LRQ.endPoint() < MBBEnd) {
751 LR.removeSegment(MBBStart, LRQ.endPoint());
752 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
753 I.skipChildren();
754 continue;
755 }
756
757 // VNI is live through MBB.
758 LR.removeSegment(MBBStart, MBBEnd);
759 if (EndPoints) EndPoints->push_back(MBBEnd);
760 ++I;
761 }
762 }
763}
764
765//===----------------------------------------------------------------------===//
766// Register allocator hooks.
767//
768
770 // Keep track of regunit ranges.
772
773 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
775 if (MRI->reg_nodbg_empty(Reg))
776 continue;
777 const LiveInterval &LI = getInterval(Reg);
778 if (LI.empty())
779 continue;
780
781 // Target may have not allocated this yet.
782 Register PhysReg = VRM->getPhys(Reg);
783 if (!PhysReg)
784 continue;
785
786 // Find the regunit intervals for the assigned register. They may overlap
787 // the virtual register live range, cancelling any kills.
788 RU.clear();
789 LaneBitmask ArtificialLanes;
790 for (MCRegUnitMaskIterator UI(PhysReg, TRI); UI.isValid(); ++UI) {
791 auto [Unit, Bitmask] = *UI;
792 // Record lane mask for all artificial RegUnits for this physreg.
793 if (TRI->isArtificialRegUnit(Unit))
794 ArtificialLanes |= Bitmask;
795 const LiveRange &RURange = getRegUnit(Unit);
796 if (RURange.empty())
797 continue;
798 RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end)));
799 }
800 // Every instruction that kills Reg corresponds to a segment range end
801 // point.
802 for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE;
803 ++RI) {
804 // A block index indicates an MBB edge.
805 if (RI->end.isBlock())
806 continue;
808 if (!MI)
809 continue;
810
811 // Check if any of the regunits are live beyond the end of RI. That could
812 // happen when a physreg is defined as a copy of a virtreg:
813 //
814 // %eax = COPY %5
815 // FOO %5 <--- MI, cancel kill because %eax is live.
816 // BAR killed %eax
817 //
818 // There should be no kill flag on FOO when %5 is rewritten as %eax.
819 for (auto &RUP : RU) {
820 const LiveRange &RURange = *RUP.first;
821 LiveRange::const_iterator &I = RUP.second;
822 if (I == RURange.end())
823 continue;
824 I = RURange.advanceTo(I, RI->end);
825 if (I == RURange.end() || I->start >= RI->end)
826 continue;
827 // I is overlapping RI.
828 goto CancelKill;
829 }
830
831 if (MRI->subRegLivenessEnabled()) {
832 // When reading a partial undefined value we must not add a kill flag.
833 // The regalloc might have used the undef lane for something else.
834 // Example:
835 // %1 = ... ; R32: %1
836 // %2:high16 = ... ; R64: %2
837 // = read killed %2 ; R64: %2
838 // = read %1 ; R32: %1
839 // The <kill> flag is correct for %2, but the register allocator may
840 // assign R0L to %1, and R0 to %2 because the low 32bits of R0
841 // are actually never written by %2. After assignment the <kill>
842 // flag at the read instruction is invalid.
843 LaneBitmask DefinedLanesMask;
844 if (LI.hasSubRanges()) {
845 // Compute a mask of lanes that are defined.
846 // Artificial regunits are not independently allocatable so the
847 // register allocator cannot have used them to represent any other
848 // values. That's why we mark them as 'defined' here, as this
849 // otherwise prevents kill flags from being added.
850 DefinedLanesMask = ArtificialLanes;
851 for (const LiveInterval::SubRange &SR : LI.subranges())
852 for (const LiveRange::Segment &Segment : SR.segments) {
853 if (Segment.start >= RI->end)
854 break;
855 if (Segment.end == RI->end) {
856 DefinedLanesMask |= SR.LaneMask;
857 break;
858 }
859 }
860 } else
861 DefinedLanesMask = LaneBitmask::getAll();
862
863 bool IsFullWrite = false;
864 for (const MachineOperand &MO : MI->operands()) {
865 if (!MO.isReg() || MO.getReg() != Reg)
866 continue;
867 if (MO.isUse()) {
868 // Reading any undefined lanes?
869 unsigned SubReg = MO.getSubReg();
870 LaneBitmask UseMask = SubReg ? TRI->getSubRegIndexLaneMask(SubReg)
871 : MRI->getMaxLaneMaskForVReg(Reg);
872 if ((UseMask & ~DefinedLanesMask).any())
873 goto CancelKill;
874 } else if (MO.getSubReg() == 0) {
875 // Writing to the full register?
876 assert(MO.isDef());
877 IsFullWrite = true;
878 }
879 }
880
881 // If an instruction writes to a subregister, a new segment starts in
882 // the LiveInterval. But as this is only overriding part of the register
883 // adding kill-flags is not correct here after registers have been
884 // assigned.
885 if (!IsFullWrite) {
886 // Next segment has to be adjacent in the subregister write case.
887 LiveRange::const_iterator N = std::next(RI);
888 if (N != LI.end() && N->start == RI->end)
889 goto CancelKill;
890 }
891 }
892
893 MI->addRegisterKilled(Reg, nullptr);
894 continue;
895CancelKill:
896 MI->clearRegisterKills(Reg, nullptr);
897 }
898 }
899}
900
903 assert(!LI.empty() && "LiveInterval is empty.");
904
905 // A local live range must be fully contained inside the block, meaning it is
906 // defined and killed at instructions, not at block boundaries. It is not
907 // live in or out of any block.
908 //
909 // It is technically possible to have a PHI-defined live range identical to a
910 // single block, but we are going to return false in that case.
911
912 SlotIndex Start = LI.beginIndex();
913 if (Start.isBlock())
914 return nullptr;
915
916 SlotIndex Stop = LI.endIndex();
917 if (Stop.isBlock())
918 return nullptr;
919
920 // getMBBFromIndex doesn't need to search the MBB table when both indexes
921 // belong to proper instructions.
922 MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start);
923 MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop);
924 return MBB1 == MBB2 ? MBB1 : nullptr;
925}
926
927bool
928LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const {
929 for (const VNInfo *PHI : LI.valnos) {
930 if (PHI->isUnused() || !PHI->isPHIDef())
931 continue;
932 const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def);
933 // Conservatively return true instead of scanning huge predecessor lists.
934 if (PHIMBB->pred_size() > 100)
935 return true;
936 for (const MachineBasicBlock *Pred : PHIMBB->predecessors())
937 if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred)))
938 return true;
939 }
940 return false;
941}
942
943float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
944 const MachineBlockFrequencyInfo *MBFI,
945 const MachineInstr &MI,
946 ProfileSummaryInfo *PSI) {
947 return getSpillWeight(isDef, isUse, MBFI, MI.getParent(), PSI);
948}
949
950float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
951 const MachineBlockFrequencyInfo *MBFI,
952 const MachineBasicBlock *MBB,
953 ProfileSummaryInfo *PSI) {
954 float Weight = isDef + isUse;
955 const auto *MF = MBB->getParent();
956 // When optimizing for size we only consider the codesize impact of spilling
957 // the register, not the runtime impact.
958 if (PSI && llvm::shouldOptimizeForSize(MF, PSI, MBFI))
959 return Weight;
960 return Weight * MBFI->getBlockFreqRelativeToEntryBlock(MBB);
961}
962
966 VNInfo *VN = Interval.getNextValue(
967 SlotIndex(getInstructionIndex(startInst).getRegSlot()),
969 LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()),
970 getMBBEndIdx(startInst.getParent()), VN);
971 Interval.addSegment(S);
972
973 return S;
974}
975
976//===----------------------------------------------------------------------===//
977// Register mask functions
978//===----------------------------------------------------------------------===//
979/// Check whether use of reg in MI is live-through. Live-through means that
980/// the value is alive on exit from Machine instruction. The example of such
981/// use is a deopt value in statepoint instruction.
983 if (MI->getOpcode() != TargetOpcode::STATEPOINT)
984 return false;
987 return false;
988 for (unsigned Idx = SO.getNumDeoptArgsIdx(), E = SO.getNumGCPtrIdx(); Idx < E;
989 ++Idx) {
990 const MachineOperand &MO = MI->getOperand(Idx);
991 if (MO.isReg() && MO.getReg() == Reg)
992 return true;
993 }
994 return false;
995}
996
998 BitVector &UsableRegs) {
999 if (LI.empty())
1000 return false;
1001 LiveInterval::const_iterator LiveI = LI.begin(), LiveE = LI.end();
1002
1003 // Use a smaller arrays for local live ranges.
1004 ArrayRef<SlotIndex> Slots;
1007 Slots = getRegMaskSlotsInBlock(MBB->getNumber());
1008 Bits = getRegMaskBitsInBlock(MBB->getNumber());
1009 } else {
1010 Slots = getRegMaskSlots();
1011 Bits = getRegMaskBits();
1012 }
1013
1014 // We are going to enumerate all the register mask slots contained in LI.
1015 // Start with a binary search of RegMaskSlots to find a starting point.
1016 ArrayRef<SlotIndex>::iterator SlotI = llvm::lower_bound(Slots, LiveI->start);
1017 ArrayRef<SlotIndex>::iterator SlotE = Slots.end();
1018
1019 // No slots in range, LI begins after the last call.
1020 if (SlotI == SlotE)
1021 return false;
1022
1023 bool Found = false;
1024 // Utility to union regmasks.
1025 auto unionBitMask = [&](unsigned Idx) {
1026 if (!Found) {
1027 // This is the first overlap. Initialize UsableRegs to all ones.
1028 UsableRegs.clear();
1029 UsableRegs.resize(TRI->getNumRegs(), true);
1030 Found = true;
1031 }
1032 // Remove usable registers clobbered by this mask.
1033 UsableRegs.clearBitsNotInMask(Bits[Idx]);
1034 };
1035 while (true) {
1036 assert(*SlotI >= LiveI->start);
1037 // Loop over all slots overlapping this segment.
1038 while (*SlotI < LiveI->end) {
1039 // *SlotI overlaps LI. Collect mask bits.
1040 unionBitMask(SlotI - Slots.begin());
1041 if (++SlotI == SlotE)
1042 return Found;
1043 }
1044 // If segment ends with live-through use we need to collect its regmask.
1045 if (*SlotI == LiveI->end)
1047 if (hasLiveThroughUse(MI, LI.reg()))
1048 unionBitMask(SlotI++ - Slots.begin());
1049 // *SlotI is beyond the current LI segment.
1050 // Special advance implementation to not miss next LiveI->end.
1051 if (++LiveI == LiveE || SlotI == SlotE || *SlotI > LI.endIndex())
1052 return Found;
1053 while (LiveI->end < *SlotI)
1054 ++LiveI;
1055 // Advance SlotI until it overlaps.
1056 while (*SlotI < LiveI->start)
1057 if (++SlotI == SlotE)
1058 return Found;
1059 }
1060}
1061
1062//===----------------------------------------------------------------------===//
1063// IntervalUpdate class.
1064//===----------------------------------------------------------------------===//
1065
1066/// Toolkit used by handleMove to trim or extend live intervals.
1068private:
1069 LiveIntervals& LIS;
1070 const MachineRegisterInfo& MRI;
1071 const TargetRegisterInfo& TRI;
1072 SlotIndex OldIdx;
1073 SlotIndex NewIdx;
1075 bool UpdateFlags;
1076
1077public:
1078 HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI,
1079 const TargetRegisterInfo& TRI,
1080 SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
1081 : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
1082 UpdateFlags(UpdateFlags) {}
1083
1084 // FIXME: UpdateFlags is a workaround that creates live intervals for all
1085 // physregs, even those that aren't needed for regalloc, in order to update
1086 // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill
1087 // flags, and postRA passes will use a live register utility instead.
1088 LiveRange *getRegUnitLI(MCRegUnit Unit) {
1089 if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
1090 return &LIS.getRegUnit(Unit);
1091 return LIS.getCachedRegUnit(Unit);
1092 }
1093
1094 /// Update all live ranges touched by MI, assuming a move from OldIdx to
1095 /// NewIdx.
1097 LLVM_DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": "
1098 << *MI);
1099 bool hasRegMask = false;
1100 for (MachineOperand &MO : MI->operands()) {
1101 if (MO.isRegMask())
1102 hasRegMask = true;
1103 if (!MO.isReg())
1104 continue;
1105 if (MO.isUse()) {
1106 if (!MO.readsReg())
1107 continue;
1108 // Aggressively clear all kill flags.
1109 // They are reinserted by VirtRegRewriter.
1110 MO.setIsKill(false);
1111 }
1112
1113 Register Reg = MO.getReg();
1114 if (!Reg)
1115 continue;
1116 if (Reg.isVirtual()) {
1117 LiveInterval &LI = LIS.getInterval(Reg);
1118 if (LI.hasSubRanges()) {
1119 unsigned SubReg = MO.getSubReg();
1120 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1121 : MRI.getMaxLaneMaskForVReg(Reg);
1122 for (LiveInterval::SubRange &S : LI.subranges()) {
1123 if ((S.LaneMask & LaneMask).none())
1124 continue;
1125 updateRange(S, VirtRegOrUnit(Reg), S.LaneMask);
1126 }
1127 }
1128 updateRange(LI, VirtRegOrUnit(Reg), LaneBitmask::getNone());
1129 // If main range has a hole and we are moving a subrange use across
1130 // the hole updateRange() cannot properly handle it since it only
1131 // gets the LiveRange and not the whole LiveInterval. As a result
1132 // we may end up with a main range not covering all subranges.
1133 // This is extremely rare case, so let's check and reconstruct the
1134 // main range.
1135 if (LI.hasSubRanges()) {
1136 unsigned SubReg = MO.getSubReg();
1137 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1138 : MRI.getMaxLaneMaskForVReg(Reg);
1139 for (LiveInterval::SubRange &S : LI.subranges()) {
1140 if ((S.LaneMask & LaneMask).none() || LI.covers(S))
1141 continue;
1142 LI.clear();
1143 LIS.constructMainRangeFromSubranges(LI);
1144 break;
1145 }
1146 }
1147
1148 continue;
1149 }
1150
1151 // For physregs, only update the regunits that actually have a
1152 // precomputed live range.
1153 for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg()))
1154 if (LiveRange *LR = getRegUnitLI(Unit))
1155 updateRange(*LR, VirtRegOrUnit(Unit), LaneBitmask::getNone());
1156 }
1157 if (hasRegMask)
1158 updateRegMaskSlots();
1159 }
1160
1161private:
1162 /// Update a single live range, assuming an instruction has been moved from
1163 /// OldIdx to NewIdx.
1164 void updateRange(LiveRange &LR, VirtRegOrUnit VRegOrUnit,
1165 LaneBitmask LaneMask) {
1166 if (!Updated.insert(&LR).second)
1167 return;
1168 LLVM_DEBUG({
1169 dbgs() << " ";
1170 if (VRegOrUnit.isVirtualReg()) {
1171 dbgs() << printReg(VRegOrUnit.asVirtualReg());
1172 if (LaneMask.any())
1173 dbgs() << " L" << PrintLaneMask(LaneMask);
1174 } else {
1175 dbgs() << printRegUnit(VRegOrUnit.asMCRegUnit(), &TRI);
1176 }
1177 dbgs() << ":\t" << LR << '\n';
1178 });
1179 if (SlotIndex::isEarlierInstr(OldIdx, NewIdx))
1180 handleMoveDown(LR);
1181 else
1182 handleMoveUp(LR, VRegOrUnit, LaneMask);
1183 LLVM_DEBUG(dbgs() << " -->\t" << LR << '\n');
1184 assert(LR.verify());
1185 }
1186
1187 /// Update LR to reflect an instruction has been moved downwards from OldIdx
1188 /// to NewIdx (OldIdx < NewIdx).
1189 void handleMoveDown(LiveRange &LR) {
1190 LiveRange::iterator E = LR.end();
1191 // Segment going into OldIdx.
1192 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1193
1194 // No value live before or after OldIdx? Nothing to do.
1195 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
1196 return;
1197
1198 LiveRange::iterator OldIdxOut;
1199 // Do we have a value live-in to OldIdx?
1200 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1201 // If the live-in value already extends to NewIdx, there is nothing to do.
1202 if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end))
1203 return;
1204 // Aggressively remove all kill flags from the old kill point.
1205 // Kill flags shouldn't be used while live intervals exist, they will be
1206 // reinserted by VirtRegRewriter.
1207 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
1208 for (MachineOperand &MOP : mi_bundle_ops(*KillMI))
1209 if (MOP.isReg() && MOP.isUse())
1210 MOP.setIsKill(false);
1211
1212 // Is there a def before NewIdx which is not OldIdx?
1213 LiveRange::iterator Next = std::next(OldIdxIn);
1214 if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) &&
1215 SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1216 // If we are here then OldIdx was just a use but not a def. We only have
1217 // to ensure liveness extends to NewIdx.
1218 LiveRange::iterator NewIdxIn =
1219 LR.advanceTo(Next, NewIdx.getBaseIndex());
1220 // Extend the segment before NewIdx if necessary.
1221 if (NewIdxIn == E ||
1222 !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) {
1223 LiveRange::iterator Prev = std::prev(NewIdxIn);
1224 Prev->end = NewIdx.getRegSlot();
1225 }
1226 // Extend OldIdxIn.
1227 OldIdxIn->end = Next->start;
1228 return;
1229 }
1230
1231 // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR
1232 // invalid by overlapping ranges.
1233 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1234 OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
1235 // If this was not a kill, then there was no def and we're done.
1236 if (!isKill)
1237 return;
1238
1239 // Did we have a Def at OldIdx?
1240 OldIdxOut = Next;
1241 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1242 return;
1243 } else {
1244 OldIdxOut = OldIdxIn;
1245 }
1246
1247 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1248 // to the segment starting there.
1249 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1250 "No def?");
1251 VNInfo *OldIdxVNI = OldIdxOut->valno;
1252 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1253
1254 // If the defined value extends beyond NewIdx, just move the beginning
1255 // of the segment to NewIdx.
1256 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1257 if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) {
1258 OldIdxVNI->def = NewIdxDef;
1259 OldIdxOut->start = OldIdxVNI->def;
1260 return;
1261 }
1262
1263 // If we are here then we have a Definition at OldIdx which ends before
1264 // NewIdx.
1265
1266 // Is there an existing Def at NewIdx?
1267 LiveRange::iterator AfterNewIdx
1268 = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot());
1269 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1270 if (!OldIdxDefIsDead &&
1271 SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) {
1272 // OldIdx is not a dead def, and NewIdxDef is inside a new interval.
1273 VNInfo *DefVNI;
1274 if (OldIdxOut != LR.begin() &&
1275 !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end,
1276 OldIdxOut->start)) {
1277 // There is no gap between OldIdxOut and its predecessor anymore,
1278 // merge them.
1279 LiveRange::iterator IPrev = std::prev(OldIdxOut);
1280 DefVNI = OldIdxVNI;
1281 IPrev->end = OldIdxOut->end;
1282 } else {
1283 // The value is live in to OldIdx
1284 LiveRange::iterator INext = std::next(OldIdxOut);
1285 assert(INext != E && "Must have following segment");
1286 // We merge OldIdxOut and its successor. As we're dealing with subreg
1287 // reordering, there is always a successor to OldIdxOut in the same BB
1288 // We don't need INext->valno anymore and will reuse for the new segment
1289 // we create later.
1290 DefVNI = OldIdxVNI;
1291 INext->start = OldIdxOut->end;
1292 INext->valno->def = INext->start;
1293 }
1294 // If NewIdx is behind the last segment, extend that and append a new one.
1295 if (AfterNewIdx == E) {
1296 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1297 // one position.
1298 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn -| end
1299 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end
1300 std::copy(std::next(OldIdxOut), E, OldIdxOut);
1301 // The last segment is undefined now, reuse it for a dead def.
1302 LiveRange::iterator NewSegment = std::prev(E);
1303 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1304 DefVNI);
1305 DefVNI->def = NewIdxDef;
1306
1307 LiveRange::iterator Prev = std::prev(NewSegment);
1308 Prev->end = NewIdxDef;
1309 } else {
1310 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1311 // one position.
1312 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -|
1313 // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -|
1314 std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
1315 LiveRange::iterator Prev = std::prev(AfterNewIdx);
1316 // We have two cases:
1317 if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) {
1318 // Case 1: NewIdx is inside a liverange. Split this liverange at
1319 // NewIdxDef into the segment "Prev" followed by "NewSegment".
1320 LiveRange::iterator NewSegment = AfterNewIdx;
1321 *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
1322 Prev->valno->def = NewIdxDef;
1323
1324 *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
1325 DefVNI->def = Prev->start;
1326 } else {
1327 // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and
1328 // turn Prev into a segment from NewIdx to AfterNewIdx->start.
1329 *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
1330 DefVNI->def = NewIdxDef;
1331 assert(DefVNI != AfterNewIdx->valno);
1332 }
1333 }
1334 return;
1335 }
1336
1337 if (AfterNewIdx != E &&
1338 SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) {
1339 // There is an existing def at NewIdx. The def at OldIdx is coalesced into
1340 // that value.
1341 assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?");
1342 LR.removeValNo(OldIdxVNI);
1343 } else {
1344 // There was no existing def at NewIdx. We need to create a dead def
1345 // at NewIdx. Shift segments over the old OldIdxOut segment, this frees
1346 // a new segment at the place where we want to construct the dead def.
1347 // |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -|
1348 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -|
1349 assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators");
1350 std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
1351 // We can reuse OldIdxVNI now.
1352 LiveRange::iterator NewSegment = std::prev(AfterNewIdx);
1353 VNInfo *NewSegmentVNI = OldIdxVNI;
1354 NewSegmentVNI->def = NewIdxDef;
1355 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1356 NewSegmentVNI);
1357 }
1358 }
1359
1360 /// Update LR to reflect an instruction has been moved upwards from OldIdx
1361 /// to NewIdx (NewIdx < OldIdx).
1362 void handleMoveUp(LiveRange &LR, VirtRegOrUnit VRegOrUnit,
1363 LaneBitmask LaneMask) {
1364 LiveRange::iterator E = LR.end();
1365 // Segment going into OldIdx.
1366 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1367
1368 // No value live before or after OldIdx? Nothing to do.
1369 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
1370 return;
1371
1372 LiveRange::iterator OldIdxOut;
1373 // Do we have a value live-in to OldIdx?
1374 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1375 // If the live-in value isn't killed here, then we have no Def at
1376 // OldIdx, moreover the value must be live at NewIdx so there is nothing
1377 // to do.
1378 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1379 if (!isKill)
1380 return;
1381
1382 // At this point we have to move OldIdxIn->end back to the nearest
1383 // previous use or (dead-)def but no further than NewIdx.
1384 SlotIndex DefBeforeOldIdx
1385 = std::max(OldIdxIn->start.getDeadSlot(),
1386 NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
1387 OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, VRegOrUnit, LaneMask);
1388
1389 // Did we have a Def at OldIdx? If not we are done now.
1390 OldIdxOut = std::next(OldIdxIn);
1391 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1392 return;
1393 } else {
1394 OldIdxOut = OldIdxIn;
1395 OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E;
1396 }
1397
1398 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1399 // to the segment starting there.
1400 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1401 "No def?");
1402 VNInfo *OldIdxVNI = OldIdxOut->valno;
1403 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1404 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1405
1406 // Is there an existing def at NewIdx?
1407 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1408 LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot());
1409 if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) {
1410 assert(NewIdxOut->valno != OldIdxVNI &&
1411 "Same value defined more than once?");
1412 // If OldIdx was a dead def remove it.
1413 if (!OldIdxDefIsDead) {
1414 // Remove segment starting at NewIdx and move begin of OldIdxOut to
1415 // NewIdx so it can take its place.
1416 OldIdxVNI->def = NewIdxDef;
1417 OldIdxOut->start = NewIdxDef;
1418 LR.removeValNo(NewIdxOut->valno);
1419 } else {
1420 // Simply remove the dead def at OldIdx.
1421 LR.removeValNo(OldIdxVNI);
1422 }
1423 } else {
1424 // Previously nothing was live after NewIdx, so all we have to do now is
1425 // move the begin of OldIdxOut to NewIdx.
1426 if (!OldIdxDefIsDead) {
1427 // Do we have any intermediate Defs between OldIdx and NewIdx?
1428 if (OldIdxIn != E &&
1429 SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) {
1430 // OldIdx is not a dead def and NewIdx is before predecessor start.
1431 LiveRange::iterator NewIdxIn = NewIdxOut;
1432 assert(NewIdxIn == LR.find(NewIdx.getBaseIndex()));
1433 const SlotIndex SplitPos = NewIdxDef;
1434 OldIdxVNI = OldIdxIn->valno;
1435
1436 SlotIndex NewDefEndPoint = std::next(NewIdxIn)->end;
1437 LiveRange::iterator Prev = std::prev(OldIdxIn);
1438 if (OldIdxIn != LR.begin() &&
1439 SlotIndex::isEarlierInstr(NewIdx, Prev->end)) {
1440 // If the segment before OldIdx read a value defined earlier than
1441 // NewIdx, the moved instruction also reads and forwards that
1442 // value. Extend the lifetime of the new def point.
1443
1444 // Extend to where the previous range started, unless there is
1445 // another redef first.
1446 NewDefEndPoint = std::min(OldIdxIn->start,
1447 std::next(NewIdxOut)->start);
1448 }
1449
1450 // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut.
1451 OldIdxOut->valno->def = OldIdxIn->start;
1452 *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
1453 OldIdxOut->valno);
1454 // OldIdxIn and OldIdxVNI are now undef and can be overridden.
1455 // We Slide [NewIdxIn, OldIdxIn) down one position.
1456 // |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -|
1457 // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -|
1458 std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
1459 // NewIdxIn is now considered undef so we can reuse it for the moved
1460 // value.
1461 LiveRange::iterator NewSegment = NewIdxIn;
1462 LiveRange::iterator Next = std::next(NewSegment);
1463 if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1464 // There is no gap between NewSegment and its predecessor.
1465 *NewSegment = LiveRange::Segment(Next->start, SplitPos,
1466 Next->valno);
1467
1468 *Next = LiveRange::Segment(SplitPos, NewDefEndPoint, OldIdxVNI);
1469 Next->valno->def = SplitPos;
1470 } else {
1471 // There is a gap between NewSegment and its predecessor
1472 // Value becomes live in.
1473 *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI);
1474 NewSegment->valno->def = SplitPos;
1475 }
1476 } else {
1477 // Leave the end point of a live def.
1478 OldIdxOut->start = NewIdxDef;
1479 OldIdxVNI->def = NewIdxDef;
1480 if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end))
1481 OldIdxIn->end = NewIdxDef;
1482 }
1483 } else if (OldIdxIn != E
1484 && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx)
1485 && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) {
1486 // OldIdxVNI is a dead def that has been moved into the middle of
1487 // another value in LR. That can happen when LR is a whole register,
1488 // but the dead def is a write to a subreg that is dead at NewIdx.
1489 // The dead def may have been moved across other values
1490 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1491 // down one position.
1492 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1493 // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1494 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1495 // Modify the segment at NewIdxOut and the following segment to meet at
1496 // the point of the dead def, with the following segment getting
1497 // OldIdxVNI as its value number.
1498 *NewIdxOut = LiveRange::Segment(
1499 NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno);
1500 *(NewIdxOut + 1) = LiveRange::Segment(
1501 NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
1502 OldIdxVNI->def = NewIdxDef;
1503 // Retag the segments that were shifted down from [NewIdxOut + 2,
1504 // OldIdxOut]. Retagging can make a segment touch another segment with
1505 // the same value number, so merge as we go. Stop at the original end
1506 // slot instead of using a segment count because merging may erase
1507 // segments.
1508 const SlotIndex RetagEnd = OldIdxOut->end;
1509 for (LiveRange::iterator Idx = NewIdxOut + 2;
1510 Idx != LR.end() && Idx->start < RetagEnd;) {
1511 Idx->valno = OldIdxVNI;
1512 Idx = std::next(LR.mergeAdjacentSegments(Idx));
1513 }
1514 // Aggressively remove all dead flags from the former dead definition.
1515 // Kill/dead flags shouldn't be used while live intervals exist; they
1516 // will be reinserted by VirtRegRewriter.
1517 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
1518 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1519 if (MO->isReg() && !MO->isUse())
1520 MO->setIsDead(false);
1521 } else {
1522 // OldIdxVNI is a dead def. It may have been moved across other values
1523 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1524 // down one position.
1525 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1526 // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1527 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1528 // OldIdxVNI can be reused now to build a new dead def segment.
1529 LiveRange::iterator NewSegment = NewIdxOut;
1530 VNInfo *NewSegmentVNI = OldIdxVNI;
1531 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1532 NewSegmentVNI);
1533 NewSegmentVNI->def = NewIdxDef;
1534 }
1535 }
1536 }
1537
1538 void updateRegMaskSlots() {
1540 llvm::lower_bound(LIS.RegMaskSlots, OldIdx);
1541 assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
1542 "No RegMask at OldIdx.");
1543 *RI = NewIdx.getRegSlot();
1544 assert((RI == LIS.RegMaskSlots.begin() ||
1545 SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) &&
1546 "Cannot move regmask instruction above another call");
1547 assert((std::next(RI) == LIS.RegMaskSlots.end() ||
1548 SlotIndex::isEarlierInstr(*RI, *std::next(RI))) &&
1549 "Cannot move regmask instruction below another call");
1550 }
1551
1552 // Return the last use of reg between NewIdx and OldIdx.
1553 SlotIndex findLastUseBefore(SlotIndex Before, VirtRegOrUnit VRegOrUnit,
1554 LaneBitmask LaneMask) {
1555 if (VRegOrUnit.isVirtualReg()) {
1556 SlotIndex LastUse = Before;
1557 for (MachineOperand &MO :
1558 MRI.use_nodbg_operands(VRegOrUnit.asVirtualReg())) {
1559 if (MO.isUndef())
1560 continue;
1561 unsigned SubReg = MO.getSubReg();
1562 if (SubReg != 0 && LaneMask.any()
1563 && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
1564 continue;
1565
1566 const MachineInstr &MI = *MO.getParent();
1567 SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI);
1568 if (InstSlot > LastUse && InstSlot < OldIdx)
1569 LastUse = InstSlot.getRegSlot();
1570 }
1571 return LastUse;
1572 }
1573
1574 // This is a regunit interval, so scanning the use list could be very
1575 // expensive. Scan upwards from OldIdx instead.
1576 assert(Before < OldIdx && "Expected upwards move");
1577 SlotIndexes *Indexes = LIS.getSlotIndexes();
1578 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before);
1579
1580 // OldIdx may not correspond to an instruction any longer, so set MII to
1581 // point to the next instruction after OldIdx, or MBB->end().
1583 if (MachineInstr *MI = Indexes->getInstructionFromIndex(
1584 Indexes->getNextNonNullIndex(OldIdx)))
1585 if (MI->getParent() == MBB)
1586 MII = MI;
1587
1589 while (MII != Begin) {
1590 if ((--MII)->isDebugOrPseudoInstr())
1591 continue;
1592 SlotIndex Idx = Indexes->getInstructionIndex(*MII);
1593
1594 // Stop searching when Before is reached.
1595 if (!SlotIndex::isEarlierInstr(Before, Idx))
1596 return Before;
1597
1598 // Check if MII uses Reg.
1599 for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
1600 if (MO->isReg() && !MO->isUndef() && MO->getReg().isPhysical() &&
1601 TRI.hasRegUnit(MO->getReg(), VRegOrUnit.asMCRegUnit()))
1602 return Idx.getRegSlot();
1603 }
1604 // Didn't reach Before. It must be the first instruction in the block.
1605 return Before;
1606 }
1607};
1608
1610 // It is fine to move a bundle as a whole, but not an individual instruction
1611 // inside it.
1612 assert((!MI.isBundled() || MI.getOpcode() == TargetOpcode::BUNDLE) &&
1613 "Cannot move instruction in bundle");
1614 SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
1615 Indexes->removeMachineInstrFromMaps(MI);
1616 SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI);
1617 assert(getMBBStartIdx(MI.getParent()) <= OldIndex &&
1618 OldIndex < getMBBEndIdx(MI.getParent()) &&
1619 "Cannot handle moves across basic block boundaries.");
1620
1621 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1622 HME.updateAllRanges(&MI);
1623}
1624
1626 bool UpdateFlags) {
1627 assert((BundleStart.getOpcode() == TargetOpcode::BUNDLE) &&
1628 "Bundle start is not a bundle");
1630 const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart);
1631 auto BundleEnd = getBundleEnd(BundleStart.getIterator());
1632
1633 auto I = BundleStart.getIterator();
1634 I++;
1635 while (I != BundleEnd) {
1636 if (!Indexes->hasIndex(*I))
1637 continue;
1638 SlotIndex OldIndex = Indexes->getInstructionIndex(*I, true);
1639 ToProcess.push_back(OldIndex);
1640 Indexes->removeMachineInstrFromMaps(*I, true);
1641 I++;
1642 }
1643 for (SlotIndex OldIndex : ToProcess) {
1644 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1645 HME.updateAllRanges(&BundleStart);
1646 }
1647
1648 // Fix up dead defs
1649 const SlotIndex Index = getInstructionIndex(BundleStart);
1650 for (MachineOperand &MO : BundleStart.operands()) {
1651 if (!MO.isReg())
1652 continue;
1653 Register Reg = MO.getReg();
1654 if (Reg.isVirtual() && hasInterval(Reg) && !MO.isUndef()) {
1655 LiveInterval &LI = getInterval(Reg);
1656 LiveQueryResult LRQ = LI.Query(Index);
1657 if (LRQ.isDeadDef())
1658 MO.setIsDead();
1659 }
1660 }
1661}
1662
1663void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin,
1665 const SlotIndex EndIdx, LiveRange &LR,
1666 const Register Reg,
1667 LaneBitmask LaneMask) {
1668 LiveInterval::iterator LII = LR.find(EndIdx);
1669 SlotIndex lastUseIdx;
1670 if (LII != LR.end() && LII->start < EndIdx) {
1671 lastUseIdx = LII->end;
1672 } else if (LII == LR.begin()) {
1673 // We may not have a liverange at all if this is a subregister untouched
1674 // between \p Begin and \p End.
1675 } else {
1676 --LII;
1677 }
1678
1679 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1680 --I;
1681 MachineInstr &MI = *I;
1682 if (MI.isDebugOrPseudoInstr())
1683 continue;
1684
1685 SlotIndex instrIdx = getInstructionIndex(MI);
1686 bool isStartValid = getInstructionFromIndex(LII->start);
1687 bool isEndValid = getInstructionFromIndex(LII->end);
1688
1689 // FIXME: This doesn't currently handle early-clobber or multiple removed
1690 // defs inside of the region to repair.
1691 for (const MachineOperand &MO : MI.operands()) {
1692 if (!MO.isReg() || MO.getReg() != Reg)
1693 continue;
1694
1695 unsigned SubReg = MO.getSubReg();
1696 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1697 if ((Mask & LaneMask).none())
1698 continue;
1699
1700 if (MO.isDef()) {
1701 if (!isStartValid) {
1702 if (LII->end.isDead()) {
1703 LII = LR.removeSegment(LII, true);
1704 if (LII != LR.begin())
1705 --LII;
1706 } else {
1707 LII->start = instrIdx.getRegSlot();
1708 LII->valno->def = instrIdx.getRegSlot();
1709 if (MO.getSubReg() && !MO.isUndef())
1710 lastUseIdx = instrIdx.getRegSlot();
1711 else
1712 lastUseIdx = SlotIndex();
1713 continue;
1714 }
1715 }
1716
1717 if (!lastUseIdx.isValid()) {
1718 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1719 LiveRange::Segment S(instrIdx.getRegSlot(),
1720 instrIdx.getDeadSlot(), VNI);
1721 LII = LR.addSegment(S);
1722 } else if (LII->start != instrIdx.getRegSlot()) {
1723 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1724 LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI);
1725 LII = LR.addSegment(S);
1726 }
1727
1728 if (MO.getSubReg() && !MO.isUndef())
1729 lastUseIdx = instrIdx.getRegSlot();
1730 else
1731 lastUseIdx = SlotIndex();
1732 } else if (MO.isUse()) {
1733 // FIXME: This should probably be handled outside of this branch,
1734 // either as part of the def case (for defs inside of the region) or
1735 // after the loop over the region.
1736 if (!isEndValid && !LII->end.isBlock())
1737 LII->end = instrIdx.getRegSlot();
1738 if (!lastUseIdx.isValid())
1739 lastUseIdx = instrIdx.getRegSlot();
1740 }
1741 }
1742 }
1743
1744 bool isStartValid = getInstructionFromIndex(LII->start);
1745 if (!isStartValid && LII->end.isDead())
1746 LR.removeSegment(*LII, true);
1747}
1748
1749void
1753 ArrayRef<Register> OrigRegs) {
1754 // Find anchor points, which are at the beginning/end of blocks or at
1755 // instructions that already have indexes.
1756 while (Begin != MBB->begin() && !Indexes->hasIndex(*std::prev(Begin)))
1757 --Begin;
1758 while (End != MBB->end() && !Indexes->hasIndex(*End))
1759 ++End;
1760
1761 SlotIndex EndIdx;
1762 if (End == MBB->end())
1763 EndIdx = getMBBEndIdx(MBB).getPrevSlot();
1764 else
1765 EndIdx = getInstructionIndex(*End);
1766
1767 Indexes->repairIndexesInRange(MBB, Begin, End);
1768
1769 // Make sure a live interval exists for all register operands in the range.
1770 SmallVector<Register> RegsToRepair(OrigRegs);
1771 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1772 --I;
1773 MachineInstr &MI = *I;
1774 if (MI.isDebugOrPseudoInstr())
1775 continue;
1776 for (const MachineOperand &MO : MI.operands()) {
1777 if (MO.isReg() && MO.getReg().isVirtual()) {
1778 Register Reg = MO.getReg();
1779 if (MO.getSubReg() && hasInterval(Reg) &&
1780 MRI->shouldTrackSubRegLiveness(Reg)) {
1781 LiveInterval &LI = getInterval(Reg);
1782 if (!LI.hasSubRanges()) {
1783 // If the new instructions refer to subregs but the old instructions
1784 // did not, throw away any old live interval so it will be
1785 // recomputed with subranges.
1786 removeInterval(Reg);
1787 } else if (MO.isDef()) {
1788 // Similarly if a subreg def has no precise subrange match then
1789 // assume we need to recompute all subranges.
1790 unsigned SubReg = MO.getSubReg();
1791 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1792 if (llvm::none_of(LI.subranges(),
1793 [Mask](LiveInterval::SubRange &SR) {
1794 return SR.LaneMask == Mask;
1795 })) {
1796 removeInterval(Reg);
1797 }
1798 }
1799 }
1800 if (!hasInterval(Reg)) {
1802 // Don't bother to repair a freshly calculated live interval.
1803 llvm::erase(RegsToRepair, Reg);
1804 }
1805 }
1806 }
1807 }
1808
1809 for (Register Reg : RegsToRepair) {
1810 if (!Reg.isVirtual())
1811 continue;
1812
1813 LiveInterval &LI = getInterval(Reg);
1814 // FIXME: Should we support undefs that gain defs?
1815 if (!LI.hasAtLeastOneValue())
1816 continue;
1817
1818 for (LiveInterval::SubRange &S : LI.subranges())
1819 repairOldRegInRange(Begin, End, EndIdx, S, Reg, S.LaneMask);
1821
1822 repairOldRegInRange(Begin, End, EndIdx, LI, Reg);
1823 }
1824}
1825
1827 for (MCRegUnit Unit : TRI->regunits(Reg)) {
1828 if (LiveRange *LR = getCachedRegUnit(Unit))
1829 if (VNInfo *VNI = LR->getVNInfoAt(Pos))
1830 LR->removeValNo(VNI);
1831 }
1832}
1833
1835 // LI may not have the main range computed yet, but its subranges may
1836 // be present.
1837 VNInfo *VNI = LI.getVNInfoAt(Pos);
1838 if (VNI != nullptr) {
1839 assert(VNI->def.getBaseIndex() == Pos.getBaseIndex());
1840 LI.removeValNo(VNI);
1841 }
1842
1843 // Also remove the value defined in subranges.
1844 for (LiveInterval::SubRange &S : LI.subranges()) {
1845 if (VNInfo *SVNI = S.getVNInfoAt(Pos))
1846 if (SVNI->def.getBaseIndex() == Pos.getBaseIndex())
1847 S.removeValNo(SVNI);
1848 }
1850}
1851
1854 ConnectedVNInfoEqClasses ConEQ(*this);
1855 unsigned NumComp = ConEQ.Classify(LI);
1856 if (NumComp <= 1)
1857 return;
1858 LLVM_DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n');
1859 Register Reg = LI.reg();
1860 for (unsigned I = 1; I < NumComp; ++I) {
1861 Register NewVReg = MRI->cloneVirtualRegister(Reg);
1862 LiveInterval &NewLI = createEmptyInterval(NewVReg);
1863 SplitLIs.push_back(&NewLI);
1864 }
1865 ConEQ.Distribute(LI, SplitLIs.data(), *MRI);
1866}
1867
1869 assert(LICalc && "LICalc not initialized.");
1870 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
1871 LICalc->constructMainRangeFromSubranges(LI);
1872}
MachineInstrBuilder & UseMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
Rewrite undef for PHI
MachineBasicBlock & MBB
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:678
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
A common definition of LaneBitmask for use in TableGen and CodeGen.
static cl::opt< bool > EnablePrecomputePhysRegs("precompute-phys-liveness", cl::Hidden, cl::desc("Eagerly compute live intervals for all physreg units."))
static bool hasLiveThroughUse(const MachineInstr *MI, Register Reg)
Check whether use of reg in MI is live-through.
static void createSegmentsForValues(LiveRange &LR, iterator_range< LiveInterval::vni_iterator > VNIs)
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
std::pair< uint64_t, uint64_t > Interval
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
SI Optimize VGPR LiveRange
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
Toolkit used by handleMove to trim or extend live intervals.
HMEditor(LiveIntervals &LIS, const MachineRegisterInfo &MRI, const TargetRegisterInfo &TRI, SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
LiveRange * getRegUnitLI(MCRegUnit Unit)
void updateAllRanges(MachineInstr *MI)
Update all live ranges touched by MI, assuming a move from OldIdx to NewIdx.
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
Definition Analysis.h:50
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
LLVM_ABI AnalysisUsage & addRequiredTransitiveID(char &ID)
Definition Pass.cpp:299
AnalysisUsage & addPreservedID(const void *ID)
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition Pass.cpp:275
AnalysisUsage & addRequiredTransitive()
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
const_pointer iterator
Definition ArrayRef.h:47
iterator begin() const
Definition ArrayRef.h:129
void resize(unsigned N, bool t=false)
Grow or shrink the bitvector.
Definition BitVector.h:355
void clear()
Removes all bits from the bitvector.
Definition BitVector.h:349
void clearBitsNotInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
Clear a bit in this vector for every '0' bit in Mask.
Definition BitVector.h:760
ConnectedVNInfoEqClasses - Helper class that can divide VNInfos in a LiveInterval into equivalence cl...
LLVM_ABI void Distribute(LiveInterval &LI, LiveInterval *LIV[], MachineRegisterInfo &MRI)
Distribute values in LI into a separate LiveIntervals for each connected component.
LLVM_ABI unsigned Classify(const LiveRange &LR)
Classify the values in LR into connected components.
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
LLVM_ABI void removeEmptySubRanges()
Removes all subranges without any segments (subranges without segments are not considered valid and s...
Register reg() const
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
LLVM_ABI void computeSubRangeUndefs(SmallVectorImpl< SlotIndex > &Undefs, LaneBitmask LaneMask, const MachineRegisterInfo &MRI, const SlotIndexes &Indexes) const
For a given lane mask LaneMask, compute indexes at which the lane is marked undefined by subregister ...
LLVM_ABI Result run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
bool runOnMachineFunction(MachineFunction &) override
Pass entry point; Calculates LiveIntervals.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
LLVM_ABI void repairIntervalsInRange(MachineBasicBlock *MBB, MachineBasicBlock::iterator Begin, MachineBasicBlock::iterator End, ArrayRef< Register > OrigRegs)
Update live intervals for instructions in a range of iterators.
bool hasInterval(Register Reg) const
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Return the first index in the given basic block.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
LLVM_ABI bool hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const
Returns true if VNI is killed by any PHI-def values in LI.
LLVM_ABI bool checkRegMaskInterference(const LiveInterval &LI, BitVector &UsableRegs)
Test if LI is live across any register mask instructions, and compute a bit mask of physical register...
LLVM_ABI void handleMove(MachineInstr &MI, bool UpdateFlags=false)
Call this method to notify LiveIntervals that instruction MI has been moved within a basic block.
SlotIndexes * getSlotIndexes() const
ArrayRef< const uint32_t * > getRegMaskBits() const
Returns an array of register mask pointers corresponding to getRegMaskSlots().
LiveInterval & getOrCreateEmptyInterval(Register Reg)
Return an existing interval for Reg.
LLVM_ABI void addKillFlags(const VirtRegMap *)
Add kill flags to any instruction that kills a virtual register.
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
LLVM_ABI bool invalidate(MachineFunction &MF, const PreservedAnalyses &PA, MachineFunctionAnalysisManager::Invalidator &Inv)
VNInfo::Allocator & getVNInfoAllocator()
ArrayRef< const uint32_t * > getRegMaskBitsInBlock(unsigned MBBNum) const
Returns an array of mask pointers corresponding to getRegMaskSlotsInBlock(MBBNum).
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
static LLVM_ABI float getSpillWeight(bool isDef, bool isUse, const MachineBlockFrequencyInfo *MBFI, const MachineInstr &MI, ProfileSummaryInfo *PSI=nullptr)
Calculate the spill weight to assign to a single instruction.
ArrayRef< SlotIndex > getRegMaskSlots() const
Returns a sorted array of slot indices of all instructions with register mask operands.
ArrayRef< SlotIndex > getRegMaskSlotsInBlock(unsigned MBBNum) const
Returns a sorted array of slot indices of all instructions with register mask operands in the basic b...
LiveInterval & getInterval(Register Reg)
friend class LiveIntervalsAnalysis
LLVM_ABI void pruneValue(LiveRange &LR, SlotIndex Kill, SmallVectorImpl< SlotIndex > *EndPoints)
If LR has a live value at Kill, prune its live range by removing any liveness reachable from Kill.
void removeInterval(Register Reg)
Interval removal.
LLVM_ABI void handleMoveIntoNewBundle(MachineInstr &BundleStart, bool UpdateFlags=false)
Update intervals of operands of all instructions in the newly created bundle specified by BundleStart...
LiveRange & getRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit.
LLVM_ABI MachineBasicBlock * intervalIsInOneMBB(const LiveInterval &LI) const
If LI is confined to a single basic block, return a pointer to that block.
LiveRange * getCachedRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit if it has already been computed, or nullptr if it hasn't...
LLVM_ABI void removeVRegDefAt(LiveInterval &LI, SlotIndex Pos)
Remove value number and related live segments of LI and its subranges that start at position Pos.
LLVM_ABI LiveInterval::Segment addSegmentToEndOfBlock(Register Reg, MachineInstr &startInst)
Given a register and an instruction, adds a live segment from that instruction to the end of its MBB.
LLVM_ABI bool shrinkToUses(LiveInterval *li, SmallVectorImpl< MachineInstr * > *dead=nullptr)
After removing some uses of a register, shrink its live range to just the remaining uses.
LLVM_ABI void constructMainRangeFromSubranges(LiveInterval &LI)
For live interval LI with correct SubRanges construct matching information for the main live range.
LiveInterval & createEmptyInterval(Register Reg)
Interval creation.
LLVM_ABI void extendToIndices(LiveRange &LR, ArrayRef< SlotIndex > Indices, ArrayRef< SlotIndex > Undefs)
Extend the live range LR to reach all points in Indices.
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &O) const
Implement the dump method.
LLVM_ABI void removePhysRegDefAt(MCRegister Reg, SlotIndex Pos)
Remove value numbers and related live segments starting at position Pos that are part of any liverang...
LLVM_ABI void splitSeparateComponents(LiveInterval &LI, SmallVectorImpl< LiveInterval * > &SplitLIs)
Split separate components in LiveInterval LI into separate intervals.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
LiveInterval & createAndComputeVirtRegInterval(Register Reg)
Result of a LiveRange query.
VNInfo * valueOutOrDead() const
Returns the value alive at the end of the instruction, if any.
bool isDeadDef() const
Return true if this instruction has a dead def.
VNInfo * valueIn() const
Return the value that is live-in to the instruction.
VNInfo * valueDefined() const
Return the value defined by this instruction, if any.
SlotIndex endPoint() const
Return the end point of the last live range segment to interact with the instruction,...
static LLVM_ABI bool isJointlyDominated(const MachineBasicBlock *MBB, ArrayRef< SlotIndex > Defs, const SlotIndexes &Indexes)
A diagnostic function to check if the end of the block MBB is jointly dominated by the blocks corresp...
This class represents the liveness of a register, stack slot, etc.
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
Segments::iterator iterator
const Segment * getSegmentContaining(SlotIndex Idx) const
Return the segment that contains the specified index, or null if there is none.
iterator_range< vni_iterator > vnis()
Segments::const_iterator const_iterator
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
LLVM_ABI iterator mergeAdjacentSegments(iterator I)
Merge the segment pointed to by I with its immediate neighbors when they use the same value number an...
LLVM_ABI bool covers(const LiveRange &Other) const
Returns true if all segments of the Other live range are completely covered by this live range.
iterator advanceTo(iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position,...
LLVM_ABI void removeValNo(VNInfo *ValNo)
removeValNo - Remove all the segments defined by the specified value#.
bool empty() const
LiveQueryResult Query(SlotIndex Idx) const
Query Liveness at Idx.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
bool verify() const
Walk the range and assert if any invariants fail to hold.
iterator begin()
SlotIndex beginIndex() const
beginIndex - Return the lowest numbered slot covered.
VNInfoList valnos
SlotIndex endIndex() const
endNumber - return the maximum point of the range of the whole, exclusive.
bool hasAtLeastOneValue() const
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
iterator FindSegmentContaining(SlotIndex Idx)
Return an iterator to the segment that contains the specified index, or end() if there is none.
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
LLVM_ABI void flushSegmentSet()
Flush segment set into the regular segment vector.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LLVM_ABI iterator find(SlotIndex Pos)
find - Return an iterator pointing to the first segment that ends after Pos, or end().
MCRegUnitMaskIterator enumerates a list of register units and their associated lane masks for Reg.
bool isValid() const
Returns true if this iterator is not yet at the end.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
bool isEHPad() const
Returns true if the block is a landing pad.
iterator_range< livein_iterator > liveins() const
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI const uint32_t * getBeginClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the start of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator_range< succ_iterator > successors()
iterator_range< pred_iterator > predecessors()
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI const uint32_t * getEndClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the end of the basic block.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
double getBlockFreqRelativeToEntryBlock(const MachineBasicBlock *MBB) const
Compute the frequency of the block, relative to the entry block.
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
void print(raw_ostream &OS, const SlotIndexes *=nullptr) const
print - Print out the MachineFunction in a format suitable for debugging to the specified stream.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
mop_range operands()
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
bool shouldTrackSubRegLiveness(const TargetRegisterClass &RC) const
Returns true if liveness for register class RC should be tracked at the subregister level.
unsigned getNumVirtRegs() const
getNumVirtRegs - Return the number of virtual registers created.
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalysisChecker getChecker() const
Build a checker for this PreservedAnalyses and the specified analysis type.
Definition Analysis.h:275
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Definition Register.h:72
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
SlotIndex - An opaque wrapper around machine indexes.
Definition SlotIndexes.h:66
static bool isSameInstr(SlotIndex A, SlotIndex B)
isSameInstr - Return true if A and B refer to the same instruction.
bool isBlock() const
isBlock - Returns true if this is a block boundary slot.
SlotIndex getDeadSlot() const
Returns the dead def kill slot for the current instruction.
static bool isEarlierInstr(SlotIndex A, SlotIndex B)
isEarlierInstr - Return true if A refers to an instruction earlier than B.
bool isValid() const
Returns true if this is a valid index.
static bool isEarlierEqualInstr(SlotIndex A, SlotIndex B)
Return true if A refers to the same instruction as B or an earlier one.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
SlotIndex getNextNonNullIndex(SlotIndex Index)
Returns the next non-null index, if one exists.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction for the given index, or null if the given index has no instruction associated...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void swap(SmallVectorImpl &RHS)
typename SuperClass::iterator iterator
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
MI-level Statepoint operands.
Definition StackMaps.h:159
unsigned getNumDeoptArgsIdx() const
Get index of Number Deopt Arguments operand.
Definition StackMaps.h:200
uint64_t getFlags() const
Return the statepoint flags.
Definition StackMaps.h:223
LLVM_ABI unsigned getNumGCPtrIdx()
Get index of number of GC pointers.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
VNInfo - Value Number Information.
void markUnused()
Mark this value as unused.
bool isUnused() const
Returns true if this value is unused.
unsigned id
The ID number of this value.
SlotIndex def
The index of the defining instruction.
bool isPHIDef() const
Returns true if this value is defined by a PHI instruction (or was, PHI instructions may have been el...
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
Definition VirtRegMap.h:91
Wrapper class representing a virtual register or register unit.
Definition Register.h:175
constexpr bool isVirtualReg() const
Definition Register.h:191
constexpr MCRegUnit asMCRegUnit() const
Definition Register.h:195
constexpr Register asVirtualReg() const
Definition Register.h:200
self_iterator getIterator()
Definition ilist_node.h:123
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
initializer< Ty > init(const Ty &Val)
NodeAddr< DefNode * > Def
Definition RDFGraph.h:384
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
LLVM_ABI cl::opt< bool > UseSegmentSetForPhysRegs
@ Kill
The last use of a register.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
Definition LaneBitmask.h:92
LLVM_ABI Printable printRegUnit(MCRegUnit Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition STLExtras.h:2200
LLVM_ABI char & MachineLoopInfoID
MachineLoopInfo - This pass is a loop analysis pass.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
df_ext_iterator< T, SetTy > df_ext_begin(const T &G, SetTy &S)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
MachineBasicBlock::instr_iterator getBundleEnd(MachineBasicBlock::instr_iterator I)
Returns an iterator pointing beyond the bundle containing I.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI const float huge_valf
Use this rather than HUGE_VALF; the latter causes warnings on MSVC.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition STLExtras.h:2052
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
ArrayRef(const T &OneElt) -> ArrayRef< T >
@ DeoptLiveIn
Mark the deopt arguments associated with the statepoint as only being "live-in".
Definition Statepoint.h:49
iterator_range< MIBundleOperands > mi_bundle_ops(MachineInstr &MI)
df_ext_iterator< T, SetTy > df_ext_end(const T &G, SetTy &S)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Next
Definition InstrProf.h:147
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI char & LiveIntervalsID
LiveIntervals - This analysis keeps track of the live ranges of virtual and physical registers.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
#define N
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
static constexpr LaneBitmask getAll()
Definition LaneBitmask.h:82
constexpr bool any() const
Definition LaneBitmask.h:53
static constexpr LaneBitmask getNone()
Definition LaneBitmask.h:81
This represents a simple continuous liveness interval for a value.