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