LLVM 22.0.0git
SplitKit.cpp
Go to the documentation of this file.
1//===- SplitKit.cpp - Toolkit for splitting live ranges -------------------===//
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// This file contains the SplitAnalysis class as well as mutator functions for
10// live range splitting.
11//
12//===----------------------------------------------------------------------===//
13
14#include "SplitKit.h"
15#include "llvm/ADT/STLExtras.h"
16#include "llvm/ADT/Statistic.h"
30#include "llvm/Config/llvm-config.h"
31#include "llvm/IR/DebugLoc.h"
34#include "llvm/Support/Debug.h"
37#include <algorithm>
38#include <cassert>
39#include <iterator>
40#include <limits>
41#include <tuple>
42
43using namespace llvm;
44
45#define DEBUG_TYPE "regalloc"
46
47static cl::opt<bool>
48 EnableLoopIVHeuristic("enable-split-loopiv-heuristic",
49 cl::desc("Enable loop iv regalloc heuristic"),
50 cl::init(true));
51
52STATISTIC(NumFinished, "Number of splits finished");
53STATISTIC(NumSimple, "Number of splits that were simple");
54STATISTIC(NumCopies, "Number of copies inserted for splitting");
55STATISTIC(NumRemats, "Number of rematerialized defs for splitting");
56
57//===----------------------------------------------------------------------===//
58// Last Insert Point Analysis
59//===----------------------------------------------------------------------===//
60
62 unsigned BBNum)
63 : LIS(lis), LastInsertPoint(BBNum) {}
64
66InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI,
67 const MachineBasicBlock &MBB) {
68 unsigned Num = MBB.getNumber();
69 std::pair<SlotIndex, SlotIndex> &LIP = LastInsertPoint[Num];
70 SlotIndex MBBEnd = LIS.getMBBEndIdx(&MBB);
71
73 bool EHPadSuccessor = false;
74 for (const MachineBasicBlock *SMBB : MBB.successors()) {
75 if (SMBB->isEHPad()) {
76 ExceptionalSuccessors.push_back(SMBB);
77 EHPadSuccessor = true;
78 } else if (SMBB->isInlineAsmBrIndirectTarget())
79 ExceptionalSuccessors.push_back(SMBB);
80 }
81
82 // Compute insert points on the first call. The pair is independent of the
83 // current live interval.
84 if (!LIP.first.isValid()) {
86 if (FirstTerm == MBB.end())
87 LIP.first = MBBEnd;
88 else
89 LIP.first = LIS.getInstructionIndex(*FirstTerm);
90
91 // If there is a landing pad or inlineasm_br successor, also find the
92 // instruction. If there is no such instruction, we don't need to do
93 // anything special. We assume there cannot be multiple instructions that
94 // are Calls with EHPad successors or INLINEASM_BR in a block. Further, we
95 // assume that if there are any, they will be after any other call
96 // instructions in the block.
97 if (ExceptionalSuccessors.empty())
98 return LIP.first;
99 for (const MachineInstr &MI : llvm::reverse(MBB)) {
100 if ((EHPadSuccessor && MI.isCall()) ||
101 MI.getOpcode() == TargetOpcode::INLINEASM_BR) {
102 LIP.second = LIS.getInstructionIndex(MI);
103 break;
104 }
105 }
106 }
107
108 // If CurLI is live into a landing pad successor, move the last insert point
109 // back to the call that may throw.
110 if (!LIP.second)
111 return LIP.first;
112
113 if (none_of(ExceptionalSuccessors, [&](const MachineBasicBlock *EHPad) {
114 return LIS.isLiveInToMBB(CurLI, EHPad);
115 }))
116 return LIP.first;
117
118 // Find the value leaving MBB.
119 const VNInfo *VNI = CurLI.getVNInfoBefore(MBBEnd);
120 if (!VNI)
121 return LIP.first;
122
123 // The def of statepoint instruction is a gc relocation and it should be alive
124 // in landing pad. So we cannot split interval after statepoint instruction.
125 if (SlotIndex::isSameInstr(VNI->def, LIP.second))
126 if (auto *I = LIS.getInstructionFromIndex(LIP.second))
127 if (I->getOpcode() == TargetOpcode::STATEPOINT)
128 return LIP.second;
129
130 // If the value leaving MBB was defined after the call in MBB, it can't
131 // really be live-in to the landing pad. This can happen if the landing pad
132 // has a PHI, and this register is undef on the exceptional edge.
133 if (!SlotIndex::isEarlierInstr(VNI->def, LIP.second) && VNI->def < MBBEnd)
134 return LIP.first;
135
136 // Value is properly live-in to the landing pad.
137 // Only allow inserts before the call.
138 return LIP.second;
139}
140
144 SlotIndex LIP = getLastInsertPoint(CurLI, MBB);
145 if (LIP == LIS.getMBBEndIdx(&MBB))
146 return MBB.end();
147 return LIS.getInstructionFromIndex(LIP);
148}
149
150//===----------------------------------------------------------------------===//
151// Split Analysis
152//===----------------------------------------------------------------------===//
153
155 const MachineLoopInfo &mli)
156 : MF(vrm.getMachineFunction()), VRM(vrm), LIS(lis), Loops(mli),
157 TII(*MF.getSubtarget().getInstrInfo()), IPA(lis, MF.getNumBlockIDs()) {}
158
160 UseSlots.clear();
161 UseBlocks.clear();
162 ThroughBlocks.clear();
163 CurLI = nullptr;
164}
165
166/// analyzeUses - Count instructions, basic blocks, and loops using CurLI.
167void SplitAnalysis::analyzeUses() {
168 assert(UseSlots.empty() && "Call clear first");
169
170 // First get all the defs from the interval values. This provides the correct
171 // slots for early clobbers.
172 for (const VNInfo *VNI : CurLI->valnos)
173 if (!VNI->isPHIDef() && !VNI->isUnused())
174 UseSlots.push_back(VNI->def);
175
176 // Get use slots form the use-def chain.
178 for (MachineOperand &MO : MRI.use_nodbg_operands(CurLI->reg()))
179 if (!MO.isUndef())
180 UseSlots.push_back(LIS.getInstructionIndex(*MO.getParent()).getRegSlot());
181
182 array_pod_sort(UseSlots.begin(), UseSlots.end());
183
184 // Remove duplicates, keeping the smaller slot for each instruction.
185 // That is what we want for early clobbers.
186 UseSlots.erase(llvm::unique(UseSlots, SlotIndex::isSameInstr),
187 UseSlots.end());
188
189 // Compute per-live block info.
190 calcLiveBlockInfo();
191
192 LLVM_DEBUG(dbgs() << "Analyze counted " << UseSlots.size() << " instrs in "
193 << UseBlocks.size() << " blocks, through "
194 << NumThroughBlocks << " blocks.\n");
195}
196
197/// calcLiveBlockInfo - Fill the LiveBlocks array with information about blocks
198/// where CurLI is live.
199void SplitAnalysis::calcLiveBlockInfo() {
200 ThroughBlocks.resize(MF.getNumBlockIDs());
201 NumThroughBlocks = NumGapBlocks = 0;
202 if (CurLI->empty())
203 return;
204
205 LiveInterval::const_iterator LVI = CurLI->begin();
206 LiveInterval::const_iterator LVE = CurLI->end();
207
209 UseI = UseSlots.begin();
210 UseE = UseSlots.end();
211
212 // Loop over basic blocks where CurLI is live.
214 LIS.getMBBFromIndex(LVI->start)->getIterator();
215 while (true) {
216 BlockInfo BI;
217 BI.MBB = &*MFI;
218 SlotIndex Start, Stop;
219 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
220
221 // If the block contains no uses, the range must be live through. At one
222 // point, RegisterCoalescer could create dangling ranges that ended
223 // mid-block.
224 if (UseI == UseE || *UseI >= Stop) {
225 ++NumThroughBlocks;
226 ThroughBlocks.set(BI.MBB->getNumber());
227 // The range shouldn't end mid-block if there are no uses. This shouldn't
228 // happen.
229 assert(LVI->end >= Stop && "range ends mid block with no uses");
230 } else {
231 // This block has uses. Find the first and last uses in the block.
232 BI.FirstInstr = *UseI;
233 assert(BI.FirstInstr >= Start);
234 do ++UseI;
235 while (UseI != UseE && *UseI < Stop);
236 BI.LastInstr = UseI[-1];
237 assert(BI.LastInstr < Stop);
238
239 // LVI is the first live segment overlapping MBB.
240 BI.LiveIn = LVI->start <= Start;
241
242 // When not live in, the first use should be a def.
243 if (!BI.LiveIn) {
244 assert(LVI->start == LVI->valno->def && "Dangling Segment start");
245 assert(LVI->start == BI.FirstInstr && "First instr should be a def");
246 BI.FirstDef = BI.FirstInstr;
247 }
248
249 // Look for gaps in the live range.
250 BI.LiveOut = true;
251 while (LVI->end < Stop) {
252 SlotIndex LastStop = LVI->end;
253 if (++LVI == LVE || LVI->start >= Stop) {
254 BI.LiveOut = false;
255 BI.LastInstr = LastStop;
256 break;
257 }
258
259 if (LastStop < LVI->start) {
260 // There is a gap in the live range. Create duplicate entries for the
261 // live-in snippet and the live-out snippet.
262 ++NumGapBlocks;
263
264 // Push the Live-in part.
265 BI.LiveOut = false;
266 UseBlocks.push_back(BI);
267 UseBlocks.back().LastInstr = LastStop;
268
269 // Set up BI for the live-out part.
270 BI.LiveIn = false;
271 BI.LiveOut = true;
272 BI.FirstInstr = BI.FirstDef = LVI->start;
273 }
274
275 // A Segment that starts in the middle of the block must be a def.
276 assert(LVI->start == LVI->valno->def && "Dangling Segment start");
277 if (!BI.FirstDef)
278 BI.FirstDef = LVI->start;
279 }
280
281 UseBlocks.push_back(BI);
282
283 // LVI is now at LVE or LVI->end >= Stop.
284 if (LVI == LVE)
285 break;
286 }
287
288 // Live segment ends exactly at Stop. Move to the next segment.
289 if (LVI->end == Stop && ++LVI == LVE)
290 break;
291
292 // Pick the next basic block.
293 if (LVI->start < Stop)
294 ++MFI;
295 else
296 MFI = LIS.getMBBFromIndex(LVI->start)->getIterator();
297 }
298
299 LooksLikeLoopIV = EnableLoopIVHeuristic && UseBlocks.size() == 2 &&
300 any_of(UseBlocks, [this](BlockInfo &BI) {
301 MachineLoop *L = Loops.getLoopFor(BI.MBB);
302 return BI.LiveIn && BI.LiveOut && BI.FirstDef && L &&
303 L->isLoopLatch(BI.MBB);
304 });
305
306 assert(getNumLiveBlocks() == countLiveBlocks(CurLI) && "Bad block count");
307}
308
310 if (cli->empty())
311 return 0;
312 LiveInterval *li = const_cast<LiveInterval*>(cli);
313 LiveInterval::iterator LVI = li->begin();
314 LiveInterval::iterator LVE = li->end();
315 unsigned Count = 0;
316
317 // Loop over basic blocks where li is live.
319 LIS.getMBBFromIndex(LVI->start)->getIterator();
320 SlotIndex Stop = LIS.getMBBEndIdx(&*MFI);
321 while (true) {
322 ++Count;
323 LVI = li->advanceTo(LVI, Stop);
324 if (LVI == LVE)
325 return Count;
326 do {
327 ++MFI;
328 Stop = LIS.getMBBEndIdx(&*MFI);
329 } while (Stop <= LVI->start);
330 }
331}
332
334 Register OrigReg = VRM.getOriginal(CurLI->reg());
335 const LiveInterval &Orig = LIS.getInterval(OrigReg);
336 assert(!Orig.empty() && "Splitting empty interval?");
338
339 // Range containing Idx should begin at Idx.
340 if (I != Orig.end() && I->start <= Idx)
341 return I->start == Idx;
342
343 // Range does not contain Idx, previous must end at Idx.
344 return I != Orig.begin() && (--I)->end == Idx;
345}
346
348 clear();
349 CurLI = li;
350 analyzeUses();
351}
352
353//===----------------------------------------------------------------------===//
354// Split Editor
355//===----------------------------------------------------------------------===//
356
357/// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
361 : SA(SA), LIS(LIS), VRM(VRM), MRI(VRM.getMachineFunction().getRegInfo()),
362 MDT(MDT), TII(*VRM.getMachineFunction().getSubtarget().getInstrInfo()),
363 TRI(*VRM.getMachineFunction().getSubtarget().getRegisterInfo()),
364 MBFI(MBFI), VRAI(VRAI), RegAssign(Allocator) {}
365
367 Edit = &LRE;
368 SpillMode = SM;
369 OpenIdx = 0;
370 RegAssign.clear();
371 Values.clear();
372
373 // Reset the LiveIntervalCalc instances needed for this spill mode.
374 LICalc[0].reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
375 &LIS.getVNInfoAllocator());
376 if (SpillMode)
377 LICalc[1].reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
378 &LIS.getVNInfoAllocator());
379}
380
381#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
383 if (RegAssign.empty()) {
384 dbgs() << " empty\n";
385 return;
386 }
387
388 for (RegAssignMap::const_iterator I = RegAssign.begin(); I.valid(); ++I)
389 dbgs() << " [" << I.start() << ';' << I.stop() << "):" << I.value();
390 dbgs() << '\n';
391}
392#endif
393
394/// Find a subrange corresponding to the exact lane mask @p LM in the live
395/// interval @p LI. The interval @p LI is assumed to contain such a subrange.
396/// This function is used to find corresponding subranges between the
397/// original interval and the new intervals.
398template <typename T> auto &getSubrangeImpl(LaneBitmask LM, T &LI) {
399 for (auto &S : LI.subranges())
400 if (S.LaneMask == LM)
401 return S;
402 llvm_unreachable("SubRange for this mask not found");
403}
404
409
411 const LiveInterval &LI) {
412 return getSubrangeImpl(LM, LI);
413}
414
415/// Find a subrange corresponding to the lane mask @p LM, or a superset of it,
416/// in the live interval @p LI. The interval @p LI is assumed to contain such
417/// a subrange. This function is used to find corresponding subranges between
418/// the original interval and the new intervals.
420 const LiveInterval &LI) {
421 for (const LiveInterval::SubRange &S : LI.subranges())
422 if ((S.LaneMask & LM) == LM)
423 return S;
424 llvm_unreachable("SubRange for this mask not found");
425}
426
427void SplitEditor::addDeadDef(LiveInterval &LI, VNInfo *VNI, bool Original) {
428 if (!LI.hasSubRanges()) {
429 LI.createDeadDef(VNI);
430 return;
431 }
432
433 SlotIndex Def = VNI->def;
434 if (Original) {
435 // If we are transferring a def from the original interval, make sure
436 // to only update the subranges for which the original subranges had
437 // a def at this location.
438 for (LiveInterval::SubRange &S : LI.subranges()) {
439 auto &PS = getSubRangeForMask(S.LaneMask, Edit->getParent());
440 VNInfo *PV = PS.getVNInfoAt(Def);
441 if (PV != nullptr && PV->def == Def)
442 S.createDeadDef(Def, LIS.getVNInfoAllocator());
443 }
444 } else {
445 // This is a new def: either from rematerialization, or from an inserted
446 // copy. Since rematerialization can regenerate a definition of a sub-
447 // register, we need to check which subranges need to be updated.
448 const MachineInstr *DefMI = LIS.getInstructionFromIndex(Def);
449 assert(DefMI != nullptr);
450 LaneBitmask LM;
451 for (const MachineOperand &DefOp : DefMI->defs()) {
452 Register R = DefOp.getReg();
453 if (R != LI.reg())
454 continue;
455 if (unsigned SR = DefOp.getSubReg())
456 LM |= TRI.getSubRegIndexLaneMask(SR);
457 else {
458 LM = MRI.getMaxLaneMaskForVReg(R);
459 break;
460 }
461 }
462 for (LiveInterval::SubRange &S : LI.subranges())
463 if ((S.LaneMask & LM).any())
464 S.createDeadDef(Def, LIS.getVNInfoAllocator());
465 }
466}
467
468VNInfo *SplitEditor::defValue(unsigned RegIdx,
469 const VNInfo *ParentVNI,
470 SlotIndex Idx,
471 bool Original) {
472 assert(ParentVNI && "Mapping NULL value");
473 assert(Idx.isValid() && "Invalid SlotIndex");
474 assert(Edit->getParent().getVNInfoAt(Idx) == ParentVNI && "Bad Parent VNI");
475 LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
476
477 // Create a new value.
478 VNInfo *VNI = LI->getNextValue(Idx, LIS.getVNInfoAllocator());
479
480 bool Force = LI->hasSubRanges();
481 ValueForcePair FP(Force ? nullptr : VNI, Force);
482 // Use insert for lookup, so we can add missing values with a second lookup.
483 std::pair<ValueMap::iterator, bool> InsP =
484 Values.insert(std::make_pair(std::make_pair(RegIdx, ParentVNI->id), FP));
485
486 // This was the first time (RegIdx, ParentVNI) was mapped, and it is not
487 // forced. Keep it as a simple def without any liveness.
488 if (!Force && InsP.second)
489 return VNI;
490
491 // If the previous value was a simple mapping, add liveness for it now.
492 if (VNInfo *OldVNI = InsP.first->second.getPointer()) {
493 addDeadDef(*LI, OldVNI, Original);
494
495 // No longer a simple mapping. Switch to a complex mapping. If the
496 // interval has subranges, make it a forced mapping.
497 InsP.first->second = ValueForcePair(nullptr, Force);
498 }
499
500 // This is a complex mapping, add liveness for VNI
501 addDeadDef(*LI, VNI, Original);
502 return VNI;
503}
504
505void SplitEditor::forceRecompute(unsigned RegIdx, const VNInfo &ParentVNI) {
506 ValueForcePair &VFP = Values[std::make_pair(RegIdx, ParentVNI.id)];
507 VNInfo *VNI = VFP.getPointer();
508
509 // ParentVNI was either unmapped or already complex mapped. Either way, just
510 // set the force bit.
511 if (!VNI) {
512 VFP.setInt(true);
513 return;
514 }
515
516 // This was previously a single mapping. Make sure the old def is represented
517 // by a trivial live range.
518 addDeadDef(LIS.getInterval(Edit->get(RegIdx)), VNI, false);
519
520 // Mark as complex mapped, forced.
521 VFP = ValueForcePair(nullptr, true);
522}
523
524SlotIndex SplitEditor::buildSingleSubRegCopy(
525 Register FromReg, Register ToReg, MachineBasicBlock &MBB,
526 MachineBasicBlock::iterator InsertBefore, unsigned SubIdx,
527 LiveInterval &DestLI, bool Late, SlotIndex Def, const MCInstrDesc &Desc) {
528 bool FirstCopy = !Def.isValid();
529 MachineInstr *CopyMI = BuildMI(MBB, InsertBefore, DebugLoc(), Desc)
530 .addReg(ToReg, RegState::Define | getUndefRegState(FirstCopy)
531 | getInternalReadRegState(!FirstCopy), SubIdx)
532 .addReg(FromReg, 0, SubIdx);
533
535 SlotIndexes &Indexes = *LIS.getSlotIndexes();
536 if (FirstCopy) {
537 Def = Indexes.insertMachineInstrInMaps(*CopyMI, Late).getRegSlot();
538 } else {
539 CopyMI->bundleWithPred();
540 }
541 return Def;
542}
543
544SlotIndex SplitEditor::buildCopy(Register FromReg, Register ToReg,
546 MachineBasicBlock::iterator InsertBefore, bool Late, unsigned RegIdx) {
547 const MCInstrDesc &Desc =
548 TII.get(TII.getLiveRangeSplitOpcode(FromReg, *MBB.getParent()));
549 SlotIndexes &Indexes = *LIS.getSlotIndexes();
550 if (LaneMask.all() || LaneMask == MRI.getMaxLaneMaskForVReg(FromReg)) {
551 // The full vreg is copied.
552 MachineInstr *CopyMI =
553 BuildMI(MBB, InsertBefore, DebugLoc(), Desc, ToReg).addReg(FromReg);
555 return Indexes.insertMachineInstrInMaps(*CopyMI, Late).getRegSlot();
556 }
557
558 // Only a subset of lanes needs to be copied. The following is a simple
559 // heuristic to construct a sequence of COPYs. We could add a target
560 // specific callback if this turns out to be suboptimal.
561 LiveInterval &DestLI = LIS.getInterval(Edit->get(RegIdx));
562
563 // First pass: Try to find a perfectly matching subregister index. If none
564 // exists find the one covering the most lanemask bits.
565 const TargetRegisterClass *RC = MRI.getRegClass(FromReg);
566 assert(RC == MRI.getRegClass(ToReg) && "Should have same reg class");
567
568 SmallVector<unsigned, 8> SubIndexes;
569
570 // Abort if we cannot possibly implement the COPY with the given indexes.
571 if (!TRI.getCoveringSubRegIndexes(RC, LaneMask, SubIndexes))
572 report_fatal_error("Impossible to implement partial COPY");
573
574 SlotIndex Def;
575 for (unsigned BestIdx : SubIndexes) {
576 Def = buildSingleSubRegCopy(FromReg, ToReg, MBB, InsertBefore, BestIdx,
577 DestLI, Late, Def, Desc);
578 }
579
580 BumpPtrAllocator &Allocator = LIS.getVNInfoAllocator();
581 DestLI.refineSubRanges(
582 Allocator, LaneMask,
583 [Def, &Allocator](LiveInterval::SubRange &SR) {
584 SR.createDeadDef(Def, Allocator);
585 },
586 Indexes, TRI);
587
588 return Def;
589}
590
591bool SplitEditor::rematWillIncreaseRestriction(const MachineInstr *DefMI,
593 SlotIndex UseIdx) const {
594 const MachineInstr *UseMI = LIS.getInstructionFromIndex(UseIdx);
595 if (!UseMI)
596 return false;
597
598 // Currently code assumes rematerialization only happens for a def at 0.
599 const unsigned DefOperandIdx = 0;
600 // We want to compute the static register class constraint for the instruction
601 // def. If it is a smaller subclass than getLargestLegalSuperClass at the use
602 // site, then rematerializing it will increase the constraints.
603 const TargetRegisterClass *DefConstrainRC =
604 DefMI->getRegClassConstraint(DefOperandIdx, &TII, &TRI);
605 if (!DefConstrainRC)
606 return false;
607
608 const TargetRegisterClass *RC = MRI.getRegClass(Edit->getReg());
609
610 // We want to find the register class that can be inflated to after the split
611 // occurs in recomputeRegClass
612 const TargetRegisterClass *SuperRC =
613 TRI.getLargestLegalSuperClass(RC, *MBB.getParent());
614
615 Register DefReg = DefMI->getOperand(DefOperandIdx).getReg();
616 const TargetRegisterClass *UseConstrainRC =
617 UseMI->getRegClassConstraintEffectForVReg(DefReg, SuperRC, &TII, &TRI,
618 /*ExploreBundle=*/true);
619 return UseConstrainRC->hasSubClass(DefConstrainRC);
620}
621
622VNInfo *SplitEditor::defFromParent(unsigned RegIdx, const VNInfo *ParentVNI,
625 LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
626
627 // We may be trying to avoid interference that ends at a deleted instruction,
628 // so always begin RegIdx 0 early and all others late.
629 bool Late = RegIdx != 0;
630
631 // Attempt cheap-as-a-copy rematerialization.
632 Register Original = VRM.getOriginal(Edit->get(RegIdx));
633 LiveInterval &OrigLI = LIS.getInterval(Original);
634 VNInfo *OrigVNI = OrigLI.getVNInfoAt(UseIdx);
635
636 Register Reg = LI->reg();
637 if (OrigVNI) {
638 LiveRangeEdit::Remat RM(ParentVNI);
639 RM.OrigMI = LIS.getInstructionFromIndex(OrigVNI->def);
640 if (RM.OrigMI && TII.isAsCheapAsAMove(*RM.OrigMI) &&
641 Edit->canRematerializeAt(RM, UseIdx)) {
642 if (!rematWillIncreaseRestriction(RM.OrigMI, MBB, UseIdx)) {
643 SlotIndex Def = Edit->rematerializeAt(MBB, I, Reg, RM, TRI, Late);
644 ++NumRemats;
645 // Define the value in Reg.
646 return defValue(RegIdx, ParentVNI, Def, false);
647 }
649 dbgs() << "skipping rematerialize of " << printReg(Reg) << " at "
650 << UseIdx
651 << " since it will increase register class restrictions\n");
652 }
653 }
654
655 LaneBitmask LaneMask;
656 if (OrigLI.hasSubRanges()) {
657 LaneMask = LaneBitmask::getNone();
658 for (LiveInterval::SubRange &S : OrigLI.subranges()) {
659 if (S.liveAt(UseIdx))
660 LaneMask |= S.LaneMask;
661 }
662 } else {
663 LaneMask = LaneBitmask::getAll();
664 }
665
666 SlotIndex Def;
667 if (LaneMask.none()) {
668 const MCInstrDesc &Desc = TII.get(TargetOpcode::IMPLICIT_DEF);
669 MachineInstr *ImplicitDef = BuildMI(MBB, I, DebugLoc(), Desc, Reg);
670 SlotIndexes &Indexes = *LIS.getSlotIndexes();
671 Def = Indexes.insertMachineInstrInMaps(*ImplicitDef, Late).getRegSlot();
672 } else {
673 ++NumCopies;
674 Def = buildCopy(Edit->getReg(), Reg, LaneMask, MBB, I, Late, RegIdx);
675 }
676
677 // Define the value in Reg.
678 return defValue(RegIdx, ParentVNI, Def, false);
679}
680
681/// Create a new virtual register and live interval.
683 // Create the complement as index 0.
684 if (Edit->empty())
685 Edit->createEmptyInterval();
686
687 // Create the open interval.
688 OpenIdx = Edit->size();
689 Edit->createEmptyInterval();
690 return OpenIdx;
691}
692
693void SplitEditor::selectIntv(unsigned Idx) {
694 assert(Idx != 0 && "Cannot select the complement interval");
695 assert(Idx < Edit->size() && "Can only select previously opened interval");
696 LLVM_DEBUG(dbgs() << " selectIntv " << OpenIdx << " -> " << Idx << '\n');
697 OpenIdx = Idx;
698}
699
701 assert(OpenIdx && "openIntv not called before enterIntvBefore");
702 LLVM_DEBUG(dbgs() << " enterIntvBefore " << Idx);
703 Idx = Idx.getBaseIndex();
704 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
705 if (!ParentVNI) {
706 LLVM_DEBUG(dbgs() << ": not live\n");
707 return Idx;
708 }
709 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
710 MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
711 assert(MI && "enterIntvBefore called with invalid index");
712
713 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(), MI);
714 return VNI->def;
715}
716
718 assert(OpenIdx && "openIntv not called before enterIntvAfter");
719 LLVM_DEBUG(dbgs() << " enterIntvAfter " << Idx);
720 Idx = Idx.getBoundaryIndex();
721 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
722 if (!ParentVNI) {
723 LLVM_DEBUG(dbgs() << ": not live\n");
724 return Idx;
725 }
726 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
727 MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
728 assert(MI && "enterIntvAfter called with invalid index");
729
730 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(),
731 std::next(MachineBasicBlock::iterator(MI)));
732 return VNI->def;
733}
734
736 assert(OpenIdx && "openIntv not called before enterIntvAtEnd");
737 SlotIndex End = LIS.getMBBEndIdx(&MBB);
738 SlotIndex Last = End.getPrevSlot();
739 LLVM_DEBUG(dbgs() << " enterIntvAtEnd " << printMBBReference(MBB) << ", "
740 << Last);
741 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Last);
742 if (!ParentVNI) {
743 LLVM_DEBUG(dbgs() << ": not live\n");
744 return End;
745 }
746 SlotIndex LSP = SA.getLastSplitPoint(&MBB);
747 if (LSP < Last) {
748 // It could be that the use after LSP is a def, and thus the ParentVNI
749 // just selected starts at that def. For this case to exist, the def
750 // must be part of a tied def/use pair (as otherwise we'd have split
751 // distinct live ranges into individual live intervals), and thus we
752 // can insert the def into the VNI of the use and the tied def/use
753 // pair can live in the resulting interval.
754 Last = LSP;
755 ParentVNI = Edit->getParent().getVNInfoAt(Last);
756 if (!ParentVNI) {
757 // undef use --> undef tied def
758 LLVM_DEBUG(dbgs() << ": tied use not live\n");
759 return End;
760 }
761 }
762
763 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id);
764 VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Last, MBB,
765 SA.getLastSplitPointIter(&MBB));
766 RegAssign.insert(VNI->def, End, OpenIdx);
767 LLVM_DEBUG(dump());
768 return VNI->def;
769}
770
771/// useIntv - indicate that all instructions in MBB should use OpenLI.
773 useIntv(LIS.getMBBStartIdx(&MBB), LIS.getMBBEndIdx(&MBB));
774}
775
777 assert(OpenIdx && "openIntv not called before useIntv");
778 LLVM_DEBUG(dbgs() << " useIntv [" << Start << ';' << End << "):");
779 RegAssign.insert(Start, End, OpenIdx);
780 LLVM_DEBUG(dump());
781}
782
784 assert(OpenIdx && "openIntv not called before leaveIntvAfter");
785 LLVM_DEBUG(dbgs() << " leaveIntvAfter " << Idx);
786
787 // The interval must be live beyond the instruction at Idx.
788 SlotIndex Boundary = Idx.getBoundaryIndex();
789 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Boundary);
790 if (!ParentVNI) {
791 LLVM_DEBUG(dbgs() << ": not live\n");
792 return Boundary.getNextSlot();
793 }
794 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
795 MachineInstr *MI = LIS.getInstructionFromIndex(Boundary);
796 assert(MI && "No instruction at index");
797
798 // In spill mode, make live ranges as short as possible by inserting the copy
799 // before MI. This is only possible if that instruction doesn't redefine the
800 // value. The inserted COPY is not a kill, and we don't need to recompute
801 // the source live range. The spiller also won't try to hoist this copy.
802 if (SpillMode && !SlotIndex::isSameInstr(ParentVNI->def, Idx) &&
803 MI->readsVirtualRegister(Edit->getReg())) {
804 forceRecompute(0, *ParentVNI);
805 defFromParent(0, ParentVNI, Idx, *MI->getParent(), MI);
806 return Idx;
807 }
808
809 VNInfo *VNI = defFromParent(0, ParentVNI, Boundary, *MI->getParent(),
810 std::next(MachineBasicBlock::iterator(MI)));
811 return VNI->def;
812}
813
815 assert(OpenIdx && "openIntv not called before leaveIntvBefore");
816 LLVM_DEBUG(dbgs() << " leaveIntvBefore " << Idx);
817
818 // The interval must be live into the instruction at Idx.
819 Idx = Idx.getBaseIndex();
820 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
821 if (!ParentVNI) {
822 LLVM_DEBUG(dbgs() << ": not live\n");
823 return Idx.getNextSlot();
824 }
825 LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
826
827 MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
828 assert(MI && "No instruction at index");
829 VNInfo *VNI = defFromParent(0, ParentVNI, Idx, *MI->getParent(), MI);
830 return VNI->def;
831}
832
834 assert(OpenIdx && "openIntv not called before leaveIntvAtTop");
835 SlotIndex Start = LIS.getMBBStartIdx(&MBB);
836 LLVM_DEBUG(dbgs() << " leaveIntvAtTop " << printMBBReference(MBB) << ", "
837 << Start);
838
839 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
840 if (!ParentVNI) {
841 LLVM_DEBUG(dbgs() << ": not live\n");
842 return Start;
843 }
844
845 unsigned RegIdx = 0;
846 Register Reg = LIS.getInterval(Edit->get(RegIdx)).reg();
847 VNInfo *VNI = defFromParent(RegIdx, ParentVNI, Start, MBB,
848 MBB.SkipPHIsLabelsAndDebug(MBB.begin(), Reg));
849 RegAssign.insert(Start, VNI->def, OpenIdx);
850 LLVM_DEBUG(dump());
851 return VNI->def;
852}
853
855 return any_of(MI.defs(), [Reg](const MachineOperand &MO) {
856 return MO.isReg() && MO.isTied() && MO.getReg() == Reg;
857 });
858}
859
861 assert(OpenIdx && "openIntv not called before overlapIntv");
862 const VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
863 assert(ParentVNI == Edit->getParent().getVNInfoBefore(End) &&
864 "Parent changes value in extended range");
865 assert(LIS.getMBBFromIndex(Start) == LIS.getMBBFromIndex(End) &&
866 "Range cannot span basic blocks");
867
868 // The complement interval will be extended as needed by LICalc.extend().
869 if (ParentVNI)
870 forceRecompute(0, *ParentVNI);
871
872 // If the last use is tied to a def, we can't mark it as live for the
873 // interval which includes only the use. That would cause the tied pair
874 // to end up in two different intervals.
875 if (auto *MI = LIS.getInstructionFromIndex(End))
876 if (hasTiedUseOf(*MI, Edit->getReg())) {
877 LLVM_DEBUG(dbgs() << "skip overlap due to tied def at end\n");
878 return;
879 }
880
881 LLVM_DEBUG(dbgs() << " overlapIntv [" << Start << ';' << End << "):");
882 RegAssign.insert(Start, End, OpenIdx);
883 LLVM_DEBUG(dump());
884}
885
886//===----------------------------------------------------------------------===//
887// Spill modes
888//===----------------------------------------------------------------------===//
889
890void SplitEditor::removeBackCopies(SmallVectorImpl<VNInfo*> &Copies) {
891 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
892 LLVM_DEBUG(dbgs() << "Removing " << Copies.size() << " back-copies.\n");
894 AssignI.setMap(RegAssign);
895
896 for (const VNInfo *C : Copies) {
897 SlotIndex Def = C->def;
899 assert(MI && "No instruction for back-copy");
900
901 MachineBasicBlock *MBB = MI->getParent();
903 bool AtBegin;
904 do AtBegin = MBBI == MBB->begin();
905 while (!AtBegin && (--MBBI)->isDebugOrPseudoInstr());
906
907 LLVM_DEBUG(dbgs() << "Removing " << Def << '\t' << *MI);
908 LIS.removeVRegDefAt(*LI, Def);
910 MI->eraseFromParent();
911
912 // Adjust RegAssign if a register assignment is killed at Def. We want to
913 // avoid calculating the live range of the source register if possible.
914 AssignI.find(Def.getPrevSlot());
915 if (!AssignI.valid() || AssignI.start() >= Def)
916 continue;
917 // If MI doesn't kill the assigned register, just leave it.
918 if (AssignI.stop() != Def)
919 continue;
920 unsigned RegIdx = AssignI.value();
921 // We could hoist back-copy right after another back-copy. As a result
922 // MMBI points to copy instruction which is actually dead now.
923 // We cannot set its stop to MBBI which will be the same as start and
924 // interval does not support that.
925 SlotIndex Kill =
926 AtBegin ? SlotIndex() : LIS.getInstructionIndex(*MBBI).getRegSlot();
927 if (AtBegin || !MBBI->readsVirtualRegister(Edit->getReg()) ||
928 Kill <= AssignI.start()) {
929 LLVM_DEBUG(dbgs() << " cannot find simple kill of RegIdx " << RegIdx
930 << '\n');
931 forceRecompute(RegIdx, *Edit->getParent().getVNInfoAt(Def));
932 } else {
933 LLVM_DEBUG(dbgs() << " move kill to " << Kill << '\t' << *MBBI);
934 AssignI.setStop(Kill);
935 }
936 }
937}
938
940SplitEditor::findShallowDominator(MachineBasicBlock *MBB,
941 MachineBasicBlock *DefMBB) {
942 if (MBB == DefMBB)
943 return MBB;
944 assert(MDT.dominates(DefMBB, MBB) && "MBB must be dominated by the def.");
945
946 const MachineLoopInfo &Loops = SA.Loops;
947 const MachineLoop *DefLoop = Loops.getLoopFor(DefMBB);
948 MachineDomTreeNode *DefDomNode = MDT[DefMBB];
949
950 // Best candidate so far.
951 MachineBasicBlock *BestMBB = MBB;
952 unsigned BestDepth = std::numeric_limits<unsigned>::max();
953
954 while (true) {
955 const MachineLoop *Loop = Loops.getLoopFor(MBB);
956
957 // MBB isn't in a loop, it doesn't get any better. All dominators have a
958 // higher frequency by definition.
959 if (!Loop) {
960 LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB)
961 << " dominates " << printMBBReference(*MBB)
962 << " at depth 0\n");
963 return MBB;
964 }
965
966 // We'll never be able to exit the DefLoop.
967 if (Loop == DefLoop) {
968 LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB)
969 << " dominates " << printMBBReference(*MBB)
970 << " in the same loop\n");
971 return MBB;
972 }
973
974 // Least busy dominator seen so far.
975 unsigned Depth = Loop->getLoopDepth();
976 if (Depth < BestDepth) {
977 BestMBB = MBB;
978 BestDepth = Depth;
979 LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB)
980 << " dominates " << printMBBReference(*MBB)
981 << " at depth " << Depth << '\n');
982 }
983
984 // Leave loop by going to the immediate dominator of the loop header.
985 // This is a bigger stride than simply walking up the dominator tree.
986 MachineDomTreeNode *IDom = MDT[Loop->getHeader()]->getIDom();
987
988 // Too far up the dominator tree?
989 if (!IDom || !MDT.dominates(DefDomNode, IDom))
990 return BestMBB;
991
992 MBB = IDom->getBlock();
993 }
994}
995
996void SplitEditor::computeRedundantBackCopies(
997 DenseSet<unsigned> &NotToHoistSet, SmallVectorImpl<VNInfo *> &BackCopies) {
998 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
999 const LiveInterval *Parent = &Edit->getParent();
1001 SmallPtrSet<VNInfo *, 8> DominatedVNIs;
1002
1003 // Aggregate VNIs having the same value as ParentVNI.
1004 for (VNInfo *VNI : LI->valnos) {
1005 if (VNI->isUnused())
1006 continue;
1007 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->def);
1008 EqualVNs[ParentVNI->id].insert(VNI);
1009 }
1010
1011 // For VNI aggregation of each ParentVNI, collect dominated, i.e.,
1012 // redundant VNIs to BackCopies.
1013 for (unsigned i = 0, e = Parent->getNumValNums(); i != e; ++i) {
1014 const VNInfo *ParentVNI = Parent->getValNumInfo(i);
1015 if (!NotToHoistSet.count(ParentVNI->id))
1016 continue;
1017 SmallPtrSetIterator<VNInfo *> It1 = EqualVNs[ParentVNI->id].begin();
1018 SmallPtrSetIterator<VNInfo *> It2 = It1;
1019 for (; It1 != EqualVNs[ParentVNI->id].end(); ++It1) {
1020 It2 = It1;
1021 for (++It2; It2 != EqualVNs[ParentVNI->id].end(); ++It2) {
1022 if (DominatedVNIs.count(*It1) || DominatedVNIs.count(*It2))
1023 continue;
1024
1025 MachineBasicBlock *MBB1 = LIS.getMBBFromIndex((*It1)->def);
1026 MachineBasicBlock *MBB2 = LIS.getMBBFromIndex((*It2)->def);
1027 if (MBB1 == MBB2) {
1028 DominatedVNIs.insert((*It1)->def < (*It2)->def ? (*It2) : (*It1));
1029 } else if (MDT.dominates(MBB1, MBB2)) {
1030 DominatedVNIs.insert(*It2);
1031 } else if (MDT.dominates(MBB2, MBB1)) {
1032 DominatedVNIs.insert(*It1);
1033 }
1034 }
1035 }
1036 if (!DominatedVNIs.empty()) {
1037 forceRecompute(0, *ParentVNI);
1038 append_range(BackCopies, DominatedVNIs);
1039 DominatedVNIs.clear();
1040 }
1041 }
1042}
1043
1044/// For SM_Size mode, find a common dominator for all the back-copies for
1045/// the same ParentVNI and hoist the backcopies to the dominator BB.
1046/// For SM_Speed mode, if the common dominator is hot and it is not beneficial
1047/// to do the hoisting, simply remove the dominated backcopies for the same
1048/// ParentVNI.
1049void SplitEditor::hoistCopies() {
1050 // Get the complement interval, always RegIdx 0.
1051 LiveInterval *LI = &LIS.getInterval(Edit->get(0));
1052 const LiveInterval *Parent = &Edit->getParent();
1053
1054 // Track the nearest common dominator for all back-copies for each ParentVNI,
1055 // indexed by ParentVNI->id.
1056 using DomPair = std::pair<MachineBasicBlock *, SlotIndex>;
1057 SmallVector<DomPair, 8> NearestDom(Parent->getNumValNums());
1058 // The total cost of all the back-copies for each ParentVNI.
1060 // The ParentVNI->id set for which hoisting back-copies are not beneficial
1061 // for Speed.
1062 DenseSet<unsigned> NotToHoistSet;
1063
1064 // Find the nearest common dominator for parent values with multiple
1065 // back-copies. If a single back-copy dominates, put it in DomPair.second.
1066 for (VNInfo *VNI : LI->valnos) {
1067 if (VNI->isUnused())
1068 continue;
1069 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->def);
1070 assert(ParentVNI && "Parent not live at complement def");
1071
1072 // Don't hoist remats. The complement is probably going to disappear
1073 // completely anyway.
1074 if (Edit->didRematerialize(ParentVNI))
1075 continue;
1076
1077 MachineBasicBlock *ValMBB = LIS.getMBBFromIndex(VNI->def);
1078
1079 DomPair &Dom = NearestDom[ParentVNI->id];
1080
1081 // Keep directly defined parent values. This is either a PHI or an
1082 // instruction in the complement range. All other copies of ParentVNI
1083 // should be eliminated.
1084 if (VNI->def == ParentVNI->def) {
1085 LLVM_DEBUG(dbgs() << "Direct complement def at " << VNI->def << '\n');
1086 Dom = DomPair(ValMBB, VNI->def);
1087 continue;
1088 }
1089 // Skip the singly mapped values. There is nothing to gain from hoisting a
1090 // single back-copy.
1091 if (Values.lookup(std::make_pair(0, ParentVNI->id)).getPointer()) {
1092 LLVM_DEBUG(dbgs() << "Single complement def at " << VNI->def << '\n');
1093 continue;
1094 }
1095
1096 if (!Dom.first) {
1097 // First time we see ParentVNI. VNI dominates itself.
1098 Dom = DomPair(ValMBB, VNI->def);
1099 } else if (Dom.first == ValMBB) {
1100 // Two defs in the same block. Pick the earlier def.
1101 if (!Dom.second.isValid() || VNI->def < Dom.second)
1102 Dom.second = VNI->def;
1103 } else {
1104 // Different basic blocks. Check if one dominates.
1105 MachineBasicBlock *Near =
1106 MDT.findNearestCommonDominator(Dom.first, ValMBB);
1107 if (Near == ValMBB)
1108 // Def ValMBB dominates.
1109 Dom = DomPair(ValMBB, VNI->def);
1110 else if (Near != Dom.first)
1111 // None dominate. Hoist to common dominator, need new def.
1112 Dom = DomPair(Near, SlotIndex());
1113 Costs[ParentVNI->id] += MBFI.getBlockFreq(ValMBB);
1114 }
1115
1116 LLVM_DEBUG(dbgs() << "Multi-mapped complement " << VNI->id << '@'
1117 << VNI->def << " for parent " << ParentVNI->id << '@'
1118 << ParentVNI->def << " hoist to "
1119 << printMBBReference(*Dom.first) << ' ' << Dom.second
1120 << '\n');
1121 }
1122
1123 // Insert the hoisted copies.
1124 for (unsigned i = 0, e = Parent->getNumValNums(); i != e; ++i) {
1125 DomPair &Dom = NearestDom[i];
1126 if (!Dom.first || Dom.second.isValid())
1127 continue;
1128 // This value needs a hoisted copy inserted at the end of Dom.first.
1129 const VNInfo *ParentVNI = Parent->getValNumInfo(i);
1130 MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(ParentVNI->def);
1131 // Get a less loopy dominator than Dom.first.
1132 Dom.first = findShallowDominator(Dom.first, DefMBB);
1133 if (SpillMode == SM_Speed &&
1134 MBFI.getBlockFreq(Dom.first) > Costs[ParentVNI->id]) {
1135 NotToHoistSet.insert(ParentVNI->id);
1136 continue;
1137 }
1138 SlotIndex LSP = SA.getLastSplitPoint(Dom.first);
1139 if (LSP <= ParentVNI->def) {
1140 NotToHoistSet.insert(ParentVNI->id);
1141 continue;
1142 }
1143 Dom.second = defFromParent(0, ParentVNI, LSP, *Dom.first,
1144 SA.getLastSplitPointIter(Dom.first))->def;
1145 }
1146
1147 // Remove redundant back-copies that are now known to be dominated by another
1148 // def with the same value.
1149 SmallVector<VNInfo*, 8> BackCopies;
1150 for (VNInfo *VNI : LI->valnos) {
1151 if (VNI->isUnused())
1152 continue;
1153 VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->def);
1154 const DomPair &Dom = NearestDom[ParentVNI->id];
1155 if (!Dom.first || Dom.second == VNI->def ||
1156 NotToHoistSet.count(ParentVNI->id))
1157 continue;
1158 BackCopies.push_back(VNI);
1159 forceRecompute(0, *ParentVNI);
1160 }
1161
1162 // If it is not beneficial to hoist all the BackCopies, simply remove
1163 // redundant BackCopies in speed mode.
1164 if (SpillMode == SM_Speed && !NotToHoistSet.empty())
1165 computeRedundantBackCopies(NotToHoistSet, BackCopies);
1166
1167 removeBackCopies(BackCopies);
1168}
1169
1170/// transferValues - Transfer all possible values to the new live ranges.
1171/// Values that were rematerialized are left alone, they need LICalc.extend().
1172bool SplitEditor::transferValues() {
1173 bool Skipped = false;
1174 RegAssignMap::const_iterator AssignI = RegAssign.begin();
1175 for (const LiveRange::Segment &S : Edit->getParent()) {
1176 LLVM_DEBUG(dbgs() << " blit " << S << ':');
1177 VNInfo *ParentVNI = S.valno;
1178 // RegAssign has holes where RegIdx 0 should be used.
1179 SlotIndex Start = S.start;
1180 AssignI.advanceTo(Start);
1181 do {
1182 unsigned RegIdx;
1183 SlotIndex End = S.end;
1184 if (!AssignI.valid()) {
1185 RegIdx = 0;
1186 } else if (AssignI.start() <= Start) {
1187 RegIdx = AssignI.value();
1188 if (AssignI.stop() < End) {
1189 End = AssignI.stop();
1190 ++AssignI;
1191 }
1192 } else {
1193 RegIdx = 0;
1194 End = std::min(End, AssignI.start());
1195 }
1196
1197 // The interval [Start;End) is continuously mapped to RegIdx, ParentVNI.
1198 LLVM_DEBUG(dbgs() << " [" << Start << ';' << End << ")=" << RegIdx << '('
1199 << printReg(Edit->get(RegIdx)) << ')');
1200 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1201
1202 // Check for a simply defined value that can be blitted directly.
1203 ValueForcePair VFP = Values.lookup(std::make_pair(RegIdx, ParentVNI->id));
1204 if (VNInfo *VNI = VFP.getPointer()) {
1205 LLVM_DEBUG(dbgs() << ':' << VNI->id);
1206 LI.addSegment(LiveInterval::Segment(Start, End, VNI));
1207 Start = End;
1208 continue;
1209 }
1210
1211 // Skip values with forced recomputation.
1212 if (VFP.getInt()) {
1213 LLVM_DEBUG(dbgs() << "(recalc)");
1214 Skipped = true;
1215 Start = End;
1216 continue;
1217 }
1218
1219 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1220
1221 // This value has multiple defs in RegIdx, but it wasn't rematerialized,
1222 // so the live range is accurate. Add live-in blocks in [Start;End) to the
1223 // LiveInBlocks.
1224 MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start)->getIterator();
1225 SlotIndex BlockStart, BlockEnd;
1226 std::tie(BlockStart, BlockEnd) = LIS.getSlotIndexes()->getMBBRange(&*MBB);
1227
1228 // The first block may be live-in, or it may have its own def.
1229 if (Start != BlockStart) {
1230 VNInfo *VNI = LI.extendInBlock(BlockStart, std::min(BlockEnd, End));
1231 assert(VNI && "Missing def for complex mapped value");
1232 LLVM_DEBUG(dbgs() << ':' << VNI->id << "*" << printMBBReference(*MBB));
1233 // MBB has its own def. Is it also live-out?
1234 if (BlockEnd <= End)
1235 LIC.setLiveOutValue(&*MBB, VNI);
1236
1237 // Skip to the next block for live-in.
1238 ++MBB;
1239 BlockStart = BlockEnd;
1240 }
1241
1242 // Handle the live-in blocks covered by [Start;End).
1243 assert(Start <= BlockStart && "Expected live-in block");
1244 while (BlockStart < End) {
1245 LLVM_DEBUG(dbgs() << ">" << printMBBReference(*MBB));
1246 BlockEnd = LIS.getMBBEndIdx(&*MBB);
1247 if (BlockStart == ParentVNI->def) {
1248 // This block has the def of a parent PHI, so it isn't live-in.
1249 assert(ParentVNI->isPHIDef() && "Non-phi defined at block start?");
1250 VNInfo *VNI = LI.extendInBlock(BlockStart, std::min(BlockEnd, End));
1251 assert(VNI && "Missing def for complex mapped parent PHI");
1252 if (End >= BlockEnd)
1253 LIC.setLiveOutValue(&*MBB, VNI); // Live-out as well.
1254 } else {
1255 // This block needs a live-in value. The last block covered may not
1256 // be live-out.
1257 if (End < BlockEnd)
1258 LIC.addLiveInBlock(LI, MDT[&*MBB], End);
1259 else {
1260 // Live-through, and we don't know the value.
1261 LIC.addLiveInBlock(LI, MDT[&*MBB]);
1262 LIC.setLiveOutValue(&*MBB, nullptr);
1263 }
1264 }
1265 BlockStart = BlockEnd;
1266 ++MBB;
1267 }
1268 Start = End;
1269 } while (Start != S.end);
1270 LLVM_DEBUG(dbgs() << '\n');
1271 }
1272
1273 LICalc[0].calculateValues();
1274 if (SpillMode)
1275 LICalc[1].calculateValues();
1276
1277 return Skipped;
1278}
1279
1281 const LiveRange::Segment *Seg = LR.getSegmentContaining(Def);
1282 if (Seg == nullptr)
1283 return true;
1284 if (Seg->end != Def.getDeadSlot())
1285 return false;
1286 // This is a dead PHI. Remove it.
1287 LR.removeSegment(*Seg, true);
1288 return true;
1289}
1290
1291void SplitEditor::extendPHIRange(MachineBasicBlock &B, LiveIntervalCalc &LIC,
1292 LiveRange &LR, LaneBitmask LM,
1293 ArrayRef<SlotIndex> Undefs) {
1294 for (MachineBasicBlock *P : B.predecessors()) {
1295 SlotIndex End = LIS.getMBBEndIdx(P);
1296 SlotIndex LastUse = End.getPrevSlot();
1297 // The predecessor may not have a live-out value. That is OK, like an
1298 // undef PHI operand.
1299 const LiveInterval &PLI = Edit->getParent();
1300 // Need the cast because the inputs to ?: would otherwise be deemed
1301 // "incompatible": SubRange vs LiveInterval.
1302 const LiveRange &PSR = !LM.all() ? getSubRangeForMaskExact(LM, PLI)
1303 : static_cast<const LiveRange &>(PLI);
1304 if (PSR.liveAt(LastUse))
1305 LIC.extend(LR, End, /*PhysReg=*/0, Undefs);
1306 }
1307}
1308
1309void SplitEditor::extendPHIKillRanges() {
1310 // Extend live ranges to be live-out for successor PHI values.
1311
1312 // Visit each PHI def slot in the parent live interval. If the def is dead,
1313 // remove it. Otherwise, extend the live interval to reach the end indexes
1314 // of all predecessor blocks.
1315
1316 const LiveInterval &ParentLI = Edit->getParent();
1317 for (const VNInfo *V : ParentLI.valnos) {
1318 if (V->isUnused() || !V->isPHIDef())
1319 continue;
1320
1321 unsigned RegIdx = RegAssign.lookup(V->def);
1322 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1323 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1324 MachineBasicBlock &B = *LIS.getMBBFromIndex(V->def);
1325 if (!removeDeadSegment(V->def, LI))
1326 extendPHIRange(B, LIC, LI, LaneBitmask::getAll(), /*Undefs=*/{});
1327 }
1328
1330 LiveIntervalCalc SubLIC;
1331
1332 for (const LiveInterval::SubRange &PS : ParentLI.subranges()) {
1333 for (const VNInfo *V : PS.valnos) {
1334 if (V->isUnused() || !V->isPHIDef())
1335 continue;
1336 unsigned RegIdx = RegAssign.lookup(V->def);
1337 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1338 LiveInterval::SubRange &S = getSubRangeForMaskExact(PS.LaneMask, LI);
1339 if (removeDeadSegment(V->def, S))
1340 continue;
1341
1342 MachineBasicBlock &B = *LIS.getMBBFromIndex(V->def);
1343 SubLIC.reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
1344 &LIS.getVNInfoAllocator());
1345 Undefs.clear();
1346 LI.computeSubRangeUndefs(Undefs, PS.LaneMask, MRI, *LIS.getSlotIndexes());
1347 extendPHIRange(B, SubLIC, S, PS.LaneMask, Undefs);
1348 }
1349 }
1350}
1351
1352/// rewriteAssigned - Rewrite all uses of Edit->getReg().
1353void SplitEditor::rewriteAssigned(bool ExtendRanges) {
1354 struct ExtPoint {
1355 ExtPoint(const MachineOperand &O, unsigned R, SlotIndex N)
1356 : MO(O), RegIdx(R), Next(N) {}
1357
1358 MachineOperand MO;
1359 unsigned RegIdx;
1360 SlotIndex Next;
1361 };
1362
1363 SmallVector<ExtPoint,4> ExtPoints;
1364
1365 for (MachineOperand &MO :
1366 llvm::make_early_inc_range(MRI.reg_operands(Edit->getReg()))) {
1367 MachineInstr *MI = MO.getParent();
1368 // LiveDebugVariables should have handled all DBG_VALUE instructions.
1369 if (MI->isDebugValue()) {
1370 LLVM_DEBUG(dbgs() << "Zapping " << *MI);
1371 MO.setReg(0);
1372 continue;
1373 }
1374
1375 // <undef> operands don't really read the register, so it doesn't matter
1376 // which register we choose. When the use operand is tied to a def, we must
1377 // use the same register as the def, so just do that always.
1378 SlotIndex Idx = LIS.getInstructionIndex(*MI);
1379 if (MO.isDef() || MO.isUndef())
1380 Idx = Idx.getRegSlot(MO.isEarlyClobber());
1381
1382 // Rewrite to the mapped register at Idx.
1383 unsigned RegIdx = RegAssign.lookup(Idx);
1384 LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
1385 MO.setReg(LI.reg());
1386 LLVM_DEBUG(dbgs() << " rewr " << printMBBReference(*MI->getParent())
1387 << '\t' << Idx << ':' << RegIdx << '\t' << *MI);
1388
1389 // Extend liveness to Idx if the instruction reads reg.
1390 if (!ExtendRanges || MO.isUndef())
1391 continue;
1392
1393 // Skip instructions that don't read Reg.
1394 if (MO.isDef()) {
1395 if (!MO.getSubReg() && !MO.isEarlyClobber())
1396 continue;
1397 // We may want to extend a live range for a partial redef, or for a use
1398 // tied to an early clobber.
1399 if (!Edit->getParent().liveAt(Idx.getPrevSlot()))
1400 continue;
1401 } else {
1402 assert(MO.isUse());
1403 bool IsEarlyClobber = false;
1404 if (MO.isTied()) {
1405 // We want to extend a live range into `e` slot rather than `r` slot if
1406 // tied-def is early clobber, because the `e` slot already contained
1407 // in the live range of early-clobber tied-def operand, give an example
1408 // here:
1409 // 0 %0 = ...
1410 // 16 early-clobber %0 = Op %0 (tied-def 0), ...
1411 // 32 ... = Op %0
1412 // Before extend:
1413 // %0 = [0r, 0d) [16e, 32d)
1414 // The point we want to extend is 0d to 16e not 16r in this case, but if
1415 // we use 16r here we will extend nothing because that already contained
1416 // in [16e, 32d).
1417 unsigned OpIdx = MO.getOperandNo();
1418 unsigned DefOpIdx = MI->findTiedOperandIdx(OpIdx);
1419 const MachineOperand &DefOp = MI->getOperand(DefOpIdx);
1420 IsEarlyClobber = DefOp.isEarlyClobber();
1421 }
1422
1423 Idx = Idx.getRegSlot(IsEarlyClobber);
1424 }
1425
1426 SlotIndex Next = Idx;
1427 if (LI.hasSubRanges()) {
1428 // We have to delay extending subranges until we have seen all operands
1429 // defining the register. This is because a <def,read-undef> operand
1430 // will create an "undef" point, and we cannot extend any subranges
1431 // until all of them have been accounted for.
1432 if (MO.isUse())
1433 ExtPoints.push_back(ExtPoint(MO, RegIdx, Next));
1434 } else {
1435 LiveIntervalCalc &LIC = getLICalc(RegIdx);
1436 LIC.extend(LI, Next, 0, ArrayRef<SlotIndex>());
1437 }
1438 }
1439
1440 for (ExtPoint &EP : ExtPoints) {
1441 LiveInterval &LI = LIS.getInterval(Edit->get(EP.RegIdx));
1442 assert(LI.hasSubRanges());
1443
1444 LiveIntervalCalc SubLIC;
1445 Register Reg = EP.MO.getReg();
1446 unsigned Sub = EP.MO.getSubReg();
1447 LaneBitmask LM = Sub != 0 ? TRI.getSubRegIndexLaneMask(Sub)
1448 : MRI.getMaxLaneMaskForVReg(Reg);
1449 for (LiveInterval::SubRange &S : LI.subranges()) {
1450 if ((S.LaneMask & LM).none())
1451 continue;
1452 // The problem here can be that the new register may have been created
1453 // for a partially defined original register. For example:
1454 // %0:subreg_hireg<def,read-undef> = ...
1455 // ...
1456 // %1 = COPY %0
1457 if (S.empty())
1458 continue;
1459 SubLIC.reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
1460 &LIS.getVNInfoAllocator());
1462 LI.computeSubRangeUndefs(Undefs, S.LaneMask, MRI, *LIS.getSlotIndexes());
1463 SubLIC.extend(S, EP.Next, 0, Undefs);
1464 }
1465 }
1466
1467 for (Register R : *Edit) {
1468 LiveInterval &LI = LIS.getInterval(R);
1469 if (!LI.hasSubRanges())
1470 continue;
1471 LI.clear();
1473 LIS.constructMainRangeFromSubranges(LI);
1474 }
1475}
1476
1477void SplitEditor::deleteRematVictims() {
1478 SmallVector<MachineInstr*, 8> Dead;
1479 for (const Register &R : *Edit) {
1480 LiveInterval *LI = &LIS.getInterval(R);
1481 for (const LiveRange::Segment &S : LI->segments) {
1482 // Dead defs end at the dead slot.
1483 if (S.end != S.valno->def.getDeadSlot())
1484 continue;
1485 if (S.valno->isPHIDef())
1486 continue;
1487 MachineInstr *MI = LIS.getInstructionFromIndex(S.valno->def);
1488 assert(MI && "Missing instruction for dead def");
1489 MI->addRegisterDead(LI->reg(), &TRI);
1490
1491 if (!MI->allDefsAreDead())
1492 continue;
1493
1494 LLVM_DEBUG(dbgs() << "All defs dead: " << *MI);
1495 Dead.push_back(MI);
1496 }
1497 }
1498
1499 if (Dead.empty())
1500 return;
1501
1502 Edit->eliminateDeadDefs(Dead, {});
1503}
1504
1505void SplitEditor::forceRecomputeVNI(const VNInfo &ParentVNI) {
1506 // Fast-path for common case.
1507 if (!ParentVNI.isPHIDef()) {
1508 for (unsigned I = 0, E = Edit->size(); I != E; ++I)
1509 forceRecompute(I, ParentVNI);
1510 return;
1511 }
1512
1513 // Trace value through phis.
1514 ///< whether VNI was/is in worklist.
1515 SmallPtrSet<const VNInfo *, 8> Visited = {&ParentVNI};
1516 SmallVector<const VNInfo *, 4> WorkList = {&ParentVNI};
1517
1518 const LiveInterval &ParentLI = Edit->getParent();
1519 const SlotIndexes &Indexes = *LIS.getSlotIndexes();
1520 do {
1521 const VNInfo &VNI = *WorkList.pop_back_val();
1522 for (unsigned I = 0, E = Edit->size(); I != E; ++I)
1523 forceRecompute(I, VNI);
1524 if (!VNI.isPHIDef())
1525 continue;
1526
1527 MachineBasicBlock &MBB = *Indexes.getMBBFromIndex(VNI.def);
1528 for (const MachineBasicBlock *Pred : MBB.predecessors()) {
1529 SlotIndex PredEnd = Indexes.getMBBEndIdx(Pred);
1530 VNInfo *PredVNI = ParentLI.getVNInfoBefore(PredEnd);
1531 assert(PredVNI && "Value available in PhiVNI predecessor");
1532 if (Visited.insert(PredVNI).second)
1533 WorkList.push_back(PredVNI);
1534 }
1535 } while(!WorkList.empty());
1536}
1537
1539 ++NumFinished;
1540
1541 // At this point, the live intervals in Edit contain VNInfos corresponding to
1542 // the inserted copies.
1543
1544 // Add the original defs from the parent interval.
1545 for (const VNInfo *ParentVNI : Edit->getParent().valnos) {
1546 if (ParentVNI->isUnused())
1547 continue;
1548 unsigned RegIdx = RegAssign.lookup(ParentVNI->def);
1549 defValue(RegIdx, ParentVNI, ParentVNI->def, true);
1550
1551 // Force rematted values to be recomputed everywhere.
1552 // The new live ranges may be truncated.
1553 if (Edit->didRematerialize(ParentVNI))
1554 forceRecomputeVNI(*ParentVNI);
1555 }
1556
1557 // Hoist back-copies to the complement interval when in spill mode.
1558 switch (SpillMode) {
1559 case SM_Partition:
1560 // Leave all back-copies as is.
1561 break;
1562 case SM_Size:
1563 case SM_Speed:
1564 // hoistCopies will behave differently between size and speed.
1565 hoistCopies();
1566 }
1567
1568 // Transfer the simply mapped values, check if any are skipped.
1569 bool Skipped = transferValues();
1570
1571 // Rewrite virtual registers, possibly extending ranges.
1572 rewriteAssigned(Skipped);
1573
1574 if (Skipped)
1575 extendPHIKillRanges();
1576 else
1577 ++NumSimple;
1578
1579 // Delete defs that were rematted everywhere.
1580 if (Skipped)
1581 deleteRematVictims();
1582
1583 // Get rid of unused values and set phi-kill flags.
1584 for (Register Reg : *Edit) {
1585 LiveInterval &LI = LIS.getInterval(Reg);
1587 LI.RenumberValues();
1588 }
1589
1590 // Provide a reverse mapping from original indices to Edit ranges.
1591 if (LRMap) {
1592 auto Seq = llvm::seq<unsigned>(0, Edit->size());
1593 LRMap->assign(Seq.begin(), Seq.end());
1594 }
1595
1596 // Now check if any registers were separated into multiple components.
1597 ConnectedVNInfoEqClasses ConEQ(LIS);
1598 for (unsigned i = 0, e = Edit->size(); i != e; ++i) {
1599 // Don't use iterators, they are invalidated by create() below.
1600 Register VReg = Edit->get(i);
1601 LiveInterval &LI = LIS.getInterval(VReg);
1603 LIS.splitSeparateComponents(LI, SplitLIs);
1604 Register Original = VRM.getOriginal(VReg);
1605 for (LiveInterval *SplitLI : SplitLIs)
1606 VRM.setIsSplitFromReg(SplitLI->reg(), Original);
1607
1608 // The new intervals all map back to i.
1609 if (LRMap)
1610 LRMap->resize(Edit->size(), i);
1611 }
1612
1613 // Calculate spill weight and allocation hints for new intervals.
1614 Edit->calculateRegClassAndHint(VRM.getMachineFunction(), VRAI);
1615
1616 assert(!LRMap || LRMap->size() == Edit->size());
1617}
1618
1619//===----------------------------------------------------------------------===//
1620// Single Block Splitting
1621//===----------------------------------------------------------------------===//
1622
1624 bool SingleInstrs) const {
1625 // Always split for multiple instructions.
1626 if (!BI.isOneInstr())
1627 return true;
1628 // Don't split for single instructions unless explicitly requested.
1629 if (!SingleInstrs)
1630 return false;
1631 // Splitting a live-through range always makes progress.
1632 if (BI.LiveIn && BI.LiveOut)
1633 return true;
1634 // No point in isolating a copy. It has no register class constraints.
1635 MachineInstr *MI = LIS.getInstructionFromIndex(BI.FirstInstr);
1636 bool copyLike = TII.isCopyInstr(*MI) || MI->isSubregToReg();
1637 if (copyLike)
1638 return false;
1639 // Finally, don't isolate an end point that was created by earlier splits.
1640 return isOriginalEndpoint(BI.FirstInstr);
1641}
1642
1644 openIntv();
1645 SlotIndex LastSplitPoint = SA.getLastSplitPoint(BI.MBB);
1646 SlotIndex SegStart = enterIntvBefore(std::min(BI.FirstInstr,
1647 LastSplitPoint));
1648 if (!BI.LiveOut || BI.LastInstr < LastSplitPoint) {
1649 useIntv(SegStart, leaveIntvAfter(BI.LastInstr));
1650 } else {
1651 // The last use is after the last valid split point.
1652 SlotIndex SegStop = leaveIntvBefore(LastSplitPoint);
1653 useIntv(SegStart, SegStop);
1654 overlapIntv(SegStop, BI.LastInstr);
1655 }
1656}
1657
1658//===----------------------------------------------------------------------===//
1659// Global Live Range Splitting Support
1660//===----------------------------------------------------------------------===//
1661
1662// These methods support a method of global live range splitting that uses a
1663// global algorithm to decide intervals for CFG edges. They will insert split
1664// points and color intervals in basic blocks while avoiding interference.
1665//
1666// Note that splitSingleBlock is also useful for blocks where both CFG edges
1667// are on the stack.
1668
1670 unsigned IntvIn, SlotIndex LeaveBefore,
1671 unsigned IntvOut, SlotIndex EnterAfter){
1672 SlotIndex Start, Stop;
1673 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(MBBNum);
1674
1675 LLVM_DEBUG(dbgs() << "%bb." << MBBNum << " [" << Start << ';' << Stop
1676 << ") intf " << LeaveBefore << '-' << EnterAfter
1677 << ", live-through " << IntvIn << " -> " << IntvOut);
1678
1679 assert((IntvIn || IntvOut) && "Use splitSingleBlock for isolated blocks");
1680
1681 assert((!LeaveBefore || LeaveBefore < Stop) && "Interference after block");
1682 assert((!IntvIn || !LeaveBefore || LeaveBefore > Start) && "Impossible intf");
1683 assert((!EnterAfter || EnterAfter >= Start) && "Interference before block");
1684
1685 MachineBasicBlock *MBB = VRM.getMachineFunction().getBlockNumbered(MBBNum);
1686
1687 if (!IntvOut) {
1688 LLVM_DEBUG(dbgs() << ", spill on entry.\n");
1689 //
1690 // <<<<<<<<< Possible LeaveBefore interference.
1691 // |-----------| Live through.
1692 // -____________ Spill on entry.
1693 //
1694 selectIntv(IntvIn);
1696 assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
1697 (void)Idx;
1698 return;
1699 }
1700
1701 if (!IntvIn) {
1702 LLVM_DEBUG(dbgs() << ", reload on exit.\n");
1703 //
1704 // >>>>>>> Possible EnterAfter interference.
1705 // |-----------| Live through.
1706 // ___________-- Reload on exit.
1707 //
1708 selectIntv(IntvOut);
1710 assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
1711 (void)Idx;
1712 return;
1713 }
1714
1715 if (IntvIn == IntvOut && !LeaveBefore && !EnterAfter) {
1716 LLVM_DEBUG(dbgs() << ", straight through.\n");
1717 //
1718 // |-----------| Live through.
1719 // ------------- Straight through, same intv, no interference.
1720 //
1721 selectIntv(IntvOut);
1722 useIntv(Start, Stop);
1723 return;
1724 }
1725
1726 // We cannot legally insert splits after LSP.
1727 SlotIndex LSP = SA.getLastSplitPoint(MBBNum);
1728 assert((!IntvOut || !EnterAfter || EnterAfter < LSP) && "Impossible intf");
1729
1730 if (IntvIn != IntvOut && (!LeaveBefore || !EnterAfter ||
1731 LeaveBefore.getBaseIndex() > EnterAfter.getBoundaryIndex())) {
1732 LLVM_DEBUG(dbgs() << ", switch avoiding interference.\n");
1733 //
1734 // >>>> <<<< Non-overlapping EnterAfter/LeaveBefore interference.
1735 // |-----------| Live through.
1736 // ------======= Switch intervals between interference.
1737 //
1738 selectIntv(IntvOut);
1739 SlotIndex Idx;
1740 if (LeaveBefore && LeaveBefore < LSP) {
1741 Idx = enterIntvBefore(LeaveBefore);
1742 useIntv(Idx, Stop);
1743 } else {
1744 Idx = enterIntvAtEnd(*MBB);
1745 }
1746 selectIntv(IntvIn);
1747 useIntv(Start, Idx);
1748 assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
1749 assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
1750 return;
1751 }
1752
1753 LLVM_DEBUG(dbgs() << ", create local intv for interference.\n");
1754 //
1755 // >>><><><><<<< Overlapping EnterAfter/LeaveBefore interference.
1756 // |-----------| Live through.
1757 // ==---------== Switch intervals before/after interference.
1758 //
1759 assert(LeaveBefore <= EnterAfter && "Missed case");
1760
1761 selectIntv(IntvOut);
1762 SlotIndex Idx = enterIntvAfter(EnterAfter);
1763 useIntv(Idx, Stop);
1764 assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
1765
1766 selectIntv(IntvIn);
1767 Idx = leaveIntvBefore(LeaveBefore);
1768 useIntv(Start, Idx);
1769 assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
1770}
1771
1773 unsigned IntvIn, SlotIndex LeaveBefore) {
1774 SlotIndex Start, Stop;
1775 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
1776
1777 LLVM_DEBUG(dbgs() << printMBBReference(*BI.MBB) << " [" << Start << ';'
1778 << Stop << "), uses " << BI.FirstInstr << '-'
1779 << BI.LastInstr << ", reg-in " << IntvIn
1780 << ", leave before " << LeaveBefore
1781 << (BI.LiveOut ? ", stack-out" : ", killed in block"));
1782
1783 assert(IntvIn && "Must have register in");
1784 assert(BI.LiveIn && "Must be live-in");
1785 assert((!LeaveBefore || LeaveBefore > Start) && "Bad interference");
1786
1787 if (!BI.LiveOut && (!LeaveBefore || LeaveBefore >= BI.LastInstr)) {
1788 LLVM_DEBUG(dbgs() << " before interference.\n");
1789 //
1790 // <<< Interference after kill.
1791 // |---o---x | Killed in block.
1792 // ========= Use IntvIn everywhere.
1793 //
1794 selectIntv(IntvIn);
1795 useIntv(Start, BI.LastInstr);
1796 return;
1797 }
1798
1799 SlotIndex LSP = SA.getLastSplitPoint(BI.MBB);
1800
1801 if (!LeaveBefore || LeaveBefore > BI.LastInstr.getBoundaryIndex()) {
1802 //
1803 // <<< Possible interference after last use.
1804 // |---o---o---| Live-out on stack.
1805 // =========____ Leave IntvIn after last use.
1806 //
1807 // < Interference after last use.
1808 // |---o---o--o| Live-out on stack, late last use.
1809 // ============ Copy to stack after LSP, overlap IntvIn.
1810 // \_____ Stack interval is live-out.
1811 //
1812 if (BI.LastInstr < LSP) {
1813 LLVM_DEBUG(dbgs() << ", spill after last use before interference.\n");
1814 selectIntv(IntvIn);
1816 useIntv(Start, Idx);
1817 assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
1818 } else {
1819 LLVM_DEBUG(dbgs() << ", spill before last split point.\n");
1820 selectIntv(IntvIn);
1821 SlotIndex Idx = leaveIntvBefore(LSP);
1822 overlapIntv(Idx, BI.LastInstr);
1823 useIntv(Start, Idx);
1824 assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
1825 }
1826 return;
1827 }
1828
1829 // The interference is overlapping somewhere we wanted to use IntvIn. That
1830 // means we need to create a local interval that can be allocated a
1831 // different register.
1832 unsigned LocalIntv = openIntv();
1833 (void)LocalIntv;
1834 LLVM_DEBUG(dbgs() << ", creating local interval " << LocalIntv << ".\n");
1835
1836 if (!BI.LiveOut || BI.LastInstr < LSP) {
1837 //
1838 // <<<<<<< Interference overlapping uses.
1839 // |---o---o---| Live-out on stack.
1840 // =====----____ Leave IntvIn before interference, then spill.
1841 //
1843 SlotIndex From = enterIntvBefore(LeaveBefore);
1844 useIntv(From, To);
1845 selectIntv(IntvIn);
1846 useIntv(Start, From);
1847 assert((!LeaveBefore || From <= LeaveBefore) && "Interference");
1848 return;
1849 }
1850
1851 // <<<<<<< Interference overlapping uses.
1852 // |---o---o--o| Live-out on stack, late last use.
1853 // =====------- Copy to stack before LSP, overlap LocalIntv.
1854 // \_____ Stack interval is live-out.
1855 //
1856 SlotIndex To = leaveIntvBefore(LSP);
1857 overlapIntv(To, BI.LastInstr);
1858 SlotIndex From = enterIntvBefore(std::min(To, LeaveBefore));
1859 useIntv(From, To);
1860 selectIntv(IntvIn);
1861 useIntv(Start, From);
1862 assert((!LeaveBefore || From <= LeaveBefore) && "Interference");
1863}
1864
1866 unsigned IntvOut, SlotIndex EnterAfter) {
1867 SlotIndex Start, Stop;
1868 std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
1869
1870 LLVM_DEBUG(dbgs() << printMBBReference(*BI.MBB) << " [" << Start << ';'
1871 << Stop << "), uses " << BI.FirstInstr << '-'
1872 << BI.LastInstr << ", reg-out " << IntvOut
1873 << ", enter after " << EnterAfter
1874 << (BI.LiveIn ? ", stack-in" : ", defined in block"));
1875
1876 SlotIndex LSP = SA.getLastSplitPoint(BI.MBB);
1877
1878 assert(IntvOut && "Must have register out");
1879 assert(BI.LiveOut && "Must be live-out");
1880 assert((!EnterAfter || EnterAfter < LSP) && "Bad interference");
1881
1882 if (!BI.LiveIn && (!EnterAfter || EnterAfter <= BI.FirstInstr)) {
1883 LLVM_DEBUG(dbgs() << " after interference.\n");
1884 //
1885 // >>>> Interference before def.
1886 // | o---o---| Defined in block.
1887 // ========= Use IntvOut everywhere.
1888 //
1889 selectIntv(IntvOut);
1890 useIntv(BI.FirstInstr, Stop);
1891 return;
1892 }
1893
1894 if (!EnterAfter || EnterAfter < BI.FirstInstr.getBaseIndex()) {
1895 LLVM_DEBUG(dbgs() << ", reload after interference.\n");
1896 //
1897 // >>>> Interference before def.
1898 // |---o---o---| Live-through, stack-in.
1899 // ____========= Enter IntvOut before first use.
1900 //
1901 selectIntv(IntvOut);
1902 SlotIndex Idx = enterIntvBefore(std::min(LSP, BI.FirstInstr));
1903 useIntv(Idx, Stop);
1904 assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
1905 return;
1906 }
1907
1908 // The interference is overlapping somewhere we wanted to use IntvOut. That
1909 // means we need to create a local interval that can be allocated a
1910 // different register.
1911 LLVM_DEBUG(dbgs() << ", interference overlaps uses.\n");
1912 //
1913 // >>>>>>> Interference overlapping uses.
1914 // |---o---o---| Live-through, stack-in.
1915 // ____---====== Create local interval for interference range.
1916 //
1917 selectIntv(IntvOut);
1918 SlotIndex Idx = enterIntvAfter(EnterAfter);
1919 useIntv(Idx, Stop);
1920 assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
1921
1922 openIntv();
1923 SlotIndex From = enterIntvBefore(std::min(Idx, BI.FirstInstr));
1924 useIntv(From, Idx);
1925}
1926
1928 OS << "{" << printMBBReference(*MBB) << ", "
1929 << "uses " << FirstInstr << " to " << LastInstr << ", "
1930 << "1st def " << FirstDef << ", "
1931 << (LiveIn ? "live in" : "dead in") << ", "
1932 << (LiveOut ? "live out" : "dead out") << "}";
1933}
1934
1936 print(dbgs());
1937 dbgs() << "\n";
1938}
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator MBBI
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:638
Hexagon Hardware Loops
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define T
#define P(N)
if(PassOpts->AAPipeline)
SI Lower i1 Copies
SI Optimize VGPR LiveRange
This file contains some templates that are useful if you are working with the STL at all.
LiveInterval::SubRange & getSubRangeForMaskExact(LaneBitmask LM, LiveInterval &LI)
Definition SplitKit.cpp:405
static bool removeDeadSegment(SlotIndex Def, LiveRange &LR)
auto & getSubrangeImpl(LaneBitmask LM, T &LI)
Find a subrange corresponding to the exact lane mask LM in the live interval LI.
Definition SplitKit.cpp:398
const LiveInterval::SubRange & getSubRangeForMask(LaneBitmask LM, const LiveInterval &LI)
Find a subrange corresponding to the lane mask LM, or a superset of it, in the live interval LI.
Definition SplitKit.cpp:419
static bool hasTiedUseOf(MachineInstr &MI, Register Reg)
Definition SplitKit.cpp:854
static cl::opt< bool > EnableLoopIVHeuristic("enable-split-loopiv-heuristic", cl::desc("Enable loop iv regalloc heuristic"), cl::init(true))
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition BitVector.h:360
BitVector & set()
Definition BitVector.h:370
ConnectedVNInfoEqClasses - Helper class that can divide VNInfos in a LiveInterval into equivalence cl...
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
DomTreeNodeBase * getIDom() const
NodeT * getBlock() const
MachineBasicBlock::iterator getLastInsertPointIter(const LiveInterval &CurLI, MachineBasicBlock &MBB)
Returns the last insert point as an iterator for \pCurLI in \pMBB.
Definition SplitKit.cpp:142
SlotIndex getLastInsertPoint(const LiveInterval &CurLI, const MachineBasicBlock &MBB)
Return the base index of the last valid insert point for \pCurLI in \pMBB.
Definition SplitKit.h:67
InsertPointAnalysis(const LiveIntervals &lis, unsigned BBNum)
Definition SplitKit.cpp:61
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 refineSubRanges(BumpPtrAllocator &Allocator, LaneBitmask LaneMask, std::function< void(LiveInterval::SubRange &)> Apply, const SlotIndexes &Indexes, const TargetRegisterInfo &TRI, unsigned ComposeSubRegIdx=0)
Refines the subranges to support LaneMask.
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 ...
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
SlotIndexes * getSlotIndexes() const
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
void RemoveMachineInstrFromMaps(MachineInstr &MI)
SlotIndex getMBBEndIdx(const MachineBasicBlock *mbb) const
Return the last index in the given basic block.
LiveInterval & getInterval(Register Reg)
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.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
void addLiveInBlock(LiveRange &LR, MachineDomTreeNode *DomNode, SlotIndex Kill=SlotIndex())
addLiveInBlock - Add a block with an unknown live-in value.
LLVM_ABI void reset(const MachineFunction *mf, SlotIndexes *SI, MachineDominatorTree *MDT, VNInfo::Allocator *VNIA)
reset - Prepare caches for a new set of non-overlapping live ranges.
LLVM_ABI void extend(LiveRange &LR, SlotIndex Use, Register PhysReg, ArrayRef< SlotIndex > Undefs)
Extend the live range of LR to reach Use.
void setLiveOutValue(MachineBasicBlock *MBB, VNInfo *VNI)
setLiveOutValue - Indicate that VNI is live out from MBB.
Register get(unsigned idx) const
Register getReg() const
This class represents the liveness of a register, stack slot, etc.
VNInfo * getValNumInfo(unsigned ValNo)
getValNumInfo - Returns pointer to the specified val#.
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.
Segments::const_iterator const_iterator
bool liveAt(SlotIndex index) const
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
iterator advanceTo(iterator I, SlotIndex Pos)
advanceTo - Advance the specified iterator to point to the Segment containing the specified position,...
bool empty() const
LLVM_ABI void RenumberValues()
RenumberValues - Renumber all values in order of appearance and remove unused values.
VNInfo * getVNInfoBefore(SlotIndex Idx) const
getVNInfoBefore - Return the VNInfo that is live up to but not necessarily including Idx,...
LLVM_ABI std::pair< VNInfo *, bool > extendInBlock(ArrayRef< SlotIndex > Undefs, SlotIndex StartIdx, SlotIndex Kill)
Attempt to extend a value defined after StartIdx to include Use.
unsigned getNumValNums() const
iterator begin()
VNInfoList valnos
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
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().
BlockT * getHeader() const
unsigned getLoopDepth() const
Return the nesting level of this loop.
Describe properties that are true of each instruction in the target description file.
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator_range< pred_iterator > predecessors()
MachineInstrBundleIterator< MachineInstr > iterator
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
BasicBlockListType::iterator iterator
BasicBlockListType::const_iterator const_iterator
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
mop_range defs()
Returns all explicit operands that are register definitions.
LLVM_ABI void bundleWithPred()
Bundle this instruction with its predecessor.
LLVM_ABI const TargetRegisterClass * getRegClassConstraintEffectForVReg(Register Reg, const TargetRegisterClass *CurRC, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ExploreBundle=false) const
Applies the constraints (def/use) implied by this MI on Reg to the given CurRC.
void setFlag(MIFlag Flag)
Set a MI flag.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI const TargetRegisterClass * getRegClassConstraint(unsigned OpIdx, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI) const
Compute the static register class constraint for operand OpIdx.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
Definition Register.h:20
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.
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.
SlotIndex getBoundaryIndex() const
Returns the boundary index for associated with this index.
SlotIndex getBaseIndex() const
Returns the base index for associated with this index.
SlotIndex getNextSlot() const
Returns the next slot in the index list.
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.
SlotIndex insertMachineInstrInMaps(MachineInstr &MI, bool Late=false)
Insert the given machine instruction into the mapping.
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
Returns the basic block which the given index falls in.
const std::pair< SlotIndex, SlotIndex > & getMBBRange(unsigned Num) const
Return the (start,end) range of the given basic block number.
SlotIndex getMBBEndIdx(unsigned Num) const
Returns the index past the last valid index in the given basic block.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
typename SuperClass::const_iterator const_iterator
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
SplitAnalysis - Analyze a LiveInterval, looking for live range splitting opportunities.
Definition SplitKit.h:96
SplitAnalysis(const VirtRegMap &vrm, const LiveIntervals &lis, const MachineLoopInfo &mli)
Definition SplitKit.cpp:154
const MachineFunction & MF
Definition SplitKit.h:98
bool isOriginalEndpoint(SlotIndex Idx) const
isOriginalEndpoint - Return true if the original live range was killed or (re-)defined at Idx.
Definition SplitKit.cpp:333
unsigned countLiveBlocks(const LiveInterval *li) const
countLiveBlocks - Return the number of blocks where li is live.
Definition SplitKit.cpp:309
const LiveIntervals & LIS
Definition SplitKit.h:100
void analyze(const LiveInterval *li)
analyze - set CurLI to the specified interval, and analyze how it may be split.
Definition SplitKit.cpp:347
void clear()
clear - clear all data structures so SplitAnalysis is ready to analyze a new interval.
Definition SplitKit.cpp:159
const MachineLoopInfo & Loops
Definition SplitKit.h:101
const TargetInstrInfo & TII
Definition SplitKit.h:102
unsigned getNumLiveBlocks() const
getNumLiveBlocks - Return the number of blocks where CurLI is live.
Definition SplitKit.h:212
const VirtRegMap & VRM
Definition SplitKit.h:99
bool shouldSplitSingleBlock(const BlockInfo &BI, bool SingleInstrs) const
shouldSplitSingleBlock - Returns true if it would help to create a local live range for the instructi...
void overlapIntv(SlotIndex Start, SlotIndex End)
overlapIntv - Indicate that all instructions in range should use the open interval if End does not ha...
Definition SplitKit.cpp:860
unsigned openIntv()
Create a new virtual register and live interval.
Definition SplitKit.cpp:682
SplitEditor(SplitAnalysis &SA, LiveIntervals &LIS, VirtRegMap &VRM, MachineDominatorTree &MDT, MachineBlockFrequencyInfo &MBFI, VirtRegAuxInfo &VRAI)
Create a new SplitEditor for editing the LiveInterval analyzed by SA.
Definition SplitKit.cpp:358
void splitRegOutBlock(const SplitAnalysis::BlockInfo &BI, unsigned IntvOut, SlotIndex EnterAfter)
splitRegOutBlock - Split CurLI in the given block such that it enters the block on the stack (or isn'...
SlotIndex enterIntvAfter(SlotIndex Idx)
enterIntvAfter - Enter the open interval after the instruction at Idx.
Definition SplitKit.cpp:717
SlotIndex enterIntvBefore(SlotIndex Idx)
enterIntvBefore - Enter the open interval before the instruction at Idx.
Definition SplitKit.cpp:700
void useIntv(const MachineBasicBlock &MBB)
useIntv - indicate that all instructions in MBB should use OpenLI.
Definition SplitKit.cpp:772
SlotIndex leaveIntvAfter(SlotIndex Idx)
leaveIntvAfter - Leave the open interval after the instruction at Idx.
Definition SplitKit.cpp:783
void reset(LiveRangeEdit &, ComplementSpillMode=SM_Partition)
reset - Prepare for a new split.
Definition SplitKit.cpp:366
SlotIndex enterIntvAtEnd(MachineBasicBlock &MBB)
enterIntvAtEnd - Enter the open interval at the end of MBB.
Definition SplitKit.cpp:735
SlotIndex leaveIntvAtTop(MachineBasicBlock &MBB)
leaveIntvAtTop - Leave the interval at the top of MBB.
Definition SplitKit.cpp:833
SlotIndex leaveIntvBefore(SlotIndex Idx)
leaveIntvBefore - Leave the open interval before the instruction at Idx.
Definition SplitKit.cpp:814
void finish(SmallVectorImpl< unsigned > *LRMap=nullptr)
finish - after all the new live ranges have been created, compute the remaining live range,...
void splitRegInBlock(const SplitAnalysis::BlockInfo &BI, unsigned IntvIn, SlotIndex LeaveBefore)
splitRegInBlock - Split CurLI in the given block such that it enters the block in IntvIn and leaves i...
void splitLiveThroughBlock(unsigned MBBNum, unsigned IntvIn, SlotIndex LeaveBefore, unsigned IntvOut, SlotIndex EnterAfter)
splitLiveThroughBlock - Split CurLI in the given block such that it enters the block in IntvIn and le...
ComplementSpillMode
ComplementSpillMode - Select how the complement live range should be created.
Definition SplitKit.h:281
@ SM_Partition
SM_Partition(Default) - Try to create the complement interval so it doesn't overlap any other interva...
Definition SplitKit.h:286
@ SM_Speed
SM_Speed - Overlap intervals to minimize the expected execution frequency of the inserted copies.
Definition SplitKit.h:298
@ SM_Size
SM_Size - Overlap intervals to minimize the number of inserted COPY instructions.
Definition SplitKit.h:293
void selectIntv(unsigned Idx)
selectIntv - Select a previously opened interval index.
Definition SplitKit.cpp:693
void splitSingleBlock(const SplitAnalysis::BlockInfo &BI)
splitSingleBlock - Split CurLI into a separate live interval around the uses in a single block.
void dump() const
dump - print the current interval mapping to dbgs().
Definition SplitKit.cpp:382
bool hasSubClass(const TargetRegisterClass *RC) const
Return true if the specified TargetRegisterClass is a proper sub-class of this TargetRegisterClass.
VNInfo - Value Number Information.
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...
Calculate auxiliary information for a virtual register such as its spill weight and allocation hint.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition DenseSet.h:180
self_iterator getIterator()
Definition ilist_node.h:123
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ Dead
Unused definition.
@ Define
Register definition.
@ Skipped
Validation was skipped, as it was not needed.
initializer< Ty > init(const Ty &Val)
NodeAddr< DefNode * > Def
Definition RDFGraph.h:384
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1667
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2184
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:632
auto unique(Range &&R, Predicate P)
Definition STLExtras.h:2124
Op::Description Desc
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:1744
auto reverse(ContainerTy &&C)
Definition STLExtras.h:406
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
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:1751
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
unsigned getInternalReadRegState(bool B)
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
unsigned getUndefRegState(bool B)
@ Sub
Subtraction of integers.
FunctionAddr VTableAddr Next
Definition InstrProf.h:141
auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:305
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
Definition STLExtras.h:1594
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
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 Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
#define N
static constexpr LaneBitmask getAll()
Definition LaneBitmask.h:82
constexpr bool none() const
Definition LaneBitmask.h:52
constexpr bool all() const
Definition LaneBitmask.h:54
static constexpr LaneBitmask getNone()
Definition LaneBitmask.h:81
This represents a simple continuous liveness interval for a value.
Additional information about basic blocks where the current variable is live.
Definition SplitKit.h:121
SlotIndex FirstDef
First non-phi valno->def, or SlotIndex().
Definition SplitKit.h:125
bool LiveOut
Current reg is live out.
Definition SplitKit.h:127
bool LiveIn
Current reg is live in.
Definition SplitKit.h:126
bool isOneInstr() const
isOneInstr - Returns true when this BlockInfo describes a single instruction.
Definition SplitKit.h:131
MachineBasicBlock * MBB
Definition SplitKit.h:122
void print(raw_ostream &OS) const
SlotIndex LastInstr
Last instr accessing current reg.
Definition SplitKit.h:124
SlotIndex FirstInstr
First instr accessing current reg.
Definition SplitKit.h:123