LLVM 23.0.0git
MachineBasicBlock.cpp
Go to the documentation of this file.
1//===-- llvm/CodeGen/MachineBasicBlock.cpp ----------------------*- C++ -*-===//
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// Collect the sequence of machine instructions for a basic block.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/STLExtras.h"
31#include "llvm/Config/llvm-config.h"
32#include "llvm/IR/BasicBlock.h"
34#include "llvm/MC/MCAsmInfo.h"
35#include "llvm/MC/MCContext.h"
36#include "llvm/Support/Debug.h"
39#include <algorithm>
40#include <cmath>
41using namespace llvm;
42
43#define DEBUG_TYPE "codegen"
44
46 "print-slotindexes",
47 cl::desc("When printing machine IR, annotate instructions and blocks with "
48 "SlotIndexes when available"),
49 cl::init(true), cl::Hidden);
50
51MachineBasicBlock::MachineBasicBlock(MachineFunction &MF, const BasicBlock *B)
52 : BB(B), Number(-1), xParent(&MF) {
53 Insts.Parent = this;
54 if (B)
55 IrrLoopHeaderWeight = B->getIrrLoopHeaderWeight();
56}
57
58MachineBasicBlock::~MachineBasicBlock() = default;
59
60/// Return the MCSymbol for this basic block.
62 if (!CachedMCSymbol) {
63 const MachineFunction *MF = getParent();
64 MCContext &Ctx = MF->getContext();
65
66 // We emit a non-temporary symbol -- with a descriptive name -- if it begins
67 // a section (with basic block sections). Otherwise we fall back to use temp
68 // label.
69 if (MF->hasBBSections() && isBeginSection()) {
70 SmallString<5> Suffix;
71 if (SectionID == MBBSectionID::ColdSectionID) {
72 Suffix += ".cold";
73 } else if (SectionID == MBBSectionID::ExceptionSectionID) {
74 Suffix += ".eh";
75 } else {
76 // For symbols that represent basic block sections, we add ".__part." to
77 // allow tools like symbolizers to know that this represents a part of
78 // the original function.
79 Suffix = (Suffix + Twine(".__part.") + Twine(SectionID.Number)).str();
80 }
81 CachedMCSymbol = Ctx.getOrCreateSymbol(MF->getName() + Suffix);
82 } else {
83 // If the block occurs as label in inline assembly, parsing the assembly
84 // needs an actual label name => set AlwaysEmit in these cases.
85 CachedMCSymbol = Ctx.createBlockSymbol(
86 "BB" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber()),
87 /*AlwaysEmit=*/hasLabelMustBeEmitted());
88 }
89 }
90 return CachedMCSymbol;
91}
92
94 if (!CachedEHContMCSymbol) {
95 const MachineFunction *MF = getParent();
96 SmallString<128> SymbolName;
97 raw_svector_ostream(SymbolName)
98 << "$ehgcr_" << MF->getFunctionNumber() << '_' << getNumber();
99 CachedEHContMCSymbol = MF->getContext().getOrCreateSymbol(SymbolName);
100 }
101 return CachedEHContMCSymbol;
102}
103
105 if (!CachedEndMCSymbol) {
106 const MachineFunction *MF = getParent();
107 MCContext &Ctx = MF->getContext();
108 CachedEndMCSymbol = Ctx.createBlockSymbol(
109 "BB_END" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber()),
110 /*AlwaysEmit=*/false);
111 }
112 return CachedEndMCSymbol;
113}
114
116 MBB.print(OS);
117 return OS;
118}
119
121 return Printable([&MBB](raw_ostream &OS) { return MBB.printAsOperand(OS); });
122}
123
124/// When an MBB is added to an MF, we need to update the parent pointer of the
125/// MBB, the MBB numbering, and any instructions in the MBB to be on the right
126/// operand list for registers.
127///
128/// MBBs start out as #-1. When a MBB is added to a MachineFunction, it
129/// gets the next available unique MBB number. If it is removed from a
130/// MachineFunction, it goes back to being #-1.
133 MachineFunction &MF = *N->getParent();
134 N->Number = MF.addToMBBNumbering(N);
135
136 // Make sure the instructions have their operands in the reginfo lists.
138 for (MachineInstr &MI : N->instrs())
139 MI.addRegOperandsToUseLists(RegInfo);
140}
141
144 N->getParent()->removeFromMBBNumbering(N->Number);
145 N->Number = -1;
146}
147
148/// When we add an instruction to a basic block list, we update its parent
149/// pointer and add its operands from reg use/def lists if appropriate.
151 assert(!N->getParent() && "machine instruction already in a basic block");
152 N->setParent(Parent);
153
154 // Add the instruction's register operands to their corresponding
155 // use/def lists.
156 MachineFunction *MF = Parent->getParent();
157 N->addRegOperandsToUseLists(MF->getRegInfo());
158 MF->handleInsertion(*N);
159}
160
161/// When we remove an instruction from a basic block list, we update its parent
162/// pointer and remove its operands from reg use/def lists if appropriate.
164 assert(N->getParent() && "machine instruction not in a basic block");
165
166 // Remove from the use/def lists.
167 if (MachineFunction *MF = N->getMF()) {
168 MF->handleRemoval(*N);
169 N->removeRegOperandsFromUseLists(MF->getRegInfo());
170 }
171
172 N->setParent(nullptr);
173}
174
175/// When moving a range of instructions from one MBB list to another, we need to
176/// update the parent pointers and the use/def lists.
178 instr_iterator First,
179 instr_iterator Last) {
180 assert(Parent->getParent() == FromList.Parent->getParent() &&
181 "cannot transfer MachineInstrs between MachineFunctions");
182
183 // If it's within the same BB, there's nothing to do.
184 if (this == &FromList)
185 return;
186
187 assert(Parent != FromList.Parent && "Two lists have the same parent?");
188
189 // If splicing between two blocks within the same function, just update the
190 // parent pointers.
191 for (; First != Last; ++First)
192 First->setParent(Parent);
193}
194
196 assert(!MI->getParent() && "MI is still in a block!");
197 Parent->getParent()->deleteMachineInstr(MI);
198}
199
202 while (I != E && I->isPHI())
203 ++I;
204 assert((I == E || !I->isInsideBundle()) &&
205 "First non-phi MI cannot be inside a bundle!");
206 return I;
207}
208
212
213 iterator E = end();
214 while (I != E && (I->isPHI() || I->isPosition() ||
215 TII->isBasicBlockPrologue(*I)))
216 ++I;
217 // FIXME: This needs to change if we wish to bundle labels
218 // inside the bundle.
219 assert((I == E || !I->isInsideBundle()) &&
220 "First non-phi / non-label instruction is inside a bundle!");
221 return I;
222}
223
226 Register Reg, bool SkipPseudoOp) {
228
229 iterator E = end();
230 while (I != E && (I->isPHI() || I->isPosition() || I->isDebugInstr() ||
231 (SkipPseudoOp && I->isPseudoProbe()) ||
232 TII->isBasicBlockPrologue(*I, Reg)))
233 ++I;
234 // FIXME: This needs to change if we wish to bundle labels / dbg_values
235 // inside the bundle.
236 assert((I == E || !I->isInsideBundle()) &&
237 "First non-phi / non-label / non-debug "
238 "instruction is inside a bundle!");
239 return I;
240}
241
243 iterator B = begin(), E = end(), I = E;
244 while (I != B && ((--I)->isTerminator() || I->isDebugInstr()))
245 ; /*noop */
246 while (I != E && !I->isTerminator())
247 ++I;
248 return I;
249}
250
252 instr_iterator B = instr_begin(), E = instr_end(), I = E;
253 while (I != B && ((--I)->isTerminator() || I->isDebugInstr()))
254 ; /*noop */
255 while (I != E && !I->isTerminator())
256 ++I;
257 return I;
258}
259
261 return find_if(instrs(), [](auto &II) { return II.isTerminator(); });
262}
263
266 // Skip over begin-of-block dbg_value instructions.
267 return skipDebugInstructionsForward(begin(), end(), SkipPseudoOp);
268}
269
272 // Skip over end-of-block dbg_value instructions.
274 while (I != B) {
275 --I;
276 // Return instruction that starts a bundle.
277 if (I->isDebugInstr() || I->isInsideBundle())
278 continue;
279 if (SkipPseudoOp && I->isPseudoProbe())
280 continue;
281 return I;
282 }
283 // The block is all debug values.
284 return end();
285}
286
288 for (const MachineBasicBlock *Succ : successors())
289 if (Succ->isEHPad())
290 return true;
291 return false;
292}
293
295 return getParent()->begin() == getIterator();
296}
297
298#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
302#endif
303
305 for (const MachineBasicBlock *Succ : successors()) {
306 if (Succ->isInlineAsmBrIndirectTarget())
307 return true;
308 }
309 return false;
310}
311
314 return false;
315 return true;
316}
317
319 if (const BasicBlock *LBB = getBasicBlock())
320 return LBB->hasName();
321 return false;
322}
323
325 if (const BasicBlock *LBB = getBasicBlock())
326 return LBB->getName();
327 else
328 return StringRef("", 0);
329}
330
331/// Return a hopefully unique identifier for this block.
333 std::string Name;
334 if (getParent())
335 Name = (getParent()->getName() + ":").str();
336 if (getBasicBlock())
337 Name += getBasicBlock()->getName();
338 else
339 Name += ("BB" + Twine(getNumber())).str();
340 return Name;
341}
342
344 bool IsStandalone) const {
345 const MachineFunction *MF = getParent();
346 if (!MF) {
347 OS << "Can't print out MachineBasicBlock because parent MachineFunction"
348 << " is null\n";
349 return;
350 }
351 const Function &F = MF->getFunction();
352 const Module *M = F.getParent();
353 ModuleSlotTracker MST(M);
355 print(OS, MST, Indexes, IsStandalone);
356}
357
359 const SlotIndexes *Indexes,
360 bool IsStandalone) const {
361 const MachineFunction *MF = getParent();
362 if (!MF) {
363 OS << "Can't print out MachineBasicBlock because parent MachineFunction"
364 << " is null\n";
365 return;
366 }
367
368 if (Indexes && PrintSlotIndexes)
369 OS << Indexes->getMBBStartIdx(this) << '\t';
370
372 OS << ":\n";
373
375 const MachineRegisterInfo &MRI = MF->getRegInfo();
377 bool HasLineAttributes = false;
378
379 // Print the preds of this block according to the CFG.
380 if (!pred_empty() && IsStandalone) {
381 if (Indexes) OS << '\t';
382 // Don't indent(2), align with previous line attributes.
383 OS << "; predecessors: ";
384 ListSeparator LS;
385 for (auto *Pred : predecessors())
386 OS << LS << printMBBReference(*Pred);
387 OS << '\n';
388 HasLineAttributes = true;
389 }
390
391 if (!succ_empty()) {
392 if (Indexes) OS << '\t';
393 // Print the successors
394 OS.indent(2) << "successors: ";
395 ListSeparator LS;
396 for (auto I = succ_begin(), E = succ_end(); I != E; ++I) {
397 OS << LS << printMBBReference(**I);
398 if (!Probs.empty())
399 OS << '('
400 << format("0x%08" PRIx32, getSuccProbability(I).getNumerator())
401 << ')';
402 }
403 if (!Probs.empty() && IsStandalone) {
404 // Print human readable probabilities as comments.
405 OS << "; ";
406 ListSeparator LS;
407 for (auto I = succ_begin(), E = succ_end(); I != E; ++I) {
409 OS << LS << printMBBReference(**I) << '('
410 << format("%.2f%%",
411 rint(((double)BP.getNumerator() / BP.getDenominator()) *
412 100.0 * 100.0) /
413 100.0)
414 << ')';
415 }
416 }
417
418 OS << '\n';
419 HasLineAttributes = true;
420 }
421
422 if (!livein_empty() && MRI.tracksLiveness()) {
423 if (Indexes) OS << '\t';
424 OS.indent(2) << "liveins: ";
425
426 ListSeparator LS;
427 for (const auto &LI : liveins()) {
428 OS << LS << printReg(LI.PhysReg, TRI);
429 if (!LI.LaneMask.all())
430 OS << ":0x" << PrintLaneMask(LI.LaneMask);
431 }
432 HasLineAttributes = true;
433 }
434
435 if (HasLineAttributes)
436 OS << '\n';
437
438 bool IsInBundle = false;
439 for (const MachineInstr &MI : instrs()) {
440 if (Indexes && PrintSlotIndexes) {
441 if (Indexes->hasIndex(MI))
442 OS << Indexes->getInstructionIndex(MI);
443 OS << '\t';
444 }
445
446 if (IsInBundle && !MI.isInsideBundle()) {
447 OS.indent(2) << "}\n";
448 IsInBundle = false;
449 }
450
451 OS.indent(IsInBundle ? 4 : 2);
452 MI.print(OS, MST, IsStandalone, /*SkipOpers=*/false, /*SkipDebugLoc=*/false,
453 /*AddNewLine=*/false, &TII);
454
455 if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) {
456 OS << " {";
457 IsInBundle = true;
458 }
459 OS << '\n';
460 }
461
462 if (IsInBundle)
463 OS.indent(2) << "}\n";
464
465 if (IrrLoopHeaderWeight && IsStandalone) {
466 if (Indexes) OS << '\t';
467 OS.indent(2) << "; Irreducible loop header weight: " << *IrrLoopHeaderWeight
468 << '\n';
469 }
470}
471
472/// Print the basic block's name as:
473///
474/// bb.{number}[.{ir-name}] [(attributes...)]
475///
476/// The {ir-name} is only printed when the \ref PrintNameIr flag is passed
477/// (which is the default). If the IR block has no name, it is identified
478/// numerically using the attribute syntax as "(%ir-block.{ir-slot})".
479///
480/// When the \ref PrintNameAttributes flag is passed, additional attributes
481/// of the block are printed when set.
482///
483/// \param printNameFlags Combination of \ref PrintNameFlag flags indicating
484/// the parts to print.
485/// \param moduleSlotTracker Optional ModuleSlotTracker. This method will
486/// incorporate its own tracker when necessary to
487/// determine the block's IR name.
488void MachineBasicBlock::printName(raw_ostream &os, unsigned printNameFlags,
489 ModuleSlotTracker *moduleSlotTracker) const {
490 os << "bb." << getNumber();
491 bool hasAttributes = false;
492
493 auto PrintBBRef = [&](const BasicBlock *bb) {
494 os << "%ir-block.";
495 if (bb->hasName()) {
496 os << bb->getName();
497 } else {
498 int slot = -1;
499
500 if (moduleSlotTracker) {
501 slot = moduleSlotTracker->getLocalSlot(bb);
502 } else if (bb->getParent()) {
503 ModuleSlotTracker tmpTracker(bb->getModule(), false);
504 tmpTracker.incorporateFunction(*bb->getParent());
505 slot = tmpTracker.getLocalSlot(bb);
506 }
507
508 if (slot == -1)
509 os << "<ir-block badref>";
510 else
511 os << slot;
512 }
513 };
514
515 if (printNameFlags & PrintNameIr) {
516 if (const auto *bb = getBasicBlock()) {
517 if (bb->hasName()) {
518 os << '.' << bb->getName();
519 } else {
520 hasAttributes = true;
521 os << " (";
522 PrintBBRef(bb);
523 }
524 }
525 }
526
527 if (printNameFlags & PrintNameAttributes) {
529 os << (hasAttributes ? ", " : " (");
530 os << "machine-block-address-taken";
531 hasAttributes = true;
532 }
533 if (isIRBlockAddressTaken()) {
534 os << (hasAttributes ? ", " : " (");
535 os << "ir-block-address-taken ";
536 PrintBBRef(getAddressTakenIRBlock());
537 hasAttributes = true;
538 }
539 if (isEHPad()) {
540 os << (hasAttributes ? ", " : " (");
541 os << "landing-pad";
542 hasAttributes = true;
543 }
545 os << (hasAttributes ? ", " : " (");
546 os << "inlineasm-br-indirect-target";
547 hasAttributes = true;
548 }
549 if (isEHFuncletEntry()) {
550 os << (hasAttributes ? ", " : " (");
551 os << "ehfunclet-entry";
552 hasAttributes = true;
553 }
554 if (isEHScopeEntry()) {
555 os << (hasAttributes ? ", " : " (");
556 os << "ehscope-entry";
557 hasAttributes = true;
558 }
559 if (getAlignment() != Align(1)) {
560 os << (hasAttributes ? ", " : " (");
561 os << "align " << getAlignment().value();
562 hasAttributes = true;
563 }
564 if (getSectionID() != MBBSectionID(0)) {
565 os << (hasAttributes ? ", " : " (");
566 os << "bbsections ";
567 switch (getSectionID().Type) {
569 os << "Exception";
570 break;
572 os << "Cold";
573 break;
574 default:
575 os << getSectionID().Number;
576 }
577 hasAttributes = true;
578 }
579 if (getBBID().has_value()) {
580 os << (hasAttributes ? ", " : " (");
581 os << "bb_id " << getBBID()->BaseID;
582 if (getBBID()->CloneID != 0)
583 os << " " << getBBID()->CloneID;
584 hasAttributes = true;
585 }
586 if (CallFrameSize != 0) {
587 os << (hasAttributes ? ", " : " (");
588 os << "call-frame-size " << CallFrameSize;
589 hasAttributes = true;
590 }
591 }
592
593 if (hasAttributes)
594 os << ')';
595}
596
598 bool /*PrintType*/) const {
599 OS << '%';
600 printName(OS, 0);
601}
602
604 assert(Reg.isPhysical());
605 LiveInVector::iterator I = find_if(
606 LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
607 if (I == LiveIns.end())
608 return;
609
610 I->LaneMask &= ~LaneMask;
611 if (I->LaneMask.none())
612 LiveIns.erase(I);
613}
614
616 const MachineFunction *MF = getParent();
618 // Remove Reg and its subregs from live in set.
619 for (MCPhysReg S : TRI->subregs_inclusive(Reg))
620 removeLiveIn(S);
621
622 // Remove live-in bitmask in super registers as well.
623 for (MCPhysReg Super : TRI->superregs(Reg)) {
624 for (MCSubRegIndexIterator SRI(Super, TRI); SRI.isValid(); ++SRI) {
625 if (Reg == SRI.getSubReg()) {
626 unsigned SubRegIndex = SRI.getSubRegIndex();
627 LaneBitmask SubRegLaneMask = TRI->getSubRegIndexLaneMask(SubRegIndex);
628 removeLiveIn(Super, SubRegLaneMask);
629 break;
630 }
631 }
632 }
633}
634
637 // Get non-const version of iterator.
638 LiveInVector::iterator LI = LiveIns.begin() + (I - LiveIns.begin());
639 return LiveIns.erase(LI);
640}
641
643 assert(Reg.isPhysical());
645 LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
646 return I != livein_end() && (I->LaneMask & LaneMask).any();
647}
648
650 llvm::sort(LiveIns,
651 [](const RegisterMaskPair &LI0, const RegisterMaskPair &LI1) {
652 return LI0.PhysReg < LI1.PhysReg;
653 });
654 // Liveins are sorted by physreg now we can merge their lanemasks.
655 LiveInVector::const_iterator I = LiveIns.begin();
656 LiveInVector::const_iterator J;
657 LiveInVector::iterator Out = LiveIns.begin();
658 for (; I != LiveIns.end(); ++Out, I = J) {
659 MCRegister PhysReg = I->PhysReg;
660 LaneBitmask LaneMask = I->LaneMask;
661 for (J = std::next(I); J != LiveIns.end() && J->PhysReg == PhysReg; ++J)
662 LaneMask |= J->LaneMask;
663 Out->PhysReg = PhysReg;
664 Out->LaneMask = LaneMask;
665 }
666 LiveIns.erase(Out, LiveIns.end());
667}
668
671 assert(getParent() && "MBB must be inserted in function");
672 assert(PhysReg.isPhysical() && "Expected physreg");
673 assert(RC && "Register class is required");
674 assert((isEHPad() || this == &getParent()->front()) &&
675 "Only the entry block and landing pads can have physreg live ins");
676
677 bool LiveIn = isLiveIn(PhysReg);
681
682 // Look for an existing copy.
683 if (LiveIn)
684 for (;I != E && I->isCopy(); ++I)
685 if (I->getOperand(1).getReg() == PhysReg) {
686 Register VirtReg = I->getOperand(0).getReg();
687 if (!MRI.constrainRegClass(VirtReg, RC))
688 llvm_unreachable("Incompatible live-in register class.");
689 return VirtReg;
690 }
691
692 // No luck, create a virtual register.
693 Register VirtReg = MRI.createVirtualRegister(RC);
694 BuildMI(*this, I, DebugLoc(), TII.get(TargetOpcode::COPY), VirtReg)
695 .addReg(PhysReg, RegState::Kill);
696 if (!LiveIn)
697 addLiveIn(PhysReg);
698 return VirtReg;
699}
700
701void MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) {
702 getParent()->splice(NewAfter->getIterator(), getIterator());
703}
704
705void MachineBasicBlock::moveAfter(MachineBasicBlock *NewBefore) {
706 getParent()->splice(++NewBefore->getIterator(), getIterator());
707}
708
710 MachineBasicBlock::const_iterator TerminatorI = MBB.getFirstTerminator();
711 if (TerminatorI == MBB.end())
712 return -1;
713 const MachineInstr &Terminator = *TerminatorI;
714 const TargetInstrInfo *TII = MBB.getParent()->getSubtarget().getInstrInfo();
715 return TII->getJumpTableIndex(Terminator);
716}
717
719 MachineBasicBlock *PreviousLayoutSuccessor) {
720 LLVM_DEBUG(dbgs() << "Updating terminators on " << printMBBReference(*this)
721 << "\n");
722
724 // A block with no successors has no concerns with fall-through edges.
725 if (this->succ_empty())
726 return;
727
728 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
731 bool B = TII->analyzeBranch(*this, TBB, FBB, Cond);
732 (void) B;
733 assert(!B && "UpdateTerminators requires analyzable predecessors!");
734 if (Cond.empty()) {
735 if (TBB) {
736 // The block has an unconditional branch. If its successor is now its
737 // layout successor, delete the branch.
739 TII->removeBranch(*this);
740 } else {
741 // The block has an unconditional fallthrough, or the end of the block is
742 // unreachable.
743
744 // Unfortunately, whether the end of the block is unreachable is not
745 // immediately obvious; we must fall back to checking the successor list,
746 // and assuming that if the passed in block is in the succesor list and
747 // not an EHPad, it must be the intended target.
748 if (!PreviousLayoutSuccessor || !isSuccessor(PreviousLayoutSuccessor) ||
749 PreviousLayoutSuccessor->isEHPad())
750 return;
751
752 // If the unconditional successor block is not the current layout
753 // successor, insert a branch to jump to it.
754 if (!isLayoutSuccessor(PreviousLayoutSuccessor))
755 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
756 }
757 return;
758 }
759
760 if (FBB) {
761 // The block has a non-fallthrough conditional branch. If one of its
762 // successors is its layout successor, rewrite it to a fallthrough
763 // conditional branch.
764 if (isLayoutSuccessor(TBB)) {
765 if (TII->reverseBranchCondition(Cond))
766 return;
767 TII->removeBranch(*this);
768 TII->insertBranch(*this, FBB, nullptr, Cond, DL);
769 } else if (isLayoutSuccessor(FBB)) {
770 TII->removeBranch(*this);
771 TII->insertBranch(*this, TBB, nullptr, Cond, DL);
772 }
773 return;
774 }
775
776 // We now know we're going to fallthrough to PreviousLayoutSuccessor.
777 assert(PreviousLayoutSuccessor);
778 assert(!PreviousLayoutSuccessor->isEHPad());
779 assert(isSuccessor(PreviousLayoutSuccessor));
780
781 if (PreviousLayoutSuccessor == TBB) {
782 // We had a fallthrough to the same basic block as the conditional jump
783 // targets. Remove the conditional jump, leaving an unconditional
784 // fallthrough or an unconditional jump.
785 TII->removeBranch(*this);
786 if (!isLayoutSuccessor(TBB)) {
787 Cond.clear();
788 TII->insertBranch(*this, TBB, nullptr, Cond, DL);
789 }
790 return;
791 }
792
793 // The block has a fallthrough conditional branch.
794 if (isLayoutSuccessor(TBB)) {
795 if (TII->reverseBranchCondition(Cond)) {
796 // We can't reverse the condition, add an unconditional branch.
797 Cond.clear();
798 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
799 return;
800 }
801 TII->removeBranch(*this);
802 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
803 } else if (!isLayoutSuccessor(PreviousLayoutSuccessor)) {
804 TII->removeBranch(*this);
805 TII->insertBranch(*this, TBB, PreviousLayoutSuccessor, Cond, DL);
806 }
807}
808
810#ifndef NDEBUG
811 int64_t Sum = 0;
812 for (auto Prob : Probs)
813 Sum += Prob.getNumerator();
814 // Due to precision issue, we assume that the sum of probabilities is one if
815 // the difference between the sum of their numerators and the denominator is
816 // no greater than the number of successors.
818 Probs.size() &&
819 "The sum of successors's probabilities exceeds one.");
820#endif // NDEBUG
821}
822
823void MachineBasicBlock::addSuccessor(MachineBasicBlock *Succ,
824 BranchProbability Prob) {
825 // Probability list is either empty (if successor list isn't empty, this means
826 // disabled optimization) or has the same size as successor list.
827 if (!(Probs.empty() && !Successors.empty()))
828 Probs.push_back(Prob);
829 Successors.push_back(Succ);
830 Succ->addPredecessor(this);
831}
832
833void MachineBasicBlock::addSuccessorWithoutProb(MachineBasicBlock *Succ) {
834 // We need to make sure probability list is either empty or has the same size
835 // of successor list. When this function is called, we can safely delete all
836 // probability in the list.
837 Probs.clear();
838 Successors.push_back(Succ);
839 Succ->addPredecessor(this);
840}
841
842void MachineBasicBlock::splitSuccessor(MachineBasicBlock *Old,
843 MachineBasicBlock *New,
844 bool NormalizeSuccProbs) {
845 succ_iterator OldI = llvm::find(successors(), Old);
846 assert(OldI != succ_end() && "Old is not a successor of this block!");
848 "New is already a successor of this block!");
849
850 // Add a new successor with equal probability as the original one. Note
851 // that we directly copy the probability using the iterator rather than
852 // getting a potentially synthetic probability computed when unknown. This
853 // preserves the probabilities as-is and then we can renormalize them and
854 // query them effectively afterward.
855 addSuccessor(New, Probs.empty() ? BranchProbability::getUnknown()
856 : *getProbabilityIterator(OldI));
857 if (NormalizeSuccProbs)
859}
860
861void MachineBasicBlock::removeSuccessor(MachineBasicBlock *Succ,
862 bool NormalizeSuccProbs) {
863 succ_iterator I = find(Successors, Succ);
864 removeSuccessor(I, NormalizeSuccProbs);
865}
866
869 assert(I != Successors.end() && "Not a current successor!");
870
871 // If probability list is empty it means we don't use it (disabled
872 // optimization).
873 if (!Probs.empty()) {
874 probability_iterator WI = getProbabilityIterator(I);
875 Probs.erase(WI);
876 if (NormalizeSuccProbs)
878 }
879
880 (*I)->removePredecessor(this);
881 return Successors.erase(I);
882}
883
884void MachineBasicBlock::replaceSuccessor(MachineBasicBlock *Old,
885 MachineBasicBlock *New) {
886 if (Old == New)
887 return;
888
890 succ_iterator NewI = E;
891 succ_iterator OldI = E;
892 for (succ_iterator I = succ_begin(); I != E; ++I) {
893 if (*I == Old) {
894 OldI = I;
895 if (NewI != E)
896 break;
897 }
898 if (*I == New) {
899 NewI = I;
900 if (OldI != E)
901 break;
902 }
903 }
904 assert(OldI != E && "Old is not a successor of this block");
905
906 // If New isn't already a successor, let it take Old's place.
907 if (NewI == E) {
908 Old->removePredecessor(this);
909 New->addPredecessor(this);
910 *OldI = New;
911 return;
912 }
913
914 // New is already a successor.
915 // Update its probability instead of adding a duplicate edge.
916 if (!Probs.empty()) {
917 auto ProbIter = getProbabilityIterator(NewI);
918 if (!ProbIter->isUnknown())
919 *ProbIter += *getProbabilityIterator(OldI);
920 }
921 removeSuccessor(OldI);
922}
923
924void MachineBasicBlock::copySuccessor(const MachineBasicBlock *Orig,
926 if (!Orig->Probs.empty())
928 else
930}
931
932void MachineBasicBlock::addPredecessor(MachineBasicBlock *Pred) {
933 Predecessors.push_back(Pred);
934}
935
936void MachineBasicBlock::removePredecessor(MachineBasicBlock *Pred) {
937 pred_iterator I = find(Predecessors, Pred);
938 assert(I != Predecessors.end() && "Pred is not a predecessor of this block!");
939 Predecessors.erase(I);
940}
941
942void MachineBasicBlock::transferSuccessors(MachineBasicBlock *FromMBB) {
943 if (this == FromMBB)
944 return;
945
946 while (!FromMBB->succ_empty()) {
947 MachineBasicBlock *Succ = *FromMBB->succ_begin();
948
949 // If probability list is empty it means we don't use it (disabled
950 // optimization).
951 if (!FromMBB->Probs.empty()) {
952 auto Prob = *FromMBB->Probs.begin();
953 addSuccessor(Succ, Prob);
954 } else
956
957 FromMBB->removeSuccessor(Succ);
958 }
959}
960
961void
963 if (this == FromMBB)
964 return;
965
966 while (!FromMBB->succ_empty()) {
967 MachineBasicBlock *Succ = *FromMBB->succ_begin();
968 if (!FromMBB->Probs.empty()) {
969 auto Prob = *FromMBB->Probs.begin();
970 addSuccessor(Succ, Prob);
971 } else
973 FromMBB->removeSuccessor(Succ);
974
975 // Fix up any PHI nodes in the successor.
976 Succ->replacePhiUsesWith(FromMBB, this);
977 }
979}
980
981bool MachineBasicBlock::isPredecessor(const MachineBasicBlock *MBB) const {
982 return is_contained(predecessors(), MBB);
983}
984
985bool MachineBasicBlock::isSuccessor(const MachineBasicBlock *MBB) const {
986 return is_contained(successors(), MBB);
987}
988
989bool MachineBasicBlock::isLayoutSuccessor(const MachineBasicBlock *MBB) const {
991 return std::next(I) == MachineFunction::const_iterator(MBB);
992}
993
994const MachineBasicBlock *MachineBasicBlock::getSingleSuccessor() const {
995 return Successors.size() == 1 ? Successors[0] : nullptr;
996}
997
998const MachineBasicBlock *MachineBasicBlock::getSinglePredecessor() const {
999 return Predecessors.size() == 1 ? Predecessors[0] : nullptr;
1000}
1001
1002MachineBasicBlock *MachineBasicBlock::getFallThrough(bool JumpToFallThrough) {
1003 MachineFunction::iterator Fallthrough = getIterator();
1004 ++Fallthrough;
1005 // If FallthroughBlock is off the end of the function, it can't fall through.
1006 if (Fallthrough == getParent()->end())
1007 return nullptr;
1008
1009 // If FallthroughBlock isn't a successor, no fallthrough is possible.
1010 if (!isSuccessor(&*Fallthrough))
1011 return nullptr;
1012
1013 // Analyze the branches, if any, at the end of the block.
1014 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
1017 if (TII->analyzeBranch(*this, TBB, FBB, Cond)) {
1018 // If we couldn't analyze the branch, examine the last instruction.
1019 // If the block doesn't end in a known control barrier, assume fallthrough
1020 // is possible. The isPredicated check is needed because this code can be
1021 // called during IfConversion, where an instruction which is normally a
1022 // Barrier is predicated and thus no longer an actual control barrier.
1023 return (empty() || !back().isBarrier() || TII->isPredicated(back()))
1024 ? &*Fallthrough
1025 : nullptr;
1026 }
1027
1028 // If there is no branch, control always falls through.
1029 if (!TBB) return &*Fallthrough;
1030
1031 // If there is some explicit branch to the fallthrough block, it can obviously
1032 // reach, even though the branch should get folded to fall through implicitly.
1033 if (JumpToFallThrough && (MachineFunction::iterator(TBB) == Fallthrough ||
1034 MachineFunction::iterator(FBB) == Fallthrough))
1035 return &*Fallthrough;
1036
1037 // If it's an unconditional branch to some block not the fall through, it
1038 // doesn't fall through.
1039 if (Cond.empty()) return nullptr;
1040
1041 // Otherwise, if it is conditional and has no explicit false block, it falls
1042 // through.
1043 return (FBB == nullptr) ? &*Fallthrough : nullptr;
1044}
1045
1047 return getFallThrough() != nullptr;
1048}
1049
1051 bool UpdateLiveIns,
1052 LiveIntervals *LIS) {
1053 MachineBasicBlock::iterator SplitPoint(&MI);
1054 ++SplitPoint;
1055
1056 if (SplitPoint == end()) {
1057 // Don't bother with a new block.
1058 return this;
1059 }
1060
1061 MachineFunction *MF = getParent();
1062
1064 if (UpdateLiveIns) {
1065 // Make sure we add any physregs we define in the block as liveins to the
1066 // new block.
1068 LiveRegs.init(*MF->getSubtarget().getRegisterInfo());
1069 LiveRegs.addLiveOuts(*this);
1070 for (auto I = rbegin(), E = Prev.getReverse(); I != E; ++I)
1071 LiveRegs.stepBackward(*I);
1072 }
1073
1074 MachineBasicBlock *SplitBB = MF->CreateMachineBasicBlock(getBasicBlock());
1075
1076 MF->insert(++MachineFunction::iterator(this), SplitBB);
1077 SplitBB->splice(SplitBB->begin(), this, SplitPoint, end());
1078
1079 SplitBB->transferSuccessorsAndUpdatePHIs(this);
1080 addSuccessor(SplitBB);
1081
1082 if (UpdateLiveIns)
1083 addLiveIns(*SplitBB, LiveRegs);
1084
1085 if (LIS)
1086 LIS->insertMBBInMaps(SplitBB);
1087
1088 return SplitBB;
1089}
1090
1091// Returns `true` if there are possibly other users of the jump table at
1092// `JumpTableIndex` except for the ones in `IgnoreMBB`.
1094 const MachineBasicBlock &IgnoreMBB,
1095 int JumpTableIndex) {
1096 assert(JumpTableIndex >= 0 && "need valid index");
1097 const MachineJumpTableInfo &MJTI = *MF.getJumpTableInfo();
1098 const MachineJumpTableEntry &MJTE = MJTI.getJumpTables()[JumpTableIndex];
1099 // Take any basic block from the table; every user of the jump table must
1100 // show up in the predecessor list.
1101 const MachineBasicBlock *MBB = nullptr;
1102 for (MachineBasicBlock *B : MJTE.MBBs) {
1103 if (B != nullptr) {
1104 MBB = B;
1105 break;
1106 }
1107 }
1108 if (MBB == nullptr)
1109 return true; // can't rule out other users if there isn't any block.
1112 for (MachineBasicBlock *Pred : MBB->predecessors()) {
1113 if (Pred == &IgnoreMBB)
1114 continue;
1115 MachineBasicBlock *DummyT = nullptr;
1116 MachineBasicBlock *DummyF = nullptr;
1117 Cond.clear();
1118 if (!TII.analyzeBranch(*Pred, DummyT, DummyF, Cond,
1119 /*AllowModify=*/false)) {
1120 // analyzable direct jump
1121 continue;
1122 }
1123 int PredJTI = findJumpTableIndex(*Pred);
1124 if (PredJTI >= 0) {
1125 if (PredJTI == JumpTableIndex)
1126 return true;
1127 continue;
1128 }
1129 // Be conservative for unanalyzable jumps.
1130 return true;
1131 }
1132 return false;
1133}
1134
1136private:
1137 MachineFunction &MF;
1138 SlotIndexes *Indexes;
1140
1141public:
1143 : MF(MF), Indexes(Indexes) {
1144 MF.setDelegate(this);
1145 }
1146
1148 MF.resetDelegate(this);
1149 for (auto MI : Insertions)
1150 Indexes->insertMachineInstrInMaps(*MI);
1151 }
1152
1154 // This is called before MI is inserted into block so defer index update.
1155 if (Indexes)
1156 Insertions.insert(&MI);
1157 }
1158
1160 if (Indexes && !Insertions.remove(&MI))
1161 Indexes->removeMachineInstrFromMaps(MI);
1162 }
1163};
1164
1166 MachineBasicBlock *Succ, Pass *P, MachineFunctionAnalysisManager *MFAM,
1167 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU) {
1168#define GET_RESULT(RESULT, GETTER, INFIX) \
1169 [MF, P, MFAM]() { \
1170 if (P) { \
1171 auto *Wrapper = P->getAnalysisIfAvailable<RESULT##INFIX##WrapperPass>(); \
1172 return Wrapper ? &Wrapper->GETTER() : nullptr; \
1173 } \
1174 return MFAM->getCachedResult<RESULT##Analysis>(*MF); \
1175 }()
1176
1177 assert((P || MFAM) && "Need a way to get analysis results!");
1178 MachineFunction *MF = getParent();
1179 LiveIntervals *LIS = GET_RESULT(LiveIntervals, getLIS, );
1180 SlotIndexes *Indexes = GET_RESULT(SlotIndexes, getSI, );
1181 LiveVariables *LV = GET_RESULT(LiveVariables, getLV, );
1182 MachineLoopInfo *MLI = GET_RESULT(MachineLoop, getLI, Info);
1183 return SplitCriticalEdge(Succ, {LIS, Indexes, LV, MLI}, LiveInSets, MDTU);
1184#undef GET_RESULT
1185}
1186
1188 MachineBasicBlock *Succ, const SplitCriticalEdgeAnalyses &Analyses,
1189 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU) {
1190 if (!canSplitCriticalEdge(Succ, Analyses.MLI))
1191 return nullptr;
1192
1193 MachineFunction *MF = getParent();
1194 MachineBasicBlock *PrevFallthrough = getNextNode();
1195
1196 MachineBasicBlock *NMBB = MF->CreateMachineBasicBlock();
1197 NMBB->setCallFrameSize(Succ->getCallFrameSize());
1198
1199 // Is there an indirect jump with jump table?
1200 bool ChangedIndirectJump = false;
1201 int JTI = findJumpTableIndex(*this);
1202 if (JTI >= 0) {
1204 MJTI.ReplaceMBBInJumpTable(JTI, Succ, NMBB);
1205 ChangedIndirectJump = true;
1206 }
1207
1208 MF->insert(std::next(MachineFunction::iterator(this)), NMBB);
1209 LLVM_DEBUG(dbgs() << "Splitting critical edge: " << printMBBReference(*this)
1210 << " -- " << printMBBReference(*NMBB) << " -- "
1211 << printMBBReference(*Succ) << '\n');
1212 auto *LIS = Analyses.LIS;
1213 if (LIS)
1214 LIS->insertMBBInMaps(NMBB);
1215 else if (Analyses.SI)
1216 Analyses.SI->insertMBBInMaps(NMBB);
1217
1218 // On some targets like Mips, branches may kill virtual registers. Make sure
1219 // that LiveVariables is properly updated after updateTerminator replaces the
1220 // terminators.
1221 auto *LV = Analyses.LV;
1222 // Collect a list of virtual registers killed by the terminators.
1223 SmallVector<Register, 4> KilledRegs;
1224 if (LV)
1225 for (MachineInstr &MI :
1227 for (MachineOperand &MO : MI.all_uses()) {
1228 if (MO.getReg() == 0 || !MO.isKill() || MO.isUndef())
1229 continue;
1230 Register Reg = MO.getReg();
1231 if (Reg.isPhysical() || LV->getVarInfo(Reg).removeKill(MI)) {
1232 KilledRegs.push_back(Reg);
1233 LLVM_DEBUG(dbgs() << "Removing terminator kill: " << MI);
1234 MO.setIsKill(false);
1235 }
1236 }
1237 }
1238
1239 SmallVector<Register, 4> UsedRegs;
1240 if (LIS) {
1241 for (MachineInstr &MI :
1243 for (const MachineOperand &MO : MI.operands()) {
1244 if (!MO.isReg() || MO.getReg() == 0)
1245 continue;
1246
1247 Register Reg = MO.getReg();
1248 if (!is_contained(UsedRegs, Reg))
1249 UsedRegs.push_back(Reg);
1250 }
1251 }
1252 }
1253
1254 ReplaceUsesOfBlockWith(Succ, NMBB);
1255
1256 // Since we replaced all uses of Succ with NMBB, that should also be treated
1257 // as the fallthrough successor
1258 if (Succ == PrevFallthrough)
1259 PrevFallthrough = NMBB;
1260 auto *Indexes = Analyses.SI;
1261 if (!ChangedIndirectJump) {
1262 SlotIndexUpdateDelegate SlotUpdater(*MF, Indexes);
1263 updateTerminator(PrevFallthrough);
1264 }
1265
1266 // Insert unconditional "jump Succ" instruction in NMBB if necessary.
1267 NMBB->addSuccessor(Succ);
1268 if (!NMBB->isLayoutSuccessor(Succ)) {
1269 SlotIndexUpdateDelegate SlotUpdater(*MF, Indexes);
1272
1273 // In original 'this' BB, there must be a branch instruction targeting at
1274 // Succ. We can not find it out since currently getBranchDestBlock was not
1275 // implemented for all targets. However, if the merged DL has column or line
1276 // number, the scope and non-zero column and line number is same with that
1277 // branch instruction so we can safely use it.
1278 DebugLoc DL, MergedDL = findBranchDebugLoc();
1279 if (MergedDL && (MergedDL.getLine() || MergedDL.getCol()))
1280 DL = MergedDL;
1281 TII->insertBranch(*NMBB, Succ, nullptr, Cond, DL);
1282 }
1283
1284 // Fix PHI nodes in Succ so they refer to NMBB instead of this.
1285 Succ->replacePhiUsesWith(this, NMBB);
1286
1287 // Inherit live-ins from the successor
1288 for (const auto &LI : Succ->liveins())
1289 NMBB->addLiveIn(LI);
1290
1291 // Update LiveVariables.
1293 if (LV) {
1294 // Restore kills of virtual registers that were killed by the terminators.
1295 while (!KilledRegs.empty()) {
1296 Register Reg = KilledRegs.pop_back_val();
1297 for (instr_iterator I = instr_end(), E = instr_begin(); I != E;) {
1298 if (!(--I)->addRegisterKilled(Reg, TRI, /* AddIfNotFound= */ false))
1299 continue;
1300 if (Reg.isVirtual())
1301 LV->getVarInfo(Reg).Kills.push_back(&*I);
1302 LLVM_DEBUG(dbgs() << "Restored terminator kill: " << *I);
1303 break;
1304 }
1305 }
1306 // Update relevant live-through information.
1307 if (LiveInSets != nullptr)
1308 LV->addNewBlock(NMBB, this, Succ, *LiveInSets);
1309 else
1310 LV->addNewBlock(NMBB, this, Succ);
1311 }
1312
1313 if (LIS) {
1314 // After splitting the edge and updating SlotIndexes, live intervals may be
1315 // in one of two situations, depending on whether this block was the last in
1316 // the function. If the original block was the last in the function, all
1317 // live intervals will end prior to the beginning of the new split block. If
1318 // the original block was not at the end of the function, all live intervals
1319 // will extend to the end of the new split block.
1320
1321 bool isLastMBB =
1322 std::next(MachineFunction::iterator(NMBB)) == getParent()->end();
1323
1324 SlotIndex StartIndex = Indexes->getMBBEndIdx(this);
1325 SlotIndex PrevIndex = StartIndex.getPrevSlot();
1326 SlotIndex EndIndex = Indexes->getMBBEndIdx(NMBB);
1327
1328 // Find the registers used from NMBB in PHIs in Succ.
1329 SmallSet<Register, 8> PHISrcRegs;
1331 I = Succ->instr_begin(), E = Succ->instr_end();
1332 I != E && I->isPHI(); ++I) {
1333 for (unsigned ni = 1, ne = I->getNumOperands(); ni != ne; ni += 2) {
1334 if (I->getOperand(ni+1).getMBB() == NMBB) {
1335 MachineOperand &MO = I->getOperand(ni);
1336 Register Reg = MO.getReg();
1337 PHISrcRegs.insert(Reg);
1338 if (MO.isUndef())
1339 continue;
1340
1341 LiveInterval &LI = LIS->getInterval(Reg);
1342 VNInfo *VNI = LI.getVNInfoAt(PrevIndex);
1343 assert(VNI &&
1344 "PHI sources should be live out of their predecessors.");
1345 LI.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1346 for (auto &SR : LI.subranges())
1347 SR.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1348 }
1349 }
1350 }
1351
1353 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
1355 if (PHISrcRegs.count(Reg) || !LIS->hasInterval(Reg))
1356 continue;
1357
1358 LiveInterval &LI = LIS->getInterval(Reg);
1359 if (!LI.liveAt(PrevIndex))
1360 continue;
1361
1362 bool isLiveOut = LI.liveAt(LIS->getMBBStartIdx(Succ));
1363 if (isLiveOut && isLastMBB) {
1364 VNInfo *VNI = LI.getVNInfoAt(PrevIndex);
1365 assert(VNI && "LiveInterval should have VNInfo where it is live.");
1366 LI.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1367 // Update subranges with live values
1368 for (auto &SR : LI.subranges()) {
1369 VNInfo *VNI = SR.getVNInfoAt(PrevIndex);
1370 if (VNI)
1371 SR.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1372 }
1373 } else if (!isLiveOut && !isLastMBB) {
1374 LI.removeSegment(StartIndex, EndIndex);
1375 for (auto &SR : LI.subranges())
1376 SR.removeSegment(StartIndex, EndIndex);
1377 }
1378 }
1379
1380 // Update all intervals for registers whose uses may have been modified by
1381 // updateTerminator().
1382 LIS->repairIntervalsInRange(this, getFirstTerminator(), end(), UsedRegs);
1383 }
1384
1385 if (MDTU)
1386 MDTU->splitCriticalEdge(this, Succ, NMBB);
1387
1388 if (MachineLoopInfo *MLI = Analyses.MLI)
1389 if (MachineLoop *TIL = MLI->getLoopFor(this)) {
1390 // If one or the other blocks were not in a loop, the new block is not
1391 // either, and thus LI doesn't need to be updated.
1392 if (MachineLoop *DestLoop = MLI->getLoopFor(Succ)) {
1393 if (TIL == DestLoop) {
1394 // Both in the same loop, the NMBB joins loop.
1395 DestLoop->addBasicBlockToLoop(NMBB, *MLI);
1396 } else if (TIL->contains(DestLoop)) {
1397 // Edge from an outer loop to an inner loop. Add to the outer loop.
1398 TIL->addBasicBlockToLoop(NMBB, *MLI);
1399 } else if (DestLoop->contains(TIL)) {
1400 // Edge from an inner loop to an outer loop. Add to the outer loop.
1401 DestLoop->addBasicBlockToLoop(NMBB, *MLI);
1402 } else {
1403 // Edge from two loops with no containment relation. Because these
1404 // are natural loops, we know that the destination block must be the
1405 // header of its loop (adding a branch into a loop elsewhere would
1406 // create an irreducible loop).
1407 assert(DestLoop->getHeader() == Succ &&
1408 "Should not create irreducible loops!");
1409 if (MachineLoop *P = DestLoop->getParentLoop())
1410 P->addBasicBlockToLoop(NMBB, *MLI);
1411 }
1412 }
1413 }
1414
1415 return NMBB;
1416}
1417
1418bool MachineBasicBlock::canSplitCriticalEdge(const MachineBasicBlock *Succ,
1419 const MachineLoopInfo *MLI) const {
1420 // Splitting the critical edge to a landing pad block is non-trivial. Don't do
1421 // it in this generic function.
1422 if (Succ->isEHPad())
1423 return false;
1424
1425 // Splitting the critical edge to a callbr's indirect block isn't advised.
1426 // Don't do it in this generic function.
1427 if (Succ->isInlineAsmBrIndirectTarget())
1428 return false;
1429
1430 const MachineFunction *MF = getParent();
1431 // Performance might be harmed on HW that implements branching using exec mask
1432 // where both sides of the branches are always executed.
1433
1434 if (MF->getTarget().requiresStructuredCFG()) {
1435 if (!MLI)
1436 return false;
1437 const MachineLoop *L = MLI->getLoopFor(Succ);
1438 // Only if `Succ` is a loop header, splitting the critical edge will not
1439 // break structured CFG. And fallthrough to check if this's terminator is
1440 // analyzable.
1441 if (!L || L->getHeader() != Succ)
1442 return false;
1443 }
1444
1445 // Do we have an Indirect jump with a jumptable that we can rewrite?
1446 int JTI = findJumpTableIndex(*this);
1447 if (JTI >= 0 && !jumpTableHasOtherUses(*MF, *this, JTI))
1448 return true;
1449
1450 // We may need to update this's terminator, but we can't do that if
1451 // analyzeBranch fails.
1453 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
1455 // AnalyzeBanch should modify this, since we did not allow modification.
1456 if (TII->analyzeBranch(*const_cast<MachineBasicBlock *>(this), TBB, FBB, Cond,
1457 /*AllowModify*/ false))
1458 return false;
1459
1460 // Avoid bugpoint weirdness: A block may end with a conditional branch but
1461 // jumps to the same MBB is either case. We have duplicate CFG edges in that
1462 // case that we can't handle. Since this never happens in properly optimized
1463 // code, just skip those edges.
1464 if (TBB && TBB == FBB) {
1465 LLVM_DEBUG(dbgs() << "Won't split critical edge after degenerate "
1466 << printMBBReference(*this) << '\n');
1467 return false;
1468 }
1469 return true;
1470}
1471
1472/// Prepare MI to be removed from its bundle. This fixes bundle flags on MI's
1473/// neighboring instructions so the bundle won't be broken by removing MI.
1475 // Removing the first instruction in a bundle.
1476 if (MI->isBundledWithSucc() && !MI->isBundledWithPred())
1477 MI->unbundleFromSucc();
1478 // Removing the last instruction in a bundle.
1479 if (MI->isBundledWithPred() && !MI->isBundledWithSucc())
1480 MI->unbundleFromPred();
1481 // If MI is not bundled, or if it is internal to a bundle, the neighbor flags
1482 // are already fine.
1483}
1484
1490
1493 MI->clearFlag(MachineInstr::BundledPred);
1494 MI->clearFlag(MachineInstr::BundledSucc);
1495 return Insts.remove(MI);
1496}
1497
1500 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1501 "Cannot insert instruction with bundle flags");
1502 // Set the bundle flags when inserting inside a bundle.
1503 if (I != instr_end() && I->isBundledWithPred()) {
1504 MI->setFlag(MachineInstr::BundledPred);
1505 MI->setFlag(MachineInstr::BundledSucc);
1506 }
1507 return Insts.insert(I, MI);
1508}
1509
1510/// This method unlinks 'this' from the containing function, and returns it, but
1511/// does not delete it.
1513 assert(getParent() && "Not embedded in a function!");
1514 getParent()->remove(this);
1515 return this;
1516}
1517
1518/// This method unlinks 'this' from the containing function, and deletes it.
1520 assert(getParent() && "Not embedded in a function!");
1521 getParent()->erase(this);
1522}
1523
1524/// Given a machine basic block that branched to 'Old', change the code and CFG
1525/// so that it branches to 'New' instead.
1527 MachineBasicBlock *New) {
1528 assert(Old != New && "Cannot replace self with self!");
1529
1531 while (I != instr_begin()) {
1532 --I;
1533 if (!I->isTerminator()) break;
1534
1535 // Scan the operands of this machine instruction, replacing any uses of Old
1536 // with New.
1537 for (MachineOperand &MO : I->operands())
1538 if (MO.isMBB() && MO.getMBB() == Old)
1539 MO.setMBB(New);
1540 }
1541
1542 // Update the successor information.
1543 replaceSuccessor(Old, New);
1544}
1545
1546void MachineBasicBlock::replacePhiUsesWith(MachineBasicBlock *Old,
1547 MachineBasicBlock *New) {
1548 for (MachineInstr &MI : phis())
1549 for (unsigned i = 2, e = MI.getNumOperands() + 1; i != e; i += 2) {
1550 MachineOperand &MO = MI.getOperand(i);
1551 if (MO.getMBB() == Old)
1552 MO.setMBB(New);
1553 }
1554}
1555
1556/// Find the next valid DebugLoc starting at MBBI, skipping any debug
1557/// instructions. Return UnknownLoc if there is none.
1560 // Skip debug declarations, we don't want a DebugLoc from them.
1562 if (MBBI != instr_end())
1563 return MBBI->getDebugLoc();
1564 return {};
1565}
1566
1568 if (MBBI == instr_rend())
1569 return findDebugLoc(instr_begin());
1570 // Skip debug declarations, we don't want a DebugLoc from them.
1572 if (!MBBI->isDebugInstr())
1573 return MBBI->getDebugLoc();
1574 return {};
1575}
1576
1577/// Find the previous valid DebugLoc preceding MBBI, skipping any debug
1578/// instructions. Return UnknownLoc if there is none.
1580 if (MBBI == instr_begin())
1581 return {};
1582 // Skip debug instructions, we don't want a DebugLoc from them.
1584 if (!MBBI->isDebugInstr())
1585 return MBBI->getDebugLoc();
1586 return {};
1587}
1588
1590 if (MBBI == instr_rend())
1591 return {};
1592 // Skip debug declarations, we don't want a DebugLoc from them.
1594 if (MBBI != instr_rend())
1595 return MBBI->getDebugLoc();
1596 return {};
1597}
1598
1599/// Find and return the merged DebugLoc of the branch instructions of the block.
1600/// Return UnknownLoc if there is none.
1603 DebugLoc DL;
1604 auto TI = getFirstTerminator();
1605 while (TI != end() && !TI->isBranch())
1606 ++TI;
1607
1608 if (TI != end()) {
1609 DL = TI->getDebugLoc();
1610 for (++TI ; TI != end() ; ++TI)
1611 if (TI->isBranch())
1612 DL = DebugLoc::getMergedLocation(DL, TI->getDebugLoc());
1613 }
1614 return DL;
1615}
1616
1617/// Return probability of the edge from this block to MBB.
1620 if (Probs.empty())
1621 return BranchProbability(1, succ_size());
1622
1623 const auto &Prob = *getProbabilityIterator(Succ);
1624 if (!Prob.isUnknown())
1625 return Prob;
1626 // For unknown probabilities, collect the sum of all known ones, and evenly
1627 // ditribute the complemental of the sum to each unknown probability.
1628 unsigned KnownProbNum = 0;
1629 auto Sum = BranchProbability::getZero();
1630 for (const auto &P : Probs) {
1631 if (!P.isUnknown()) {
1632 Sum += P;
1633 KnownProbNum++;
1634 }
1635 }
1636 return Sum.getCompl() / (Probs.size() - KnownProbNum);
1637}
1638
1640 if (succ_size() <= 1)
1641 return true;
1643 return true;
1644
1645 SmallVector<BranchProbability, 8> Normalized(Probs.begin(), Probs.end());
1647
1648 // Normalize assuming unknown probabilities. This will assign equal
1649 // probabilities to all successors.
1650 SmallVector<BranchProbability, 8> Equal(Normalized.size());
1652
1653 return llvm::equal(Normalized, Equal);
1654}
1655
1656/// Set successor probability of a given iterator.
1658 BranchProbability Prob) {
1659 assert(!Prob.isUnknown());
1660 if (Probs.empty())
1661 return;
1662 *getProbabilityIterator(I) = Prob;
1663}
1664
1665/// Return probability iterator corresonding to the I successor iterator
1666MachineBasicBlock::const_probability_iterator
1667MachineBasicBlock::getProbabilityIterator(
1669 assert(Probs.size() == Successors.size() && "Async probability list!");
1670 const size_t index = std::distance(Successors.begin(), I);
1671 assert(index < Probs.size() && "Not a current successor!");
1672 return Probs.begin() + index;
1673}
1674
1675/// Return probability iterator corresonding to the I successor iterator.
1676MachineBasicBlock::probability_iterator
1677MachineBasicBlock::getProbabilityIterator(MachineBasicBlock::succ_iterator I) {
1678 assert(Probs.size() == Successors.size() && "Async probability list!");
1679 const size_t index = std::distance(Successors.begin(), I);
1680 assert(index < Probs.size() && "Not a current successor!");
1681 return Probs.begin() + index;
1682}
1683
1684/// Return whether (physical) register "Reg" has been <def>ined and not <kill>ed
1685/// as of just before "MI".
1686///
1687/// Search is localised to a neighborhood of
1688/// Neighborhood instructions before (searching for defs or kills) and N
1689/// instructions after (searching just for defs) MI.
1692 MCRegister Reg, const_iterator Before,
1693 unsigned Neighborhood) const {
1694 assert(Reg.isPhysical());
1695 unsigned N = Neighborhood;
1696
1697 // Try searching forwards from Before, looking for reads or defs.
1698 const_iterator I(Before);
1699 for (; I != end() && N > 0; ++I) {
1700 if (I->isDebugOrPseudoInstr())
1701 continue;
1702
1703 --N;
1704
1705 PhysRegInfo Info = AnalyzePhysRegInBundle(*I, Reg, TRI);
1706
1707 // Register is live when we read it here.
1708 if (Info.Read)
1709 return LQR_Live;
1710 // Register is dead if we can fully overwrite or clobber it here.
1711 if (Info.FullyDefined || Info.Clobbered)
1712 return LQR_Dead;
1713 }
1714
1715 // If we reached the end, it is safe to clobber Reg at the end of a block of
1716 // no successor has it live in.
1717 if (I == end()) {
1718 for (MachineBasicBlock *S : successors()) {
1719 for (const MachineBasicBlock::RegisterMaskPair &LI : S->liveins()) {
1720 if (TRI->regsOverlap(LI.PhysReg, Reg))
1721 return LQR_Live;
1722 }
1723 }
1724
1725 return LQR_Dead;
1726 }
1727
1728
1729 N = Neighborhood;
1730
1731 // Start by searching backwards from Before, looking for kills, reads or defs.
1732 I = const_iterator(Before);
1733 // If this is the first insn in the block, don't search backwards.
1734 if (I != begin()) {
1735 do {
1736 --I;
1737
1738 if (I->isDebugOrPseudoInstr())
1739 continue;
1740
1741 --N;
1742
1743 PhysRegInfo Info = AnalyzePhysRegInBundle(*I, Reg, TRI);
1744
1745 // Defs happen after uses so they take precedence if both are present.
1746
1747 // Register is dead after a dead def of the full register.
1748 if (Info.DeadDef)
1749 return LQR_Dead;
1750 // Register is (at least partially) live after a def.
1751 if (Info.Defined) {
1752 if (!Info.PartialDeadDef)
1753 return LQR_Live;
1754 // As soon as we saw a partial definition (dead or not),
1755 // we cannot tell if the value is partial live without
1756 // tracking the lanemasks. We are not going to do this,
1757 // so fall back on the remaining of the analysis.
1758 break;
1759 }
1760 // Register is dead after a full kill or clobber and no def.
1761 if (Info.Killed || Info.Clobbered)
1762 return LQR_Dead;
1763 // Register must be live if we read it.
1764 if (Info.Read)
1765 return LQR_Live;
1766
1767 } while (I != begin() && N > 0);
1768 }
1769
1770 // If all the instructions before this in the block are debug instructions,
1771 // skip over them.
1772 while (I != begin() && std::prev(I)->isDebugOrPseudoInstr())
1773 --I;
1774
1775 // Did we get to the start of the block?
1776 if (I == begin()) {
1777 // If so, the register's state is definitely defined by the live-in state.
1779 if (TRI->regsOverlap(LI.PhysReg, Reg))
1780 return LQR_Live;
1781
1782 return LQR_Dead;
1783 }
1784
1785 // At this point we have no idea of the liveness of the register.
1786 return LQR_Unknown;
1787}
1788
1789const uint32_t *
1791 // EH funclet entry does not preserve any registers.
1792 return isEHFuncletEntry() ? TRI->getNoPreservedMask() : nullptr;
1793}
1794
1795const uint32_t *
1797 // If we see a return block with successors, this must be a funclet return,
1798 // which does not preserve any registers. If there are no successors, we don't
1799 // care what kind of return it is, putting a mask after it is a no-op.
1800 return isReturnBlock() && !succ_empty() ? TRI->getNoPreservedMask() : nullptr;
1801}
1802
1804 LiveIns.clear();
1805}
1806
1808 std::vector<RegisterMaskPair> &OldLiveIns) {
1809 assert(OldLiveIns.empty() && "Vector must be empty");
1810 std::swap(LiveIns, OldLiveIns);
1811}
1812
1814 assert(getParent()->getProperties().hasTracksLiveness() &&
1815 "Liveness information is accurate");
1816 return LiveIns.begin();
1817}
1818
1820 const MachineFunction &MF = *getParent();
1821 const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
1822 MCRegister ExceptionPointer, ExceptionSelector;
1823 if (MF.getFunction().hasPersonalityFn()) {
1824 auto PersonalityFn = MF.getFunction().getPersonalityFn();
1825 ExceptionPointer = TLI.getExceptionPointerRegister(PersonalityFn);
1826 ExceptionSelector = TLI.getExceptionSelectorRegister(PersonalityFn);
1827 }
1828
1829 return liveout_iterator(*this, ExceptionPointer, ExceptionSelector, false);
1830}
1831
1833 unsigned Cntr = 0;
1834 auto R = instructionsWithoutDebug(begin(), end());
1835 for (auto I = R.begin(), E = R.end(); I != E; ++I) {
1836 if (++Cntr > Limit)
1837 return true;
1838 }
1839 return false;
1840}
1841
1843 const MachineBasicBlock &PredMBB) {
1844 for (MachineInstr &Phi : phis())
1845 Phi.removePHIIncomingValueFor(PredMBB);
1846}
1847
1849const MBBSectionID
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
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:646
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define GET_RESULT(RESULT, GETTER, INFIX)
static bool jumpTableHasOtherUses(const MachineFunction &MF, const MachineBasicBlock &IgnoreMBB, int JumpTableIndex)
static void unbundleSingleMI(MachineInstr *MI)
Prepare MI to be removed from its bundle.
static int findJumpTableIndex(const MachineBasicBlock &MBB)
static cl::opt< bool > PrintSlotIndexes("print-slotindexes", cl::desc("When printing machine IR, annotate instructions and blocks with " "SlotIndexes when available"), cl::init(true), cl::Hidden)
Register const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
#define P(N)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool isLiveOut(const MachineBasicBlock &MBB, unsigned Reg)
This file contains some templates that are useful if you are working with the STL at all.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:114
This file describes how to lower LLVM code to machine code.
SlotIndexUpdateDelegate(MachineFunction &MF, SlotIndexes *Indexes)
void MF_HandleRemoval(MachineInstr &MI) override
Callback before a removal. This should not modify the MI directly.
void MF_HandleInsertion(MachineInstr &MI) override
Callback after an insertion. This should not modify the MI directly.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
static uint32_t getDenominator()
static BranchProbability getUnknown()
uint32_t getNumerator() const
static BranchProbability getZero()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
A debug info location.
Definition DebugLoc.h:123
LLVM_ABI unsigned getLine() const
Definition DebugLoc.cpp:52
static LLVM_ABI DebugLoc getMergedLocation(DebugLoc LocA, DebugLoc LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
Definition DebugLoc.cpp:179
LLVM_ABI unsigned getCol() const
Definition DebugLoc.cpp:57
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition Function.h:903
Constant * getPersonalityFn() const
Get the personality function associated with this function.
void splitCriticalEdge(BasicBlockT *FromBB, BasicBlockT *ToBB, BasicBlockT *NewBB)
Apply updates that the critical edge (FromBB, ToBB) has been split with NewBB.
A helper class to return the specified delimiter string after the first invocation of operator String...
LiveInterval - This class represents the liveness of a register, or stack slot.
iterator_range< subrange_iterator > subranges()
void insertMBBInMaps(MachineBasicBlock *MBB)
A set of physical registers with utility functions to track liveness when walking backward/forward th...
LLVM_ABI iterator addSegment(Segment S)
Add the specified Segment to this range, merging segments as appropriate.
bool liveAt(SlotIndex index) const
LLVM_ABI void removeSegment(SlotIndex Start, SlotIndex End, bool RemoveDeadValNo=false)
Remove the specified interval from this live range.
VNInfo * getVNInfoAt(SlotIndex Idx) const
getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Context object for machine code objects.
Definition MCContext.h:83
LLVM_ABI MCSymbol * createBlockSymbol(const Twine &Name, bool AlwaysEmit=false)
Get or create a symbol for a basic block.
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition MCRegister.h:72
Iterator that enumerates the sub-registers of a Reg and the associated sub-register indices.
bool isValid() const
Returns true if this iterator is not yet at the end.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
bool isInlineAsmBrIndirectTarget() const
Returns true if this is the indirect dest of an INLINEASM_BR.
LLVM_ABI DebugLoc rfindPrevDebugLoc(reverse_instr_iterator MBBI)
Has exact same behavior as findPrevDebugLoc (it also searches towards the beginning of this MBB) exce...
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
LLVM_ABI bool hasEHPadSuccessor() const
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
livein_iterator livein_end() const
LLVM_ABI iterator getFirstTerminatorForward()
Finds the first terminator in a block by scanning forward.
bool isEHPad() const
Returns true if the block is a landing pad.
LLVM_ABI void replacePhiUsesWith(MachineBasicBlock *Old, MachineBasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI MachineInstr * remove_instr(MachineInstr *I)
Remove the possibly bundled instruction from the instruction list without deleting it.
MachineInstrBundleIterator< const MachineInstr > const_iterator
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
LLVM_ABI void moveBefore(MachineBasicBlock *NewAfter)
Move 'this' block before or after the specified block.
LLVM_ABI void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New)
Replace successor OLD with NEW and update probability info.
LLVM_ABI MachineBasicBlock * getFallThrough(bool JumpToFallThrough=true)
Return the fallthrough block if the block can implicitly transfer control to the block after it by fa...
LLVM_ABI void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
MachineBasicBlock * SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P, std::vector< SparseBitVector<> > *LiveInSets=nullptr, MachineDomTreeUpdater *MDTU=nullptr)
bool hasLabelMustBeEmitted() const
Test whether this block must have its label emitted.
LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
LLVM_ABI BranchProbability getSuccProbability(const_succ_iterator Succ) const
Return probability of the edge from this block to MBB.
iterator_range< livein_iterator > liveins() const
iterator_range< iterator > phis()
Returns a range that iterates over the phis in the basic block.
reverse_instr_iterator instr_rbegin()
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
LLVM_ABI void addSuccessorWithoutProb(MachineBasicBlock *Succ)
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::const_iterator const_succ_iterator
LLVM_ABI bool hasName() const
Check if there is a name of corresponding LLVM basic block.
void setCallFrameSize(unsigned N)
Set the call frame size on entry to this basic block.
std::optional< UniqueBBID > getBBID() const
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI MCSymbol * getEHContSymbol() const
Return the Windows EH Continuation Symbol for this basic block.
LLVM_ABI void splitSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New, bool NormalizeSuccProbs=false)
Split the old successor into old plus new and updates the probability info.
@ PrintNameIr
Add IR name where available.
@ PrintNameAttributes
Print attributes.
LLVM_ABI void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor)
Update the terminator instructions in block to account for changes to block layout which may have bee...
LLVM_ABI const MachineBasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor.
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.
LLVM_ABI bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
LLVM_ABI void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the first non-debug instruction in the basic block, or end().
LLVM_ABI void removeLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Remove the specified register from the live in set.
LLVM_ABI void printAsOperand(raw_ostream &OS, bool PrintType=true) const
LLVM_ABI void validateSuccProbs() const
Validate successors' probabilities and check if the sum of them is approximate one.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
LiveInVector::const_iterator livein_iterator
LLVM_ABI MCSymbol * getEndSymbol() const
Returns the MCSymbol marking the end of this basic block.
LLVM_ABI void clearLiveIns()
Clear live in list.
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
LLVM_ABI LivenessQueryResult computeRegisterLiveness(const TargetRegisterInfo *TRI, MCRegister Reg, const_iterator Before, unsigned Neighborhood=10) const
Return whether (physical) register Reg has been defined and not killed as of just before Before.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
LLVM_ABI livein_iterator livein_begin() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
LLVM_ABI const uint32_t * getBeginClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the start of this basic block.
LLVM_ABI void removePHIsIncomingValuesForPredecessor(const MachineBasicBlock &PredMBB)
Iterate over block PHI instructions and remove all incoming values for PredMBB.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
LLVM_ABI void dump() const
bool isEHScopeEntry() const
Returns true if this is the entry block of an EH scope, i.e., the block that used to have a catchpad ...
LLVM_ABI bool isEntryBlock() const
Returns true if this is the entry block of the function.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI void copySuccessor(const MachineBasicBlock *Orig, succ_iterator I)
Copy a successor (and any probability info) from original block to this block's.
SmallVectorImpl< MachineBasicBlock * >::iterator succ_iterator
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
LLVM_ABI void sortUniqueLiveIns()
Sorts and uniques the LiveIns vector.
LLVM_ABI const MachineBasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
LLVM_ABI liveout_iterator liveout_begin() const
Iterator scanning successor basic blocks' liveins to determine the registers potentially live at the ...
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI bool isPredecessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a predecessor of this block.
bool hasSuccessorProbabilities() const
Return true if any of the successors have probabilities attached to them.
LLVM_ABI DebugLoc rfindDebugLoc(reverse_instr_iterator MBBI)
Has exact same behavior as findDebugLoc (it also searches towards the end of this MBB) except that th...
LLVM_ABI void print(raw_ostream &OS, const SlotIndexes *=nullptr, bool IsStandalone=true) const
reverse_instr_iterator instr_rend()
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
Instructions::iterator instr_iterator
LLVM_ABI iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
LLVM_ABI void ReplaceUsesOfBlockWith(MachineBasicBlock *Old, MachineBasicBlock *New)
Given a machine basic block that branched to 'Old', change the code and CFG so that it branches to 'N...
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
LLVM_ABI DebugLoc findPrevDebugLoc(instr_iterator MBBI)
Find the previous valid DebugLoc preceding MBBI, skipping any debug instructions.
LLVM_ABI MachineBasicBlock * splitAt(MachineInstr &SplitInst, bool UpdateLiveIns=true, LiveIntervals *LIS=nullptr)
Split a basic block into 2 pieces at SplitPoint.
LLVM_ABI bool canSplitCriticalEdge(const MachineBasicBlock *Succ, const MachineLoopInfo *MLI=nullptr) const
Check if the edge between this block and the given successor Succ, can be split.
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
LLVM_ABI void removeLiveInOverlappedWith(MCRegister Reg)
Remove the specified register from any overlapped live in.
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
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.
LLVM_ABI std::string getFullName() const
Return a formatted string to identify this block and its parent function.
bool isBeginSection() const
Returns true if this block begins any section.
unsigned getCallFrameSize() const
Return the call frame size on entry to this basic block.
LLVM_ABI DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
LLVM_ABI instr_iterator getFirstInstrTerminator()
Same getFirstTerminator but it ignores bundles and return an instr_iterator instead.
reverse_iterator rbegin()
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
LLVM_ABI void printName(raw_ostream &os, unsigned printNameFlags=PrintNameIr, ModuleSlotTracker *moduleSlotTracker=nullptr) const
Print the basic block's name as:
LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB is a successor of this block.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
Align getAlignment() const
Return alignment of the basic block.
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI bool isLegalToHoistInto() const
Returns true if it is legal to hoist instructions into this block.
LLVM_ABI bool canPredictBranchProbabilities() const
LLVM_ABI StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
LLVM_ABI bool mayHaveInlineAsmBr() const
Returns true if this block may have an INLINEASM_BR (overestimate, by checking if any of the successo...
LivenessQueryResult
Possible outcome of a register liveness query to computeRegisterLiveness()
@ LQR_Dead
Register is known to be fully dead.
@ LQR_Live
Register is known to be (at least partially) live.
@ LQR_Unknown
Register liveness not decidable from local neighborhood.
LLVM_ABI void moveAfter(MachineBasicBlock *NewBefore)
LLVM_ABI const uint32_t * getEndClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the end of the basic block.
LLVM_ABI bool sizeWithoutDebugLargerThan(unsigned Limit) const
LLVM_ABI bool isLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
LLVM_ABI MachineBasicBlock * removeFromParent()
This method unlinks 'this' from the containing function, and returns it, but does not delete it.
Instructions::reverse_iterator reverse_instr_iterator
unsigned addToMBBNumbering(MachineBasicBlock *MBB)
Adds the MBB to the internal numbering.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
BasicBlockListType::iterator iterator
void remove(iterator MBBI)
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
void splice(iterator InsertPt, iterator MBBI)
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void erase(iterator MBBI)
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
BasicBlockListType::const_iterator const_iterator
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
Representation of each machine instruction.
LLVM_ABI bool ReplaceMBBInJumpTable(unsigned Idx, MachineBasicBlock *Old, MachineBasicBlock *New)
ReplaceMBBInJumpTable - If Old is a target of the jump tables, update the jump table to branch to New...
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineOperand class - Representation of each machine instruction operand.
MachineBasicBlock * getMBB() const
void setMBB(MachineBasicBlock *MBB)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Manage lifetime of a slot tracker for printing IR.
int getLocalSlot(const Value *V)
Return the slot number of the specified local value.
void incorporateFunction(const Function &F)
Incorporate the given function.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Pass interface - Implemented by all 'passes'.
Definition Pass.h:99
Simple wrapper around std::function<void(raw_ostream&)>.
Definition Printable.h:38
Wrapper class representing virtual and physical registers.
Definition Register.h:20
static Register index2VirtReg(unsigned Index)
Convert a 0-based index to a virtual register number.
Definition Register.h:72
SlotIndex - An opaque wrapper around machine indexes.
Definition SlotIndexes.h:66
SlotIndex getPrevSlot() const
Returns the previous slot in the index list.
SlotIndexes pass.
void insertMBBInMaps(MachineBasicBlock *mbb)
Add the given MachineBasicBlock into the maps.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
SlotIndex getMBBStartIdx(unsigned Num) const
Returns the first index in the given basic block number.
bool hasIndex(const MachineInstr &instr) const
Returns true if the given machine instr is mapped to an index, otherwise returns false.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:339
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:133
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
Definition SmallSet.h:175
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:183
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
TargetInstrInfo - Interface to description of machine instruction set.
virtual Register getExceptionPointerRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
virtual Register getExceptionSelectorRegister(const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
bool requiresStructuredCFG() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual const TargetLowering * getTargetLowering() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
VNInfo - Value Number Information.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Kill
The last use of a register.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
IterT next_nodbg(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It, then continue incrementing it while it points to a debug instruction.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1763
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.
Printable PrintLaneMask(LaneBitmask LaneMask)
Create Printable object to print LaneBitmasks on a raw_ostream.
Definition LaneBitmask.h:92
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1634
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
auto instructionsWithoutDebug(IterT It, IterT End, bool SkipPseudoOp=true)
Construct a range iterator which begins at It and moves forwards until End is reached,...
IterT skipDebugInstructionsBackward(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It until it points to a non-debug instruction or to Begin and return the resulting iterator...
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:129
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
Definition CFG.h:105
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1770
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1945
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
Definition STLExtras.h:2136
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Definition Alignment.h:77
This represents a simple continuous liveness interval for a value.
LLVM_ABI static const MBBSectionID ExceptionSectionID
LLVM_ABI static const MBBSectionID ColdSectionID
Pair of physical register and lane mask.
Split the critical edge from this block to the given successor block, and return the newly created bl...
MachineJumpTableEntry - One jump table in the jump table info.
std::vector< MachineBasicBlock * > MBBs
MBBs - The vector of basic blocks from which to create the jump table.
Information about how a physical register Reg is used by a set of operands.
static void deleteNode(NodeTy *V)
Definition ilist.h:42
void removeNodeFromList(NodeTy *)
Definition ilist.h:67
void addNodeToList(NodeTy *)
When an MBB is added to an MF, we need to update the parent pointer of the MBB, the MBB numbering,...
Definition ilist.h:66
void transferNodesFromList(ilist_callback_traits &OldList, Iterator, Iterator)
Callback before transferring nodes to this list.
Definition ilist.h:72
Template traits for intrusive list.
Definition ilist.h:90