LLVM 23.0.0git
InlineSpiller.cpp
Go to the documentation of this file.
1//===- InlineSpiller.cpp - Insert spills and restores inline --------------===//
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// The inline spiller modifies the machine function directly instead of
10// inserting spills and restores in VirtRegMap.
11//
12//===----------------------------------------------------------------------===//
13
14#include "AllocationOrder.h"
15#include "SplitKit.h"
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/MapVector.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SetVector.h"
23#include "llvm/ADT/Statistic.h"
46#include "llvm/Config/llvm-config.h"
51#include "llvm/Support/Debug.h"
54#include <cassert>
55#include <iterator>
56#include <tuple>
57#include <utility>
58
59using namespace llvm;
60
61#define DEBUG_TYPE "regalloc"
62
63STATISTIC(NumSpilledRanges, "Number of spilled live ranges");
64STATISTIC(NumSnippets, "Number of spilled snippets");
65STATISTIC(NumSpills, "Number of spills inserted");
66STATISTIC(NumSpillsRemoved, "Number of spills removed");
67STATISTIC(NumReloads, "Number of reloads inserted");
68STATISTIC(NumReloadsRemoved, "Number of reloads removed");
69STATISTIC(NumFolded, "Number of folded stack accesses");
70STATISTIC(NumFoldedLoads, "Number of folded loads");
71STATISTIC(NumRemats, "Number of rematerialized defs for spilling");
72
73static cl::opt<bool>
74RestrictStatepointRemat("restrict-statepoint-remat",
75 cl::init(false), cl::Hidden,
76 cl::desc("Restrict remat for statepoint operands"));
77
78namespace {
79class HoistSpillHelper : private LiveRangeEdit::Delegate {
81 LiveIntervals &LIS;
82 LiveStacks &LSS;
84 VirtRegMap &VRM;
86 const TargetInstrInfo &TII;
88 const MachineBlockFrequencyInfo &MBFI;
90
92
93 // Map from StackSlot to the LiveInterval of the original register.
94 // Note the LiveInterval of the original register may have been deleted
95 // after it is spilled. We keep a copy here to track the range where
96 // spills can be moved.
98
99 // Map from pair of (StackSlot and Original VNI) to a set of spills which
100 // have the same stackslot and have equal values defined by Original VNI.
101 // These spills are mergeable and are hoist candidates.
102 using MergeableSpillsMap =
104 MergeableSpillsMap MergeableSpills;
105
106 /// This is the map from original register to a set containing all its
107 /// siblings. To hoist a spill to another BB, we need to find out a live
108 /// sibling there and use it as the source of the new spill.
110
111 bool isSpillCandBB(LiveInterval &OrigLI, VNInfo &OrigVNI,
112 MachineBasicBlock &BB, Register &LiveReg);
113
114 void rmRedundantSpills(
118
119 void getVisitOrders(
125
126 void runHoistSpills(LiveInterval &OrigLI, VNInfo &OrigVNI,
130
131public:
132 HoistSpillHelper(const Spiller::RequiredAnalyses &Analyses,
133 MachineFunction &mf, VirtRegMap &vrm, LiveRegMatrix *matrix)
134 : MF(mf), LIS(Analyses.LIS), LSS(Analyses.LSS), MDT(Analyses.MDT),
135 VRM(vrm), MRI(mf.getRegInfo()), TII(*mf.getSubtarget().getInstrInfo()),
136 TRI(*mf.getSubtarget().getRegisterInfo()), MBFI(Analyses.MBFI),
137 Matrix(matrix), IPA(LIS, mf.getNumBlockIDs()) {}
138
139 void addToMergeableSpills(MachineInstr &Spill, int StackSlot,
140 Register Original);
141 bool rmFromMergeableSpills(MachineInstr &Spill, int StackSlot);
142 void hoistAllSpills();
143 void LRE_WillShrinkVirtReg(Register) override;
144 bool LRE_CanEraseVirtReg(Register) override;
145 void LRE_DidCloneVirtReg(Register, Register) override;
146
147private:
148 // Vregs unassigned from the matrix during LRE_WillShrinkVirtReg, pending
149 // re-assignment after the interval is shrunk/split.
150 DenseMap<Register, MCRegister> PendingReassignments;
151};
152
153class InlineSpiller : public Spiller {
154 MachineFunction &MF;
155 LiveIntervals &LIS;
156 LiveStacks &LSS;
157 VirtRegMap &VRM;
158 MachineRegisterInfo &MRI;
159 const TargetInstrInfo &TII;
160 const TargetRegisterInfo &TRI;
161 LiveRegMatrix *Matrix = nullptr;
162
163 // Variables that are valid during spill(), but used by multiple methods.
164 LiveRangeEdit *Edit = nullptr;
165 LiveInterval *StackInt = nullptr;
166 int StackSlot;
167 Register Original;
168 AllocationOrder *Order = nullptr;
169
170 // All registers to spill to StackSlot, including the main register.
171 SmallVector<Register, 8> RegsToSpill;
172
173 // All registers that were replaced by the spiller through some other method,
174 // e.g. rematerialization.
175 SmallVector<Register, 8> RegsReplaced;
176
177 // All COPY instructions to/from snippets.
178 // They are ignored since both operands refer to the same stack slot.
179 // For bundled copies, this will only include the first header copy.
180 SmallPtrSet<MachineInstr*, 8> SnippetCopies;
181
182 // Values that failed to remat at some point.
183 SmallPtrSet<VNInfo*, 8> UsedValues;
184
185 // Dead defs generated during spilling.
186 SmallVector<MachineInstr*, 8> DeadDefs;
187
188 // Object records spills information and does the hoisting.
189 HoistSpillHelper HSpiller;
190
191 // Live range weight calculator.
192 VirtRegAuxInfo &VRAI;
193
194 ~InlineSpiller() override = default;
195
196public:
197 InlineSpiller(const Spiller::RequiredAnalyses &Analyses, MachineFunction &MF,
198 VirtRegMap &VRM, VirtRegAuxInfo &VRAI, LiveRegMatrix *Matrix)
199 : MF(MF), LIS(Analyses.LIS), LSS(Analyses.LSS), VRM(VRM),
200 MRI(MF.getRegInfo()), TII(*MF.getSubtarget().getInstrInfo()),
201 TRI(*MF.getSubtarget().getRegisterInfo()), Matrix(Matrix),
202 HSpiller(Analyses, MF, VRM, Matrix), VRAI(VRAI) {}
203
204 void spill(LiveRangeEdit &, AllocationOrder *Order = nullptr) override;
205 ArrayRef<Register> getSpilledRegs() override { return RegsToSpill; }
206 ArrayRef<Register> getReplacedRegs() override { return RegsReplaced; }
207 void postOptimization() override;
208
209private:
210 bool isSnippet(const LiveInterval &SnipLI);
211 void collectRegsToSpill();
212
213 bool isRegToSpill(Register Reg) { return is_contained(RegsToSpill, Reg); }
214
215 bool isSibling(Register Reg);
216 bool hoistSpillInsideBB(LiveInterval &SpillLI, MachineInstr &CopyMI);
217 void eliminateRedundantSpills(LiveInterval &LI, VNInfo *VNI);
218
219 void markValueUsed(LiveInterval*, VNInfo*);
220 bool canGuaranteeAssignmentAfterRemat(Register VReg, MachineInstr &MI);
221 bool hasPhysRegAvailable(const MachineInstr &MI);
222 bool reMaterializeFor(LiveInterval &, MachineInstr &MI);
223 void reMaterializeAll();
224
225 bool coalesceStackAccess(MachineInstr *MI, Register Reg);
226 bool foldMemoryOperand(ArrayRef<std::pair<MachineInstr *, unsigned>>,
227 MachineInstr *LoadMI = nullptr);
228 void insertReload(Register VReg, SlotIndex, MachineBasicBlock::iterator MI);
229 void insertSpill(Register VReg, bool isKill, MachineBasicBlock::iterator MI);
230
231 void spillAroundUses(Register Reg);
232 void spillAll();
233};
234
235} // end anonymous namespace
236
237Spiller::~Spiller() = default;
238
239void Spiller::anchor() {}
240
241Spiller *
242llvm::createInlineSpiller(const InlineSpiller::RequiredAnalyses &Analyses,
243 MachineFunction &MF, VirtRegMap &VRM,
245 return new InlineSpiller(Analyses, MF, VRM, VRAI, Matrix);
246}
247
248//===----------------------------------------------------------------------===//
249// Snippets
250//===----------------------------------------------------------------------===//
251
252// When spilling a virtual register, we also spill any snippets it is connected
253// to. The snippets are small live ranges that only have a single real use,
254// leftovers from live range splitting. Spilling them enables memory operand
255// folding or tightens the live range around the single use.
256//
257// This minimizes register pressure and maximizes the store-to-load distance for
258// spill slots which can be important in tight loops.
259
260/// isFullCopyOf - If MI is a COPY to or from Reg, return the other register,
261/// otherwise return 0.
263 const TargetInstrInfo &TII) {
264 if (!TII.isCopyInstr(MI))
265 return Register();
266
267 const MachineOperand &DstOp = MI.getOperand(0);
268 const MachineOperand &SrcOp = MI.getOperand(1);
269
270 // TODO: Probably only worth allowing subreg copies with undef dests.
271 if (DstOp.getSubReg() != SrcOp.getSubReg())
272 return Register();
273 if (DstOp.getReg() == Reg)
274 return SrcOp.getReg();
275 if (SrcOp.getReg() == Reg)
276 return DstOp.getReg();
277 return Register();
278}
279
280/// Check for a copy bundle as formed by SplitKit.
282 const TargetInstrInfo &TII) {
283 if (!FirstMI.isBundled())
284 return isCopyOf(FirstMI, Reg, TII);
285
286 assert(!FirstMI.isBundledWithPred() && FirstMI.isBundledWithSucc() &&
287 "expected to see first instruction in bundle");
288
289 Register SnipReg;
291 while (I->isBundledWithSucc()) {
292 const MachineInstr &MI = *I;
293 auto CopyInst = TII.isCopyInstr(MI);
294 if (!CopyInst)
295 return Register();
296
297 const MachineOperand &DstOp = *CopyInst->Destination;
298 const MachineOperand &SrcOp = *CopyInst->Source;
299 if (DstOp.getReg() == Reg) {
300 if (!SnipReg)
301 SnipReg = SrcOp.getReg();
302 else if (SnipReg != SrcOp.getReg())
303 return Register();
304 } else if (SrcOp.getReg() == Reg) {
305 if (!SnipReg)
306 SnipReg = DstOp.getReg();
307 else if (SnipReg != DstOp.getReg())
308 return Register();
309 }
310
311 ++I;
312 }
313
314 return Register();
315}
316
317static void getVDefInterval(const MachineInstr &MI, LiveIntervals &LIS) {
318 for (const MachineOperand &MO : MI.all_defs())
319 if (MO.getReg().isVirtual())
320 LIS.getInterval(MO.getReg());
321}
322
323/// isSnippet - Identify if a live interval is a snippet that should be spilled.
324/// It is assumed that SnipLI is a virtual register with the same original as
325/// Edit->getReg().
326bool InlineSpiller::isSnippet(const LiveInterval &SnipLI) {
327 Register Reg = Edit->getReg();
328
329 // A snippet is a tiny live range with only a single instruction using it
330 // besides copies to/from Reg or spills/fills.
331 // Exception is done for statepoint instructions which will fold fills
332 // into their operands.
333 // We accept:
334 //
335 // %snip = COPY %Reg / FILL fi#
336 // %snip = USE %snip
337 // %snip = STATEPOINT %snip in var arg area
338 // %Reg = COPY %snip / SPILL %snip, fi#
339 //
340 if (!LIS.intervalIsInOneMBB(SnipLI))
341 return false;
342
343 // Number of defs should not exceed 2 not accounting defs coming from
344 // statepoint instructions.
345 unsigned NumValNums = SnipLI.getNumValNums();
346 for (auto *VNI : SnipLI.vnis()) {
347 MachineInstr *MI = LIS.getInstructionFromIndex(VNI->def);
348 if (MI->getOpcode() == TargetOpcode::STATEPOINT)
349 --NumValNums;
350 }
351 if (NumValNums > 2)
352 return false;
353
354 MachineInstr *UseMI = nullptr;
355
356 // Check that all uses satisfy our criteria.
358 RI = MRI.reg_bundle_nodbg_begin(SnipLI.reg()),
359 E = MRI.reg_bundle_nodbg_end();
360 RI != E;) {
361 MachineInstr &MI = *RI++;
362
363 // Allow copies to/from Reg.
364 if (isCopyOfBundle(MI, Reg, TII))
365 continue;
366
367 // Allow stack slot loads.
368 int FI;
369 if (SnipLI.reg() == TII.isLoadFromStackSlot(MI, FI) && FI == StackSlot)
370 continue;
371
372 // Allow stack slot stores.
373 if (SnipLI.reg() == TII.isStoreToStackSlot(MI, FI) && FI == StackSlot)
374 continue;
375
376 if (StatepointOpers::isFoldableReg(&MI, SnipLI.reg()))
377 continue;
378
379 // Allow a single additional instruction.
380 if (UseMI && &MI != UseMI)
381 return false;
382 UseMI = &MI;
383 }
384 return true;
385}
386
387/// collectRegsToSpill - Collect live range snippets that only have a single
388/// real use.
389void InlineSpiller::collectRegsToSpill() {
390 Register Reg = Edit->getReg();
391
392 // Main register always spills.
393 RegsToSpill.assign(1, Reg);
394 SnippetCopies.clear();
395 RegsReplaced.clear();
396
397 // Snippets all have the same original, so there can't be any for an original
398 // register.
399 if (Original == Reg)
400 return;
401
402 for (MachineInstr &MI : llvm::make_early_inc_range(MRI.reg_bundles(Reg))) {
403 Register SnipReg = isCopyOfBundle(MI, Reg, TII);
404 if (!isSibling(SnipReg))
405 continue;
406 LiveInterval &SnipLI = LIS.getInterval(SnipReg);
407 if (!isSnippet(SnipLI))
408 continue;
409 SnippetCopies.insert(&MI);
410 if (isRegToSpill(SnipReg))
411 continue;
412 RegsToSpill.push_back(SnipReg);
413 LLVM_DEBUG(dbgs() << "\talso spill snippet " << SnipLI << '\n');
414 ++NumSnippets;
415 }
416}
417
418bool InlineSpiller::isSibling(Register Reg) {
419 return Reg.isVirtual() && VRM.getOriginal(Reg) == Original;
420}
421
422/// It is beneficial to spill to earlier place in the same BB in case
423/// as follows:
424/// There is an alternative def earlier in the same MBB.
425/// Hoist the spill as far as possible in SpillMBB. This can ease
426/// register pressure:
427///
428/// x = def
429/// y = use x
430/// s = copy x
431///
432/// Hoisting the spill of s to immediately after the def removes the
433/// interference between x and y:
434///
435/// x = def
436/// spill x
437/// y = use killed x
438///
439/// This hoist only helps when the copy kills its source.
440///
441bool InlineSpiller::hoistSpillInsideBB(LiveInterval &SpillLI,
442 MachineInstr &CopyMI) {
443 SlotIndex Idx = LIS.getInstructionIndex(CopyMI);
444#ifndef NDEBUG
445 VNInfo *VNI = SpillLI.getVNInfoAt(Idx.getRegSlot());
446 assert(VNI && VNI->def == Idx.getRegSlot() && "Not defined by copy");
447#endif
448
449 Register SrcReg = CopyMI.getOperand(1).getReg();
450 LiveInterval &SrcLI = LIS.getInterval(SrcReg);
451 VNInfo *SrcVNI = SrcLI.getVNInfoAt(Idx);
452 LiveQueryResult SrcQ = SrcLI.Query(Idx);
453 MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(SrcVNI->def);
454 if (DefMBB != CopyMI.getParent() || !SrcQ.isKill())
455 return false;
456
457 // Conservatively extend the stack slot range to the range of the original
458 // value. We may be able to do better with stack slot coloring by being more
459 // careful here.
460 assert(StackInt && "No stack slot assigned yet.");
461 LiveInterval &OrigLI = LIS.getInterval(Original);
462 VNInfo *OrigVNI = OrigLI.getVNInfoAt(Idx);
463 StackInt->MergeValueInAsValue(OrigLI, OrigVNI, StackInt->getValNumInfo(0));
464 LLVM_DEBUG(dbgs() << "\tmerged orig valno " << OrigVNI->id << ": "
465 << *StackInt << '\n');
466
467 // We are going to spill SrcVNI immediately after its def, so clear out
468 // any later spills of the same value.
469 eliminateRedundantSpills(SrcLI, SrcVNI);
470
471 MachineBasicBlock *MBB = LIS.getMBBFromIndex(SrcVNI->def);
473 if (SrcVNI->isPHIDef())
474 MII = MBB->SkipPHIsLabelsAndDebug(MBB->begin(), SrcReg);
475 else {
476 MachineInstr *DefMI = LIS.getInstructionFromIndex(SrcVNI->def);
477 assert(DefMI && "Defining instruction disappeared");
478 MII = DefMI;
479 ++MII;
480 }
481 MachineInstrSpan MIS(MII, MBB);
482 // Insert spill without kill flag immediately after def.
483 TII.storeRegToStackSlot(*MBB, MII, SrcReg, false, StackSlot,
484 MRI.getRegClass(SrcReg), Register());
485 LIS.InsertMachineInstrRangeInMaps(MIS.begin(), MII);
486 for (const MachineInstr &MI : make_range(MIS.begin(), MII))
487 getVDefInterval(MI, LIS);
488 --MII; // Point to store instruction.
489 LLVM_DEBUG(dbgs() << "\thoisted: " << SrcVNI->def << '\t' << *MII);
490
491 // When the def is a PHI, SkipPHIsLabelsAndDebug may place the store past
492 // prologue instructions. Therefore if that copy was the end of a segment
493 // we need to extend it to the store.
494 if (SrcVNI->isPHIDef()) {
495 SlotIndex StoreUseIdx = LIS.getInstructionIndex(*MII).getRegSlot(true);
496 SrcLI.extendInBlock(LIS.getMBBStartIdx(MBB), StoreUseIdx);
497 }
498
499 // If there is only 1 store instruction is required for spill, add it
500 // to mergeable list. In X86 AMX, 2 intructions are required to store.
501 // We disable the merge for this case.
502 if (MIS.begin() == MII)
503 HSpiller.addToMergeableSpills(*MII, StackSlot, Original);
504 ++NumSpills;
505 return true;
506}
507
508/// eliminateRedundantSpills - SLI:VNI is known to be on the stack. Remove any
509/// redundant spills of this value in SLI.reg and sibling copies.
510void InlineSpiller::eliminateRedundantSpills(LiveInterval &SLI, VNInfo *VNI) {
511 assert(VNI && "Missing value");
513 WorkList.push_back(std::make_pair(&SLI, VNI));
514 assert(StackInt && "No stack slot assigned yet.");
515
516 do {
517 LiveInterval *LI;
518 std::tie(LI, VNI) = WorkList.pop_back_val();
519 Register Reg = LI->reg();
520 LLVM_DEBUG(dbgs() << "Checking redundant spills for " << VNI->id << '@'
521 << VNI->def << " in " << *LI << '\n');
522
523 // Regs to spill are taken care of.
524 if (isRegToSpill(Reg))
525 continue;
526
527 // Add all of VNI's live range to StackInt.
528 StackInt->MergeValueInAsValue(*LI, VNI, StackInt->getValNumInfo(0));
529 LLVM_DEBUG(dbgs() << "Merged to stack int: " << *StackInt << '\n');
530
531 // Find all spills and copies of VNI.
532 for (MachineInstr &MI :
533 llvm::make_early_inc_range(MRI.use_nodbg_bundles(Reg))) {
534 if (!MI.mayStore() && !TII.isCopyInstr(MI))
535 continue;
536 SlotIndex Idx = LIS.getInstructionIndex(MI);
537 if (LI->getVNInfoAt(Idx) != VNI)
538 continue;
539
540 // Follow sibling copies down the dominator tree.
541 if (Register DstReg = isCopyOfBundle(MI, Reg, TII)) {
542 if (isSibling(DstReg)) {
543 LiveInterval &DstLI = LIS.getInterval(DstReg);
544 VNInfo *DstVNI = DstLI.getVNInfoAt(Idx.getRegSlot());
545 assert(DstVNI && "Missing defined value");
546 assert(DstVNI->def == Idx.getRegSlot() && "Wrong copy def slot");
547
548 WorkList.push_back(std::make_pair(&DstLI, DstVNI));
549 }
550 continue;
551 }
552
553 // Erase spills.
554 int FI;
555 if (Reg == TII.isStoreToStackSlot(MI, FI) && FI == StackSlot) {
556 LLVM_DEBUG(dbgs() << "Redundant spill " << Idx << '\t' << MI);
557 // eliminateDeadDefs won't normally remove stores, so switch opcode.
558 MI.setDesc(TII.get(TargetOpcode::KILL));
559 DeadDefs.push_back(&MI);
560 ++NumSpillsRemoved;
561 if (HSpiller.rmFromMergeableSpills(MI, StackSlot))
562 --NumSpills;
563 }
564 }
565 } while (!WorkList.empty());
566}
567
568//===----------------------------------------------------------------------===//
569// Rematerialization
570//===----------------------------------------------------------------------===//
571
572/// markValueUsed - Remember that VNI failed to rematerialize, so its defining
573/// instruction cannot be eliminated. See through snippet copies
574void InlineSpiller::markValueUsed(LiveInterval *LI, VNInfo *VNI) {
576 WorkList.push_back(std::make_pair(LI, VNI));
577 do {
578 std::tie(LI, VNI) = WorkList.pop_back_val();
579 if (!UsedValues.insert(VNI).second)
580 continue;
581
582 if (VNI->isPHIDef()) {
583 MachineBasicBlock *MBB = LIS.getMBBFromIndex(VNI->def);
584 for (MachineBasicBlock *P : MBB->predecessors()) {
585 VNInfo *PVNI = LI->getVNInfoBefore(LIS.getMBBEndIdx(P));
586 if (PVNI)
587 WorkList.push_back(std::make_pair(LI, PVNI));
588 }
589 continue;
590 }
591
592 // Follow snippet copies.
593 MachineInstr *MI = LIS.getInstructionFromIndex(VNI->def);
594 if (!SnippetCopies.count(MI))
595 continue;
596 LiveInterval &SnipLI = LIS.getInterval(MI->getOperand(1).getReg());
597 assert(isRegToSpill(SnipLI.reg()) && "Unexpected register in copy");
598 VNInfo *SnipVNI = SnipLI.getVNInfoAt(VNI->def.getRegSlot(true));
599 assert(SnipVNI && "Snippet undefined before copy");
600 WorkList.push_back(std::make_pair(&SnipLI, SnipVNI));
601 } while (!WorkList.empty());
602}
603
604bool InlineSpiller::canGuaranteeAssignmentAfterRemat(Register VReg,
605 MachineInstr &MI) {
607 return true;
608 // Here's a quick explanation of the problem we're trying to handle here:
609 // * There are some pseudo instructions with more vreg uses than there are
610 // physical registers on the machine.
611 // * This is normally handled by spilling the vreg, and folding the reload
612 // into the user instruction. (Thus decreasing the number of used vregs
613 // until the remainder can be assigned to physregs.)
614 // * However, since we may try to spill vregs in any order, we can end up
615 // trying to spill each operand to the instruction, and then rematting it
616 // instead. When that happens, the new live intervals (for the remats) are
617 // expected to be trivially assignable (i.e. RS_Done). However, since we
618 // may have more remats than physregs, we're guaranteed to fail to assign
619 // one.
620 // At the moment, we only handle this for STATEPOINTs since they're the only
621 // pseudo op where we've seen this. If we start seeing other instructions
622 // with the same problem, we need to revisit this.
623 if (MI.getOpcode() != TargetOpcode::STATEPOINT)
624 return true;
625 // For STATEPOINTs we allow re-materialization for fixed arguments only hoping
626 // that number of physical registers is enough to cover all fixed arguments.
627 // If it is not true we need to revisit it.
628 for (unsigned Idx = StatepointOpers(&MI).getVarIdx(),
629 EndIdx = MI.getNumOperands();
630 Idx < EndIdx; ++Idx) {
631 MachineOperand &MO = MI.getOperand(Idx);
632 if (MO.isReg() && MO.getReg() == VReg)
633 return false;
634 }
635 return true;
636}
637
638/// hasPhysRegAvailable - Check if there is an available physical register for
639/// rematerialization.
640bool InlineSpiller::hasPhysRegAvailable(const MachineInstr &MI) {
641 if (!Order || !Matrix)
642 return false;
643
644 SlotIndex UseIdx = LIS.getInstructionIndex(MI).getRegSlot(true);
645 SlotIndex PrevIdx = UseIdx.getPrevSlot();
646
647 for (MCPhysReg PhysReg : *Order) {
648 if (!Matrix->checkInterference(PrevIdx, UseIdx, PhysReg))
649 return true;
650 }
651
652 return false;
653}
654
655/// reMaterializeFor - Attempt to rematerialize before MI instead of reloading.
656bool InlineSpiller::reMaterializeFor(LiveInterval &VirtReg, MachineInstr &MI) {
657 // Analyze instruction
659 VirtRegInfo RI = AnalyzeVirtRegInBundle(MI, VirtReg.reg(), &Ops);
660
661 // Defs without reads will be deleted if unused after remat is
662 // completed for other users of the virtual register.
663 if (!RI.Reads) {
664 LLVM_DEBUG(dbgs() << "\tskipping remat of def " << MI);
665 return false;
666 }
667
668 SlotIndex UseIdx = LIS.getInstructionIndex(MI).getRegSlot(true);
669 VNInfo *ParentVNI = VirtReg.getVNInfoAt(UseIdx.getBaseIndex());
670
671 if (!ParentVNI) {
672 LLVM_DEBUG(dbgs() << "\tadding <undef> flags: ");
673 for (MachineOperand &MO : MI.all_uses())
674 if (MO.getReg() == VirtReg.reg())
675 MO.setIsUndef();
676 LLVM_DEBUG(dbgs() << UseIdx << '\t' << MI);
677 return true;
678 }
679
680 // Snippets copies are ignored for remat, and will be deleted if they
681 // don't feed a live user after rematerialization completes.
682 if (SnippetCopies.count(&MI)) {
683 LLVM_DEBUG(dbgs() << "\tskipping remat snippet copy for " << UseIdx << '\t'
684 << MI);
685 return false;
686 }
687
688 LiveInterval &OrigLI = LIS.getInterval(Original);
689 VNInfo *OrigVNI = OrigLI.getVNInfoAt(UseIdx);
690 assert(OrigVNI && "corrupted sub-interval");
691 MachineInstr *DefMI = LIS.getInstructionFromIndex(OrigVNI->def);
692 // This can happen if for two reasons: 1) This could be a phi valno,
693 // or 2) the remat def has already been removed from the original
694 // live interval; this happens if we rematted to all uses, and
695 // then further split one of those live ranges.
696 if (!DefMI) {
697 // Try to find the rematerializable definition by tracing through COPY
698 // chains.
699 LiveInterval &LI = LIS.getInterval(VirtReg.reg());
700 VNInfo *CurVNI = LI.getVNInfoAt(UseIdx);
701 MachineInstr *CurDef = nullptr;
702
703 LLVM_DEBUG(dbgs() << "\ttracing COPY chain from "
704 << printReg(VirtReg.reg(), &TRI) << "\n");
705
706 // Trace backwards through COPY chain using VNInfo
707 while (CurVNI) {
708 CurDef = LIS.getInstructionFromIndex(CurVNI->def);
709
710 LLVM_DEBUG(dbgs() << "\t -> def at " << CurVNI->def << ": "
711 << (CurDef ? TII.getName(CurDef->getOpcode()) : "null")
712 << "\n");
713
714 if (!CurDef || !CurDef->isFullCopy())
715 break;
716
717 Register SrcReg = CurDef->getOperand(1).getReg();
718 if (!SrcReg.isVirtual())
719 break;
720 LLVM_DEBUG(dbgs() << "\t -> tracing through COPY to "
721 << printReg(SrcReg, &TRI) << "\n");
722 LiveInterval &SrcLI = LIS.getInterval(SrcReg);
723 CurVNI = SrcLI.getVNInfoBefore(CurVNI->def);
724 }
725 if (CurDef && TII.isReMaterializable(*CurDef)) {
726 DefMI = CurDef;
727 LLVM_DEBUG(dbgs() << "\tFound remat possibility through COPY chain: "
728 << *DefMI);
729 }
730 if (!DefMI) {
731 markValueUsed(&VirtReg, ParentVNI);
732 LLVM_DEBUG(dbgs() << "\tcannot remat missing def for " << UseIdx << '\t'
733 << MI);
734 return false;
735 }
736 }
737
738 LiveRangeEdit::Remat RM(ParentVNI);
739 RM.OrigMI = DefMI;
740 if (!Edit->canRematerializeAt(RM, UseIdx)) {
741 markValueUsed(&VirtReg, ParentVNI);
742 LLVM_DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << MI);
743 return false;
744 }
745
746 // If the instruction also writes VirtReg.reg, it had better not require the
747 // same register for uses and defs.
748 if (RI.Tied) {
749 markValueUsed(&VirtReg, ParentVNI);
750 LLVM_DEBUG(dbgs() << "\tcannot remat tied reg: " << UseIdx << '\t' << MI);
751 return false;
752 }
753
754 // Before rematerializing into a register for a single instruction, try to
755 // fold a load into the instruction. That avoids allocating a new register.
756 if (RM.OrigMI->canFoldAsLoad() &&
757 (RM.OrigMI->mayLoad() || !hasPhysRegAvailable(MI)) &&
758 foldMemoryOperand(Ops, RM.OrigMI)) {
759 Edit->markRematerialized(RM.ParentVNI);
760 ++NumFoldedLoads;
761 return true;
762 }
763
764 // If we can't guarantee that we'll be able to actually assign the new vreg,
765 // we can't remat.
766 if (!canGuaranteeAssignmentAfterRemat(VirtReg.reg(), MI)) {
767 markValueUsed(&VirtReg, ParentVNI);
768 LLVM_DEBUG(dbgs() << "\tcannot remat for " << UseIdx << '\t' << MI);
769 return false;
770 }
771
772 // Allocate a new register for the remat.
773 Register NewVReg = Edit->createFrom(Original);
774
775 // Constrain it to the register class of MI.
776 MRI.constrainRegClass(NewVReg, MRI.getRegClass(VirtReg.reg()));
777
778 // Compute which lanes of the virtual register are live at the use point.
779 LaneBitmask UsedLanes = LaneBitmask::getAll();
780 if (VirtReg.hasSubRanges()) {
781 UsedLanes = LaneBitmask::getNone();
782 for (const LiveInterval::SubRange &SR : VirtReg.subranges())
783 if (SR.liveAt(UseIdx))
784 UsedLanes |= SR.LaneMask;
785 }
786
787 // Finally we can rematerialize OrigMI before MI.
788 SlotIndex DefIdx = Edit->rematerializeAt(*MI.getParent(), MI, NewVReg, RM,
789 TRI, false, 0, nullptr, UsedLanes);
790
791 // We take the DebugLoc from MI, since OrigMI may be attributed to a
792 // different source location.
793 auto *NewMI = LIS.getInstructionFromIndex(DefIdx);
794 NewMI->setDebugLoc(MI.getDebugLoc());
795
796 (void)DefIdx;
797 LLVM_DEBUG(dbgs() << "\tremat: " << DefIdx << '\t'
798 << *LIS.getInstructionFromIndex(DefIdx));
799
800 // Replace operands
801 for (const auto &OpPair : Ops) {
802 MachineOperand &MO = OpPair.first->getOperand(OpPair.second);
803 if (MO.isReg() && MO.isUse() && MO.getReg() == VirtReg.reg()) {
804 MO.setReg(NewVReg);
805 MO.setIsKill();
806 }
807 }
808 LLVM_DEBUG(dbgs() << "\t " << UseIdx << '\t' << MI << '\n');
809
810 ++NumRemats;
811 return true;
812}
813
814/// reMaterializeAll - Try to rematerialize as many uses as possible,
815/// and trim the live ranges after.
816void InlineSpiller::reMaterializeAll() {
817 UsedValues.clear();
818
819 // Try to remat before all uses of snippets.
820 bool anyRemat = false;
821 for (Register Reg : RegsToSpill) {
822 LiveInterval &LI = LIS.getInterval(Reg);
823 for (MachineInstr &MI : llvm::make_early_inc_range(MRI.reg_bundles(Reg))) {
824 // Debug values are not allowed to affect codegen.
825 if (MI.isDebugValue())
826 continue;
827
828 assert(!MI.isDebugInstr() && "Did not expect to find a use in debug "
829 "instruction that isn't a DBG_VALUE");
830
831 anyRemat |= reMaterializeFor(LI, MI);
832 }
833 }
834 if (!anyRemat)
835 return;
836
837 // Remove any values that were completely rematted.
838 for (Register Reg : RegsToSpill) {
839 LiveInterval &LI = LIS.getInterval(Reg);
840 for (VNInfo *VNI : LI.vnis()) {
841 if (VNI->isUnused() || VNI->isPHIDef() || UsedValues.count(VNI))
842 continue;
843 MachineInstr *MI = LIS.getInstructionFromIndex(VNI->def);
844 MI->addRegisterDead(Reg, &TRI);
845 if (!MI->allDefsAreDead())
846 continue;
847 LLVM_DEBUG(dbgs() << "All defs dead: " << *MI);
848 DeadDefs.push_back(MI);
849 // If MI is a bundle header, also try removing copies inside the bundle,
850 // otherwise the verifier would complain "live range continues after dead
851 // def flag".
852 if (MI->isBundledWithSucc() && !MI->isBundledWithPred()) {
853 MachineBasicBlock::instr_iterator BeginIt = MI->getIterator(),
854 EndIt = MI->getParent()->instr_end();
855 ++BeginIt; // Skip MI that was already handled.
856
857 bool OnlyDeadCopies = true;
858 for (MachineBasicBlock::instr_iterator It = BeginIt;
859 It != EndIt && It->isBundledWithPred(); ++It) {
860
861 auto DestSrc = TII.isCopyInstr(*It);
862 bool IsCopyToDeadReg =
863 DestSrc && DestSrc->Destination->getReg() == Reg;
864 if (!IsCopyToDeadReg) {
865 OnlyDeadCopies = false;
866 break;
867 }
868 }
869 if (OnlyDeadCopies) {
870 for (MachineBasicBlock::instr_iterator It = BeginIt;
871 It != EndIt && It->isBundledWithPred(); ++It) {
872 It->addRegisterDead(Reg, &TRI);
873 LLVM_DEBUG(dbgs() << "All defs dead: " << *It);
874 DeadDefs.push_back(&*It);
875 }
876 }
877 }
878 }
879 }
880
881 // Eliminate dead code after remat. Note that some snippet copies may be
882 // deleted here.
883 if (DeadDefs.empty())
884 return;
885 LLVM_DEBUG(dbgs() << "Remat created " << DeadDefs.size() << " dead defs.\n");
886 Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
887
888 // LiveRangeEdit::eliminateDeadDef is used to remove dead define instructions
889 // after rematerialization. To remove a VNI for a vreg from its LiveInterval,
890 // LiveIntervals::removeVRegDefAt is used. However, after non-PHI VNIs are all
891 // removed, PHI VNI are still left in the LiveInterval.
892 // So to get rid of unused reg, we need to check whether it has non-dbg
893 // reference instead of whether it has non-empty interval.
894 unsigned ResultPos = 0;
895 for (Register Reg : RegsToSpill) {
896 if (MRI.reg_nodbg_empty(Reg)) {
897 Edit->eraseVirtReg(Reg);
898 RegsReplaced.push_back(Reg);
899 continue;
900 }
901
902 assert(LIS.hasInterval(Reg) &&
903 (!LIS.getInterval(Reg).empty() || !MRI.reg_nodbg_empty(Reg)) &&
904 "Empty and not used live-range?!");
905
906 RegsToSpill[ResultPos++] = Reg;
907 }
908 RegsToSpill.erase(RegsToSpill.begin() + ResultPos, RegsToSpill.end());
909 LLVM_DEBUG(dbgs() << RegsToSpill.size()
910 << " registers to spill after remat.\n");
911}
912
913//===----------------------------------------------------------------------===//
914// Spilling
915//===----------------------------------------------------------------------===//
916
917/// If MI is a load or store of StackSlot, it can be removed.
918bool InlineSpiller::coalesceStackAccess(MachineInstr *MI, Register Reg) {
919 int FI = 0;
920 Register InstrReg = TII.isLoadFromStackSlot(*MI, FI);
921 bool IsLoad = InstrReg.isValid();
922 if (!IsLoad)
923 InstrReg = TII.isStoreToStackSlot(*MI, FI);
924
925 // We have a stack access. Is it the right register and slot?
926 if (InstrReg != Reg || FI != StackSlot)
927 return false;
928
929 if (!IsLoad)
930 HSpiller.rmFromMergeableSpills(*MI, StackSlot);
931
932 LLVM_DEBUG(dbgs() << "Coalescing stack access: " << *MI);
933 LIS.RemoveMachineInstrFromMaps(*MI);
934 MI->eraseFromParent();
935
936 if (IsLoad) {
937 ++NumReloadsRemoved;
938 --NumReloads;
939 } else {
940 ++NumSpillsRemoved;
941 --NumSpills;
942 }
943
944 return true;
945}
946
947#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
949// Dump the range of instructions from B to E with their slot indexes.
952 LiveIntervals const &LIS,
953 const char *const header,
954 Register VReg = Register()) {
955 char NextLine = '\n';
956 char SlotIndent = '\t';
957
958 if (std::next(B) == E) {
959 NextLine = ' ';
960 SlotIndent = ' ';
961 }
962
963 dbgs() << '\t' << header << ": " << NextLine;
964
965 for (MachineBasicBlock::iterator I = B; I != E; ++I) {
967
968 // If a register was passed in and this instruction has it as a
969 // destination that is marked as an early clobber, print the
970 // early-clobber slot index.
971 if (VReg) {
972 MachineOperand *MO = I->findRegisterDefOperand(VReg, /*TRI=*/nullptr);
973 if (MO && MO->isEarlyClobber())
974 Idx = Idx.getRegSlot(true);
975 }
976
977 dbgs() << SlotIndent << Idx << '\t' << *I;
978 }
979}
980#endif
981
982/// foldMemoryOperand - Try folding stack slot references in Ops into their
983/// instructions.
984///
985/// @param Ops Operand indices from AnalyzeVirtRegInBundle().
986/// @param LoadMI Load instruction to use instead of stack slot when non-null.
987/// @return True on success.
988bool InlineSpiller::
989foldMemoryOperand(ArrayRef<std::pair<MachineInstr *, unsigned>> Ops,
990 MachineInstr *LoadMI) {
991 if (Ops.empty())
992 return false;
993 // Don't attempt folding in bundles.
994 MachineInstr *MI = Ops.front().first;
995 if (Ops.back().first != MI || MI->isBundled())
996 return false;
997
998 bool WasCopy = TII.isCopyInstr(*MI).has_value();
999 Register ImpReg;
1000
1001 // TII::foldMemoryOperand will do what we need here for statepoint
1002 // (fold load into use and remove corresponding def). We will replace
1003 // uses of removed def with loads (spillAroundUses).
1004 // For that to work we need to untie def and use to pass it through
1005 // foldMemoryOperand and signal foldPatchpoint that it is allowed to
1006 // fold them.
1007 bool UntieRegs = MI->getOpcode() == TargetOpcode::STATEPOINT;
1008
1009 // Spill subregs if the target allows it.
1010 // We always want to spill subregs for stackmap/patchpoint pseudos.
1011 bool SpillSubRegs = TII.isSubregFoldable() ||
1012 MI->getOpcode() == TargetOpcode::STATEPOINT ||
1013 MI->getOpcode() == TargetOpcode::PATCHPOINT ||
1014 MI->getOpcode() == TargetOpcode::STACKMAP;
1015
1016 // TargetInstrInfo::foldMemoryOperand only expects explicit, non-tied
1017 // operands.
1019 for (const auto &OpPair : Ops) {
1020 unsigned Idx = OpPair.second;
1021 assert(MI == OpPair.first && "Instruction conflict during operand folding");
1022 MachineOperand &MO = MI->getOperand(Idx);
1023
1024 // No point restoring an undef read, and we'll produce an invalid live
1025 // interval.
1026 // TODO: Is this really the correct way to handle undef tied uses?
1027 if (MO.isUse() && !MO.readsReg() && !MO.isTied())
1028 continue;
1029
1030 if (MO.isImplicit()) {
1031 ImpReg = MO.getReg();
1032 continue;
1033 }
1034
1035 if (!SpillSubRegs && MO.getSubReg())
1036 return false;
1037 // We cannot fold a load instruction into a def.
1038 if (LoadMI && MO.isDef())
1039 return false;
1040 // Tied use operands should not be passed to foldMemoryOperand.
1041 if (UntieRegs || !MI->isRegTiedToDefOperand(Idx))
1042 FoldOps.push_back(Idx);
1043 }
1044
1045 // If we only have implicit uses, we won't be able to fold that.
1046 // Moreover, TargetInstrInfo::foldMemoryOperand will assert if we try!
1047 if (FoldOps.empty())
1048 return false;
1049
1050 MachineInstrSpan MIS(MI, MI->getParent());
1051
1053 if (UntieRegs)
1054 for (unsigned Idx : FoldOps) {
1055 MachineOperand &MO = MI->getOperand(Idx);
1056 if (!MO.isTied())
1057 continue;
1058 unsigned Tied = MI->findTiedOperandIdx(Idx);
1059 if (MO.isUse())
1060 TiedOps.emplace_back(Tied, Idx);
1061 else {
1062 assert(MO.isDef() && "Tied to not use and def?");
1063 TiedOps.emplace_back(Idx, Tied);
1064 }
1065 MI->untieRegOperand(Idx);
1066 }
1067
1068 MachineInstr *CopyMI = nullptr;
1069 MachineInstr *FoldMI =
1070 LoadMI
1071 ? TII.foldMemoryOperand(*MI, FoldOps, *LoadMI, CopyMI, &LIS, &VRM)
1072 : TII.foldMemoryOperand(*MI, FoldOps, StackSlot, CopyMI, &LIS, &VRM);
1073 if (!FoldMI) {
1074 // Re-tie operands.
1075 for (auto Tied : TiedOps)
1076 MI->tieOperands(Tied.first, Tied.second);
1077 return false;
1078 }
1079
1080 // Remove LIS for any dead defs in the original MI not in FoldMI.
1081 for (MIBundleOperands MO(*MI); MO.isValid(); ++MO) {
1082 if (!MO->isReg())
1083 continue;
1084 Register Reg = MO->getReg();
1085 if (!Reg || Reg.isVirtual() || MRI.isReserved(Reg)) {
1086 continue;
1087 }
1088 // Skip non-Defs, including undef uses and internal reads.
1089 if (MO->isUse())
1090 continue;
1091 PhysRegInfo RI = AnalyzePhysRegInBundle(*FoldMI, Reg, &TRI);
1092 if (RI.FullyDefined)
1093 continue;
1094 // FoldMI does not define this physreg. Remove the LI segment.
1095 assert(MO->isDead() && "Cannot fold physreg def");
1096 SlotIndex Idx = LIS.getInstructionIndex(*MI).getRegSlot();
1097 LIS.removePhysRegDefAt(Reg.asMCReg(), Idx);
1098 }
1099
1100 int FI;
1101 if (TII.isStoreToStackSlot(*MI, FI) &&
1102 HSpiller.rmFromMergeableSpills(*MI, FI))
1103 --NumSpills;
1104 SlotIndex FoldIdx = LIS.ReplaceMachineInstrInMaps(*MI, *FoldMI);
1105 if (CopyMI) {
1106 SlotIndex CopyIdx = LIS.InsertMachineInstrInMaps(*CopyMI).getRegSlot();
1107 if (!MRI.isSSA()) {
1108 Register CopyDstReg = CopyMI->getOperand(0).getReg();
1109 LiveInterval &LI = LIS.getInterval(CopyDstReg);
1110
1111 // The addSegment below extends CopyDstReg's LiveInterval with a new
1112 // segment for the copy. If CopyDstReg is already assigned in the
1113 // LiveRegMatrix, we must unassign before the modification and reassign
1114 // after, so the matrix stays consistent with the updated interval.
1115 // This can happen when the fold target creates a copy
1116 // to preserve a source operand, defining a vreg that was already
1117 // allocated to a physreg.
1118 bool NeedMatrixReassign =
1119 Matrix && CopyDstReg.isVirtual() && VRM.hasPhys(CopyDstReg);
1120 MCRegister PhysReg;
1121 if (NeedMatrixReassign) {
1122 PhysReg = VRM.getPhys(CopyDstReg);
1123 Matrix->unassign(LI);
1124 }
1125
1126 VNInfo *VNI = LI.getNextValue(CopyIdx, LIS.getVNInfoAllocator());
1127 LI.addSegment(LiveRange::Segment(CopyIdx, FoldIdx.getRegSlot(), VNI));
1128
1129 if (NeedMatrixReassign)
1130 Matrix->assign(LI, PhysReg);
1131 }
1132 }
1133 // Update the call info.
1134 if (MI->isCandidateForAdditionalCallInfo())
1135 MI->getMF()->moveAdditionalCallInfo(MI, FoldMI);
1136
1137 // If we've folded a store into an instruction labelled with debug-info,
1138 // record a substitution from the old operand to the memory operand. Handle
1139 // the simple common case where operand 0 is the one being folded, plus when
1140 // the destination operand is also a tied def. More values could be
1141 // substituted / preserved with more analysis.
1142 if (MI->peekDebugInstrNum() && Ops[0].second == 0) {
1143 // Helper lambda.
1144 auto MakeSubstitution = [this,FoldMI,MI,&Ops]() {
1145 // Substitute old operand zero to the new instructions memory operand.
1146 unsigned OldOperandNum = Ops[0].second;
1147 unsigned NewNum = FoldMI->getDebugInstrNum();
1148 unsigned OldNum = MI->getDebugInstrNum();
1149 MF.makeDebugValueSubstitution({OldNum, OldOperandNum},
1151 };
1152
1153 const MachineOperand &Op0 = MI->getOperand(Ops[0].second);
1154 if (Ops.size() == 1 && Op0.isDef()) {
1155 MakeSubstitution();
1156 } else if (Ops.size() == 2 && Op0.isDef() && MI->getOperand(1).isTied() &&
1157 Op0.getReg() == MI->getOperand(1).getReg()) {
1158 MakeSubstitution();
1159 }
1160 } else if (MI->peekDebugInstrNum()) {
1161 // This is a debug-labelled instruction, but the operand being folded isn't
1162 // at operand zero. Most likely this means it's a load being folded in.
1163 // Substitute any register defs from operand zero up to the one being
1164 // folded -- past that point, we don't know what the new operand indexes
1165 // will be.
1166 MF.substituteDebugValuesForInst(*MI, *FoldMI, Ops[0].second);
1167 }
1168
1169 MI->eraseFromParent();
1170
1171 // Insert any new instructions other than FoldMI into the LIS maps.
1172 assert(!MIS.empty() && "Unexpected empty span of instructions!");
1173 for (MachineInstr &MI : MIS)
1174 if (&MI != FoldMI && &MI != CopyMI)
1176
1177 if (CopyMI) {
1178 Register R = CopyMI->getOperand(1).getReg();
1179 if (R.isVirtual()) {
1180 LiveInterval &LI = LIS.getInterval(R);
1181 LIS.shrinkToUses(&LI);
1182 } else {
1183 assert(MRI.isReserved(R) && "Unexpected PhysReg in source operand!");
1184 }
1185 }
1186
1187 // TII.foldMemoryOperand may have left some implicit operands on the
1188 // instruction. Strip them.
1189 if (ImpReg)
1190 for (unsigned i = FoldMI->getNumOperands(); i; --i) {
1191 MachineOperand &MO = FoldMI->getOperand(i - 1);
1192 if (!MO.isReg() || !MO.isImplicit())
1193 break;
1194 if (MO.getReg() == ImpReg)
1195 FoldMI->removeOperand(i - 1);
1196 }
1197
1198 LLVM_DEBUG(dumpMachineInstrRangeWithSlotIndex(MIS.begin(), MIS.end(), LIS,
1199 "folded"));
1200
1201 if (!WasCopy)
1202 ++NumFolded;
1203 else if (Ops.front().second == 0) {
1204 ++NumSpills;
1205 // If there is only 1 store instruction is required for spill, add it
1206 // to mergeable list. In X86 AMX, 2 intructions are required to store.
1207 // We disable the merge for this case.
1208 if (std::distance(MIS.begin(), MIS.end()) <= 1)
1209 HSpiller.addToMergeableSpills(*FoldMI, StackSlot, Original);
1210 } else
1211 ++NumReloads;
1212 return true;
1213}
1214
1215void InlineSpiller::insertReload(Register NewVReg,
1216 SlotIndex Idx,
1218 MachineBasicBlock &MBB = *MI->getParent();
1219
1220 MachineInstrSpan MIS(MI, &MBB);
1221 TII.loadRegFromStackSlot(MBB, MI, NewVReg, StackSlot,
1222 MRI.getRegClass(NewVReg), Register());
1223
1224 LIS.InsertMachineInstrRangeInMaps(MIS.begin(), MI);
1225
1226 LLVM_DEBUG(dumpMachineInstrRangeWithSlotIndex(MIS.begin(), MI, LIS, "reload",
1227 NewVReg));
1228 ++NumReloads;
1229}
1230
1231/// Check if \p Def fully defines a VReg with an undefined value.
1232/// If that's the case, that means the value of VReg is actually
1233/// not relevant.
1234static bool isRealSpill(const MachineInstr &Def) {
1235 if (!Def.isImplicitDef())
1236 return true;
1237
1238 // We can say that the VReg defined by Def is undef, only if it is
1239 // fully defined by Def. Otherwise, some of the lanes may not be
1240 // undef and the value of the VReg matters.
1241 return Def.getOperand(0).getSubReg();
1242}
1243
1244/// insertSpill - Insert a spill of NewVReg after MI.
1245void InlineSpiller::insertSpill(Register NewVReg, bool isKill,
1247 // Spill are not terminators, so inserting spills after terminators will
1248 // violate invariants in MachineVerifier.
1249 assert(!MI->isTerminator() && "Inserting a spill after a terminator");
1250 MachineBasicBlock &MBB = *MI->getParent();
1251
1252 MachineInstrSpan MIS(MI, &MBB);
1253 MachineBasicBlock::iterator SpillBefore = std::next(MI);
1254 bool IsRealSpill = isRealSpill(*MI);
1255
1256 if (IsRealSpill)
1257 TII.storeRegToStackSlot(MBB, SpillBefore, NewVReg, isKill, StackSlot,
1258 MRI.getRegClass(NewVReg), Register());
1259 else
1260 // Don't spill undef value.
1261 // Anything works for undef, in particular keeping the memory
1262 // uninitialized is a viable option and it saves code size and
1263 // run time.
1264 BuildMI(MBB, SpillBefore, MI->getDebugLoc(), TII.get(TargetOpcode::KILL))
1265 .addReg(NewVReg, getKillRegState(isKill));
1266
1268 LIS.InsertMachineInstrRangeInMaps(Spill, MIS.end());
1269 for (const MachineInstr &MI : make_range(Spill, MIS.end()))
1270 getVDefInterval(MI, LIS);
1271
1272 LLVM_DEBUG(
1273 dumpMachineInstrRangeWithSlotIndex(Spill, MIS.end(), LIS, "spill"));
1274 ++NumSpills;
1275 // If there is only 1 store instruction is required for spill, add it
1276 // to mergeable list. In X86 AMX, 2 intructions are required to store.
1277 // We disable the merge for this case.
1278 if (IsRealSpill && std::distance(Spill, MIS.end()) <= 1)
1279 HSpiller.addToMergeableSpills(*Spill, StackSlot, Original);
1280}
1281
1282/// spillAroundUses - insert spill code around each use of Reg.
1283void InlineSpiller::spillAroundUses(Register Reg) {
1284 LLVM_DEBUG(dbgs() << "spillAroundUses " << printReg(Reg) << '\n');
1285 LiveInterval &OldLI = LIS.getInterval(Reg);
1286
1287 // Iterate over instructions using Reg.
1288 for (MachineInstr &MI : llvm::make_early_inc_range(MRI.reg_bundles(Reg))) {
1289 // Debug values are not allowed to affect codegen.
1290 if (MI.isDebugValue()) {
1291 // Modify DBG_VALUE now that the value is in a spill slot.
1292 MachineBasicBlock *MBB = MI.getParent();
1293 LLVM_DEBUG(dbgs() << "Modifying debug info due to spill:\t" << MI);
1294 buildDbgValueForSpill(*MBB, &MI, MI, StackSlot, Reg);
1295 MBB->erase(MI);
1296 continue;
1297 }
1298
1299 assert(!MI.isDebugInstr() && "Did not expect to find a use in debug "
1300 "instruction that isn't a DBG_VALUE");
1301
1302 // Ignore copies to/from snippets. We'll delete them.
1303 if (SnippetCopies.count(&MI))
1304 continue;
1305
1306 // Stack slot accesses may coalesce away.
1307 if (coalesceStackAccess(&MI, Reg))
1308 continue;
1309
1310 // Analyze instruction.
1313
1314 // Find the slot index where this instruction reads and writes OldLI.
1315 // This is usually the def slot, except for tied early clobbers.
1317 if (VNInfo *VNI = OldLI.getVNInfoAt(Idx.getRegSlot(true)))
1318 if (SlotIndex::isSameInstr(Idx, VNI->def))
1319 Idx = VNI->def;
1320
1321 // Check for a sibling copy.
1322 Register SibReg = isCopyOfBundle(MI, Reg, TII);
1323 if (SibReg && isSibling(SibReg)) {
1324 // This may actually be a copy between snippets.
1325 if (isRegToSpill(SibReg)) {
1326 LLVM_DEBUG(dbgs() << "Found new snippet copy: " << MI);
1327 SnippetCopies.insert(&MI);
1328 continue;
1329 }
1330 if (RI.Writes) {
1331 if (hoistSpillInsideBB(OldLI, MI)) {
1332 // This COPY is now dead, the value is already in the stack slot.
1333 MI.getOperand(0).setIsDead();
1334 DeadDefs.push_back(&MI);
1335 continue;
1336 }
1337 } else {
1338 // This is a reload for a sib-reg copy. Drop spills downstream.
1339 LiveInterval &SibLI = LIS.getInterval(SibReg);
1340 eliminateRedundantSpills(SibLI, SibLI.getVNInfoAt(Idx));
1341 // The COPY will fold to a reload below.
1342 }
1343 }
1344
1345 // Attempt to fold memory ops.
1346 if (foldMemoryOperand(Ops))
1347 continue;
1348
1349 // Create a new virtual register for spill/fill.
1350 // FIXME: Infer regclass from instruction alone.
1351 Register NewVReg = Edit->createFrom(Reg);
1352
1353 if (RI.Reads)
1354 insertReload(NewVReg, Idx, &MI);
1355
1356 // Rewrite instruction operands.
1357 bool hasLiveDef = false;
1358 for (const auto &OpPair : Ops) {
1359 MachineOperand &MO = OpPair.first->getOperand(OpPair.second);
1360 MO.setReg(NewVReg);
1361 if (MO.isUse()) {
1362 if (!OpPair.first->isRegTiedToDefOperand(OpPair.second))
1363 MO.setIsKill();
1364 } else {
1365 if (!MO.isDead())
1366 hasLiveDef = true;
1367 }
1368 }
1369 LLVM_DEBUG(dbgs() << "\trewrite: " << Idx << '\t' << MI << '\n');
1370
1371 // FIXME: Use a second vreg if instruction has no tied ops.
1372 if (RI.Writes)
1373 if (hasLiveDef)
1374 insertSpill(NewVReg, true, &MI);
1375 }
1376}
1377
1378/// spillAll - Spill all registers remaining after rematerialization.
1379void InlineSpiller::spillAll() {
1380 // Update LiveStacks now that we are committed to spilling.
1381 if (StackSlot == VirtRegMap::NO_STACK_SLOT) {
1382 StackSlot = VRM.assignVirt2StackSlot(Original);
1383 StackInt = &LSS.getOrCreateInterval(StackSlot, MRI.getRegClass(Original));
1384 StackInt->getNextValue(SlotIndex(), LSS.getVNInfoAllocator());
1385 } else
1386 StackInt = &LSS.getInterval(StackSlot);
1387
1388 if (Original != Edit->getReg())
1389 VRM.assignVirt2StackSlot(Edit->getReg(), StackSlot);
1390
1391 assert(StackInt->getNumValNums() == 1 && "Bad stack interval values");
1392 for (Register Reg : RegsToSpill)
1393 StackInt->MergeSegmentsInAsValue(LIS.getInterval(Reg),
1394 StackInt->getValNumInfo(0));
1395 LLVM_DEBUG(dbgs() << "Merged spilled regs: " << *StackInt << '\n');
1396
1397 // Spill around uses of all RegsToSpill.
1398 for (Register Reg : RegsToSpill) {
1399 spillAroundUses(Reg);
1400 // Assign all of the spilled registers to the slot so that
1401 // LiveDebugVariables knows about these locations later on.
1402 if (VRM.getStackSlot(Reg) == VirtRegMap::NO_STACK_SLOT)
1403 VRM.assignVirt2StackSlot(Reg, StackSlot);
1404 }
1405
1406 // Hoisted spills may cause dead code.
1407 if (!DeadDefs.empty()) {
1408 LLVM_DEBUG(dbgs() << "Eliminating " << DeadDefs.size() << " dead defs\n");
1409 Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
1410 }
1411
1412 // Finally delete the SnippetCopies.
1413 for (Register Reg : RegsToSpill) {
1414 for (MachineInstr &MI :
1415 llvm::make_early_inc_range(MRI.reg_instructions(Reg))) {
1416 assert(SnippetCopies.count(&MI) && "Remaining use wasn't a snippet copy");
1417 // FIXME: Do this with a LiveRangeEdit callback.
1419 MI.eraseFromBundle();
1420 }
1421 }
1422
1423 // Delete all spilled registers.
1424 for (Register Reg : RegsToSpill)
1425 Edit->eraseVirtReg(Reg);
1426}
1427
1428void InlineSpiller::spill(LiveRangeEdit &edit, AllocationOrder *order) {
1429 ++NumSpilledRanges;
1430 Edit = &edit;
1431 Order = order;
1432 assert(!edit.getReg().isStack() && "Trying to spill a stack slot.");
1433 // Share a stack slot among all descendants of Original.
1434 Original = VRM.getOriginal(edit.getReg());
1435 StackSlot = VRM.getStackSlot(Original);
1436 StackInt = nullptr;
1437
1438 LLVM_DEBUG(dbgs() << "Inline spilling "
1439 << TRI.getRegClassName(MRI.getRegClass(edit.getReg()))
1440 << ':' << edit.getParent() << "\nFrom original "
1441 << printReg(Original) << '\n');
1442 assert(edit.getParent().isSpillable() &&
1443 "Attempting to spill already spilled value.");
1444 assert(DeadDefs.empty() && "Previous spill didn't remove dead defs");
1445
1446 collectRegsToSpill();
1447 reMaterializeAll();
1448
1449 // Remat may handle everything.
1450 if (!RegsToSpill.empty())
1451 spillAll();
1452
1453 Edit->calculateRegClassAndHint(MF, VRAI);
1454}
1455
1456/// Optimizations after all the reg selections and spills are done.
1457void InlineSpiller::postOptimization() { HSpiller.hoistAllSpills(); }
1458
1459/// When a spill is inserted, add the spill to MergeableSpills map.
1460void HoistSpillHelper::addToMergeableSpills(MachineInstr &Spill, int StackSlot,
1461 Register Original) {
1463 LiveInterval &OrigLI = LIS.getInterval(Original);
1464 // save a copy of LiveInterval in StackSlotToOrigLI because the original
1465 // LiveInterval may be cleared after all its references are spilled.
1466
1467 auto [Place, Inserted] = StackSlotToOrigLI.try_emplace(StackSlot);
1468 if (Inserted) {
1469 auto LI = std::make_unique<LiveInterval>(OrigLI.reg(), OrigLI.weight());
1470 LI->assign(OrigLI, Allocator);
1471 Place->second = std::move(LI);
1472 }
1473
1474 SlotIndex Idx = LIS.getInstructionIndex(Spill);
1475 VNInfo *OrigVNI = Place->second->getVNInfoAt(Idx.getRegSlot());
1476 std::pair<int, VNInfo *> MIdx = std::make_pair(StackSlot, OrigVNI);
1477 MergeableSpills[MIdx].insert(&Spill);
1478}
1479
1480/// When a spill is removed, remove the spill from MergeableSpills map.
1481/// Return true if the spill is removed successfully.
1482bool HoistSpillHelper::rmFromMergeableSpills(MachineInstr &Spill,
1483 int StackSlot) {
1484 auto It = StackSlotToOrigLI.find(StackSlot);
1485 if (It == StackSlotToOrigLI.end())
1486 return false;
1487 SlotIndex Idx = LIS.getInstructionIndex(Spill);
1488 VNInfo *OrigVNI = It->second->getVNInfoAt(Idx.getRegSlot());
1489 std::pair<int, VNInfo *> MIdx = std::make_pair(StackSlot, OrigVNI);
1490 return MergeableSpills[MIdx].erase(&Spill);
1491}
1492
1493/// Check BB to see if it is a possible target BB to place a hoisted spill,
1494/// i.e., there should be a living sibling of OrigReg at the insert point.
1495bool HoistSpillHelper::isSpillCandBB(LiveInterval &OrigLI, VNInfo &OrigVNI,
1496 MachineBasicBlock &BB, Register &LiveReg) {
1497 SlotIndex Idx = IPA.getLastInsertPoint(OrigLI, BB);
1498 // The original def could be after the last insert point in the root block,
1499 // we can't hoist to here.
1500 if (Idx < OrigVNI.def) {
1501 // TODO: We could be better here. If LI is not alive in landing pad
1502 // we could hoist spill after LIP.
1503 LLVM_DEBUG(dbgs() << "can't spill in root block - def after LIP\n");
1504 return false;
1505 }
1506 Register OrigReg = OrigLI.reg();
1507 SmallSetVector<Register, 16> &Siblings = Virt2SiblingsMap[OrigReg];
1508 assert(OrigLI.getVNInfoAt(Idx) == &OrigVNI && "Unexpected VNI");
1509
1510 for (const Register &SibReg : Siblings) {
1511 LiveInterval &LI = LIS.getInterval(SibReg);
1512 if (!LI.getVNInfoAt(Idx))
1513 continue;
1514 // All of the sub-ranges should be alive at the prospective slot index.
1515 // Otherwise, we might risk storing unrelated / compromised values from some
1516 // sub-registers to the spill slot.
1517 if (all_of(LI.subranges(), [&](const LiveInterval::SubRange &SR) {
1518 return SR.getVNInfoAt(Idx) != nullptr;
1519 })) {
1520 LiveReg = SibReg;
1521 return true;
1522 }
1523 }
1524 return false;
1525}
1526
1527/// Remove redundant spills in the same BB. Save those redundant spills in
1528/// SpillsToRm, and save the spill to keep and its BB in SpillBBToSpill map.
1529void HoistSpillHelper::rmRedundantSpills(
1533 // For each spill saw, check SpillBBToSpill[] and see if its BB already has
1534 // another spill inside. If a BB contains more than one spill, only keep the
1535 // earlier spill with smaller SlotIndex.
1536 for (auto *const CurrentSpill : Spills) {
1537 MachineBasicBlock *Block = CurrentSpill->getParent();
1538 MachineDomTreeNode *Node = MDT.getNode(Block);
1539 MachineInstr *PrevSpill = SpillBBToSpill[Node];
1540 if (PrevSpill) {
1541 SlotIndex PIdx = LIS.getInstructionIndex(*PrevSpill);
1542 SlotIndex CIdx = LIS.getInstructionIndex(*CurrentSpill);
1543 MachineInstr *SpillToRm = (CIdx > PIdx) ? CurrentSpill : PrevSpill;
1544 MachineInstr *SpillToKeep = (CIdx > PIdx) ? PrevSpill : CurrentSpill;
1545 SpillsToRm.push_back(SpillToRm);
1546 SpillBBToSpill[MDT.getNode(Block)] = SpillToKeep;
1547 } else {
1548 SpillBBToSpill[MDT.getNode(Block)] = CurrentSpill;
1549 }
1550 }
1551 for (auto *const SpillToRm : SpillsToRm)
1552 Spills.erase(SpillToRm);
1553}
1554
1555/// Starting from \p Root find a top-down traversal order of the dominator
1556/// tree to visit all basic blocks containing the elements of \p Spills.
1557/// Redundant spills will be found and put into \p SpillsToRm at the same
1558/// time. \p SpillBBToSpill will be populated as part of the process and
1559/// maps a basic block to the first store occurring in the basic block.
1560/// \post SpillsToRm.union(Spills\@post) == Spills\@pre
1561void HoistSpillHelper::getVisitOrders(
1567 // The set contains all the possible BB nodes to which we may hoist
1568 // original spills.
1570 // Save the BB nodes on the path from the first BB node containing
1571 // non-redundant spill to the Root node.
1573 // All the spills to be hoisted must originate from a single def instruction
1574 // to the OrigReg. It means the def instruction should dominate all the spills
1575 // to be hoisted. We choose the BB where the def instruction is located as
1576 // the Root.
1577 MachineDomTreeNode *RootIDomNode = MDT[Root]->getIDom();
1578 // For every node on the dominator tree with spill, walk up on the dominator
1579 // tree towards the Root node until it is reached. If there is other node
1580 // containing spill in the middle of the path, the previous spill saw will
1581 // be redundant and the node containing it will be removed. All the nodes on
1582 // the path starting from the first node with non-redundant spill to the Root
1583 // node will be added to the WorkSet, which will contain all the possible
1584 // locations where spills may be hoisted to after the loop below is done.
1585 for (auto *const Spill : Spills) {
1586 MachineBasicBlock *Block = Spill->getParent();
1588 MachineInstr *SpillToRm = nullptr;
1589 while (Node != RootIDomNode) {
1590 // If Node dominates Block, and it already contains a spill, the spill in
1591 // Block will be redundant.
1592 if (Node != MDT[Block] && SpillBBToSpill[Node]) {
1593 SpillToRm = SpillBBToSpill[MDT[Block]];
1594 break;
1595 /// If we see the Node already in WorkSet, the path from the Node to
1596 /// the Root node must already be traversed by another spill.
1597 /// Then no need to repeat.
1598 } else if (WorkSet.count(Node)) {
1599 break;
1600 } else {
1601 NodesOnPath.insert(Node);
1602 }
1603 Node = Node->getIDom();
1604 }
1605 if (SpillToRm) {
1606 SpillsToRm.push_back(SpillToRm);
1607 } else {
1608 // Add a BB containing the original spills to SpillsToKeep -- i.e.,
1609 // set the initial status before hoisting start. The value of BBs
1610 // containing original spills is set to 0, in order to descriminate
1611 // with BBs containing hoisted spills which will be inserted to
1612 // SpillsToKeep later during hoisting.
1613 SpillsToKeep[MDT[Block]] = Register();
1614 WorkSet.insert_range(NodesOnPath);
1615 }
1616 NodesOnPath.clear();
1617 }
1618
1619 // Sort the nodes in WorkSet in top-down order and save the nodes
1620 // in Orders. Orders will be used for hoisting in runHoistSpills.
1621 unsigned idx = 0;
1622 Orders.push_back(MDT.getNode(Root));
1623 do {
1624 MachineDomTreeNode *Node = Orders[idx++];
1625 for (MachineDomTreeNode *Child : Node->children()) {
1626 if (WorkSet.count(Child))
1627 Orders.push_back(Child);
1628 }
1629 } while (idx != Orders.size());
1630 assert(Orders.size() == WorkSet.size() &&
1631 "Orders have different size with WorkSet");
1632
1633#ifndef NDEBUG
1634 LLVM_DEBUG(dbgs() << "Orders size is " << Orders.size() << "\n");
1636 for (; RIt != Orders.rend(); RIt++)
1637 LLVM_DEBUG(dbgs() << "BB" << (*RIt)->getBlock()->getNumber() << ",");
1638 LLVM_DEBUG(dbgs() << "\n");
1639#endif
1640}
1641
1642/// Try to hoist spills according to BB hotness. The spills to removed will
1643/// be saved in \p SpillsToRm. The spills to be inserted will be saved in
1644/// \p SpillsToIns.
1645void HoistSpillHelper::runHoistSpills(
1646 LiveInterval &OrigLI, VNInfo &OrigVNI,
1650 // Visit order of dominator tree nodes.
1652 // SpillsToKeep contains all the nodes where spills are to be inserted
1653 // during hoisting. If the spill to be inserted is an original spill
1654 // (not a hoisted one), the value of the map entry is 0. If the spill
1655 // is a hoisted spill, the value of the map entry is the VReg to be used
1656 // as the source of the spill.
1658 // Map from BB to the first spill inside of it.
1660
1661 rmRedundantSpills(Spills, SpillsToRm, SpillBBToSpill);
1662
1663 MachineBasicBlock *Root = LIS.getMBBFromIndex(OrigVNI.def);
1664 getVisitOrders(Root, Spills, Orders, SpillsToRm, SpillsToKeep,
1665 SpillBBToSpill);
1666
1667 // SpillsInSubTreeMap keeps the map from a dom tree node to a pair of
1668 // nodes set and the cost of all the spills inside those nodes.
1669 // The nodes set are the locations where spills are to be inserted
1670 // in the subtree of current node.
1671 using NodesCostPair =
1672 std::pair<SmallPtrSet<MachineDomTreeNode *, 16>, BlockFrequency>;
1674
1675 // Iterate Orders set in reverse order, which will be a bottom-up order
1676 // in the dominator tree. Once we visit a dom tree node, we know its
1677 // children have already been visited and the spill locations in the
1678 // subtrees of all the children have been determined.
1680 for (; RIt != Orders.rend(); RIt++) {
1681 MachineBasicBlock *Block = (*RIt)->getBlock();
1682
1683 // If Block contains an original spill, simply continue.
1684 if (auto It = SpillsToKeep.find(*RIt);
1685 It != SpillsToKeep.end() && !It->second) {
1686 auto &SIt = SpillsInSubTreeMap[*RIt];
1687 SIt.first.insert(*RIt);
1688 // Sit.second contains the cost of spill.
1689 SIt.second = MBFI.getBlockFreq(Block);
1690 continue;
1691 }
1692
1693 // Collect spills in subtree of current node (*RIt) to
1694 // SpillsInSubTreeMap[*RIt].first.
1695 for (MachineDomTreeNode *Child : (*RIt)->children()) {
1696 if (!SpillsInSubTreeMap.contains(Child))
1697 continue;
1698 // The stmt:
1699 // "auto &[SpillsInSubTree, SubTreeCost] = SpillsInSubTreeMap[*RIt]"
1700 // below should be placed before getting the begin and end iterators of
1701 // SpillsInSubTreeMap[Child].first, or else the iterators may be
1702 // invalidated when SpillsInSubTreeMap[*RIt] is seen the first time
1703 // and the map grows and then the original buckets in the map are moved.
1704 auto &[SpillsInSubTree, SubTreeCost] = SpillsInSubTreeMap[*RIt];
1705 auto ChildIt = SpillsInSubTreeMap.find(Child);
1706 SubTreeCost += ChildIt->second.second;
1707 auto BI = ChildIt->second.first.begin();
1708 auto EI = ChildIt->second.first.end();
1709 SpillsInSubTree.insert(BI, EI);
1710 SpillsInSubTreeMap.erase(ChildIt);
1711 }
1712
1713 auto &[SpillsInSubTree, SubTreeCost] = SpillsInSubTreeMap[*RIt];
1714 // No spills in subtree, simply continue.
1715 if (SpillsInSubTree.empty())
1716 continue;
1717
1718 // Check whether Block is a possible candidate to insert spill.
1719 Register LiveReg;
1720 if (!isSpillCandBB(OrigLI, OrigVNI, *Block, LiveReg))
1721 continue;
1722
1723 // If there are multiple spills that could be merged, bias a little
1724 // to hoist the spill.
1725 BranchProbability MarginProb = (SpillsInSubTree.size() > 1)
1726 ? BranchProbability(9, 10)
1727 : BranchProbability(1, 1);
1728 if (SubTreeCost > MBFI.getBlockFreq(Block) * MarginProb) {
1729 // Hoist: Move spills to current Block.
1730 for (auto *const SpillBB : SpillsInSubTree) {
1731 // When SpillBB is a BB contains original spill, insert the spill
1732 // to SpillsToRm.
1733 if (auto It = SpillsToKeep.find(SpillBB);
1734 It != SpillsToKeep.end() && !It->second) {
1735 MachineInstr *SpillToRm = SpillBBToSpill[SpillBB];
1736 SpillsToRm.push_back(SpillToRm);
1737 }
1738 // SpillBB will not contain spill anymore, remove it from SpillsToKeep.
1739 SpillsToKeep.erase(SpillBB);
1740 }
1741 // Current Block is the BB containing the new hoisted spill. Add it to
1742 // SpillsToKeep. LiveReg is the source of the new spill.
1743 SpillsToKeep[*RIt] = LiveReg;
1744 LLVM_DEBUG({
1745 dbgs() << "spills in BB: ";
1746 for (const auto Rspill : SpillsInSubTree)
1747 dbgs() << Rspill->getBlock()->getNumber() << " ";
1748 dbgs() << "were promoted to BB" << (*RIt)->getBlock()->getNumber()
1749 << "\n";
1750 });
1751 SpillsInSubTree.clear();
1752 SpillsInSubTree.insert(*RIt);
1753 SubTreeCost = MBFI.getBlockFreq(Block);
1754 }
1755 }
1756 // For spills in SpillsToKeep with LiveReg set (i.e., not original spill),
1757 // save them to SpillsToIns.
1758 for (const auto &Ent : SpillsToKeep) {
1759 if (Ent.second)
1760 SpillsToIns[Ent.first->getBlock()] = Ent.second;
1761 }
1762}
1763
1764/// For spills with equal values, remove redundant spills and hoist those left
1765/// to less hot spots.
1766///
1767/// Spills with equal values will be collected into the same set in
1768/// MergeableSpills when spill is inserted. These equal spills are originated
1769/// from the same defining instruction and are dominated by the instruction.
1770/// Before hoisting all the equal spills, redundant spills inside in the same
1771/// BB are first marked to be deleted. Then starting from the spills left, walk
1772/// up on the dominator tree towards the Root node where the define instruction
1773/// is located, mark the dominated spills to be deleted along the way and
1774/// collect the BB nodes on the path from non-dominated spills to the define
1775/// instruction into a WorkSet. The nodes in WorkSet are the candidate places
1776/// where we are considering to hoist the spills. We iterate the WorkSet in
1777/// bottom-up order, and for each node, we will decide whether to hoist spills
1778/// inside its subtree to that node. In this way, we can get benefit locally
1779/// even if hoisting all the equal spills to one cold place is impossible.
1780void HoistSpillHelper::hoistAllSpills() {
1781 SmallVector<Register, 4> NewVRegs;
1782 LiveRangeEdit Edit(nullptr, NewVRegs, MF, LIS, &VRM, this);
1783
1784 for (unsigned i = 0, e = MRI.getNumVirtRegs(); i != e; ++i) {
1786 Register Original = VRM.getPreSplitReg(Reg);
1787 if (!MRI.def_empty(Reg) && Original.isValid())
1788 Virt2SiblingsMap[Original].insert(Reg);
1789 }
1790
1791 // Each entry in MergeableSpills contains a spill set with equal values.
1792 for (auto &Ent : MergeableSpills) {
1793 int Slot = Ent.first.first;
1794 LiveInterval &OrigLI = *StackSlotToOrigLI[Slot];
1795 VNInfo *OrigVNI = Ent.first.second;
1796 SmallPtrSet<MachineInstr *, 16> &EqValSpills = Ent.second;
1797 if (Ent.second.empty())
1798 continue;
1799
1800 LLVM_DEBUG({
1801 dbgs() << "\nFor Slot" << Slot << " and VN" << OrigVNI->id << ":\n"
1802 << "Equal spills in BB: ";
1803 for (const auto spill : EqValSpills)
1804 dbgs() << spill->getParent()->getNumber() << " ";
1805 dbgs() << "\n";
1806 });
1807
1808 // SpillsToRm is the spill set to be removed from EqValSpills.
1810 // SpillsToIns is the spill set to be newly inserted after hoisting.
1812
1813 runHoistSpills(OrigLI, *OrigVNI, EqValSpills, SpillsToRm, SpillsToIns);
1814
1815 LLVM_DEBUG({
1816 dbgs() << "Finally inserted spills in BB: ";
1817 for (const auto &Ispill : SpillsToIns)
1818 dbgs() << Ispill.first->getNumber() << " ";
1819 dbgs() << "\nFinally removed spills in BB: ";
1820 for (const auto Rspill : SpillsToRm)
1821 dbgs() << Rspill->getParent()->getNumber() << " ";
1822 dbgs() << "\n";
1823 });
1824
1825 // Stack live range update.
1826 LiveInterval &StackIntvl = LSS.getInterval(Slot);
1827 if (!SpillsToIns.empty() || !SpillsToRm.empty())
1828 StackIntvl.MergeValueInAsValue(OrigLI, OrigVNI,
1829 StackIntvl.getValNumInfo(0));
1830
1831 // Insert hoisted spills.
1832 for (auto const &Insert : SpillsToIns) {
1833 MachineBasicBlock *BB = Insert.first;
1834 Register LiveReg = Insert.second;
1835 MachineBasicBlock::iterator MII = IPA.getLastInsertPointIter(OrigLI, *BB);
1836 MachineInstrSpan MIS(MII, BB);
1837 TII.storeRegToStackSlot(*BB, MII, LiveReg, false, Slot,
1838 MRI.getRegClass(LiveReg), Register());
1839 LIS.InsertMachineInstrRangeInMaps(MIS.begin(), MII);
1840 for (const MachineInstr &MI : make_range(MIS.begin(), MII))
1841 getVDefInterval(MI, LIS);
1842 ++NumSpills;
1843 }
1844
1845 // Remove redundant spills or change them to dead instructions.
1846 NumSpills -= SpillsToRm.size();
1847 for (auto *const RMEnt : SpillsToRm) {
1848 RMEnt->setDesc(TII.get(TargetOpcode::KILL));
1849 for (unsigned i = RMEnt->getNumOperands(); i; --i) {
1850 MachineOperand &MO = RMEnt->getOperand(i - 1);
1851 if (MO.isReg() && MO.isImplicit() && MO.isDef() && !MO.isDead())
1852 RMEnt->removeOperand(i - 1);
1853 }
1854 }
1855 Edit.eliminateDeadDefs(SpillsToRm, {});
1856 }
1857
1858 // Flush vregs that were unassigned from the matrix during shrinking but
1859 // were not split (so LRE_DidCloneVirtReg never re-assigned them).
1860 for (auto &[VReg, PhysReg] : PendingReassignments) {
1861 assert(Matrix && LIS.hasInterval(VReg) &&
1862 "Pending reassignment without matrix or live interval");
1863 Matrix->assign(LIS.getInterval(VReg), PhysReg);
1864 }
1865 PendingReassignments.clear();
1866}
1867
1868/// Called when a virtual register's live interval is about to be shrunk.
1869/// Unassign from the matrix so the shrunk interval can be re-assigned by a
1870/// later LRE_DidCloneVirtReg or by hoistAllSpills' flush, and stash the
1871/// physreg in PendingReassignments since the unassign clears VRM.
1872void HoistSpillHelper::LRE_WillShrinkVirtReg(Register VirtReg) {
1873 if (!Matrix || !VRM.hasPhys(VirtReg) || !LIS.hasInterval(VirtReg))
1874 return;
1875
1876 MCRegister PhysReg = VRM.getPhys(VirtReg);
1877 LiveInterval &LI = LIS.getInterval(VirtReg);
1878 Matrix->unassign(LI, /*ClearAllReferencingSegments=*/true);
1879 PendingReassignments[VirtReg] = PhysReg;
1880}
1881
1882/// Called before a virtual register is erased from LiveIntervals.
1883/// Forcibly remove the register from LiveRegMatrix before it's deleted,
1884/// preventing dangling pointers.
1885bool HoistSpillHelper::LRE_CanEraseVirtReg(Register VirtReg) {
1886 PendingReassignments.erase(VirtReg);
1887 if (Matrix && VRM.hasPhys(VirtReg)) {
1888 const LiveInterval &LI = LIS.getInterval(VirtReg);
1889 Matrix->unassign(LI, /*ClearAllReferencingSegments=*/true);
1890 }
1891 return true; // Allow deletion to proceed
1892}
1893
1894/// For VirtReg clone, the \p New register should have the same physreg or
1895/// stackslot as the \p old register.
1896void HoistSpillHelper::LRE_DidCloneVirtReg(Register New, Register Old) {
1897 // New is freshly created by LiveRangeEdit::eliminateDeadDefs and its interval
1898 // is guaranteed to exist on every path below.
1899 assert(LIS.hasInterval(New) && "Cloned vreg without live interval");
1900
1901 auto PendingIt = PendingReassignments.find(Old);
1902 if (PendingIt != PendingReassignments.end()) {
1903 // Old was already unassigned in LRE_WillShrinkVirtReg, which only
1904 // enrolls vregs when Matrix is non-null and the interval exists.
1905 assert(Matrix && LIS.hasInterval(Old) &&
1906 "Pending reassignment without matrix or live interval");
1907 MCRegister PhysReg = PendingIt->second;
1908 PendingReassignments.erase(PendingIt);
1909
1910 // Reassign both Old (with its shrunk interval) and New to the matrix.
1911 Matrix->assign(LIS.getInterval(Old), PhysReg);
1912 Matrix->assign(LIS.getInterval(New), PhysReg);
1913 } else if (VRM.hasPhys(Old)) {
1914 MCRegister PhysReg = VRM.getPhys(Old);
1915 if (Matrix) {
1916 if (LIS.hasInterval(Old)) {
1917 const LiveInterval &LI = LIS.getInterval(Old);
1918 // Drop stale pre-clone segments before reassigning Old's current LI.
1919 Matrix->unassign(LI, /*ClearAllReferencingSegments=*/true);
1920 Matrix->assign(LI, PhysReg);
1921 }
1922 Matrix->assign(LIS.getInterval(New), PhysReg);
1923 } else {
1924 VRM.assignVirt2Phys(New, PhysReg);
1925 }
1926 } else if (VRM.getStackSlot(Old) != VirtRegMap::NO_STACK_SLOT) {
1927 VRM.assignVirt2StackSlot(New, VRM.getStackSlot(Old));
1928 } else {
1929 llvm_unreachable("VReg should be assigned either physreg or stackslot");
1930 }
1931 if (VRM.hasShape(Old))
1932 VRM.assignVirt2Shape(New, VRM.getShape(Old));
1933}
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
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:661
This file defines the DenseMap class.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
static LLVM_DUMP_METHOD void dumpMachineInstrRangeWithSlotIndex(MachineBasicBlock::iterator B, MachineBasicBlock::iterator E, LiveIntervals const &LIS, const char *const header, Register VReg=Register())
static Register isCopyOfBundle(const MachineInstr &FirstMI, Register Reg, const TargetInstrInfo &TII)
Check for a copy bundle as formed by SplitKit.
static bool isRealSpill(const MachineInstr &Def)
Check if Def fully defines a VReg with an undefined value.
static cl::opt< bool > RestrictStatepointRemat("restrict-statepoint-remat", cl::init(false), cl::Hidden, cl::desc("Restrict remat for statepoint operands"))
static Register isCopyOf(const MachineInstr &MI, Register Reg, const TargetInstrInfo &TII)
isFullCopyOf - If MI is a COPY to or from Reg, return the other register, otherwise return 0.
static void getVDefInterval(const MachineInstr &MI, LiveIntervals &LIS)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Live Register Matrix
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
This file implements a map that provides insertion order iteration.
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define P(N)
Basic Register Allocator
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
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:119
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:178
bool erase(const KeyT &Val)
Definition DenseMap.h:332
iterator end()
Definition DenseMap.h:85
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:169
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:239
Register getReg() const
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Store the specified register of the given register class to the specified stack frame index.
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
TargetInstrInfo overrides.
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Load the specified register of the given register class from the specified stack frame index.
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
If the specified machine instruction is a direct store to a stack slot, return the virtual or physica...
Determines the latest safe point in a block in which we can insert a split, spill or other instructio...
Definition SplitKit.h:50
A live range for subregisters.
LiveInterval - This class represents the liveness of a register, or stack slot.
float weight() const
Register reg() const
bool isSpillable() const
isSpillable - Can this interval be spilled?
bool hasSubRanges() const
Returns true if subregister liveness information is available.
iterator_range< subrange_iterator > subranges()
bool hasInterval(Register Reg) const
SlotIndex InsertMachineInstrInMaps(MachineInstr &MI)
SlotIndexes * getSlotIndexes() const
SlotIndex getInstructionIndex(const MachineInstr &Instr) const
Returns the base index of the given instruction.
VNInfo::Allocator & getVNInfoAllocator()
LiveInterval & getInterval(Register Reg)
void InsertMachineInstrRangeInMaps(MachineBasicBlock::iterator B, MachineBasicBlock::iterator E)
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 removePhysRegDefAt(MCRegister Reg, SlotIndex Pos)
Remove value numbers and related live segments starting at position Pos that are part of any liverang...
MachineBasicBlock * getMBBFromIndex(SlotIndex index) const
SlotIndex ReplaceMachineInstrInMaps(MachineInstr &MI, MachineInstr &NewMI)
Result of a LiveRange query.
bool isKill() const
Return true if the live-in value is killed by this instruction.
Callback methods for LiveRangeEdit owners.
const LiveInterval & getParent() const
Register getReg() const
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.
LLVM_ABI void MergeValueInAsValue(const LiveRange &RHS, const VNInfo *RHSValNo, VNInfo *LHSValNo)
MergeValueInAsValue - Merge all of the segments of a specific val# in RHS into this live range as the...
iterator_range< vni_iterator > vnis()
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,...
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
VNInfo * getNextValue(SlotIndex Def, VNInfo::Allocator &VNInfoAllocator)
getNextValue - Create a new value number and return it.
void assign(const LiveRange &Other, BumpPtrAllocator &Allocator)
Copies values numbers and live segments from Other into this range.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
MIBundleOperands - Iterate over all operands in a bundle of machine instructions.
LLVM_ABI iterator SkipPHIsLabelsAndDebug(iterator I, Register Reg=Register(), bool SkipPseudoOp=true)
Return the first instruction in MBB after I that is not a PHI, label or debug.
Instructions::iterator instr_iterator
Instructions::const_iterator const_instr_iterator
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
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...
static const unsigned int DebugOperandMemNumber
A reserved operand number representing the instructions memory operand, for instructions that have a ...
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
MachineInstrSpan provides an interface to get an iteration range containing the instruction it was in...
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
unsigned getNumOperands() const
Retuns the total number of operands.
bool isBundledWithPred() const
Return true if this instruction is part of a bundle, and it is not the first instruction in the bundl...
bool isFullCopy() const
LLVM_ABI void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
bool isBundledWithSucc() const
Return true if this instruction is part of a bundle, and it is not the last instruction in the bundle...
LLVM_ABI unsigned getDebugInstrNum()
Fetch the instruction number of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
bool isBundled() const
Return true if this instruction part of a bundle.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
bool readsReg() const
readsReg - Returns true if this operand reads the previous value of its register.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
void setIsUndef(bool Val=true)
bool isEarlyClobber() const
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
defusechain_instr_iterator< true, true, true, false > reg_bundle_nodbg_iterator
reg_bundle_nodbg_iterator/reg_bundle_nodbg_begin/reg_bundle_nodbg_end - Walk all defs and uses of the...
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:38
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isStack() const
Return true if this is a stack slot.
Definition Register.h:46
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Definition Register.h:72
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
Definition Register.h:107
constexpr bool isValid() const
Definition Register.h:112
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
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 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.
LLVM_ABI void removeSingleMachineInstrFromMaps(MachineInstr &MI)
Removes a single machine instruction MI from the mapping.
size_type size() const
Definition SmallPtrSet.h:99
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
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.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:339
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
std::reverse_iterator< iterator > reverse_iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Spiller interface.
Definition Spiller.h:33
virtual ~Spiller()=0
Register getReg() const
MI-level Statepoint operands.
Definition StackMaps.h:159
LLVM_ABI bool isFoldableReg(Register Reg) const
Return true if Reg is used only in operands which can be folded to stack usage.
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
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.
static constexpr int NO_STACK_SLOT
Definition VirtRegMap.h:66
self_iterator getIterator()
Definition ilist_node.h:123
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1738
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr RegState getKillRegState(bool B)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI PhysRegInfo AnalyzePhysRegInBundle(const MachineInstr &MI, Register Reg, const TargetRegisterInfo *TRI)
AnalyzePhysRegInBundle - Analyze how the current instruction or bundle uses a physical register.
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:633
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI Spiller * createInlineSpiller(const Spiller::RequiredAnalyses &Analyses, MachineFunction &MF, VirtRegMap &VRM, VirtRegAuxInfo &VRAI, LiveRegMatrix *Matrix=nullptr)
Create and return a spiller that will insert spill code directly instead of deferring though VirtRegM...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI VirtRegInfo AnalyzeVirtRegInBundle(MachineInstr &MI, Register Reg, SmallVectorImpl< std::pair< MachineInstr *, unsigned > > *Ops=nullptr)
AnalyzeVirtRegInBundle - Analyze how the current instruction or bundle uses a virtual register.
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
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 >
LLVM_ABI MachineInstr * buildDbgValueForSpill(MachineBasicBlock &BB, MachineBasicBlock::iterator I, const MachineInstr &Orig, int FrameIndex, Register SpillReg)
Clone a DBG_VALUE whose value has been spilled to FrameIndex.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1946
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.
static constexpr LaneBitmask getAll()
Definition LaneBitmask.h:82
static constexpr LaneBitmask getNone()
Definition LaneBitmask.h:81
Remat - Information needed to rematerialize at a specific location.
This represents a simple continuous liveness interval for a value.
Information about how a physical register Reg is used by a set of operands.
bool FullyDefined
Reg or a super-register is defined.
VirtRegInfo - Information about a virtual register used by a set of operands.
bool Reads
Reads - One of the operands read the virtual register.
bool Tied
Tied - Uses and defs must use the same register.
bool Writes
Writes - One of the operands writes the virtual register.