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
227LiveRange *LiveIntervals::createRegUnitRange() {
228 // Use segment set to speed-up initial computation of the live range.
230}
231
232/// Compute the live interval of a virtual register, based on defs and uses.
233bool LiveIntervals::computeVirtRegInterval(LiveInterval &LI) {
234 assert(LICalc && "LICalc not initialized.");
235 assert(LI.empty() && "Should only compute empty intervals.");
236 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
237 LICalc->calculate(LI, MRI->shouldTrackSubRegLiveness(LI.reg()));
238 return computeDeadValues(LI, nullptr);
239}
240
241void LiveIntervals::computeVirtRegs() {
242 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
244 if (MRI->reg_nodbg_empty(Reg))
245 continue;
246 LiveInterval &LI = createEmptyInterval(Reg);
247 bool NeedSplit = computeVirtRegInterval(LI);
248 if (NeedSplit) {
250 splitSeparateComponents(LI, SplitLIs);
251 }
252 }
253}
254
255void LiveIntervals::computeRegMasks() {
256 RegMaskBlocks.resize(MF->getNumBlockIDs());
257
258 // Find all instructions with regmask operands.
259 for (const MachineBasicBlock &MBB : *MF) {
260 std::pair<unsigned, unsigned> &RMB = RegMaskBlocks[MBB.getNumber()];
261 RMB.first = RegMaskSlots.size();
262
263 // Some block starts, such as EH funclets, create masks.
264 if (const uint32_t *Mask = MBB.getBeginClobberMask(TRI)) {
265 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
266 RegMaskBits.push_back(Mask);
267 }
268
269 // Unwinders may clobber additional registers.
270 // FIXME: This functionality can possibly be merged into
271 // MachineBasicBlock::getBeginClobberMask().
272 if (MBB.isEHPad())
273 if (auto *Mask = TRI->getCustomEHPadPreservedMask(*MBB.getParent())) {
274 RegMaskSlots.push_back(Indexes->getMBBStartIdx(&MBB));
275 RegMaskBits.push_back(Mask);
276 }
277
278 for (const MachineInstr &MI : MBB) {
279 for (const MachineOperand &MO : MI.operands()) {
280 if (!MO.isRegMask())
281 continue;
282 RegMaskSlots.push_back(Indexes->getInstructionIndex(MI).getRegSlot());
283 RegMaskBits.push_back(MO.getRegMask());
284 }
285 }
286
287 // Some block ends, such as funclet returns, create masks. Put the mask on
288 // the last instruction of the block, because MBB slot index intervals are
289 // half-open.
290 if (const uint32_t *Mask = MBB.getEndClobberMask(TRI)) {
291 assert(!MBB.empty() && "empty return block?");
292 RegMaskSlots.push_back(
293 Indexes->getInstructionIndex(MBB.back()).getRegSlot());
294 RegMaskBits.push_back(Mask);
295 }
296
297 // Compute the number of register mask instructions in this block.
298 RMB.second = RegMaskSlots.size() - RMB.first;
299 }
300}
301
302void LiveIntervals::reassignRegMaskSlots(MachineBasicBlock &Orig,
303 MachineBasicBlock &SplitBB) {
304 assert(&Orig != &SplitBB && "expected distinct blocks");
305 std::pair<unsigned, unsigned> &OrigRMB = RegMaskBlocks[Orig.getNumber()];
306 std::pair<unsigned, unsigned> &SplitRMB = RegMaskBlocks[SplitBB.getNumber()];
307
308 // RegMaskSlots is sorted, so the slots that moved are those at or after
309 // SplitBB's start index.
310 ArrayRef<SlotIndex> OrigSlots =
311 getRegMaskSlots().slice(OrigRMB.first, OrigRMB.second);
312 unsigned KeptCount = llvm::lower_bound(OrigSlots, getMBBStartIdx(&SplitBB)) -
313 OrigSlots.begin();
314 if (KeptCount == OrigRMB.second)
315 return; // No regmask slots moved into SplitBB.
316
317 SplitRMB.first = OrigRMB.first + KeptCount;
318 SplitRMB.second = OrigRMB.second - KeptCount;
319 OrigRMB.second = KeptCount;
320}
321
322void LiveIntervals::insertMBBInMapsImpl(
323 MachineBasicBlock *MBB, [[maybe_unused]] bool AssumeRegMaskEmpty) {
324#ifdef EXPENSIVE_CHECKS
325 assert((!AssumeRegMaskEmpty ||
326 none_of(*MBB,
327 [](const MachineInstr &MI) {
328 return any_of(MI.operands(), [](const MachineOperand &MO) {
329 return MO.isRegMask();
330 });
331 })) &&
332 "insertMBBInMaps expects a block with no regmask operands; use "
333 "LiveIntervals::splitAt() to split a block containing calls");
334#endif
335 Indexes->insertMBBInMaps(MBB);
336 assert(unsigned(MBB->getNumber()) == RegMaskBlocks.size() &&
337 "Blocks must be added in order.");
338 RegMaskBlocks.push_back(std::make_pair(RegMaskSlots.size(), 0));
339}
340
341//===----------------------------------------------------------------------===//
342// Register Unit Liveness
343//===----------------------------------------------------------------------===//
344//
345// Fixed interference typically comes from ABI boundaries: Function arguments
346// and return values are passed in fixed registers, and so are exception
347// pointers entering landing pads. Certain instructions require values to be
348// present in specific registers. That is also represented through fixed
349// interference.
350//
351
352/// Compute the live range of a register unit, based on the uses and defs of
353/// aliasing registers. The range should be empty, or contain only dead
354/// phi-defs from ABI blocks.
355void LiveIntervals::computeRegUnitRange(LiveRange &LR, MCRegUnit Unit) {
356 assert(LICalc && "LICalc not initialized.");
357 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
358
359 // The physregs aliasing Unit are the roots and their super-registers.
360 // Create all values as dead defs before extending to uses. Note that roots
361 // may share super-registers. That's OK because createDeadDefs() is
362 // idempotent. It is very rare for a register unit to have multiple roots, so
363 // uniquing super-registers is probably not worthwhile.
364 bool IsReserved = false;
365 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
366 bool IsRootReserved = true;
367 for (MCPhysReg Reg : TRI->superregs_inclusive(*Root)) {
368 if (!MRI->reg_empty(Reg))
369 LICalc->createDeadDefs(LR, Reg);
370 // A register unit is considered reserved if all its roots and all their
371 // super registers are reserved.
372 if (!MRI->isReserved(Reg))
373 IsRootReserved = false;
374 }
375 IsReserved |= IsRootReserved;
376 }
377 assert(IsReserved == MRI->isReservedRegUnit(Unit) &&
378 "reserved computation mismatch");
379
380 // Now extend LR to reach all uses.
381 // Ignore uses of reserved registers. We only track defs of those.
382 if (!IsReserved) {
383 for (MCRegUnitRootIterator Root(Unit, TRI); Root.isValid(); ++Root) {
384 for (MCPhysReg Reg : TRI->superregs_inclusive(*Root)) {
385 if (!MRI->reg_empty(Reg))
386 LICalc->extendToUses(LR, Reg);
387 }
388 }
389 }
390
391 // Flush the segment set to the segment vector.
393 LR.flushSegmentSet();
394}
395
396/// Precompute the live ranges of any register units that are live-in to an ABI
397/// block somewhere. Register values can appear without a corresponding def when
398/// entering the entry block or a landing pad.
399void LiveIntervals::computeLiveInRegUnits() {
400 RegUnitRanges.resize(TRI->getNumRegUnits());
401 LLVM_DEBUG(dbgs() << "Computing live-in reg-units in ABI blocks.\n");
402
403 // Keep track of the live range sets allocated.
405
406 // Check all basic blocks for live-ins.
407 for (const MachineBasicBlock &MBB : *MF) {
408 // We only care about ABI blocks: Entry + landing pads.
409 if ((&MBB != &MF->front() && !MBB.isEHPad()) || MBB.livein_empty())
410 continue;
411
412 // Create phi-defs at Begin for all live-in registers.
413 SlotIndex Begin = Indexes->getMBBStartIdx(&MBB);
414 LLVM_DEBUG(dbgs() << Begin << "\t" << printMBBReference(MBB));
415 for (const auto &LI : MBB.liveins()) {
416 for (MCRegUnit Unit : TRI->regunits(LI.PhysReg)) {
417 LiveRange *LR = RegUnitRanges[static_cast<unsigned>(Unit)];
418 if (!LR) {
419 LR = RegUnitRanges[static_cast<unsigned>(Unit)] =
420 createRegUnitRange();
421 NewRanges.push_back(Unit);
422 }
423 VNInfo *VNI = LR->createDeadDef(Begin, getVNInfoAllocator());
424 (void)VNI;
425 LLVM_DEBUG(dbgs() << ' ' << printRegUnit(Unit, TRI) << '#' << VNI->id);
426 }
427 }
428 LLVM_DEBUG(dbgs() << '\n');
429 }
430 LLVM_DEBUG(dbgs() << "Created " << NewRanges.size() << " new intervals.\n");
431
432 // Compute the 'normal' part of the ranges.
433 for (MCRegUnit Unit : NewRanges)
434 computeRegUnitRange(*RegUnitRanges[static_cast<unsigned>(Unit)], Unit);
435}
436
439 for (VNInfo *VNI : VNIs) {
440 if (VNI->isUnused())
441 continue;
442 SlotIndex Def = VNI->def;
443 LR.addSegment(LiveRange::Segment(Def, Def.getDeadSlot(), VNI));
444 }
445}
446
447void LiveIntervals::extendSegmentsToUses(LiveRange &Segments,
448 ShrinkToUsesWorkList &WorkList,
449 Register Reg, LaneBitmask LaneMask) {
450 // Keep track of the PHIs that are in use.
451 SmallPtrSet<VNInfo*, 8> UsedPHIs;
452 // Blocks that have already been added to WorkList as live-out.
453 SmallPtrSet<const MachineBasicBlock*, 16> LiveOut;
454
455 auto getSubRange = [](const LiveInterval &I, LaneBitmask M)
456 -> const LiveRange& {
457 if (M.none())
458 return I;
459 for (const LiveInterval::SubRange &SR : I.subranges()) {
460 if ((SR.LaneMask & M).any()) {
461 assert(SR.LaneMask == M && "Expecting lane masks to match exactly");
462 return SR;
463 }
464 }
465 llvm_unreachable("Subrange for mask not found");
466 };
467
468 const LiveInterval &LI = getInterval(Reg);
469 const LiveRange &OldRange = getSubRange(LI, LaneMask);
470
471 // Extend intervals to reach all uses in WorkList.
472 while (!WorkList.empty()) {
473 SlotIndex Idx = WorkList.back().first;
474 VNInfo *VNI = WorkList.back().second;
475 WorkList.pop_back();
476 const MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Idx.getPrevSlot());
477 SlotIndex BlockStart = Indexes->getMBBStartIdx(MBB);
478
479 // Extend the live range for VNI to be live at Idx.
480 if (VNInfo *ExtVNI = Segments.extendInBlock(BlockStart, Idx)) {
481 assert(ExtVNI == VNI && "Unexpected existing value number");
482 (void)ExtVNI;
483 // Is this a PHIDef we haven't seen before?
484 if (!VNI->isPHIDef() || VNI->def != BlockStart ||
485 !UsedPHIs.insert(VNI).second)
486 continue;
487 // The PHI is live, make sure the predecessors are live-out.
488 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
489 if (!LiveOut.insert(Pred).second)
490 continue;
491 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
492 // A predecessor is not required to have a live-out value for a PHI.
493 if (VNInfo *PVNI = OldRange.getVNInfoBefore(Stop))
494 WorkList.push_back(std::make_pair(Stop, PVNI));
495 }
496 continue;
497 }
498
499 // VNI is live-in to MBB.
500 LLVM_DEBUG(dbgs() << " live-in at " << BlockStart << '\n');
501 Segments.addSegment(LiveRange::Segment(BlockStart, Idx, VNI));
502
503 // Make sure VNI is live-out from the predecessors.
504 for (const MachineBasicBlock *Pred : MBB->predecessors()) {
505 if (!LiveOut.insert(Pred).second)
506 continue;
507 SlotIndex Stop = Indexes->getMBBEndIdx(Pred);
508 if (VNInfo *OldVNI = OldRange.getVNInfoBefore(Stop)) {
509 assert(OldVNI == VNI && "Wrong value out of predecessor");
510 (void)OldVNI;
511 WorkList.push_back(std::make_pair(Stop, VNI));
512 } else {
513#ifndef NDEBUG
514 // There was no old VNI. Verify that Stop is jointly dominated
515 // by <undef>s for this live range.
516 assert(LaneMask.any() &&
517 "Missing value out of predecessor for main range");
519 LI.computeSubRangeUndefs(Undefs, LaneMask, *MRI, *Indexes);
520 assert(LiveRangeCalc::isJointlyDominated(Pred, Undefs, *Indexes) &&
521 "Missing value out of predecessor for subrange");
522#endif
523 }
524 }
525 }
526}
527
530 LLVM_DEBUG(dbgs() << "Shrink: " << *li << '\n');
531 assert(li->reg().isVirtual() && "Can only shrink virtual registers");
532
533 // Shrink subregister live ranges.
534 bool NeedsCleanup = false;
535 for (LiveInterval::SubRange &S : li->subranges()) {
536 shrinkToUses(S, li->reg());
537 if (S.empty())
538 NeedsCleanup = true;
539 }
540 if (NeedsCleanup)
542
543 // Find all the values used, including PHI kills.
544 ShrinkToUsesWorkList WorkList;
545
546 // Visit all instructions reading li->reg().
547 Register Reg = li->reg();
548 for (MachineInstr &UseMI : MRI->reg_instructions(Reg)) {
549 if (UseMI.isDebugInstr() || !UseMI.readsVirtualRegister(Reg))
550 continue;
552 LiveQueryResult LRQ = li->Query(Idx);
553 VNInfo *VNI = LRQ.valueIn();
554 if (!VNI) {
555 // This shouldn't happen: readsVirtualRegister returns true, but there is
556 // no live value. It is likely caused by a target getting <undef> flags
557 // wrong.
559 dbgs() << Idx << '\t' << UseMI
560 << "Warning: Instr claims to read non-existent value in "
561 << *li << '\n');
562 continue;
563 }
564 // Special case: An early-clobber tied operand reads and writes the
565 // register one slot early.
566 if (VNInfo *DefVNI = LRQ.valueDefined())
567 Idx = DefVNI->def;
568
569 WorkList.push_back(std::make_pair(Idx, VNI));
570 }
571
572 // Create new live ranges with only minimal live segments per def.
573 LiveRange NewLR;
574 createSegmentsForValues(NewLR, li->vnis());
575 extendSegmentsToUses(NewLR, WorkList, Reg, LaneBitmask::getNone());
576
577 // Move the trimmed segments back.
578 li->segments.swap(NewLR.segments);
579
580 // Handle dead values.
581 bool CanSeparate = computeDeadValues(*li, dead);
582 LLVM_DEBUG(dbgs() << "Shrunk: " << *li << '\n');
583 return CanSeparate;
584}
585
586bool LiveIntervals::computeDeadValues(LiveInterval &LI,
588 bool MayHaveSplitComponents = false;
589
590 for (VNInfo *VNI : LI.valnos) {
591 if (VNI->isUnused())
592 continue;
593 SlotIndex Def = VNI->def;
595 assert(I != LI.end() && "Missing segment for VNI");
596
597 // Is the register live before? Otherwise we may have to add a read-undef
598 // flag for subregister defs.
599 Register VReg = LI.reg();
600 if (MRI->shouldTrackSubRegLiveness(VReg)) {
601 if ((I == LI.begin() || std::prev(I)->end < Def) && !VNI->isPHIDef()) {
603 MI->setRegisterDefReadUndef(VReg);
604 }
605 }
606
607 if (I->end != Def.getDeadSlot())
608 continue;
609 if (VNI->isPHIDef()) {
610 // This is a dead PHI. Remove it.
611 VNI->markUnused();
612 LI.removeSegment(I);
613 LLVM_DEBUG(dbgs() << "Dead PHI at " << Def << " may separate interval\n");
614 } else {
615 // This is a dead def. Make sure the instruction knows.
616 MachineInstr *MI = getInstructionFromIndex(Def);
617 assert(MI && "No instruction defining live value");
618 MI->addRegisterDead(LI.reg(), TRI);
619
620 if (dead && MI->allDefsAreDead()) {
621 LLVM_DEBUG(dbgs() << "All defs dead: " << Def << '\t' << *MI);
622 dead->push_back(MI);
623 }
624 }
625 MayHaveSplitComponents = true;
626 }
627 return MayHaveSplitComponents;
628}
629
631 LLVM_DEBUG(dbgs() << "Shrink: " << SR << '\n');
632 assert(Reg.isVirtual() && "Can only shrink virtual registers");
633 // Find all the values used, including PHI kills.
634 ShrinkToUsesWorkList WorkList;
635
636 // Visit all instructions reading Reg.
637 SlotIndex LastIdx;
638 for (MachineOperand &MO : MRI->use_nodbg_operands(Reg)) {
639 // Skip "undef" uses.
640 if (!MO.readsReg())
641 continue;
642 // Maybe the operand is for a subregister we don't care about.
643 unsigned SubReg = MO.getSubReg();
644 if (SubReg != 0) {
645 LaneBitmask LaneMask = TRI->getSubRegIndexLaneMask(SubReg);
646 if ((LaneMask & SR.LaneMask).none())
647 continue;
648 }
649 // We only need to visit each instruction once.
650 MachineInstr *UseMI = MO.getParent();
652 if (Idx == LastIdx)
653 continue;
654 LastIdx = Idx;
655
656 LiveQueryResult LRQ = SR.Query(Idx);
657 VNInfo *VNI = LRQ.valueIn();
658 // For Subranges it is possible that only undef values are left in that
659 // part of the subregister, so there is no real liverange at the use
660 if (!VNI)
661 continue;
662
663 // Special case: An early-clobber tied operand reads and writes the
664 // register one slot early.
665 if (VNInfo *DefVNI = LRQ.valueDefined())
666 Idx = DefVNI->def;
667
668 WorkList.push_back(std::make_pair(Idx, VNI));
669 }
670
671 // Create a new live ranges with only minimal live segments per def.
672 LiveRange NewLR;
673 createSegmentsForValues(NewLR, SR.vnis());
674 extendSegmentsToUses(NewLR, WorkList, Reg, SR.LaneMask);
675
676 // Move the trimmed ranges back.
677 SR.segments.swap(NewLR.segments);
678
679 // Remove dead PHI value numbers
680 for (VNInfo *VNI : SR.valnos) {
681 if (VNI->isUnused())
682 continue;
683 const LiveRange::Segment *Segment = SR.getSegmentContaining(VNI->def);
684 assert(Segment != nullptr && "Missing segment for VNI");
685 if (Segment->end != VNI->def.getDeadSlot())
686 continue;
687 if (VNI->isPHIDef()) {
688 // This is a dead PHI. Remove it.
689 LLVM_DEBUG(dbgs() << "Dead PHI at " << VNI->def
690 << " may separate interval\n");
691 VNI->markUnused();
692 SR.removeSegment(*Segment);
693 }
694 }
695
696 LLVM_DEBUG(dbgs() << "Shrunk: " << SR << '\n');
697}
698
700 ArrayRef<SlotIndex> Indices,
701 ArrayRef<SlotIndex> Undefs) {
702 assert(LICalc && "LICalc not initialized.");
703 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
704 for (SlotIndex Idx : Indices)
705 LICalc->extend(LR, Idx, /*PhysReg=*/0, Undefs);
706}
707
709 SmallVectorImpl<SlotIndex> *EndPoints) {
710 LiveQueryResult LRQ = LR.Query(Kill);
711 // LR may have liveness reachable from early clobber slot, which may be
712 // only live-in instead of live-out of the instruction.
713 // For example, LR =[1r, 3r), Kill = 3e, we have to prune [3e, 3r) of LR.
714 VNInfo *VNI = LRQ.valueOutOrDead() ? LRQ.valueOutOrDead() : LRQ.valueIn();
715 if (!VNI)
716 return;
717
718 MachineBasicBlock *KillMBB = Indexes->getMBBFromIndex(Kill);
719 SlotIndex MBBEnd = Indexes->getMBBEndIdx(KillMBB);
720
721 // If VNI isn't live out from KillMBB, the value is trivially pruned.
722 if (LRQ.endPoint() < MBBEnd) {
723 LR.removeSegment(Kill, LRQ.endPoint());
724 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
725 return;
726 }
727
728 // VNI is live out of KillMBB.
729 LR.removeSegment(Kill, MBBEnd);
730 if (EndPoints) EndPoints->push_back(MBBEnd);
731
732 // Find all blocks that are reachable from KillMBB without leaving VNI's live
733 // range. It is possible that KillMBB itself is reachable, so start a DFS
734 // from each successor.
736 VisitedTy Visited;
737 for (MachineBasicBlock *Succ : KillMBB->successors()) {
739 I = df_ext_begin(Succ, Visited), E = df_ext_end(Succ, Visited);
740 I != E;) {
742
743 // Check if VNI is live in to MBB.
744 SlotIndex MBBStart, MBBEnd;
745 std::tie(MBBStart, MBBEnd) = Indexes->getMBBRange(MBB);
746 LiveQueryResult LRQ = LR.Query(MBBStart);
747 if (LRQ.valueIn() != VNI) {
748 // This block isn't part of the VNI segment. Prune the search.
749 I.skipChildren();
750 continue;
751 }
752
753 // Prune the search if VNI is killed in MBB.
754 if (LRQ.endPoint() < MBBEnd) {
755 LR.removeSegment(MBBStart, LRQ.endPoint());
756 if (EndPoints) EndPoints->push_back(LRQ.endPoint());
757 I.skipChildren();
758 continue;
759 }
760
761 // VNI is live through MBB.
762 LR.removeSegment(MBBStart, MBBEnd);
763 if (EndPoints) EndPoints->push_back(MBBEnd);
764 ++I;
765 }
766 }
767}
768
769//===----------------------------------------------------------------------===//
770// Register allocator hooks.
771//
772
774 // Keep track of regunit ranges.
776
777 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
779 if (MRI->reg_nodbg_empty(Reg))
780 continue;
781 const LiveInterval &LI = getInterval(Reg);
782 if (LI.empty())
783 continue;
784
785 // Target may have not allocated this yet.
786 Register PhysReg = VRM->getPhys(Reg);
787 if (!PhysReg)
788 continue;
789
790 // Find the regunit intervals for the assigned register. They may overlap
791 // the virtual register live range, cancelling any kills.
792 RU.clear();
793 LaneBitmask ArtificialLanes;
794 for (MCRegUnitMaskIterator UI(PhysReg, TRI); UI.isValid(); ++UI) {
795 auto [Unit, Bitmask] = *UI;
796 // Record lane mask for all artificial RegUnits for this physreg.
797 if (TRI->isArtificialRegUnit(Unit))
798 ArtificialLanes |= Bitmask;
799 const LiveRange &RURange = getRegUnit(Unit);
800 if (RURange.empty())
801 continue;
802 RU.push_back(std::make_pair(&RURange, RURange.find(LI.begin()->end)));
803 }
804 // Every instruction that kills Reg corresponds to a segment range end
805 // point.
806 for (LiveInterval::const_iterator RI = LI.begin(), RE = LI.end(); RI != RE;
807 ++RI) {
808 // A block index indicates an MBB edge.
809 if (RI->end.isBlock())
810 continue;
812 if (!MI)
813 continue;
814
815 // Check if any of the regunits are live beyond the end of RI. That could
816 // happen when a physreg is defined as a copy of a virtreg:
817 //
818 // %eax = COPY %5
819 // FOO %5 <--- MI, cancel kill because %eax is live.
820 // BAR killed %eax
821 //
822 // There should be no kill flag on FOO when %5 is rewritten as %eax.
823 for (auto &RUP : RU) {
824 const LiveRange &RURange = *RUP.first;
825 LiveRange::const_iterator &I = RUP.second;
826 if (I == RURange.end())
827 continue;
828 I = RURange.advanceTo(I, RI->end);
829 if (I == RURange.end() || I->start >= RI->end)
830 continue;
831 // I is overlapping RI.
832 goto CancelKill;
833 }
834
835 if (MRI->subRegLivenessEnabled()) {
836 // When reading a partial undefined value we must not add a kill flag.
837 // The regalloc might have used the undef lane for something else.
838 // Example:
839 // %1 = ... ; R32: %1
840 // %2:high16 = ... ; R64: %2
841 // = read killed %2 ; R64: %2
842 // = read %1 ; R32: %1
843 // The <kill> flag is correct for %2, but the register allocator may
844 // assign R0L to %1, and R0 to %2 because the low 32bits of R0
845 // are actually never written by %2. After assignment the <kill>
846 // flag at the read instruction is invalid.
847 LaneBitmask DefinedLanesMask;
848 if (LI.hasSubRanges()) {
849 // Compute a mask of lanes that are defined.
850 // Artificial regunits are not independently allocatable so the
851 // register allocator cannot have used them to represent any other
852 // values. That's why we mark them as 'defined' here, as this
853 // otherwise prevents kill flags from being added.
854 DefinedLanesMask = ArtificialLanes;
855 for (const LiveInterval::SubRange &SR : LI.subranges())
856 for (const LiveRange::Segment &Segment : SR.segments) {
857 if (Segment.start >= RI->end)
858 break;
859 if (Segment.end == RI->end) {
860 DefinedLanesMask |= SR.LaneMask;
861 break;
862 }
863 }
864 } else
865 DefinedLanesMask = LaneBitmask::getAll();
866
867 bool IsFullWrite = false;
868 for (const MachineOperand &MO : MI->operands()) {
869 if (!MO.isReg() || MO.getReg() != Reg)
870 continue;
871 if (MO.isUse()) {
872 // Reading any undefined lanes?
873 unsigned SubReg = MO.getSubReg();
874 LaneBitmask UseMask = SubReg ? TRI->getSubRegIndexLaneMask(SubReg)
875 : MRI->getMaxLaneMaskForVReg(Reg);
876 if ((UseMask & ~DefinedLanesMask).any())
877 goto CancelKill;
878 } else if (MO.getSubReg() == 0) {
879 // Writing to the full register?
880 assert(MO.isDef());
881 IsFullWrite = true;
882 }
883 }
884
885 // If an instruction writes to a subregister, a new segment starts in
886 // the LiveInterval. But as this is only overriding part of the register
887 // adding kill-flags is not correct here after registers have been
888 // assigned.
889 if (!IsFullWrite) {
890 // Next segment has to be adjacent in the subregister write case.
891 LiveRange::const_iterator N = std::next(RI);
892 if (N != LI.end() && N->start == RI->end)
893 goto CancelKill;
894 }
895 }
896
897 MI->addRegisterKilled(Reg, nullptr);
898 continue;
899CancelKill:
900 MI->clearRegisterKills(Reg, nullptr);
901 }
902 }
903}
904
907 assert(!LI.empty() && "LiveInterval is empty.");
908
909 // A local live range must be fully contained inside the block, meaning it is
910 // defined and killed at instructions, not at block boundaries. It is not
911 // live in or out of any block.
912 //
913 // It is technically possible to have a PHI-defined live range identical to a
914 // single block, but we are going to return false in that case.
915
916 SlotIndex Start = LI.beginIndex();
917 if (Start.isBlock())
918 return nullptr;
919
920 SlotIndex Stop = LI.endIndex();
921 if (Stop.isBlock())
922 return nullptr;
923
924 // getMBBFromIndex doesn't need to search the MBB table when both indexes
925 // belong to proper instructions.
926 MachineBasicBlock *MBB1 = Indexes->getMBBFromIndex(Start);
927 MachineBasicBlock *MBB2 = Indexes->getMBBFromIndex(Stop);
928 return MBB1 == MBB2 ? MBB1 : nullptr;
929}
930
931bool
932LiveIntervals::hasPHIKill(const LiveInterval &LI, const VNInfo *VNI) const {
933 for (const VNInfo *PHI : LI.valnos) {
934 if (PHI->isUnused() || !PHI->isPHIDef())
935 continue;
936 const MachineBasicBlock *PHIMBB = getMBBFromIndex(PHI->def);
937 // Conservatively return true instead of scanning huge predecessor lists.
938 if (PHIMBB->pred_size() > 100)
939 return true;
940 for (const MachineBasicBlock *Pred : PHIMBB->predecessors())
941 if (VNI == LI.getVNInfoBefore(Indexes->getMBBEndIdx(Pred)))
942 return true;
943 }
944 return false;
945}
946
947float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
948 const MachineBlockFrequencyInfo *MBFI,
949 const MachineInstr &MI,
950 ProfileSummaryInfo *PSI) {
951 return getSpillWeight(isDef, isUse, MBFI, MI.getParent(), PSI);
952}
953
954float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
955 const MachineBlockFrequencyInfo *MBFI,
956 const MachineBasicBlock *MBB,
957 ProfileSummaryInfo *PSI) {
958 const auto *MF = MBB->getParent();
959 return getSpillWeight(isDef, isUse, MBFI, MBB,
960 PSI && llvm::shouldOptimizeForSize(MF, PSI, MBFI));
961}
962
963float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
964 const MachineBlockFrequencyInfo *MBFI,
965 const MachineInstr &MI, bool OptForSize) {
966 return getSpillWeight(isDef, isUse, MBFI, MI.getParent(), OptForSize);
967}
968
969float LiveIntervals::getSpillWeight(bool isDef, bool isUse,
970 const MachineBlockFrequencyInfo *MBFI,
971 const MachineBasicBlock *MBB,
972 bool OptForSize) {
973 float Weight = isDef + isUse;
974 // When optimizing for size we only consider the codesize impact of spilling
975 // the register, not the runtime impact.
976 if (OptForSize)
977 return Weight;
978 return Weight * MBFI->getBlockFreqRelativeToEntryBlock(MBB);
979}
980
984 VNInfo *VN = Interval.getNextValue(
985 SlotIndex(getInstructionIndex(startInst).getRegSlot()),
987 LiveRange::Segment S(SlotIndex(getInstructionIndex(startInst).getRegSlot()),
988 getMBBEndIdx(startInst.getParent()), VN);
989 Interval.addSegment(S);
990
991 return S;
992}
993
994//===----------------------------------------------------------------------===//
995// Register mask functions
996//===----------------------------------------------------------------------===//
997/// Check whether use of reg in MI is live-through. Live-through means that
998/// the value is alive on exit from Machine instruction. The example of such
999/// use is a deopt value in statepoint instruction.
1001 if (MI->getOpcode() != TargetOpcode::STATEPOINT)
1002 return false;
1003 StatepointOpers SO(MI);
1005 return false;
1006 for (unsigned Idx = SO.getNumDeoptArgsIdx(), E = SO.getNumGCPtrIdx(); Idx < E;
1007 ++Idx) {
1008 const MachineOperand &MO = MI->getOperand(Idx);
1009 if (MO.isReg() && MO.getReg() == Reg)
1010 return true;
1011 }
1012 return false;
1013}
1014
1016 BitVector &UsableRegs) {
1017 if (LI.empty())
1018 return false;
1019 LiveInterval::const_iterator LiveI = LI.begin(), LiveE = LI.end();
1020
1021 // Use a smaller arrays for local live ranges.
1022 ArrayRef<SlotIndex> Slots;
1025 Slots = getRegMaskSlotsInBlock(MBB->getNumber());
1026 Bits = getRegMaskBitsInBlock(MBB->getNumber());
1027 } else {
1028 Slots = getRegMaskSlots();
1029 Bits = getRegMaskBits();
1030 }
1031
1032 // We are going to enumerate all the register mask slots contained in LI.
1033 // Start with a binary search of RegMaskSlots to find a starting point.
1034 ArrayRef<SlotIndex>::iterator SlotI = llvm::lower_bound(Slots, LiveI->start);
1035 ArrayRef<SlotIndex>::iterator SlotE = Slots.end();
1036
1037 // No slots in range, LI begins after the last call.
1038 if (SlotI == SlotE)
1039 return false;
1040
1041 bool Found = false;
1042 // Utility to union regmasks.
1043 auto unionBitMask = [&](unsigned Idx) {
1044 if (!Found) {
1045 // This is the first overlap. Initialize UsableRegs to all ones.
1046 UsableRegs.clear();
1047 UsableRegs.resize(TRI->getNumRegs(), true);
1048 Found = true;
1049 }
1050 // Remove usable registers clobbered by this mask.
1051 UsableRegs.clearBitsNotInMask(Bits[Idx]);
1052 };
1053 while (true) {
1054 assert(*SlotI >= LiveI->start);
1055 // Loop over all slots overlapping this segment.
1056 while (*SlotI < LiveI->end) {
1057 // *SlotI overlaps LI. Collect mask bits.
1058 unionBitMask(SlotI - Slots.begin());
1059 if (++SlotI == SlotE)
1060 return Found;
1061 }
1062 // If segment ends with live-through use we need to collect its regmask.
1063 if (*SlotI == LiveI->end)
1065 if (hasLiveThroughUse(MI, LI.reg()))
1066 unionBitMask(SlotI++ - Slots.begin());
1067 // *SlotI is beyond the current LI segment.
1068 // Special advance implementation to not miss next LiveI->end.
1069 if (++LiveI == LiveE || SlotI == SlotE || *SlotI > LI.endIndex())
1070 return Found;
1071 while (LiveI->end < *SlotI)
1072 ++LiveI;
1073 // Advance SlotI until it overlaps.
1074 while (*SlotI < LiveI->start)
1075 if (++SlotI == SlotE)
1076 return Found;
1077 }
1078}
1079
1080//===----------------------------------------------------------------------===//
1081// IntervalUpdate class.
1082//===----------------------------------------------------------------------===//
1083
1084/// Toolkit used by handleMove to trim or extend live intervals.
1086private:
1087 LiveIntervals& LIS;
1088 const MachineRegisterInfo& MRI;
1089 const TargetRegisterInfo& TRI;
1090 SlotIndex OldIdx;
1091 SlotIndex NewIdx;
1093 bool UpdateFlags;
1094
1095public:
1096 HMEditor(LiveIntervals& LIS, const MachineRegisterInfo& MRI,
1097 const TargetRegisterInfo& TRI,
1098 SlotIndex OldIdx, SlotIndex NewIdx, bool UpdateFlags)
1099 : LIS(LIS), MRI(MRI), TRI(TRI), OldIdx(OldIdx), NewIdx(NewIdx),
1100 UpdateFlags(UpdateFlags) {}
1101
1102 // FIXME: UpdateFlags is a workaround that creates live intervals for all
1103 // physregs, even those that aren't needed for regalloc, in order to update
1104 // kill flags. This is wasteful. Eventually, LiveVariables will strip all kill
1105 // flags, and postRA passes will use a live register utility instead.
1106 LiveRange *getRegUnitLI(MCRegUnit Unit) {
1107 if (UpdateFlags && !MRI.isReservedRegUnit(Unit))
1108 return &LIS.getRegUnit(Unit);
1109 return LIS.getCachedRegUnit(Unit);
1110 }
1111
1112 /// Update all live ranges touched by MI, assuming a move from OldIdx to
1113 /// NewIdx.
1115 LLVM_DEBUG(dbgs() << "handleMove " << OldIdx << " -> " << NewIdx << ": "
1116 << *MI);
1117 bool hasRegMask = false;
1118 for (MachineOperand &MO : MI->operands()) {
1119 if (MO.isRegMask())
1120 hasRegMask = true;
1121 if (!MO.isReg())
1122 continue;
1123 if (MO.isUse()) {
1124 if (!MO.readsReg())
1125 continue;
1126 // Aggressively clear all kill flags.
1127 // They are reinserted by VirtRegRewriter.
1128 MO.setIsKill(false);
1129 }
1130
1131 Register Reg = MO.getReg();
1132 if (!Reg)
1133 continue;
1134 if (Reg.isVirtual()) {
1135 LiveInterval &LI = LIS.getInterval(Reg);
1136 if (LI.hasSubRanges()) {
1137 unsigned SubReg = MO.getSubReg();
1138 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1139 : MRI.getMaxLaneMaskForVReg(Reg);
1140 for (LiveInterval::SubRange &S : LI.subranges()) {
1141 if ((S.LaneMask & LaneMask).none())
1142 continue;
1143 updateRange(S, VirtRegOrUnit(Reg), S.LaneMask);
1144 }
1145 }
1146 updateRange(LI, VirtRegOrUnit(Reg), LaneBitmask::getNone());
1147 // If main range has a hole and we are moving a subrange use across
1148 // the hole updateRange() cannot properly handle it since it only
1149 // gets the LiveRange and not the whole LiveInterval. As a result
1150 // we may end up with a main range not covering all subranges.
1151 // This is extremely rare case, so let's check and reconstruct the
1152 // main range.
1153 if (LI.hasSubRanges()) {
1154 unsigned SubReg = MO.getSubReg();
1155 LaneBitmask LaneMask = SubReg ? TRI.getSubRegIndexLaneMask(SubReg)
1156 : MRI.getMaxLaneMaskForVReg(Reg);
1157 for (LiveInterval::SubRange &S : LI.subranges()) {
1158 if ((S.LaneMask & LaneMask).none() || LI.covers(S))
1159 continue;
1160 LI.clear();
1161 LIS.constructMainRangeFromSubranges(LI);
1162 break;
1163 }
1164 }
1165
1166 continue;
1167 }
1168
1169 // For physregs, only update the regunits that actually have a
1170 // precomputed live range.
1171 for (MCRegUnit Unit : TRI.regunits(Reg.asMCReg()))
1172 if (LiveRange *LR = getRegUnitLI(Unit))
1173 updateRange(*LR, VirtRegOrUnit(Unit), LaneBitmask::getNone());
1174 }
1175 if (hasRegMask)
1176 updateRegMaskSlots();
1177 }
1178
1179private:
1180 /// Update a single live range, assuming an instruction has been moved from
1181 /// OldIdx to NewIdx.
1182 void updateRange(LiveRange &LR, VirtRegOrUnit VRegOrUnit,
1183 LaneBitmask LaneMask) {
1184 if (!Updated.insert(&LR).second)
1185 return;
1186 LLVM_DEBUG({
1187 dbgs() << " ";
1188 if (VRegOrUnit.isVirtualReg()) {
1189 dbgs() << printReg(VRegOrUnit.asVirtualReg());
1190 if (LaneMask.any())
1191 dbgs() << " L" << PrintLaneMask(LaneMask);
1192 } else {
1193 dbgs() << printRegUnit(VRegOrUnit.asMCRegUnit(), &TRI);
1194 }
1195 dbgs() << ":\t" << LR << '\n';
1196 });
1197 if (SlotIndex::isEarlierInstr(OldIdx, NewIdx))
1198 handleMoveDown(LR);
1199 else
1200 handleMoveUp(LR, VRegOrUnit, LaneMask);
1201 LLVM_DEBUG(dbgs() << " -->\t" << LR << '\n');
1202 assert(LR.verify());
1203 }
1204
1205 /// Update LR to reflect an instruction has been moved downwards from OldIdx
1206 /// to NewIdx (OldIdx < NewIdx).
1207 void handleMoveDown(LiveRange &LR) {
1208 LiveRange::iterator E = LR.end();
1209 // Segment going into OldIdx.
1210 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1211
1212 // No value live before or after OldIdx? Nothing to do.
1213 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
1214 return;
1215
1216 LiveRange::iterator OldIdxOut;
1217 // Do we have a value live-in to OldIdx?
1218 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1219 // If the live-in value already extends to NewIdx, there is nothing to do.
1220 if (SlotIndex::isEarlierEqualInstr(NewIdx, OldIdxIn->end))
1221 return;
1222 // Aggressively remove all kill flags from the old kill point.
1223 // Kill flags shouldn't be used while live intervals exist, they will be
1224 // reinserted by VirtRegRewriter.
1225 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(OldIdxIn->end))
1226 for (MachineOperand &MOP : mi_bundle_ops(*KillMI))
1227 if (MOP.isReg() && MOP.isUse())
1228 MOP.setIsKill(false);
1229
1230 // Is there a def before NewIdx which is not OldIdx?
1231 LiveRange::iterator Next = std::next(OldIdxIn);
1232 if (Next != E && !SlotIndex::isSameInstr(OldIdx, Next->start) &&
1233 SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1234 // If we are here then OldIdx was just a use but not a def. We only have
1235 // to ensure liveness extends to NewIdx.
1236 LiveRange::iterator NewIdxIn =
1237 LR.advanceTo(Next, NewIdx.getBaseIndex());
1238 // Extend the segment before NewIdx if necessary.
1239 if (NewIdxIn == E ||
1240 !SlotIndex::isEarlierInstr(NewIdxIn->start, NewIdx)) {
1241 LiveRange::iterator Prev = std::prev(NewIdxIn);
1242 Prev->end = NewIdx.getRegSlot();
1243 }
1244 // Extend OldIdxIn.
1245 OldIdxIn->end = Next->start;
1246 return;
1247 }
1248
1249 // Adjust OldIdxIn->end to reach NewIdx. This may temporarily make LR
1250 // invalid by overlapping ranges.
1251 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1252 OldIdxIn->end = NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber());
1253 // If this was not a kill, then there was no def and we're done.
1254 if (!isKill)
1255 return;
1256
1257 // Did we have a Def at OldIdx?
1258 OldIdxOut = Next;
1259 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1260 return;
1261 } else {
1262 OldIdxOut = OldIdxIn;
1263 }
1264
1265 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1266 // to the segment starting there.
1267 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1268 "No def?");
1269 VNInfo *OldIdxVNI = OldIdxOut->valno;
1270 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1271
1272 // If the defined value extends beyond NewIdx, just move the beginning
1273 // of the segment to NewIdx.
1274 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1275 if (SlotIndex::isEarlierInstr(NewIdxDef, OldIdxOut->end)) {
1276 OldIdxVNI->def = NewIdxDef;
1277 OldIdxOut->start = OldIdxVNI->def;
1278 return;
1279 }
1280
1281 // If we are here then we have a Definition at OldIdx which ends before
1282 // NewIdx.
1283
1284 // Is there an existing Def at NewIdx?
1285 LiveRange::iterator AfterNewIdx
1286 = LR.advanceTo(OldIdxOut, NewIdx.getRegSlot());
1287 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1288 if (!OldIdxDefIsDead &&
1289 SlotIndex::isEarlierInstr(OldIdxOut->end, NewIdxDef)) {
1290 // OldIdx is not a dead def, and NewIdxDef is inside a new interval.
1291 VNInfo *DefVNI;
1292 if (OldIdxOut != LR.begin() &&
1293 !SlotIndex::isEarlierInstr(std::prev(OldIdxOut)->end,
1294 OldIdxOut->start)) {
1295 // There is no gap between OldIdxOut and its predecessor anymore,
1296 // merge them.
1297 LiveRange::iterator IPrev = std::prev(OldIdxOut);
1298 DefVNI = OldIdxVNI;
1299 IPrev->end = OldIdxOut->end;
1300 } else {
1301 // The value is live in to OldIdx
1302 LiveRange::iterator INext = std::next(OldIdxOut);
1303 assert(INext != E && "Must have following segment");
1304 // We merge OldIdxOut and its successor. As we're dealing with subreg
1305 // reordering, there is always a successor to OldIdxOut in the same BB
1306 // We don't need INext->valno anymore and will reuse for the new segment
1307 // we create later.
1308 DefVNI = OldIdxVNI;
1309 INext->start = OldIdxOut->end;
1310 INext->valno->def = INext->start;
1311 }
1312 // If NewIdx is behind the last segment, extend that and append a new one.
1313 if (AfterNewIdx == E) {
1314 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1315 // one position.
1316 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn -| end
1317 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS -| end
1318 std::copy(std::next(OldIdxOut), E, OldIdxOut);
1319 // The last segment is undefined now, reuse it for a dead def.
1320 LiveRange::iterator NewSegment = std::prev(E);
1321 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1322 DefVNI);
1323 DefVNI->def = NewIdxDef;
1324
1325 LiveRange::iterator Prev = std::prev(NewSegment);
1326 Prev->end = NewIdxDef;
1327 } else {
1328 // OldIdxOut is undef at this point, Slide (OldIdxOut;AfterNewIdx] up
1329 // one position.
1330 // |- ?/OldIdxOut -| |- X0 -| ... |- Xn/AfterNewIdx -| |- Next -|
1331 // => |- X0/OldIdxOut -| ... |- Xn -| |- Xn/AfterNewIdx -| |- Next -|
1332 std::copy(std::next(OldIdxOut), std::next(AfterNewIdx), OldIdxOut);
1333 LiveRange::iterator Prev = std::prev(AfterNewIdx);
1334 // We have two cases:
1335 if (SlotIndex::isEarlierInstr(Prev->start, NewIdxDef)) {
1336 // Case 1: NewIdx is inside a liverange. Split this liverange at
1337 // NewIdxDef into the segment "Prev" followed by "NewSegment".
1338 LiveRange::iterator NewSegment = AfterNewIdx;
1339 *NewSegment = LiveRange::Segment(NewIdxDef, Prev->end, Prev->valno);
1340 Prev->valno->def = NewIdxDef;
1341
1342 *Prev = LiveRange::Segment(Prev->start, NewIdxDef, DefVNI);
1343 DefVNI->def = Prev->start;
1344 } else {
1345 // Case 2: NewIdx is in a lifetime hole. Keep AfterNewIdx as is and
1346 // turn Prev into a segment from NewIdx to AfterNewIdx->start.
1347 *Prev = LiveRange::Segment(NewIdxDef, AfterNewIdx->start, DefVNI);
1348 DefVNI->def = NewIdxDef;
1349 assert(DefVNI != AfterNewIdx->valno);
1350 }
1351 }
1352 return;
1353 }
1354
1355 if (AfterNewIdx != E &&
1356 SlotIndex::isSameInstr(AfterNewIdx->start, NewIdxDef)) {
1357 // There is an existing def at NewIdx. The def at OldIdx is coalesced into
1358 // that value.
1359 assert(AfterNewIdx->valno != OldIdxVNI && "Multiple defs of value?");
1360 LR.removeValNo(OldIdxVNI);
1361 } else {
1362 // There was no existing def at NewIdx. We need to create a dead def
1363 // at NewIdx. Shift segments over the old OldIdxOut segment, this frees
1364 // a new segment at the place where we want to construct the dead def.
1365 // |- OldIdxOut -| |- X0 -| ... |- Xn -| |- AfterNewIdx -|
1366 // => |- X0/OldIdxOut -| ... |- Xn -| |- undef/NewS. -| |- AfterNewIdx -|
1367 assert(AfterNewIdx != OldIdxOut && "Inconsistent iterators");
1368 std::copy(std::next(OldIdxOut), AfterNewIdx, OldIdxOut);
1369 // We can reuse OldIdxVNI now.
1370 LiveRange::iterator NewSegment = std::prev(AfterNewIdx);
1371 VNInfo *NewSegmentVNI = OldIdxVNI;
1372 NewSegmentVNI->def = NewIdxDef;
1373 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1374 NewSegmentVNI);
1375 }
1376 }
1377
1378 /// Update LR to reflect an instruction has been moved upwards from OldIdx
1379 /// to NewIdx (NewIdx < OldIdx).
1380 void handleMoveUp(LiveRange &LR, VirtRegOrUnit VRegOrUnit,
1381 LaneBitmask LaneMask) {
1382 LiveRange::iterator E = LR.end();
1383 // Segment going into OldIdx.
1384 LiveRange::iterator OldIdxIn = LR.find(OldIdx.getBaseIndex());
1385
1386 // No value live before or after OldIdx? Nothing to do.
1387 if (OldIdxIn == E || SlotIndex::isEarlierInstr(OldIdx, OldIdxIn->start))
1388 return;
1389
1390 LiveRange::iterator OldIdxOut;
1391 // Do we have a value live-in to OldIdx?
1392 if (SlotIndex::isEarlierInstr(OldIdxIn->start, OldIdx)) {
1393 // If the live-in value isn't killed here, then we have no Def at
1394 // OldIdx, moreover the value must be live at NewIdx so there is nothing
1395 // to do.
1396 bool isKill = SlotIndex::isSameInstr(OldIdx, OldIdxIn->end);
1397 if (!isKill)
1398 return;
1399
1400 // At this point we have to move OldIdxIn->end back to the nearest
1401 // previous use or (dead-)def but no further than NewIdx.
1402 SlotIndex DefBeforeOldIdx
1403 = std::max(OldIdxIn->start.getDeadSlot(),
1404 NewIdx.getRegSlot(OldIdxIn->end.isEarlyClobber()));
1405 OldIdxIn->end = findLastUseBefore(DefBeforeOldIdx, VRegOrUnit, LaneMask);
1406
1407 // Did we have a Def at OldIdx? If not we are done now.
1408 OldIdxOut = std::next(OldIdxIn);
1409 if (OldIdxOut == E || !SlotIndex::isSameInstr(OldIdx, OldIdxOut->start))
1410 return;
1411 } else {
1412 OldIdxOut = OldIdxIn;
1413 OldIdxIn = OldIdxOut != LR.begin() ? std::prev(OldIdxOut) : E;
1414 }
1415
1416 // If we are here then there is a Definition at OldIdx. OldIdxOut points
1417 // to the segment starting there.
1418 assert(OldIdxOut != E && SlotIndex::isSameInstr(OldIdx, OldIdxOut->start) &&
1419 "No def?");
1420 VNInfo *OldIdxVNI = OldIdxOut->valno;
1421 assert(OldIdxVNI->def == OldIdxOut->start && "Inconsistent def");
1422 bool OldIdxDefIsDead = OldIdxOut->end.isDead();
1423
1424 // Is there an existing def at NewIdx?
1425 SlotIndex NewIdxDef = NewIdx.getRegSlot(OldIdxOut->start.isEarlyClobber());
1426 LiveRange::iterator NewIdxOut = LR.find(NewIdx.getRegSlot());
1427 if (SlotIndex::isSameInstr(NewIdxOut->start, NewIdx)) {
1428 assert(NewIdxOut->valno != OldIdxVNI &&
1429 "Same value defined more than once?");
1430 // If OldIdx was a dead def remove it.
1431 if (!OldIdxDefIsDead) {
1432 // Remove segment starting at NewIdx and move begin of OldIdxOut to
1433 // NewIdx so it can take its place.
1434 OldIdxVNI->def = NewIdxDef;
1435 OldIdxOut->start = NewIdxDef;
1436 LR.removeValNo(NewIdxOut->valno);
1437 } else {
1438 // Simply remove the dead def at OldIdx.
1439 LR.removeValNo(OldIdxVNI);
1440 }
1441 } else {
1442 // Previously nothing was live after NewIdx, so all we have to do now is
1443 // move the begin of OldIdxOut to NewIdx.
1444 if (!OldIdxDefIsDead) {
1445 // Do we have any intermediate Defs between OldIdx and NewIdx?
1446 if (OldIdxIn != E &&
1447 SlotIndex::isEarlierInstr(NewIdxDef, OldIdxIn->start)) {
1448 // OldIdx is not a dead def and NewIdx is before predecessor start.
1449 LiveRange::iterator NewIdxIn = NewIdxOut;
1450 assert(NewIdxIn == LR.find(NewIdx.getBaseIndex()));
1451 const SlotIndex SplitPos = NewIdxDef;
1452 OldIdxVNI = OldIdxIn->valno;
1453
1454 SlotIndex NewDefEndPoint = std::next(NewIdxIn)->end;
1455 LiveRange::iterator Prev = std::prev(OldIdxIn);
1456 if (OldIdxIn != LR.begin() &&
1457 SlotIndex::isEarlierInstr(NewIdx, Prev->end)) {
1458 // If the segment before OldIdx read a value defined earlier than
1459 // NewIdx, the moved instruction also reads and forwards that
1460 // value. Extend the lifetime of the new def point.
1461
1462 // Extend to where the previous range started, unless there is
1463 // another redef first.
1464 NewDefEndPoint = std::min(OldIdxIn->start,
1465 std::next(NewIdxOut)->start);
1466 }
1467
1468 // Merge the OldIdxIn and OldIdxOut segments into OldIdxOut.
1469 OldIdxOut->valno->def = OldIdxIn->start;
1470 *OldIdxOut = LiveRange::Segment(OldIdxIn->start, OldIdxOut->end,
1471 OldIdxOut->valno);
1472 // OldIdxIn and OldIdxVNI are now undef and can be overridden.
1473 // We Slide [NewIdxIn, OldIdxIn) down one position.
1474 // |- X0/NewIdxIn -| ... |- Xn-1 -||- Xn/OldIdxIn -||- OldIdxOut -|
1475 // => |- undef/NexIdxIn -| |- X0 -| ... |- Xn-1 -| |- Xn/OldIdxOut -|
1476 std::copy_backward(NewIdxIn, OldIdxIn, OldIdxOut);
1477 // NewIdxIn is now considered undef so we can reuse it for the moved
1478 // value.
1479 LiveRange::iterator NewSegment = NewIdxIn;
1480 LiveRange::iterator Next = std::next(NewSegment);
1481 if (SlotIndex::isEarlierInstr(Next->start, NewIdx)) {
1482 // There is no gap between NewSegment and its predecessor.
1483 *NewSegment = LiveRange::Segment(Next->start, SplitPos,
1484 Next->valno);
1485
1486 *Next = LiveRange::Segment(SplitPos, NewDefEndPoint, OldIdxVNI);
1487 Next->valno->def = SplitPos;
1488 } else {
1489 // There is a gap between NewSegment and its predecessor
1490 // Value becomes live in.
1491 *NewSegment = LiveRange::Segment(SplitPos, Next->start, OldIdxVNI);
1492 NewSegment->valno->def = SplitPos;
1493 }
1494 } else {
1495 // Leave the end point of a live def.
1496 OldIdxOut->start = NewIdxDef;
1497 OldIdxVNI->def = NewIdxDef;
1498 if (OldIdxIn != E && SlotIndex::isEarlierInstr(NewIdx, OldIdxIn->end))
1499 OldIdxIn->end = NewIdxDef;
1500 }
1501 } else if (OldIdxIn != E
1502 && SlotIndex::isEarlierInstr(NewIdxOut->start, NewIdx)
1503 && SlotIndex::isEarlierInstr(NewIdx, NewIdxOut->end)) {
1504 // OldIdxVNI is a dead def that has been moved into the middle of
1505 // another value in LR. That can happen when LR is a whole register,
1506 // but the dead def is a write to a subreg that is dead at NewIdx.
1507 // The dead def may have been moved across other values
1508 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1509 // down one position.
1510 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1511 // => |- X0/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1512 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1513 // Modify the segment at NewIdxOut and the following segment to meet at
1514 // the point of the dead def, with the following segment getting
1515 // OldIdxVNI as its value number.
1516 *NewIdxOut = LiveRange::Segment(
1517 NewIdxOut->start, NewIdxDef.getRegSlot(), NewIdxOut->valno);
1518 *(NewIdxOut + 1) = LiveRange::Segment(
1519 NewIdxDef.getRegSlot(), (NewIdxOut + 1)->end, OldIdxVNI);
1520 OldIdxVNI->def = NewIdxDef;
1521 // Retag the segments that were shifted down from [NewIdxOut + 2,
1522 // OldIdxOut]. Retagging can make a segment touch another segment with
1523 // the same value number, so merge as we go. Stop at the original end
1524 // slot instead of using a segment count because merging may erase
1525 // segments.
1526 const SlotIndex RetagEnd = OldIdxOut->end;
1527 for (LiveRange::iterator Idx = NewIdxOut + 2;
1528 Idx != LR.end() && Idx->start < RetagEnd;) {
1529 Idx->valno = OldIdxVNI;
1530 Idx = std::next(LR.mergeAdjacentSegments(Idx));
1531 }
1532 // Aggressively remove all dead flags from the former dead definition.
1533 // Kill/dead flags shouldn't be used while live intervals exist; they
1534 // will be reinserted by VirtRegRewriter.
1535 if (MachineInstr *KillMI = LIS.getInstructionFromIndex(NewIdx))
1536 for (MIBundleOperands MO(*KillMI); MO.isValid(); ++MO)
1537 if (MO->isReg() && !MO->isUse())
1538 MO->setIsDead(false);
1539 } else {
1540 // OldIdxVNI is a dead def. It may have been moved across other values
1541 // in LR, so move OldIdxOut up to NewIdxOut. Slide [NewIdxOut;OldIdxOut)
1542 // down one position.
1543 // |- X0/NewIdxOut -| ... |- Xn-1 -| |- Xn/OldIdxOut -| |- next - |
1544 // => |- undef/NewIdxOut -| |- X0 -| ... |- Xn-1 -| |- next -|
1545 std::copy_backward(NewIdxOut, OldIdxOut, std::next(OldIdxOut));
1546 // OldIdxVNI can be reused now to build a new dead def segment.
1547 LiveRange::iterator NewSegment = NewIdxOut;
1548 VNInfo *NewSegmentVNI = OldIdxVNI;
1549 *NewSegment = LiveRange::Segment(NewIdxDef, NewIdxDef.getDeadSlot(),
1550 NewSegmentVNI);
1551 NewSegmentVNI->def = NewIdxDef;
1552 }
1553 }
1554 }
1555
1556 void updateRegMaskSlots() {
1558 llvm::lower_bound(LIS.RegMaskSlots, OldIdx);
1559 assert(RI != LIS.RegMaskSlots.end() && *RI == OldIdx.getRegSlot() &&
1560 "No RegMask at OldIdx.");
1561 *RI = NewIdx.getRegSlot();
1562 assert((RI == LIS.RegMaskSlots.begin() ||
1563 SlotIndex::isEarlierInstr(*std::prev(RI), *RI)) &&
1564 "Cannot move regmask instruction above another call");
1565 assert((std::next(RI) == LIS.RegMaskSlots.end() ||
1566 SlotIndex::isEarlierInstr(*RI, *std::next(RI))) &&
1567 "Cannot move regmask instruction below another call");
1568 }
1569
1570 // Return the last use of reg between NewIdx and OldIdx.
1571 SlotIndex findLastUseBefore(SlotIndex Before, VirtRegOrUnit VRegOrUnit,
1572 LaneBitmask LaneMask) {
1573 if (VRegOrUnit.isVirtualReg()) {
1574 SlotIndex LastUse = Before;
1575 for (MachineOperand &MO :
1576 MRI.use_nodbg_operands(VRegOrUnit.asVirtualReg())) {
1577 if (MO.isUndef())
1578 continue;
1579 unsigned SubReg = MO.getSubReg();
1580 if (SubReg != 0 && LaneMask.any()
1581 && (TRI.getSubRegIndexLaneMask(SubReg) & LaneMask).none())
1582 continue;
1583
1584 const MachineInstr &MI = *MO.getParent();
1585 SlotIndex InstSlot = LIS.getSlotIndexes()->getInstructionIndex(MI);
1586 if (InstSlot > LastUse && InstSlot < OldIdx)
1587 LastUse = InstSlot.getRegSlot();
1588 }
1589 return LastUse;
1590 }
1591
1592 // This is a regunit interval, so scanning the use list could be very
1593 // expensive. Scan upwards from OldIdx instead.
1594 assert(Before < OldIdx && "Expected upwards move");
1595 SlotIndexes *Indexes = LIS.getSlotIndexes();
1596 MachineBasicBlock *MBB = Indexes->getMBBFromIndex(Before);
1597
1598 // OldIdx may not correspond to an instruction any longer, so set MII to
1599 // point to the next instruction after OldIdx, or MBB->end().
1601 if (MachineInstr *MI = Indexes->getInstructionFromIndex(
1602 Indexes->getNextNonNullIndex(OldIdx)))
1603 if (MI->getParent() == MBB)
1604 MII = MI;
1605
1607 while (MII != Begin) {
1608 if ((--MII)->isDebugOrPseudoInstr())
1609 continue;
1610 SlotIndex Idx = Indexes->getInstructionIndex(*MII);
1611
1612 // Stop searching when Before is reached.
1613 if (!SlotIndex::isEarlierInstr(Before, Idx))
1614 return Before;
1615
1616 // Check if MII uses Reg.
1617 for (MIBundleOperands MO(*MII); MO.isValid(); ++MO)
1618 if (MO->isReg() && !MO->isUndef() && MO->getReg().isPhysical() &&
1619 TRI.hasRegUnit(MO->getReg(), VRegOrUnit.asMCRegUnit()))
1620 return Idx.getRegSlot();
1621 }
1622 // Didn't reach Before. It must be the first instruction in the block.
1623 return Before;
1624 }
1625};
1626
1628 // It is fine to move a bundle as a whole, but not an individual instruction
1629 // inside it.
1630 assert((!MI.isBundled() || MI.getOpcode() == TargetOpcode::BUNDLE) &&
1631 "Cannot move instruction in bundle");
1632 SlotIndex OldIndex = Indexes->getInstructionIndex(MI);
1633 Indexes->removeMachineInstrFromMaps(MI);
1634 SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(MI);
1635 assert(getMBBStartIdx(MI.getParent()) <= OldIndex &&
1636 OldIndex < getMBBEndIdx(MI.getParent()) &&
1637 "Cannot handle moves across basic block boundaries.");
1638
1639 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1640 HME.updateAllRanges(&MI);
1641}
1642
1644 bool UpdateFlags) {
1645 assert((BundleStart.getOpcode() == TargetOpcode::BUNDLE) &&
1646 "Bundle start is not a bundle");
1648 const SlotIndex NewIndex = Indexes->insertMachineInstrInMaps(BundleStart);
1649 auto BundleEnd = getBundleEnd(BundleStart.getIterator());
1650
1651 auto I = BundleStart.getIterator();
1652 I++;
1653 while (I != BundleEnd) {
1654 if (!Indexes->hasIndex(*I))
1655 continue;
1656 SlotIndex OldIndex = Indexes->getInstructionIndex(*I, true);
1657 ToProcess.push_back(OldIndex);
1658 Indexes->removeMachineInstrFromMaps(*I, true);
1659 I++;
1660 }
1661 for (SlotIndex OldIndex : ToProcess) {
1662 HMEditor HME(*this, *MRI, *TRI, OldIndex, NewIndex, UpdateFlags);
1663 HME.updateAllRanges(&BundleStart);
1664 }
1665
1666 // Fix up dead defs
1667 const SlotIndex Index = getInstructionIndex(BundleStart);
1668 for (MachineOperand &MO : BundleStart.operands()) {
1669 if (!MO.isReg())
1670 continue;
1671 Register Reg = MO.getReg();
1672 if (Reg.isVirtual() && hasInterval(Reg) && !MO.isUndef()) {
1673 LiveInterval &LI = getInterval(Reg);
1674 LiveQueryResult LRQ = LI.Query(Index);
1675 if (LRQ.isDeadDef())
1676 MO.setIsDead();
1677 }
1678 }
1679}
1680
1681void LiveIntervals::repairOldRegInRange(const MachineBasicBlock::iterator Begin,
1683 const SlotIndex EndIdx, LiveRange &LR,
1684 const Register Reg,
1685 LaneBitmask LaneMask) {
1686 LiveInterval::iterator LII = LR.find(EndIdx);
1687 SlotIndex lastUseIdx;
1688 if (LII != LR.end() && LII->start < EndIdx) {
1689 lastUseIdx = LII->end;
1690 } else if (LII == LR.begin()) {
1691 // We may not have a liverange at all if this is a subregister untouched
1692 // between \p Begin and \p End.
1693 } else {
1694 --LII;
1695 }
1696
1697 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1698 --I;
1699 MachineInstr &MI = *I;
1700 if (MI.isDebugOrPseudoInstr())
1701 continue;
1702
1703 SlotIndex instrIdx = getInstructionIndex(MI);
1704 bool isStartValid = getInstructionFromIndex(LII->start);
1705 bool isEndValid = getInstructionFromIndex(LII->end);
1706
1707 // FIXME: This doesn't currently handle early-clobber or multiple removed
1708 // defs inside of the region to repair.
1709 for (const MachineOperand &MO : MI.operands()) {
1710 if (!MO.isReg() || MO.getReg() != Reg)
1711 continue;
1712
1713 unsigned SubReg = MO.getSubReg();
1714 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1715 if ((Mask & LaneMask).none())
1716 continue;
1717
1718 if (MO.isDef()) {
1719 if (!isStartValid) {
1720 if (LII->end.isDead()) {
1721 LII = LR.removeSegment(LII, true);
1722 if (LII != LR.begin())
1723 --LII;
1724 } else {
1725 LII->start = instrIdx.getRegSlot();
1726 LII->valno->def = instrIdx.getRegSlot();
1727 if (MO.getSubReg() && !MO.isUndef())
1728 lastUseIdx = instrIdx.getRegSlot();
1729 else
1730 lastUseIdx = SlotIndex();
1731 continue;
1732 }
1733 }
1734
1735 if (!lastUseIdx.isValid()) {
1736 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1737 LiveRange::Segment S(instrIdx.getRegSlot(),
1738 instrIdx.getDeadSlot(), VNI);
1739 LII = LR.addSegment(S);
1740 } else if (LII->start != instrIdx.getRegSlot()) {
1741 VNInfo *VNI = LR.getNextValue(instrIdx.getRegSlot(), VNInfoAllocator);
1742 LiveRange::Segment S(instrIdx.getRegSlot(), lastUseIdx, VNI);
1743 LII = LR.addSegment(S);
1744 }
1745
1746 if (MO.getSubReg() && !MO.isUndef())
1747 lastUseIdx = instrIdx.getRegSlot();
1748 else
1749 lastUseIdx = SlotIndex();
1750 } else if (MO.isUse()) {
1751 // FIXME: This should probably be handled outside of this branch,
1752 // either as part of the def case (for defs inside of the region) or
1753 // after the loop over the region.
1754 if (!isEndValid && !LII->end.isBlock())
1755 LII->end = instrIdx.getRegSlot();
1756 if (!lastUseIdx.isValid())
1757 lastUseIdx = instrIdx.getRegSlot();
1758 }
1759 }
1760 }
1761
1762 bool isStartValid = getInstructionFromIndex(LII->start);
1763 if (!isStartValid && LII->end.isDead())
1764 LR.removeSegment(*LII, true);
1765}
1766
1767void
1771 ArrayRef<Register> OrigRegs) {
1772 // Find anchor points, which are at the beginning/end of blocks or at
1773 // instructions that already have indexes.
1774 while (Begin != MBB->begin() && !Indexes->hasIndex(*std::prev(Begin)))
1775 --Begin;
1776 while (End != MBB->end() && !Indexes->hasIndex(*End))
1777 ++End;
1778
1779 SlotIndex EndIdx;
1780 if (End == MBB->end())
1781 EndIdx = getMBBEndIdx(MBB).getPrevSlot();
1782 else
1783 EndIdx = getInstructionIndex(*End);
1784
1785 Indexes->repairIndexesInRange(MBB, Begin, End);
1786
1787 // Make sure a live interval exists for all register operands in the range.
1788 SmallVector<Register> RegsToRepair(OrigRegs);
1789 for (MachineBasicBlock::iterator I = End; I != Begin;) {
1790 --I;
1791 MachineInstr &MI = *I;
1792 if (MI.isDebugOrPseudoInstr())
1793 continue;
1794 for (const MachineOperand &MO : MI.operands()) {
1795 if (MO.isReg() && MO.getReg().isVirtual()) {
1796 Register Reg = MO.getReg();
1797 if (MO.getSubReg() && hasInterval(Reg) &&
1798 MRI->shouldTrackSubRegLiveness(Reg)) {
1799 LiveInterval &LI = getInterval(Reg);
1800 if (!LI.hasSubRanges()) {
1801 // If the new instructions refer to subregs but the old instructions
1802 // did not, throw away any old live interval so it will be
1803 // recomputed with subranges.
1804 removeInterval(Reg);
1805 } else if (MO.isDef()) {
1806 // Similarly if a subreg def has no precise subrange match then
1807 // assume we need to recompute all subranges.
1808 unsigned SubReg = MO.getSubReg();
1809 LaneBitmask Mask = TRI->getSubRegIndexLaneMask(SubReg);
1810 if (llvm::none_of(LI.subranges(),
1811 [Mask](LiveInterval::SubRange &SR) {
1812 return SR.LaneMask == Mask;
1813 })) {
1814 removeInterval(Reg);
1815 }
1816 }
1817 }
1818 if (!hasInterval(Reg)) {
1820 // Don't bother to repair a freshly calculated live interval.
1821 llvm::erase(RegsToRepair, Reg);
1822 }
1823 }
1824 }
1825 }
1826
1827 for (Register Reg : RegsToRepair) {
1828 if (!Reg.isVirtual())
1829 continue;
1830
1831 LiveInterval &LI = getInterval(Reg);
1832 // FIXME: Should we support undefs that gain defs?
1833 if (!LI.hasAtLeastOneValue())
1834 continue;
1835
1836 for (LiveInterval::SubRange &S : LI.subranges())
1837 repairOldRegInRange(Begin, End, EndIdx, S, Reg, S.LaneMask);
1839
1840 repairOldRegInRange(Begin, End, EndIdx, LI, Reg);
1841 }
1842}
1843
1845 for (MCRegUnit Unit : TRI->regunits(Reg)) {
1846 if (LiveRange *LR = getCachedRegUnit(Unit))
1847 if (VNInfo *VNI = LR->getVNInfoAt(Pos))
1848 LR->removeValNo(VNI);
1849 }
1850}
1851
1853 // LI may not have the main range computed yet, but its subranges may
1854 // be present.
1855 VNInfo *VNI = LI.getVNInfoAt(Pos);
1856 if (VNI != nullptr) {
1857 assert(VNI->def.getBaseIndex() == Pos.getBaseIndex());
1858 LI.removeValNo(VNI);
1859 }
1860
1861 // Also remove the value defined in subranges.
1862 for (LiveInterval::SubRange &S : LI.subranges()) {
1863 if (VNInfo *SVNI = S.getVNInfoAt(Pos))
1864 if (SVNI->def.getBaseIndex() == Pos.getBaseIndex())
1865 S.removeValNo(SVNI);
1866 }
1868}
1869
1872 ConnectedVNInfoEqClasses ConEQ(*this);
1873 unsigned NumComp = ConEQ.Classify(LI);
1874 if (NumComp <= 1)
1875 return;
1876 LLVM_DEBUG(dbgs() << " Split " << NumComp << " components: " << LI << '\n');
1877 Register Reg = LI.reg();
1878 for (unsigned I = 1; I < NumComp; ++I) {
1879 Register NewVReg = MRI->cloneVirtualRegister(Reg);
1880 LiveInterval &NewLI = createEmptyInterval(NewVReg);
1881 SplitLIs.push_back(&NewLI);
1882 }
1883 ConEQ.Distribute(LI, SplitLIs.data(), *MRI);
1884}
1885
1887 assert(LICalc && "LICalc not initialized.");
1888 LICalc->reset(MF, getSlotIndexes(), DomTree, &getVNInfoAllocator());
1889 LICalc->constructMainRangeFromSubranges(LI);
1890}
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:686
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 > UseSegmentSetForPhysRegs("use-segment-set-for-physregs", cl::Hidden, cl::init(true), cl::desc("Use segment set for the computation of the live ranges of physregs."))
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:302
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:278
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)
@ 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:2216
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:1762
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:1769
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:2068
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.