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