LLVM 24.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/IR/Module.h"
36#include "llvm/MC/MCAsmInfo.h"
37#include "llvm/MC/MCContext.h"
38#include "llvm/Support/Debug.h"
41#include <algorithm>
42#include <cmath>
43using namespace llvm;
44
45#define DEBUG_TYPE "codegen"
46
48 "print-slotindexes",
49 cl::desc("When printing machine IR, annotate instructions and blocks with "
50 "SlotIndexes when available"),
51 cl::init(true), cl::Hidden);
52
53MachineBasicBlock::MachineBasicBlock(MachineFunction &MF, const BasicBlock *B)
54 : BB(B), Number(-1), xParent(&MF) {
55 Insts.Parent = this;
56 if (B)
57 IrrLoopHeaderWeight = B->getIrrLoopHeaderWeight();
58}
59
60MachineBasicBlock::~MachineBasicBlock() = default;
61
62/// Return the MCSymbol for this basic block.
64 if (!CachedMCSymbol) {
65 const MachineFunction *MF = getParent();
66 MCContext &Ctx = MF->getContext();
67
68 // We emit a non-temporary symbol -- with a descriptive name -- if it begins
69 // a section (with basic block sections). Otherwise we fall back to use temp
70 // label.
71 if (MF->hasBBSections() && isBeginSection()) {
72 SmallString<5> Suffix;
73 if (SectionID == MBBSectionID::ColdSectionID) {
74 Suffix += ".cold";
75 } else if (SectionID == MBBSectionID::ExceptionSectionID) {
76 Suffix += ".eh";
77 } else {
78 // For symbols that represent basic block sections, we add ".__part." to
79 // allow tools like symbolizers to know that this represents a part of
80 // the original function.
81 Suffix = (Suffix + Twine(".__part.") + Twine(SectionID.Number)).str();
82 }
83 CachedMCSymbol = Ctx.getOrCreateSymbol(MF->getName() + Suffix);
84 } else {
85 // If the block occurs as label in inline assembly, parsing the assembly
86 // needs an actual label name => set AlwaysEmit in these cases.
87 CachedMCSymbol = Ctx.createBlockSymbol(
88 "BB" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber()),
89 /*AlwaysEmit=*/hasLabelMustBeEmitted());
90 }
91 }
92 return CachedMCSymbol;
93}
94
96 if (!CachedEHContMCSymbol) {
97 const MachineFunction *MF = getParent();
98 SmallString<128> SymbolName;
99 raw_svector_ostream(SymbolName)
100 << "$ehgcr_" << MF->getFunctionNumber() << '_' << getNumber();
101 CachedEHContMCSymbol = MF->getContext().getOrCreateSymbol(SymbolName);
102 }
103 return CachedEHContMCSymbol;
104}
105
107 if (!CachedEndMCSymbol) {
108 const MachineFunction *MF = getParent();
109 MCContext &Ctx = MF->getContext();
110 CachedEndMCSymbol = Ctx.createBlockSymbol(
111 "BB_END" + Twine(MF->getFunctionNumber()) + "_" + Twine(getNumber()),
112 /*AlwaysEmit=*/false);
113 }
114 return CachedEndMCSymbol;
115}
116
118 MBB.print(OS);
119 return OS;
120}
121
123 return Printable([&MBB](raw_ostream &OS) { return MBB.printAsOperand(OS); });
124}
125
126/// When an MBB is added to an MF, we need to update the parent pointer of the
127/// MBB, the MBB numbering, and any instructions in the MBB to be on the right
128/// operand list for registers.
129///
130/// MBBs start out as #-1. When a MBB is added to a MachineFunction, it
131/// gets the next available unique MBB number. If it is removed from a
132/// MachineFunction, it goes back to being #-1.
135 MachineFunction &MF = *N->getParent();
136 N->Number = MF.addToMBBNumbering(N);
137 N->AnalysisNumber = MF.assignAnalysisNumber();
138
139 // Make sure the instructions have their operands in the reginfo lists.
141 for (MachineInstr &MI : N->instrs())
142 MI.addRegOperandsToUseLists(RegInfo);
143}
144
147 N->getParent()->removeFromMBBNumbering(N->Number);
148 N->Number = -1;
149 N->AnalysisNumber = -1;
150}
151
152/// When we add an instruction to a basic block list, we update its parent
153/// pointer and add its operands from reg use/def lists if appropriate.
155 assert(!N->getParent() && "machine instruction already in a basic block");
156 N->setParent(Parent);
157
158 // Add the instruction's register operands to their corresponding
159 // use/def lists.
160 MachineFunction *MF = Parent->getParent();
161 N->addRegOperandsToUseLists(MF->getRegInfo());
162 MF->handleInsertion(*N);
163}
164
165/// When we remove an instruction from a basic block list, we update its parent
166/// pointer and remove its operands from reg use/def lists if appropriate.
168 assert(N->getParent() && "machine instruction not in a basic block");
169
170 // Remove from the use/def lists.
171 if (MachineFunction *MF = N->getMF()) {
172 MF->handleRemoval(*N);
173 N->removeRegOperandsFromUseLists(MF->getRegInfo());
174 }
175
176 N->setParent(nullptr);
177}
178
179/// When moving a range of instructions from one MBB list to another, we need to
180/// update the parent pointers and the use/def lists.
182 instr_iterator First,
183 instr_iterator Last) {
184 assert(Parent->getParent() == FromList.Parent->getParent() &&
185 "cannot transfer MachineInstrs between MachineFunctions");
186
187 // If it's within the same BB, there's nothing to do.
188 if (this == &FromList)
189 return;
190
191 assert(Parent != FromList.Parent && "Two lists have the same parent?");
192
193 // If splicing between two blocks within the same function, just update the
194 // parent pointers.
195 for (; First != Last; ++First)
196 First->setParent(Parent);
197}
198
200 assert(!MI->getParent() && "MI is still in a block!");
201 Parent->getParent()->deleteMachineInstr(MI);
202}
203
206 while (I != E && I->isPHI())
207 ++I;
208 assert((I == E || !I->isInsideBundle()) &&
209 "First non-phi MI cannot be inside a bundle!");
210 return I;
211}
212
216
217 iterator E = end();
218 while (I != E && (I->isPHI() || I->isPosition() ||
219 TII->isBasicBlockPrologue(*I)))
220 ++I;
221 // FIXME: This needs to change if we wish to bundle labels
222 // inside the bundle.
223 assert((I == E || !I->isInsideBundle()) &&
224 "First non-phi / non-label instruction is inside a bundle!");
225 return I;
226}
227
230 Register Reg, bool SkipPseudoOp) {
232
233 iterator E = end();
234 while (I != E && (I->isPHI() || I->isPosition() || I->isDebugInstr() ||
235 (SkipPseudoOp && I->isPseudoProbe()) ||
236 TII->isBasicBlockPrologue(*I, Reg)))
237 ++I;
238 // FIXME: This needs to change if we wish to bundle labels / dbg_values
239 // inside the bundle.
240 assert((I == E || !I->isInsideBundle()) &&
241 "First non-phi / non-label / non-debug "
242 "instruction is inside a bundle!");
243 return I;
244}
245
247 iterator B = begin(), E = end(), I = E;
248 while (I != B && ((--I)->isTerminator() || I->isDebugInstr()))
249 ; /*noop */
250 while (I != E && !I->isTerminator())
251 ++I;
252 return I;
253}
254
256 instr_iterator B = instr_begin(), E = instr_end(), I = E;
257 while (I != B && ((--I)->isTerminator() || I->isDebugInstr()))
258 ; /*noop */
259 while (I != E && !I->isTerminator())
260 ++I;
261 return I;
262}
263
265 return find_if(instrs(), [](auto &II) { return II.isTerminator(); });
266}
267
270 // Skip over begin-of-block dbg_value instructions.
271 return skipDebugInstructionsForward(begin(), end(), SkipPseudoOp);
272}
273
276 // Skip over end-of-block dbg_value instructions.
278 while (I != B) {
279 --I;
280 // Return instruction that starts a bundle.
281 if (I->isDebugInstr() || I->isInsideBundle())
282 continue;
283 if (SkipPseudoOp && I->isPseudoProbe())
284 continue;
285 return I;
286 }
287 // The block is all debug values.
288 return end();
289}
290
292 for (const MachineBasicBlock *Succ : successors())
293 if (Succ->isEHPad())
294 return true;
295 return false;
296}
297
299 return getParent()->begin() == getIterator();
300}
301
302#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
306#endif
307
309 for (const MachineBasicBlock *Succ : successors()) {
310 if (Succ->isInlineAsmBrIndirectTarget())
311 return true;
312 }
313 return false;
314}
315
318 return false;
319 return true;
320}
321
323 if (const BasicBlock *LBB = getBasicBlock())
324 return LBB->hasName();
325 return false;
326}
327
329 if (const BasicBlock *LBB = getBasicBlock())
330 return LBB->getName();
331 else
332 return StringRef("", 0);
333}
334
335/// Return a hopefully unique identifier for this block.
337 std::string Name;
338 if (getParent())
339 Name = (getParent()->getName() + ":").str();
340 if (getBasicBlock())
341 Name += getBasicBlock()->getName();
342 else
343 Name += ("BB" + Twine(getNumber())).str();
344 return Name;
345}
346
348 bool IsStandalone) const {
349 const MachineFunction *MF = getParent();
350 if (!MF) {
351 OS << "Can't print out MachineBasicBlock because parent MachineFunction"
352 << " is null\n";
353 return;
354 }
355 const Function &F = MF->getFunction();
356 const Module *M = F.getParent();
357 ModuleSlotTracker MST(M);
359 print(OS, MST, Indexes, IsStandalone);
360}
361
363 const SlotIndexes *Indexes,
364 bool IsStandalone) const {
365 const MachineFunction *MF = getParent();
366 if (!MF) {
367 OS << "Can't print out MachineBasicBlock because parent MachineFunction"
368 << " is null\n";
369 return;
370 }
371
372 if (Indexes && PrintSlotIndexes)
373 OS << Indexes->getMBBStartIdx(this) << '\t';
374
376 OS << ":\n";
377
379 const MachineRegisterInfo &MRI = MF->getRegInfo();
381 bool HasLineAttributes = false;
382
383 // Print the preds of this block according to the CFG.
384 if (!pred_empty() && IsStandalone) {
385 if (Indexes) OS << '\t';
386 // Don't indent(2), align with previous line attributes.
387 OS << "; predecessors: ";
388 ListSeparator LS;
389 for (auto *Pred : predecessors())
390 OS << LS << printMBBReference(*Pred);
391 OS << '\n';
392 HasLineAttributes = true;
393 }
394
395 if (!succ_empty()) {
396 if (Indexes) OS << '\t';
397 // Print the successors
398 OS.indent(2) << "successors: ";
399 ListSeparator LS;
400 for (auto I = succ_begin(), E = succ_end(); I != E; ++I) {
401 OS << LS << printMBBReference(**I);
402 if (!Probs.empty())
403 OS << '('
404 << format("0x%08" PRIx32, getSuccProbability(I).getNumerator())
405 << ')';
406 }
407 if (!Probs.empty() && IsStandalone) {
408 // Print human readable probabilities as comments.
409 OS << "; ";
410 ListSeparator LS;
411 for (auto I = succ_begin(), E = succ_end(); I != E; ++I) {
413 OS << LS << printMBBReference(**I) << '('
414 << format("%.2f%%",
415 rint(((double)BP.getNumerator() / BP.getDenominator()) *
416 100.0 * 100.0) /
417 100.0)
418 << ')';
419 }
420 }
421
422 OS << '\n';
423 HasLineAttributes = true;
424 }
425
426 if (!livein_empty() && MRI.tracksLiveness()) {
427 if (Indexes) OS << '\t';
428 OS.indent(2) << "liveins: ";
429
430 ListSeparator LS;
431 for (const auto &LI : liveins()) {
432 OS << LS << printReg(LI.PhysReg, TRI);
433 if (!LI.LaneMask.all())
434 OS << ":0x" << PrintLaneMask(LI.LaneMask);
435 }
436 HasLineAttributes = true;
437 }
438
439 if (HasLineAttributes)
440 OS << '\n';
441
442 bool IsInBundle = false;
443 for (const MachineInstr &MI : instrs()) {
444 if (Indexes && PrintSlotIndexes) {
445 if (Indexes->hasIndex(MI))
446 OS << Indexes->getInstructionIndex(MI);
447 OS << '\t';
448 }
449
450 if (IsInBundle && !MI.isInsideBundle()) {
451 OS.indent(2) << "}\n";
452 IsInBundle = false;
453 }
454
455 OS.indent(IsInBundle ? 4 : 2);
456 MI.print(OS, MST, IsStandalone, /*SkipOpers=*/false, /*SkipDebugLoc=*/false,
457 /*AddNewLine=*/false, &TII);
458
459 if (!IsInBundle && MI.getFlag(MachineInstr::BundledSucc)) {
460 OS << " {";
461 IsInBundle = true;
462 }
463 OS << '\n';
464 }
465
466 if (IsInBundle)
467 OS.indent(2) << "}\n";
468
469 if (IrrLoopHeaderWeight && IsStandalone) {
470 if (Indexes) OS << '\t';
471 OS.indent(2) << "; Irreducible loop header weight: " << *IrrLoopHeaderWeight
472 << '\n';
473 }
474}
475
476/// Print the basic block's name as:
477///
478/// bb.{number}[.{ir-name}] [(attributes...)]
479///
480/// The {ir-name} is only printed when the \ref PrintNameIr flag is passed
481/// (which is the default). If the IR block has no name, it is identified
482/// numerically using the attribute syntax as "(%ir-block.{ir-slot})".
483///
484/// When the \ref PrintNameAttributes flag is passed, additional attributes
485/// of the block are printed when set.
486///
487/// \param printNameFlags Combination of \ref PrintNameFlag flags indicating
488/// the parts to print.
489/// \param moduleSlotTracker Optional ModuleSlotTracker. This method will
490/// incorporate its own tracker when necessary to
491/// determine the block's IR name.
492void MachineBasicBlock::printName(raw_ostream &os, unsigned printNameFlags,
493 ModuleSlotTracker *moduleSlotTracker) const {
494 os << "bb." << getNumber();
495 bool hasAttributes = false;
496
497 auto PrintBBRef = [&](const BasicBlock *bb) {
498 os << "%ir-block.";
499 if (bb->hasName()) {
500 printLLVMNameWithoutPrefix(os, bb->getName());
501 } else {
502 int slot = -1;
503
504 if (moduleSlotTracker) {
505 slot = moduleSlotTracker->getLocalSlot(bb);
506 } else if (bb->getParent()) {
507 ModuleSlotTracker tmpTracker(bb->getModule());
508 tmpTracker.incorporateFunction(*bb->getParent());
509 slot = tmpTracker.getLocalSlot(bb);
510 }
511
512 if (slot == -1)
513 os << "<ir-block badref>";
514 else
515 os << slot;
516 }
517 };
518
519 if (printNameFlags & PrintNameIr) {
520 if (const auto *bb = getBasicBlock()) {
521 if (bb->hasName()) {
522 // Quote if not a plain identifier, or the MIR cannot be parsed back.
523 os << '.';
524 printLLVMNameWithoutPrefix(os, bb->getName());
525 } else {
526 hasAttributes = true;
527 os << " (";
528 PrintBBRef(bb);
529 }
530 }
531 }
532
533 if (printNameFlags & PrintNameAttributes) {
535 os << (hasAttributes ? ", " : " (");
536 os << "machine-block-address-taken";
537 hasAttributes = true;
538 }
539 if (isIRBlockAddressTaken()) {
540 os << (hasAttributes ? ", " : " (");
541 os << "ir-block-address-taken ";
542 PrintBBRef(getAddressTakenIRBlock());
543 hasAttributes = true;
544 }
545 if (isEHPad()) {
546 os << (hasAttributes ? ", " : " (");
547 os << "landing-pad";
548 hasAttributes = true;
549 }
551 os << (hasAttributes ? ", " : " (");
552 os << "inlineasm-br-indirect-target";
553 hasAttributes = true;
554 }
555 if (isEHFuncletEntry()) {
556 os << (hasAttributes ? ", " : " (");
557 os << "ehfunclet-entry";
558 hasAttributes = true;
559 }
560 if (isEHScopeEntry()) {
561 os << (hasAttributes ? ", " : " (");
562 os << "ehscope-entry";
563 hasAttributes = true;
564 }
565 if (getAlignment() != Align(1)) {
566 os << (hasAttributes ? ", " : " (");
567 os << "align " << getAlignment().value();
568 hasAttributes = true;
569 }
570 if (getSectionID() != MBBSectionID(0)) {
571 os << (hasAttributes ? ", " : " (");
572 os << "bbsections ";
573 switch (getSectionID().Type) {
575 os << "Exception";
576 break;
578 os << "Cold";
579 break;
580 default:
581 os << getSectionID().Number;
582 }
583 hasAttributes = true;
584 }
585 if (getBBID().has_value()) {
586 os << (hasAttributes ? ", " : " (");
587 os << "bb_id " << getBBID()->BaseID;
588 if (getBBID()->CloneID != 0)
589 os << " " << getBBID()->CloneID;
590 hasAttributes = true;
591 }
592 if (CallFrameSize != 0) {
593 os << (hasAttributes ? ", " : " (");
594 os << "call-frame-size " << CallFrameSize;
595 hasAttributes = true;
596 }
597 }
598
599 if (hasAttributes)
600 os << ')';
601}
602
604 bool /*PrintType*/) const {
605 OS << '%';
606 printName(OS, 0);
607}
608
610 assert(Reg.isPhysical());
611 LiveInVector::iterator I = find_if(
612 LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
613 if (I == LiveIns.end())
614 return;
615
616 I->LaneMask &= ~LaneMask;
617 if (I->LaneMask.none())
618 LiveIns.erase(I);
619}
620
622 const MachineFunction *MF = getParent();
624 // Remove Reg and its subregs from live in set.
625 for (MCPhysReg S : TRI->subregs_inclusive(Reg))
626 removeLiveIn(S);
627
628 // Remove live-in bitmask in super registers as well.
629 for (MCPhysReg Super : TRI->superregs(Reg)) {
630 for (MCSubRegIndexIterator SRI(Super, TRI); SRI.isValid(); ++SRI) {
631 if (Reg == SRI.getSubReg()) {
632 unsigned SubRegIndex = SRI.getSubRegIndex();
633 LaneBitmask SubRegLaneMask = TRI->getSubRegIndexLaneMask(SubRegIndex);
634 removeLiveIn(Super, SubRegLaneMask);
635 break;
636 }
637 }
638 }
639}
640
643 // Get non-const version of iterator.
644 LiveInVector::iterator LI = LiveIns.begin() + (I - LiveIns.begin());
645 return LiveIns.erase(LI);
646}
647
649 assert(Reg.isPhysical());
651 LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
652 return I != livein_end() && (I->LaneMask & LaneMask).any();
653}
654
656 llvm::sort(LiveIns,
657 [](const RegisterMaskPair &LI0, const RegisterMaskPair &LI1) {
658 return LI0.PhysReg < LI1.PhysReg;
659 });
660 // Liveins are sorted by physreg now we can merge their lanemasks.
661 LiveInVector::const_iterator I = LiveIns.begin();
662 LiveInVector::const_iterator J;
663 LiveInVector::iterator Out = LiveIns.begin();
664 for (; I != LiveIns.end(); ++Out, I = J) {
665 MCRegister PhysReg = I->PhysReg;
666 LaneBitmask LaneMask = I->LaneMask;
667 for (J = std::next(I); J != LiveIns.end() && J->PhysReg == PhysReg; ++J)
668 LaneMask |= J->LaneMask;
669 Out->PhysReg = PhysReg;
670 Out->LaneMask = LaneMask;
671 }
672 LiveIns.erase(Out, LiveIns.end());
673}
674
677 assert(getParent() && "MBB must be inserted in function");
678 assert(PhysReg.isPhysical() && "Expected physreg");
679 assert(RC && "Register class is required");
680 assert((isEHPad() || this == &getParent()->front()) &&
681 "Only the entry block and landing pads can have physreg live ins");
682
683 bool LiveIn = isLiveIn(PhysReg);
687
688 // Look for an existing copy.
689 if (LiveIn)
690 for (;I != E && I->isCopy(); ++I)
691 if (I->getOperand(1).getReg() == PhysReg) {
692 Register VirtReg = I->getOperand(0).getReg();
693 if (!MRI.constrainRegClass(VirtReg, RC))
694 llvm_unreachable("Incompatible live-in register class.");
695 return VirtReg;
696 }
697
698 // No luck, create a virtual register.
699 Register VirtReg = MRI.createVirtualRegister(RC);
700 BuildMI(*this, I, DebugLoc(), TII.get(TargetOpcode::COPY), VirtReg)
701 .addReg(PhysReg, RegState::Kill);
702 if (!LiveIn)
703 addLiveIn(PhysReg);
704 return VirtReg;
705}
706
707void MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) {
708 getParent()->splice(NewAfter->getIterator(), getIterator());
709}
710
711void MachineBasicBlock::moveAfter(MachineBasicBlock *NewBefore) {
712 getParent()->splice(++NewBefore->getIterator(), getIterator());
713}
714
716 MachineBasicBlock::const_iterator TerminatorI = MBB.getFirstTerminator();
717 if (TerminatorI == MBB.end())
718 return -1;
719 const MachineInstr &Terminator = *TerminatorI;
720 const TargetInstrInfo *TII = MBB.getParent()->getSubtarget().getInstrInfo();
721 return TII->getJumpTableIndex(Terminator);
722}
723
725 MachineBasicBlock *PreviousLayoutSuccessor) {
726 LLVM_DEBUG(dbgs() << "Updating terminators on " << printMBBReference(*this)
727 << "\n");
728
730 // A block with no successors has no concerns with fall-through edges.
731 if (this->succ_empty())
732 return;
733
734 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
737 bool B = TII->analyzeBranch(*this, TBB, FBB, Cond);
738 (void) B;
739 assert(!B && "UpdateTerminators requires analyzable predecessors!");
740 if (Cond.empty()) {
741 if (TBB) {
742 // The block has an unconditional branch. If its successor is now its
743 // layout successor, delete the branch.
745 TII->removeBranch(*this);
746 } else {
747 // The block has an unconditional fallthrough, or the end of the block is
748 // unreachable.
749
750 // Unfortunately, whether the end of the block is unreachable is not
751 // immediately obvious; we must fall back to checking the successor list,
752 // and assuming that if the passed in block is in the succesor list and
753 // not an EHPad, it must be the intended target.
754 if (!PreviousLayoutSuccessor || !isSuccessor(PreviousLayoutSuccessor) ||
755 PreviousLayoutSuccessor->isEHPad())
756 return;
757
758 // If the unconditional successor block is not the current layout
759 // successor, insert a branch to jump to it.
760 if (!isLayoutSuccessor(PreviousLayoutSuccessor))
761 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
762 }
763 return;
764 }
765
766 if (FBB) {
767 // The block has a non-fallthrough conditional branch. If one of its
768 // successors is its layout successor, rewrite it to a fallthrough
769 // conditional branch.
770 if (isLayoutSuccessor(TBB)) {
771 if (TII->reverseBranchCondition(Cond))
772 return;
773 TII->removeBranch(*this);
774 TII->insertBranch(*this, FBB, nullptr, Cond, DL);
775 } else if (isLayoutSuccessor(FBB)) {
776 TII->removeBranch(*this);
777 TII->insertBranch(*this, TBB, nullptr, Cond, DL);
778 }
779 return;
780 }
781
782 // We now know we're going to fallthrough to PreviousLayoutSuccessor.
783 assert(PreviousLayoutSuccessor);
784 assert(!PreviousLayoutSuccessor->isEHPad());
785 assert(isSuccessor(PreviousLayoutSuccessor));
786
787 if (PreviousLayoutSuccessor == TBB) {
788 // We had a fallthrough to the same basic block as the conditional jump
789 // targets. Remove the conditional jump, leaving an unconditional
790 // fallthrough or an unconditional jump.
791 TII->removeBranch(*this);
792 if (!isLayoutSuccessor(TBB)) {
793 Cond.clear();
794 TII->insertBranch(*this, TBB, nullptr, Cond, DL);
795 }
796 return;
797 }
798
799 // The block has a fallthrough conditional branch.
800 if (isLayoutSuccessor(TBB)) {
801 if (TII->reverseBranchCondition(Cond)) {
802 // We can't reverse the condition, add an unconditional branch.
803 Cond.clear();
804 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
805 return;
806 }
807 TII->removeBranch(*this);
808 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
809 } else if (!isLayoutSuccessor(PreviousLayoutSuccessor)) {
810 TII->removeBranch(*this);
811 TII->insertBranch(*this, TBB, PreviousLayoutSuccessor, Cond, DL);
812 }
813}
814
816#ifndef NDEBUG
817 int64_t Sum = 0;
818 for (auto Prob : Probs)
819 Sum += Prob.getNumerator();
820 // Due to precision issue, we assume that the sum of probabilities is one if
821 // the difference between the sum of their numerators and the denominator is
822 // no greater than the number of successors.
823 assert((uint64_t)std::abs(Sum - BranchProbability::getDenominator()) <=
824 Probs.size() &&
825 "The sum of successors's probabilities exceeds one.");
826#endif // NDEBUG
827}
828
829void MachineBasicBlock::addSuccessor(MachineBasicBlock *Succ,
830 BranchProbability Prob) {
831 // Probability list is either empty (if successor list isn't empty, this means
832 // disabled optimization) or has the same size as successor list.
833 if (!(Probs.empty() && !Successors.empty()))
834 Probs.push_back(Prob);
835 Successors.push_back(Succ);
836 Succ->addPredecessor(this);
837}
838
839void MachineBasicBlock::addSuccessorWithoutProb(MachineBasicBlock *Succ) {
840 // We need to make sure probability list is either empty or has the same size
841 // of successor list. When this function is called, we can safely delete all
842 // probability in the list.
843 Probs.clear();
844 Successors.push_back(Succ);
845 Succ->addPredecessor(this);
846}
847
848void MachineBasicBlock::splitSuccessor(MachineBasicBlock *Old,
849 MachineBasicBlock *New,
850 bool NormalizeSuccProbs) {
851 succ_iterator OldI = llvm::find(successors(), Old);
852 assert(OldI != succ_end() && "Old is not a successor of this block!");
854 "New is already a successor of this block!");
855
856 // Add a new successor with equal probability as the original one. Note
857 // that we directly copy the probability using the iterator rather than
858 // getting a potentially synthetic probability computed when unknown. This
859 // preserves the probabilities as-is and then we can renormalize them and
860 // query them effectively afterward.
861 addSuccessor(New, Probs.empty() ? BranchProbability::getUnknown()
862 : *getProbabilityIterator(OldI));
863 if (NormalizeSuccProbs)
865}
866
867void MachineBasicBlock::removeSuccessor(MachineBasicBlock *Succ,
868 bool NormalizeSuccProbs) {
869 succ_iterator I = find(Successors, Succ);
870 removeSuccessor(I, NormalizeSuccProbs);
871}
872
875 assert(I != Successors.end() && "Not a current successor!");
876
877 // If probability list is empty it means we don't use it (disabled
878 // optimization).
879 if (!Probs.empty()) {
880 probability_iterator WI = getProbabilityIterator(I);
881 Probs.erase(WI);
882 if (NormalizeSuccProbs)
884 }
885
886 (*I)->removePredecessor(this);
887 return Successors.erase(I);
888}
889
890void MachineBasicBlock::replaceSuccessor(MachineBasicBlock *Old,
891 MachineBasicBlock *New) {
892 if (Old == New)
893 return;
894
896 succ_iterator NewI = E;
897 succ_iterator OldI = E;
898 for (succ_iterator I = succ_begin(); I != E; ++I) {
899 if (*I == Old) {
900 OldI = I;
901 if (NewI != E)
902 break;
903 }
904 if (*I == New) {
905 NewI = I;
906 if (OldI != E)
907 break;
908 }
909 }
910 assert(OldI != E && "Old is not a successor of this block");
911
912 // If New isn't already a successor, let it take Old's place.
913 if (NewI == E) {
914 Old->removePredecessor(this);
915 New->addPredecessor(this);
916 *OldI = New;
917 return;
918 }
919
920 // New is already a successor.
921 // Update its probability instead of adding a duplicate edge.
922 if (!Probs.empty()) {
923 auto ProbIter = getProbabilityIterator(NewI);
924 if (!ProbIter->isUnknown())
925 *ProbIter += *getProbabilityIterator(OldI);
926 }
927 removeSuccessor(OldI);
928}
929
930void MachineBasicBlock::copySuccessor(const MachineBasicBlock *Orig,
932 if (!Orig->Probs.empty())
934 else
936}
937
938void MachineBasicBlock::addPredecessor(MachineBasicBlock *Pred) {
939 Predecessors.push_back(Pred);
940}
941
942void MachineBasicBlock::removePredecessor(MachineBasicBlock *Pred) {
943 // This is often called on many predecessors in reverse order.
944 // Do a reverse search and removal to avoid quadratic behavior in such cases.
945 auto RI = llvm::find(reverse(Predecessors), Pred);
946 assert(RI != Predecessors.rend() &&
947 "Pred is not a predecessor of this block!");
948 Predecessors.erase(std::prev(RI.base()));
949}
950
951void MachineBasicBlock::transferSuccessors(MachineBasicBlock *FromMBB) {
952 if (this == FromMBB)
953 return;
954
955 while (!FromMBB->succ_empty()) {
956 MachineBasicBlock *Succ = *FromMBB->succ_begin();
957
958 // If probability list is empty it means we don't use it (disabled
959 // optimization).
960 if (!FromMBB->Probs.empty()) {
961 auto Prob = *FromMBB->Probs.begin();
962 addSuccessor(Succ, Prob);
963 } else
965
966 FromMBB->removeSuccessor(Succ);
967 }
968}
969
970void
972 if (this == FromMBB)
973 return;
974
975 while (!FromMBB->succ_empty()) {
976 MachineBasicBlock *Succ = *FromMBB->succ_begin();
977 if (!FromMBB->Probs.empty()) {
978 auto Prob = *FromMBB->Probs.begin();
979 addSuccessor(Succ, Prob);
980 } else
982 FromMBB->removeSuccessor(Succ);
983
984 // Fix up any PHI nodes in the successor.
985 Succ->replacePhiUsesWith(FromMBB, this);
986 }
988}
989
990bool MachineBasicBlock::isPredecessor(const MachineBasicBlock *MBB) const {
991 return is_contained(predecessors(), MBB);
992}
993
994bool MachineBasicBlock::isSuccessor(const MachineBasicBlock *MBB) const {
995 return is_contained(successors(), MBB);
996}
997
998bool MachineBasicBlock::isLayoutSuccessor(const MachineBasicBlock *MBB) const {
1000 return std::next(I) == MachineFunction::const_iterator(MBB);
1001}
1002
1003const MachineBasicBlock *MachineBasicBlock::getSingleSuccessor() const {
1004 return Successors.size() == 1 ? Successors[0] : nullptr;
1005}
1006
1007const MachineBasicBlock *MachineBasicBlock::getSinglePredecessor() const {
1008 return Predecessors.size() == 1 ? Predecessors[0] : nullptr;
1009}
1010
1011MachineBasicBlock *MachineBasicBlock::getFallThrough(bool JumpToFallThrough) {
1012 MachineFunction::iterator Fallthrough = getIterator();
1013 ++Fallthrough;
1014 // If FallthroughBlock is off the end of the function, it can't fall through.
1015 if (Fallthrough == getParent()->end())
1016 return nullptr;
1017
1018 // If FallthroughBlock isn't a successor, no fallthrough is possible.
1019 if (!isSuccessor(&*Fallthrough))
1020 return nullptr;
1021
1022 // Analyze the branches, if any, at the end of the block.
1023 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
1026 if (TII->analyzeBranch(*this, TBB, FBB, Cond)) {
1027 // If we couldn't analyze the branch, examine the last instruction.
1028 // If the block doesn't end in a known control barrier, assume fallthrough
1029 // is possible. The isPredicated check is needed because this code can be
1030 // called during IfConversion, where an instruction which is normally a
1031 // Barrier is predicated and thus no longer an actual control barrier.
1032 return (empty() || !back().isBarrier() || TII->isPredicated(back()))
1033 ? &*Fallthrough
1034 : nullptr;
1035 }
1036
1037 // If there is no branch, control always falls through.
1038 if (!TBB) return &*Fallthrough;
1039
1040 // If there is some explicit branch to the fallthrough block, it can obviously
1041 // reach, even though the branch should get folded to fall through implicitly.
1042 if (JumpToFallThrough && (MachineFunction::iterator(TBB) == Fallthrough ||
1043 MachineFunction::iterator(FBB) == Fallthrough))
1044 return &*Fallthrough;
1045
1046 // If it's an unconditional branch to some block not the fall through, it
1047 // doesn't fall through.
1048 if (Cond.empty()) return nullptr;
1049
1050 // Otherwise, if it is conditional and has no explicit false block, it falls
1051 // through.
1052 return (FBB == nullptr) ? &*Fallthrough : nullptr;
1053}
1054
1056 return getFallThrough() != nullptr;
1057}
1058
1060 bool UpdateLiveIns,
1061 LiveIntervals *LIS) {
1062 MachineBasicBlock::iterator SplitPoint(&MI);
1063 ++SplitPoint;
1064
1065 if (SplitPoint == end()) {
1066 // Don't bother with a new block.
1067 return this;
1068 }
1069
1070 MachineFunction *MF = getParent();
1071
1073 if (UpdateLiveIns) {
1074 // Make sure we add any physregs we define in the block as liveins to the
1075 // new block.
1077 LiveRegs.init(*MF->getSubtarget().getRegisterInfo());
1078 LiveRegs.addLiveOuts(*this);
1079 for (auto I = rbegin(), E = Prev.getReverse(); I != E; ++I)
1080 LiveRegs.stepBackward(*I);
1081 }
1082
1083 MachineBasicBlock *SplitBB = MF->CreateMachineBasicBlock(getBasicBlock());
1084
1085 MF->insert(++MachineFunction::iterator(this), SplitBB);
1086 SplitBB->splice(SplitBB->begin(), this, SplitPoint, end());
1087
1088 SplitBB->transferSuccessorsAndUpdatePHIs(this);
1089 addSuccessor(SplitBB);
1090
1091 if (UpdateLiveIns)
1092 addLiveIns(*SplitBB, LiveRegs);
1093
1094 if (LIS)
1095 LIS->splitAt(*this, *SplitBB);
1096
1097 return SplitBB;
1098}
1099
1100// Returns `true` if there are possibly other users of the jump table at
1101// `JumpTableIndex` except for the ones in `IgnoreMBB`.
1103 const MachineBasicBlock &IgnoreMBB,
1104 int JumpTableIndex) {
1105 assert(JumpTableIndex >= 0 && "need valid index");
1106 const MachineJumpTableInfo &MJTI = *MF.getJumpTableInfo();
1107 const MachineJumpTableEntry &MJTE = MJTI.getJumpTables()[JumpTableIndex];
1108 // Take any basic block from the table; every user of the jump table must
1109 // show up in the predecessor list.
1110 const MachineBasicBlock *MBB = nullptr;
1111 for (MachineBasicBlock *B : MJTE.MBBs) {
1112 if (B != nullptr) {
1113 MBB = B;
1114 break;
1115 }
1116 }
1117 if (MBB == nullptr)
1118 return true; // can't rule out other users if there isn't any block.
1121 for (MachineBasicBlock *Pred : MBB->predecessors()) {
1122 if (Pred == &IgnoreMBB)
1123 continue;
1124 MachineBasicBlock *DummyT = nullptr;
1125 MachineBasicBlock *DummyF = nullptr;
1126 Cond.clear();
1127 if (!TII.analyzeBranch(*Pred, DummyT, DummyF, Cond,
1128 /*AllowModify=*/false)) {
1129 // analyzable direct jump
1130 continue;
1131 }
1132 int PredJTI = findJumpTableIndex(*Pred);
1133 if (PredJTI >= 0) {
1134 if (PredJTI == JumpTableIndex)
1135 return true;
1136 continue;
1137 }
1138 // Be conservative for unanalyzable jumps.
1139 return true;
1140 }
1141 return false;
1142}
1143
1145private:
1146 MachineFunction &MF;
1147 SlotIndexes *Indexes;
1149
1150public:
1152 : MF(MF), Indexes(Indexes) {
1153 MF.setDelegate(this);
1154 }
1155
1157 MF.resetDelegate(this);
1158 for (auto MI : Insertions)
1159 Indexes->insertMachineInstrInMaps(*MI);
1160 }
1161
1163 // This is called before MI is inserted into block so defer index update.
1164 if (Indexes)
1165 Insertions.insert(&MI);
1166 }
1167
1169 if (Indexes && !Insertions.remove(&MI))
1170 Indexes->removeMachineInstrFromMaps(MI);
1171 }
1172};
1173
1175 MachineBasicBlock *Succ, Pass *P, MachineFunctionAnalysisManager *MFAM,
1176 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU) {
1177#define GET_RESULT(RESULT, GETTER, INFIX) \
1178 [MF, P, MFAM]() { \
1179 if (P) { \
1180 auto *Wrapper = P->getAnalysisIfAvailable<RESULT##INFIX##WrapperPass>(); \
1181 return Wrapper ? &Wrapper->GETTER() : nullptr; \
1182 } \
1183 return MFAM->getCachedResult<RESULT##Analysis>(*MF); \
1184 }()
1185
1186 assert((P || MFAM) && "Need a way to get analysis results!");
1187 MachineFunction *MF = getParent();
1188 LiveIntervals *LIS = GET_RESULT(LiveIntervals, getLIS, );
1189 SlotIndexes *Indexes = GET_RESULT(SlotIndexes, getSI, );
1190 LiveVariables *LV = GET_RESULT(LiveVariables, getLV, );
1191 MachineLoopInfo *MLI = GET_RESULT(MachineLoop, getLI, Info);
1192 return SplitCriticalEdge(Succ, {LIS, Indexes, LV, MLI}, LiveInSets, MDTU);
1193#undef GET_RESULT
1194}
1195
1197 MachineBasicBlock *Succ, const SplitCriticalEdgeAnalyses &Analyses,
1198 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU) {
1199 if (!canSplitCriticalEdge(Succ, Analyses.MLI))
1200 return nullptr;
1201
1202 MachineFunction *MF = getParent();
1203 MachineBasicBlock *PrevFallthrough = getNextNode();
1204
1205 MachineBasicBlock *NMBB = MF->CreateMachineBasicBlock();
1206 NMBB->setCallFrameSize(Succ->getCallFrameSize());
1207
1208 // Is there an indirect jump with jump table?
1209 bool ChangedIndirectJump = false;
1210 int JTI = findJumpTableIndex(*this);
1211 if (JTI >= 0) {
1213 MJTI.ReplaceMBBInJumpTable(JTI, Succ, NMBB);
1214 ChangedIndirectJump = true;
1215 }
1216
1217 MF->insert(std::next(MachineFunction::iterator(this)), NMBB);
1218 LLVM_DEBUG(dbgs() << "Splitting critical edge: " << printMBBReference(*this)
1219 << " -- " << printMBBReference(*NMBB) << " -- "
1220 << printMBBReference(*Succ) << '\n');
1221 auto *LIS = Analyses.LIS;
1222 if (LIS)
1223 LIS->insertMBBInMaps(NMBB);
1224 else if (Analyses.SI)
1225 Analyses.SI->insertMBBInMaps(NMBB);
1226
1227 // On some targets like Mips, branches may kill virtual registers. Make sure
1228 // that LiveVariables is properly updated after updateTerminator replaces the
1229 // terminators.
1230 auto *LV = Analyses.LV;
1231 // Collect a list of virtual registers killed by the terminators.
1232 SmallVector<Register, 4> KilledRegs;
1233 if (LV)
1234 for (MachineInstr &MI :
1236 for (MachineOperand &MO : MI.all_uses()) {
1237 if (MO.getReg() == 0 || !MO.isKill() || MO.isUndef())
1238 continue;
1239 Register Reg = MO.getReg();
1240 if (Reg.isPhysical() || LV->getVarInfo(Reg).removeKill(MI)) {
1241 KilledRegs.push_back(Reg);
1242 LLVM_DEBUG(dbgs() << "Removing terminator kill: " << MI);
1243 MO.setIsKill(false);
1244 }
1245 }
1246 }
1247
1248 SmallVector<Register, 4> UsedRegs;
1249 if (LIS) {
1250 for (MachineInstr &MI :
1252 for (const MachineOperand &MO : MI.operands()) {
1253 if (!MO.isReg() || MO.getReg() == 0)
1254 continue;
1255
1256 Register Reg = MO.getReg();
1257 if (!is_contained(UsedRegs, Reg))
1258 UsedRegs.push_back(Reg);
1259 }
1260 }
1261 }
1262
1263 ReplaceUsesOfBlockWith(Succ, NMBB);
1264
1265 // Since we replaced all uses of Succ with NMBB, that should also be treated
1266 // as the fallthrough successor
1267 if (Succ == PrevFallthrough)
1268 PrevFallthrough = NMBB;
1269 auto *Indexes = Analyses.SI;
1270 if (!ChangedIndirectJump) {
1271 SlotIndexUpdateDelegate SlotUpdater(*MF, Indexes);
1272 updateTerminator(PrevFallthrough);
1273 }
1274
1275 // Insert unconditional "jump Succ" instruction in NMBB if necessary.
1276 NMBB->addSuccessor(Succ);
1277 if (!NMBB->isLayoutSuccessor(Succ)) {
1278 SlotIndexUpdateDelegate SlotUpdater(*MF, Indexes);
1281
1282 // In original 'this' BB, there must be a branch instruction targeting at
1283 // Succ. We can not find it out since currently getBranchDestBlock was not
1284 // implemented for all targets. However, if the merged DL has column or line
1285 // number, the scope and non-zero column and line number is same with that
1286 // branch instruction so we can safely use it.
1287 DebugLoc DL, MergedDL = findBranchDebugLoc();
1288 if (MergedDL && (MergedDL.getLine() || MergedDL.getCol()))
1289 DL = MergedDL;
1290 TII->insertBranch(*NMBB, Succ, nullptr, Cond, DL);
1291 }
1292
1293 // Fix PHI nodes in Succ so they refer to NMBB instead of this.
1294 Succ->replacePhiUsesWith(this, NMBB);
1295
1296 // Inherit live-ins from the successor
1297 for (const auto &LI : Succ->liveins())
1298 NMBB->addLiveIn(LI);
1299
1300 // Update LiveVariables.
1302 if (LV) {
1303 // Restore kills of virtual registers that were killed by the terminators.
1304 while (!KilledRegs.empty()) {
1305 Register Reg = KilledRegs.pop_back_val();
1306 for (instr_iterator I = instr_end(), E = instr_begin(); I != E;) {
1307 if (!(--I)->addRegisterKilled(Reg, TRI, /* AddIfNotFound= */ false))
1308 continue;
1309 if (Reg.isVirtual())
1310 LV->getVarInfo(Reg).Kills.push_back(&*I);
1311 LLVM_DEBUG(dbgs() << "Restored terminator kill: " << *I);
1312 break;
1313 }
1314 }
1315 // Update relevant live-through information.
1316 if (LiveInSets != nullptr)
1317 LV->addNewBlock(NMBB, this, Succ, *LiveInSets);
1318 else
1319 LV->addNewBlock(NMBB, this, Succ);
1320 }
1321
1322 if (LIS) {
1323 // After splitting the edge and updating SlotIndexes, live intervals may be
1324 // in one of two situations, depending on whether this block was the last in
1325 // the function. If the original block was the last in the function, all
1326 // live intervals will end prior to the beginning of the new split block. If
1327 // the original block was not at the end of the function, all live intervals
1328 // will extend to the end of the new split block.
1329
1330 bool isLastMBB =
1331 std::next(MachineFunction::iterator(NMBB)) == getParent()->end();
1332
1333 SlotIndex StartIndex = Indexes->getMBBEndIdx(this);
1334 SlotIndex PrevIndex = StartIndex.getPrevSlot();
1335 SlotIndex EndIndex = Indexes->getMBBEndIdx(NMBB);
1336
1337 // Find the registers used from NMBB in PHIs in Succ.
1338 SmallSet<Register, 8> PHISrcRegs;
1340 I = Succ->instr_begin(), E = Succ->instr_end();
1341 I != E && I->isPHI(); ++I) {
1342 for (unsigned ni = 1, ne = I->getNumOperands(); ni != ne; ni += 2) {
1343 if (I->getOperand(ni+1).getMBB() == NMBB) {
1344 MachineOperand &MO = I->getOperand(ni);
1345 Register Reg = MO.getReg();
1346 PHISrcRegs.insert(Reg);
1347 if (MO.isUndef())
1348 continue;
1349
1350 LiveInterval &LI = LIS->getInterval(Reg);
1351 VNInfo *VNI = LI.getVNInfoAt(PrevIndex);
1352 assert(VNI &&
1353 "PHI sources should be live out of their predecessors.");
1354 LI.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1355 for (auto &SR : LI.subranges())
1356 SR.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1357 }
1358 }
1359 }
1360
1362 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i) {
1364 if (PHISrcRegs.count(Reg) || !LIS->hasInterval(Reg))
1365 continue;
1366
1367 LiveInterval &LI = LIS->getInterval(Reg);
1368 if (!LI.liveAt(PrevIndex))
1369 continue;
1370
1371 bool isLiveOut = LI.liveAt(LIS->getMBBStartIdx(Succ));
1372 if (isLiveOut && isLastMBB) {
1373 VNInfo *VNI = LI.getVNInfoAt(PrevIndex);
1374 assert(VNI && "LiveInterval should have VNInfo where it is live.");
1375 LI.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1376 // Update subranges with live values
1377 for (auto &SR : LI.subranges()) {
1378 VNInfo *VNI = SR.getVNInfoAt(PrevIndex);
1379 if (VNI)
1380 SR.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1381 }
1382 } else if (!isLiveOut && !isLastMBB) {
1383 LI.removeSegment(StartIndex, EndIndex);
1384 for (auto &SR : LI.subranges())
1385 SR.removeSegment(StartIndex, EndIndex);
1386 }
1387 }
1388
1389 // Update all intervals for registers whose uses may have been modified by
1390 // updateTerminator().
1391 LIS->repairIntervalsInRange(this, getFirstTerminator(), end(), UsedRegs);
1392
1393 // repairIntervalsInRange() does not update physregs; clear their ranges
1394 // since updateTerminator() may have replaced defs.
1395 for (Register Reg : UsedRegs) {
1396 if (Reg.isPhysical())
1397 LIS->removeAllRegUnitsForPhysReg(Reg.asMCReg());
1398 }
1399 }
1400
1401 if (MDTU)
1402 MDTU->splitCriticalEdge(this, Succ, NMBB);
1403
1404 if (MachineLoopInfo *MLI = Analyses.MLI)
1405 if (MachineLoop *TIL = MLI->getLoopFor(this)) {
1406 // If one or the other blocks were not in a loop, the new block is not
1407 // either, and thus LI doesn't need to be updated.
1408 if (MachineLoop *DestLoop = MLI->getLoopFor(Succ)) {
1409 if (TIL == DestLoop) {
1410 // Both in the same loop, the NMBB joins loop.
1411 DestLoop->addBasicBlockToLoop(NMBB, *MLI);
1412 } else if (TIL->contains(DestLoop)) {
1413 // Edge from an outer loop to an inner loop. Add to the outer loop.
1414 TIL->addBasicBlockToLoop(NMBB, *MLI);
1415 } else if (DestLoop->contains(TIL)) {
1416 // Edge from an inner loop to an outer loop. Add to the outer loop.
1417 DestLoop->addBasicBlockToLoop(NMBB, *MLI);
1418 } else {
1419 // Edge from two loops with no containment relation. Because these
1420 // are natural loops, we know that the destination block must be the
1421 // header of its loop (adding a branch into a loop elsewhere would
1422 // create an irreducible loop).
1423 assert(DestLoop->getHeader() == Succ &&
1424 "Should not create irreducible loops!");
1425 if (MachineLoop *P = DestLoop->getParentLoop())
1426 P->addBasicBlockToLoop(NMBB, *MLI);
1427 }
1428 }
1429 }
1430
1431 return NMBB;
1432}
1433
1434bool MachineBasicBlock::canSplitCriticalEdge(const MachineBasicBlock *Succ,
1435 const MachineLoopInfo *MLI) const {
1436 // Splitting the critical edge to a landing pad block is non-trivial. Don't do
1437 // it in this generic function.
1438 if (Succ->isEHPad())
1439 return false;
1440
1441 // Splitting the critical edge to a callbr's indirect block isn't advised.
1442 // Don't do it in this generic function.
1443 if (Succ->isInlineAsmBrIndirectTarget())
1444 return false;
1445
1446 const MachineFunction *MF = getParent();
1447 // Performance might be harmed on HW that implements branching using exec mask
1448 // where both sides of the branches are always executed.
1449
1450 if (MF->getTarget().requiresStructuredCFG()) {
1451 if (!MLI)
1452 return false;
1453 const MachineLoop *L = MLI->getLoopFor(Succ);
1454 // Only if `Succ` is a loop header, splitting the critical edge will not
1455 // break structured CFG. And fallthrough to check if this's terminator is
1456 // analyzable.
1457 if (!L || L->getHeader() != Succ)
1458 return false;
1459 }
1460
1461 // Do we have an Indirect jump with a jumptable that we can rewrite?
1462 int JTI = findJumpTableIndex(*this);
1463 if (JTI >= 0 && !jumpTableHasOtherUses(*MF, *this, JTI))
1464 return true;
1465
1466 // We may need to update this's terminator, but we can't do that if
1467 // analyzeBranch fails.
1469 const MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
1471 // AnalyzeBanch should modify this, since we did not allow modification.
1472 if (TII->analyzeBranch(*this, TBB, FBB, Cond))
1473 return false;
1474
1475 // Handle weird inputs (e.g., generated by a test case reducer/fuzzer): A
1476 // block may end with a conditional branch but jumps to the same MBB is either
1477 // case. We have duplicate CFG edges in that case that we can't handle. Since
1478 // this never happens in properly optimized code, just skip those edges.
1479 if (TBB && TBB == FBB) {
1480 LLVM_DEBUG(dbgs() << "Won't split critical edge after degenerate "
1481 << printMBBReference(*this) << '\n');
1482 return false;
1483 }
1484 return true;
1485}
1486
1487/// Prepare MI to be removed from its bundle. This fixes bundle flags on MI's
1488/// neighboring instructions so the bundle won't be broken by removing MI.
1490 // Removing the first instruction in a bundle.
1491 if (MI->isBundledWithSucc() && !MI->isBundledWithPred())
1492 MI->unbundleFromSucc();
1493 // Removing the last instruction in a bundle.
1494 if (MI->isBundledWithPred() && !MI->isBundledWithSucc())
1495 MI->unbundleFromPred();
1496 // If MI is not bundled, or if it is internal to a bundle, the neighbor flags
1497 // are already fine.
1498}
1499
1505
1508 MI->clearFlag(MachineInstr::BundledPred);
1509 MI->clearFlag(MachineInstr::BundledSucc);
1510 return Insts.remove(MI);
1511}
1512
1515 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1516 "Cannot insert instruction with bundle flags");
1517 // Set the bundle flags when inserting inside a bundle.
1518 if (I != instr_end() && I->isBundledWithPred()) {
1519 MI->setFlag(MachineInstr::BundledPred);
1520 MI->setFlag(MachineInstr::BundledSucc);
1521 }
1522 return Insts.insert(I, MI);
1523}
1524
1525/// This method unlinks 'this' from the containing function, and returns it, but
1526/// does not delete it.
1528 assert(getParent() && "Not embedded in a function!");
1529 getParent()->remove(this);
1530 return this;
1531}
1532
1533/// This method unlinks 'this' from the containing function, and deletes it.
1535 assert(getParent() && "Not embedded in a function!");
1536 getParent()->erase(this);
1537}
1538
1539/// Given a machine basic block that branched to 'Old', change the code and CFG
1540/// so that it branches to 'New' instead.
1542 MachineBasicBlock *New) {
1543 assert(Old != New && "Cannot replace self with self!");
1544
1546 while (I != instr_begin()) {
1547 --I;
1548 if (!I->isTerminator()) break;
1549
1550 // Scan the operands of this machine instruction, replacing any uses of Old
1551 // with New.
1552 for (MachineOperand &MO : I->operands())
1553 if (MO.isMBB() && MO.getMBB() == Old)
1554 MO.setMBB(New);
1555 }
1556
1557 // Update the successor information.
1558 replaceSuccessor(Old, New);
1559}
1560
1561void MachineBasicBlock::replacePhiUsesWith(MachineBasicBlock *Old,
1562 MachineBasicBlock *New) {
1563 for (MachineInstr &MI : phis())
1564 for (unsigned i = 2, e = MI.getNumOperands() + 1; i != e; i += 2) {
1565 MachineOperand &MO = MI.getOperand(i);
1566 if (MO.getMBB() == Old)
1567 MO.setMBB(New);
1568 }
1569}
1570
1571/// Find the next valid DebugLoc starting at MBBI, skipping any debug
1572/// instructions. Return UnknownLoc if there is none.
1575 // Skip debug declarations, we don't want a DebugLoc from them.
1577 if (MBBI != instr_end())
1578 return MBBI->getDebugLoc();
1579 return {};
1580}
1581
1583 if (MBBI == instr_rend())
1584 return findDebugLoc(instr_begin());
1585 // Skip debug declarations, we don't want a DebugLoc from them.
1587 if (!MBBI->isDebugInstr())
1588 return MBBI->getDebugLoc();
1589 return {};
1590}
1591
1592/// Find the previous valid DebugLoc preceding MBBI, skipping any debug
1593/// instructions. Return UnknownLoc if there is none.
1595 if (MBBI == instr_begin())
1596 return {};
1597 // Skip debug instructions, we don't want a DebugLoc from them.
1599 if (!MBBI->isDebugInstr())
1600 return MBBI->getDebugLoc();
1601 return {};
1602}
1603
1605 if (MBBI == instr_rend())
1606 return {};
1607 // Skip debug declarations, we don't want a DebugLoc from them.
1609 if (MBBI != instr_rend())
1610 return MBBI->getDebugLoc();
1611 return {};
1612}
1613
1614/// Find and return the merged DebugLoc of the branch instructions of the block.
1615/// Return UnknownLoc if there is none.
1618 DebugLoc DL;
1619 auto TI = getFirstTerminator();
1620 while (TI != end() && !TI->isBranch())
1621 ++TI;
1622
1623 if (TI != end()) {
1624 DL = TI->getDebugLoc();
1625 for (++TI ; TI != end() ; ++TI)
1626 if (TI->isBranch())
1627 DL = DebugLoc::getMergedLocation(DL, TI->getDebugLoc());
1628 }
1629 return DL;
1630}
1631
1632/// Return probability of the edge from this block to MBB.
1635 if (Probs.empty())
1636 return BranchProbability(1, succ_size());
1637
1638 const auto &Prob = *getProbabilityIterator(Succ);
1639 if (!Prob.isUnknown())
1640 return Prob;
1641 // For unknown probabilities, collect the sum of all known ones, and evenly
1642 // ditribute the complemental of the sum to each unknown probability.
1643 unsigned KnownProbNum = 0;
1644 auto Sum = BranchProbability::getZero();
1645 for (const auto &P : Probs) {
1646 if (!P.isUnknown()) {
1647 Sum += P;
1648 KnownProbNum++;
1649 }
1650 }
1651 return Sum.getCompl() / (Probs.size() - KnownProbNum);
1652}
1653
1655 if (succ_size() <= 1)
1656 return true;
1658 return true;
1659
1660 SmallVector<BranchProbability, 8> Normalized(Probs.begin(), Probs.end());
1662
1663 // Normalize assuming unknown probabilities. This will assign equal
1664 // probabilities to all successors.
1665 SmallVector<BranchProbability, 8> Equal(Normalized.size());
1667
1668 return llvm::equal(Normalized, Equal);
1669}
1670
1671/// Set successor probability of a given iterator.
1673 BranchProbability Prob) {
1674 assert(!Prob.isUnknown());
1675 if (Probs.empty())
1676 return;
1677 *getProbabilityIterator(I) = Prob;
1678}
1679
1680/// Return probability iterator corresonding to the I successor iterator
1681MachineBasicBlock::const_probability_iterator
1682MachineBasicBlock::getProbabilityIterator(
1684 assert(Probs.size() == Successors.size() && "Async probability list!");
1685 const size_t index = std::distance(Successors.begin(), I);
1686 assert(index < Probs.size() && "Not a current successor!");
1687 return Probs.begin() + index;
1688}
1689
1690/// Return probability iterator corresonding to the I successor iterator.
1691MachineBasicBlock::probability_iterator
1692MachineBasicBlock::getProbabilityIterator(MachineBasicBlock::succ_iterator I) {
1693 assert(Probs.size() == Successors.size() && "Async probability list!");
1694 const size_t index = std::distance(Successors.begin(), I);
1695 assert(index < Probs.size() && "Not a current successor!");
1696 return Probs.begin() + index;
1697}
1698
1699/// Return whether (physical) register "Reg" has been <def>ined and not <kill>ed
1700/// as of just before "MI".
1701///
1702/// Search is localised to a neighborhood of
1703/// Neighborhood instructions before (searching for defs or kills) and N
1704/// instructions after (searching just for defs) MI.
1707 MCRegister Reg, const_iterator Before,
1708 unsigned Neighborhood) const {
1709 assert(Reg.isPhysical());
1710 unsigned N = Neighborhood;
1711
1712 // Try searching forwards from Before, looking for reads or defs.
1713 const_iterator I(Before);
1714 for (; I != end() && N > 0; ++I) {
1715 if (I->isDebugOrPseudoInstr())
1716 continue;
1717
1718 --N;
1719
1720 PhysRegInfo Info = AnalyzePhysRegInBundle(*I, Reg, TRI);
1721
1722 // Register is live when we read it here.
1723 if (Info.Read)
1724 return LQR_Live;
1725 // Register is dead if we can fully overwrite or clobber it here.
1726 if (Info.FullyDefined || Info.Clobbered)
1727 return LQR_Dead;
1728 }
1729
1730 // If we reached the end, it is safe to clobber Reg at the end of a block of
1731 // no successor has it live in.
1732 if (I == end()) {
1733 for (MachineBasicBlock *S : successors()) {
1734 for (const MachineBasicBlock::RegisterMaskPair &LI : S->liveins()) {
1735 if (TRI->regsOverlap(LI.PhysReg, Reg))
1736 return LQR_Live;
1737 }
1738 }
1739
1740 return LQR_Dead;
1741 }
1742
1743
1744 N = Neighborhood;
1745
1746 // Start by searching backwards from Before, looking for kills, reads or defs.
1747 I = const_iterator(Before);
1748 // If this is the first insn in the block, don't search backwards.
1749 if (I != begin()) {
1750 do {
1751 --I;
1752
1753 if (I->isDebugOrPseudoInstr())
1754 continue;
1755
1756 --N;
1757
1758 PhysRegInfo Info = AnalyzePhysRegInBundle(*I, Reg, TRI);
1759
1760 // Defs happen after uses so they take precedence if both are present.
1761
1762 // Register is dead after a dead def of the full register.
1763 if (Info.DeadDef)
1764 return LQR_Dead;
1765 // Register is (at least partially) live after a def.
1766 if (Info.Defined) {
1767 if (!Info.PartialDeadDef)
1768 return LQR_Live;
1769 // As soon as we saw a partial definition (dead or not),
1770 // we cannot tell if the value is partial live without
1771 // tracking the lanemasks. We are not going to do this,
1772 // so fall back on the remaining of the analysis.
1773 break;
1774 }
1775 // Register is dead after a full kill or clobber and no def.
1776 if (Info.Killed || Info.Clobbered)
1777 return LQR_Dead;
1778 // Register must be live if we read it.
1779 if (Info.Read)
1780 return LQR_Live;
1781
1782 } while (I != begin() && N > 0);
1783 }
1784
1785 // If all the instructions before this in the block are debug instructions,
1786 // skip over them.
1787 while (I != begin() && std::prev(I)->isDebugOrPseudoInstr())
1788 --I;
1789
1790 // Did we get to the start of the block?
1791 if (I == begin()) {
1792 // If so, the register's state is definitely defined by the live-in state.
1794 if (TRI->regsOverlap(LI.PhysReg, Reg))
1795 return LQR_Live;
1796
1797 return LQR_Dead;
1798 }
1799
1800 // At this point we have no idea of the liveness of the register.
1801 return LQR_Unknown;
1802}
1803
1804const uint32_t *
1806 // EH funclet entry does not preserve any registers.
1807 return isEHFuncletEntry() ? TRI->getNoPreservedMask() : nullptr;
1808}
1809
1810const uint32_t *
1812 // If we see a return block with successors, this must be a funclet return,
1813 // which does not preserve any registers. If there are no successors, we don't
1814 // care what kind of return it is, putting a mask after it is a no-op.
1815 return isReturnBlock() && !succ_empty() ? TRI->getNoPreservedMask() : nullptr;
1816}
1817
1819 LiveIns.clear();
1820}
1821
1823 std::vector<RegisterMaskPair> &OldLiveIns) {
1824 assert(OldLiveIns.empty() && "Vector must be empty");
1825 std::swap(LiveIns, OldLiveIns);
1826}
1827
1829 assert(getParent()->getProperties().hasTracksLiveness() &&
1830 "Liveness information is accurate");
1831 return LiveIns.begin();
1832}
1833
1835 const MachineFunction &MF = *getParent();
1836 const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
1837 MCRegister ExceptionPointer, ExceptionSelector;
1838 if (MF.getFunction().hasPersonalityFn()) {
1839 auto PersonalityFn = MF.getFunction().getPersonalityFn();
1840 // Prefer the "exception-model" module flag, else the TargetOptions default.
1844 ExceptionPointer = TLI.getExceptionPointerRegister(EH, PersonalityFn);
1845 ExceptionSelector = TLI.getExceptionSelectorRegister(EH, PersonalityFn);
1846 }
1847
1848 return liveout_iterator(*this, ExceptionPointer, ExceptionSelector, false);
1849}
1850
1852 unsigned Cntr = 0;
1853 auto R = instructionsWithoutDebug(begin(), end());
1854 for (auto I = R.begin(), E = R.end(); I != E; ++I) {
1855 if (++Cntr > Limit)
1856 return true;
1857 }
1858 return false;
1859}
1860
1862 const MachineBasicBlock &PredMBB) {
1863 for (MachineInstr &Phi : phis())
1864 Phi.removePHIIncomingValueFor(PredMBB);
1865}
1866
1868const MBBSectionID
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:678
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
This file contains an interface for creating legacy passes to print out IR in various granularities.
Module.h This file contains the declarations for the Module class.
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:119
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 constexpr BranchProbability getUnknown()
static constexpr BranchProbability getZero()
uint32_t getNumerator() const
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
A debug info location.
Definition DebugLoc.h:126
LLVM_ABI unsigned getLine() const
Definition DebugLoc.cpp:43
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:173
LLVM_ABI unsigned getCol() const
Definition DebugLoc.cpp:48
bool hasPersonalityFn() const
Check whether this function has a personality function.
Definition Function.h:890
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.
Module * getParent()
Get the module that this global value is contained inside of...
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)
Adds an empty block MBB to the SlotIndexes and regmask maps.
void splitAt(MachineBasicBlock &Orig, MachineBasicBlock &SplitBB)
After the tail of Orig has been sliced into SplitBB, updates the SlotIndexes and regmask maps and re-...
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, RegState Flags={}, 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,...
bool tracksLiveness() const
tracksLiveness - Returns true when tracking register liveness accurately.
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
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.
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:68
ExceptionHandling getExceptionModel() const
Returns the exception model recorded by the "exception-model" module flag, or ExceptionHandling::Defa...
Definition Module.cpp:720
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.
bool hasIndex(const MachineInstr &instr) const
Returns true if the given machine instr is mapped to an index, otherwise returns false.
SlotIndex getMBBStartIdx(const MachineBasicBlock *mbb) const
Returns the first index in the given basic block.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:345
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:134
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
Definition SmallSet.h:176
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:184
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
TargetInstrInfo - Interface to description of machine instruction set.
const TargetMachine & getTargetMachine() const
virtual Register getExceptionSelectorRegister(ExceptionHandling EH, const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception typeid on entry to a la...
virtual Register getExceptionPointerRegister(ExceptionHandling EH, const Constant *PersonalityFn) const
If a physical register, this returns the register that receives the exception address on entry to an ...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
ExceptionHandling getExceptionModel() const
Return the ExceptionHandling to use.
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:46
VNInfo - Value Number Information.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
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.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
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:1781
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
@ Kill
The last use of a register.
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.
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1652
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
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:102
@ 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
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ExceptionHandling
Definition CodeGen.h:54
@ Default
Not specified; resolve to the target's default model.
Definition CodeGen.h:55
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:1788
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
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:2162
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 void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
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.
LLVM_ABI void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs)
Adds registers contained in LiveRegs to the block live-in list of MBB.
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#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