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"
30#include "llvm/Config/llvm-config.h"
31#include "llvm/IR/BasicBlock.h"
33#include "llvm/IR/Module.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());
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 (isCleanupFuncletEntry()) {
565 os << (hasAttributes ? ", " : " (");
566 os << "cleanup-funclet-entry";
567 hasAttributes = true;
568 }
569 if (isEHContTarget()) {
570 os << (hasAttributes ? ", " : " (");
571 os << "ehcont-target";
572 hasAttributes = true;
573 }
574 if (getAlignment() != Align(1)) {
575 os << (hasAttributes ? ", " : " (");
576 os << "align " << getAlignment().value();
577 hasAttributes = true;
579 os << ", max-bytes-for-alignment " << getMaxBytesForAlignment();
580 }
581 if (getSectionID() != MBBSectionID(0)) {
582 os << (hasAttributes ? ", " : " (");
583 os << "bbsections ";
584 switch (getSectionID().Type) {
586 os << "Exception";
587 break;
589 os << "Cold";
590 break;
591 default:
592 os << getSectionID().Number;
593 }
594 hasAttributes = true;
595 }
596 if (getBBID().has_value()) {
597 os << (hasAttributes ? ", " : " (");
598 os << "bb_id " << getBBID()->BaseID;
599 if (getBBID()->CloneID != 0)
600 os << " " << getBBID()->CloneID;
601 hasAttributes = true;
602 }
603 if (CallFrameSize != 0) {
604 os << (hasAttributes ? ", " : " (");
605 os << "call-frame-size " << CallFrameSize;
606 hasAttributes = true;
607 }
608 }
609
610 if (hasAttributes)
611 os << ')';
612}
613
615 bool /*PrintType*/) const {
616 OS << '%';
617 printName(OS, 0);
618}
619
621 assert(Reg.isPhysical());
622 LiveInVector::iterator I = find_if(
623 LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
624 if (I == LiveIns.end())
625 return;
626
627 I->LaneMask &= ~LaneMask;
628 if (I->LaneMask.none())
629 LiveIns.erase(I);
630}
631
633 const MachineFunction *MF = getParent();
635 // Remove Reg and its subregs from live in set.
636 for (MCPhysReg S : TRI->subregs_inclusive(Reg))
637 removeLiveIn(S);
638
639 // Remove live-in bitmask in super registers as well.
640 for (MCPhysReg Super : TRI->superregs(Reg)) {
641 for (MCSubRegIndexIterator SRI(Super, TRI); SRI.isValid(); ++SRI) {
642 if (Reg == SRI.getSubReg()) {
643 unsigned SubRegIndex = SRI.getSubRegIndex();
644 LaneBitmask SubRegLaneMask = TRI->getSubRegIndexLaneMask(SubRegIndex);
645 removeLiveIn(Super, SubRegLaneMask);
646 break;
647 }
648 }
649 }
650}
651
654 // Get non-const version of iterator.
655 LiveInVector::iterator LI = LiveIns.begin() + (I - LiveIns.begin());
656 return LiveIns.erase(LI);
657}
658
660 assert(Reg.isPhysical());
662 LiveIns, [Reg](const RegisterMaskPair &LI) { return LI.PhysReg == Reg; });
663 return I != livein_end() && (I->LaneMask & LaneMask).any();
664}
665
667 llvm::sort(LiveIns,
668 [](const RegisterMaskPair &LI0, const RegisterMaskPair &LI1) {
669 return LI0.PhysReg < LI1.PhysReg;
670 });
671 // Liveins are sorted by physreg now we can merge their lanemasks.
672 LiveInVector::const_iterator I = LiveIns.begin();
673 LiveInVector::const_iterator J;
674 LiveInVector::iterator Out = LiveIns.begin();
675 for (; I != LiveIns.end(); ++Out, I = J) {
676 MCRegister PhysReg = I->PhysReg;
677 LaneBitmask LaneMask = I->LaneMask;
678 for (J = std::next(I); J != LiveIns.end() && J->PhysReg == PhysReg; ++J)
679 LaneMask |= J->LaneMask;
680 Out->PhysReg = PhysReg;
681 Out->LaneMask = LaneMask;
682 }
683 LiveIns.erase(Out, LiveIns.end());
684}
685
688 assert(getParent() && "MBB must be inserted in function");
689 assert(PhysReg.isPhysical() && "Expected physreg");
690 assert(RC && "Register class is required");
691 assert((isEHPad() || this == &getParent()->front()) &&
692 "Only the entry block and landing pads can have physreg live ins");
693
694 bool LiveIn = isLiveIn(PhysReg);
698
699 // Look for an existing copy.
700 if (LiveIn)
701 for (;I != E && I->isCopy(); ++I)
702 if (I->getOperand(1).getReg() == PhysReg) {
703 Register VirtReg = I->getOperand(0).getReg();
704 if (!MRI.constrainRegClass(VirtReg, RC))
705 llvm_unreachable("Incompatible live-in register class.");
706 return VirtReg;
707 }
708
709 // No luck, create a virtual register.
710 Register VirtReg = MRI.createVirtualRegister(RC);
711 BuildMI(*this, I, DebugLoc(), TII.get(TargetOpcode::COPY), VirtReg)
712 .addReg(PhysReg, RegState::Kill);
713 if (!LiveIn)
714 addLiveIn(PhysReg);
715 return VirtReg;
716}
717
718void MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) {
719 getParent()->splice(NewAfter->getIterator(), getIterator());
720}
721
722void MachineBasicBlock::moveAfter(MachineBasicBlock *NewBefore) {
723 getParent()->splice(++NewBefore->getIterator(), getIterator());
724}
725
727 MachineBasicBlock::const_iterator TerminatorI = MBB.getFirstTerminator();
728 if (TerminatorI == MBB.end())
729 return -1;
730 const MachineInstr &Terminator = *TerminatorI;
731 const TargetInstrInfo *TII = MBB.getParent()->getSubtarget().getInstrInfo();
732 return TII->getJumpTableIndex(Terminator);
733}
734
736 MachineBasicBlock *PreviousLayoutSuccessor) {
737 LLVM_DEBUG(dbgs() << "Updating terminators on " << printMBBReference(*this)
738 << "\n");
739
741 // A block with no successors has no concerns with fall-through edges.
742 if (this->succ_empty())
743 return;
744
745 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
748 bool B = TII->analyzeBranch(*this, TBB, FBB, Cond);
749 (void) B;
750 assert(!B && "UpdateTerminators requires analyzable predecessors!");
751 if (Cond.empty()) {
752 if (TBB) {
753 // The block has an unconditional branch. If its successor is now its
754 // layout successor, delete the branch.
756 TII->removeBranch(*this);
757 } else {
758 // The block has an unconditional fallthrough, or the end of the block is
759 // unreachable.
760
761 // Unfortunately, whether the end of the block is unreachable is not
762 // immediately obvious; we must fall back to checking the successor list,
763 // and assuming that if the passed in block is in the succesor list and
764 // not an EHPad, it must be the intended target.
765 if (!PreviousLayoutSuccessor || !isSuccessor(PreviousLayoutSuccessor) ||
766 PreviousLayoutSuccessor->isEHPad())
767 return;
768
769 // If the unconditional successor block is not the current layout
770 // successor, insert a branch to jump to it.
771 if (!isLayoutSuccessor(PreviousLayoutSuccessor))
772 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
773 }
774 return;
775 }
776
777 if (FBB) {
778 // The block has a non-fallthrough conditional branch. If one of its
779 // successors is its layout successor, rewrite it to a fallthrough
780 // conditional branch.
781 if (isLayoutSuccessor(TBB)) {
782 if (TII->reverseBranchCondition(Cond))
783 return;
784 TII->removeBranch(*this);
785 TII->insertBranch(*this, FBB, nullptr, Cond, DL);
786 } else if (isLayoutSuccessor(FBB)) {
787 TII->removeBranch(*this);
788 TII->insertBranch(*this, TBB, nullptr, Cond, DL);
789 }
790 return;
791 }
792
793 // We now know we're going to fallthrough to PreviousLayoutSuccessor.
794 assert(PreviousLayoutSuccessor);
795 assert(!PreviousLayoutSuccessor->isEHPad());
796 assert(isSuccessor(PreviousLayoutSuccessor));
797
798 if (PreviousLayoutSuccessor == TBB) {
799 // We had a fallthrough to the same basic block as the conditional jump
800 // targets. Remove the conditional jump, leaving an unconditional
801 // fallthrough or an unconditional jump.
802 TII->removeBranch(*this);
803 if (!isLayoutSuccessor(TBB)) {
804 Cond.clear();
805 TII->insertBranch(*this, TBB, nullptr, Cond, DL);
806 }
807 return;
808 }
809
810 // The block has a fallthrough conditional branch.
811 if (isLayoutSuccessor(TBB)) {
812 if (TII->reverseBranchCondition(Cond)) {
813 // We can't reverse the condition, add an unconditional branch.
814 Cond.clear();
815 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
816 return;
817 }
818 TII->removeBranch(*this);
819 TII->insertBranch(*this, PreviousLayoutSuccessor, nullptr, Cond, DL);
820 } else if (!isLayoutSuccessor(PreviousLayoutSuccessor)) {
821 TII->removeBranch(*this);
822 TII->insertBranch(*this, TBB, PreviousLayoutSuccessor, Cond, DL);
823 }
824}
825
827#ifndef NDEBUG
828 int64_t Sum = 0;
829 for (auto Prob : Probs)
830 Sum += Prob.getNumerator();
831 // Due to precision issue, we assume that the sum of probabilities is one if
832 // the difference between the sum of their numerators and the denominator is
833 // no greater than the number of successors.
834 assert((uint64_t)std::abs(Sum - BranchProbability::getDenominator()) <=
835 Probs.size() &&
836 "The sum of successors's probabilities exceeds one.");
837#endif // NDEBUG
838}
839
840void MachineBasicBlock::addSuccessor(MachineBasicBlock *Succ,
841 BranchProbability Prob) {
842 // Probability list is either empty (if successor list isn't empty, this means
843 // disabled optimization) or has the same size as successor list.
844 if (!(Probs.empty() && !Successors.empty()))
845 Probs.push_back(Prob);
846 Successors.push_back(Succ);
847 Succ->addPredecessor(this);
848}
849
850void MachineBasicBlock::addSuccessorWithoutProb(MachineBasicBlock *Succ) {
851 // We need to make sure probability list is either empty or has the same size
852 // of successor list. When this function is called, we can safely delete all
853 // probability in the list.
854 Probs.clear();
855 Successors.push_back(Succ);
856 Succ->addPredecessor(this);
857}
858
859void MachineBasicBlock::splitSuccessor(MachineBasicBlock *Old,
860 MachineBasicBlock *New,
861 bool NormalizeSuccProbs) {
862 succ_iterator OldI = llvm::find(successors(), Old);
863 assert(OldI != succ_end() && "Old is not a successor of this block!");
865 "New is already a successor of this block!");
866
867 // Add a new successor with equal probability as the original one. Note
868 // that we directly copy the probability using the iterator rather than
869 // getting a potentially synthetic probability computed when unknown. This
870 // preserves the probabilities as-is and then we can renormalize them and
871 // query them effectively afterward.
872 addSuccessor(New, Probs.empty() ? BranchProbability::getUnknown()
873 : *getProbabilityIterator(OldI));
874 if (NormalizeSuccProbs)
876}
877
878void MachineBasicBlock::removeSuccessor(MachineBasicBlock *Succ,
879 bool NormalizeSuccProbs) {
880 succ_iterator I = find(Successors, Succ);
881 removeSuccessor(I, NormalizeSuccProbs);
882}
883
886 assert(I != Successors.end() && "Not a current successor!");
887
888 // If probability list is empty it means we don't use it (disabled
889 // optimization).
890 if (!Probs.empty()) {
891 probability_iterator WI = getProbabilityIterator(I);
892 Probs.erase(WI);
893 if (NormalizeSuccProbs)
895 }
896
897 (*I)->removePredecessor(this);
898 return Successors.erase(I);
899}
900
901void MachineBasicBlock::replaceSuccessor(MachineBasicBlock *Old,
902 MachineBasicBlock *New) {
903 if (Old == New)
904 return;
905
907 succ_iterator NewI = E;
908 succ_iterator OldI = E;
909 for (succ_iterator I = succ_begin(); I != E; ++I) {
910 if (*I == Old) {
911 OldI = I;
912 if (NewI != E)
913 break;
914 }
915 if (*I == New) {
916 NewI = I;
917 if (OldI != E)
918 break;
919 }
920 }
921 assert(OldI != E && "Old is not a successor of this block");
922
923 // If New isn't already a successor, let it take Old's place.
924 if (NewI == E) {
925 Old->removePredecessor(this);
926 New->addPredecessor(this);
927 *OldI = New;
928 return;
929 }
930
931 // New is already a successor.
932 // Update its probability instead of adding a duplicate edge.
933 if (!Probs.empty()) {
934 auto ProbIter = getProbabilityIterator(NewI);
935 if (!ProbIter->isUnknown())
936 *ProbIter += *getProbabilityIterator(OldI);
937 }
938 removeSuccessor(OldI);
939}
940
941void MachineBasicBlock::copySuccessor(const MachineBasicBlock *Orig,
943 if (!Orig->Probs.empty())
945 else
947}
948
949void MachineBasicBlock::addPredecessor(MachineBasicBlock *Pred) {
950 Predecessors.push_back(Pred);
951}
952
953void MachineBasicBlock::removePredecessor(MachineBasicBlock *Pred) {
954 // This is often called on many predecessors in reverse order.
955 // Do a reverse search and removal to avoid quadratic behavior in such cases.
956 auto RI = llvm::find(reverse(Predecessors), Pred);
957 assert(RI != Predecessors.rend() &&
958 "Pred is not a predecessor of this block!");
959 Predecessors.erase(std::prev(RI.base()));
960}
961
962void MachineBasicBlock::transferSuccessors(MachineBasicBlock *FromMBB) {
963 if (this == FromMBB)
964 return;
965
966 while (!FromMBB->succ_empty()) {
967 MachineBasicBlock *Succ = *FromMBB->succ_begin();
968
969 // If probability list is empty it means we don't use it (disabled
970 // optimization).
971 if (!FromMBB->Probs.empty()) {
972 auto Prob = *FromMBB->Probs.begin();
973 addSuccessor(Succ, Prob);
974 } else
976
977 FromMBB->removeSuccessor(Succ);
978 }
979}
980
981void
983 if (this == FromMBB)
984 return;
985
986 while (!FromMBB->succ_empty()) {
987 MachineBasicBlock *Succ = *FromMBB->succ_begin();
988 if (!FromMBB->Probs.empty()) {
989 auto Prob = *FromMBB->Probs.begin();
990 addSuccessor(Succ, Prob);
991 } else
993 FromMBB->removeSuccessor(Succ);
994
995 // Fix up any PHI nodes in the successor.
996 Succ->replacePhiUsesWith(FromMBB, this);
997 }
999}
1000
1001bool MachineBasicBlock::isPredecessor(const MachineBasicBlock *MBB) const {
1002 return is_contained(predecessors(), MBB);
1003}
1004
1005bool MachineBasicBlock::isSuccessor(const MachineBasicBlock *MBB) const {
1006 return is_contained(successors(), MBB);
1007}
1008
1009bool MachineBasicBlock::isLayoutSuccessor(const MachineBasicBlock *MBB) const {
1011 return std::next(I) == MachineFunction::const_iterator(MBB);
1012}
1013
1014const MachineBasicBlock *MachineBasicBlock::getSingleSuccessor() const {
1015 return Successors.size() == 1 ? Successors[0] : nullptr;
1016}
1017
1018const MachineBasicBlock *MachineBasicBlock::getSinglePredecessor() const {
1019 return Predecessors.size() == 1 ? Predecessors[0] : nullptr;
1020}
1021
1022MachineBasicBlock *MachineBasicBlock::getFallThrough(bool JumpToFallThrough) {
1023 MachineFunction::iterator Fallthrough = getIterator();
1024 ++Fallthrough;
1025 // If FallthroughBlock is off the end of the function, it can't fall through.
1026 if (Fallthrough == getParent()->end())
1027 return nullptr;
1028
1029 // If FallthroughBlock isn't a successor, no fallthrough is possible.
1030 if (!isSuccessor(&*Fallthrough))
1031 return nullptr;
1032
1033 // Analyze the branches, if any, at the end of the block.
1034 MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
1037 if (TII->analyzeBranch(*this, TBB, FBB, Cond)) {
1038 // If we couldn't analyze the branch, examine the last instruction.
1039 // If the block doesn't end in a known control barrier, assume fallthrough
1040 // is possible. The isPredicated check is needed because this code can be
1041 // called during IfConversion, where an instruction which is normally a
1042 // Barrier is predicated and thus no longer an actual control barrier.
1043 return (empty() || !back().isBarrier() || TII->isPredicated(back()))
1044 ? &*Fallthrough
1045 : nullptr;
1046 }
1047
1048 // If there is no branch, control always falls through.
1049 if (!TBB) return &*Fallthrough;
1050
1051 // If there is some explicit branch to the fallthrough block, it can obviously
1052 // reach, even though the branch should get folded to fall through implicitly.
1053 if (JumpToFallThrough && (MachineFunction::iterator(TBB) == Fallthrough ||
1054 MachineFunction::iterator(FBB) == Fallthrough))
1055 return &*Fallthrough;
1056
1057 // If it's an unconditional branch to some block not the fall through, it
1058 // doesn't fall through.
1059 if (Cond.empty()) return nullptr;
1060
1061 // Otherwise, if it is conditional and has no explicit false block, it falls
1062 // through.
1063 return (FBB == nullptr) ? &*Fallthrough : nullptr;
1064}
1065
1067 return getFallThrough() != nullptr;
1068}
1069
1071 bool UpdateLiveIns,
1072 LiveIntervals *LIS) {
1073 MachineBasicBlock::iterator SplitPoint(&MI);
1074 ++SplitPoint;
1075
1076 if (SplitPoint == end()) {
1077 // Don't bother with a new block.
1078 return this;
1079 }
1080
1081 MachineFunction *MF = getParent();
1082
1084 if (UpdateLiveIns) {
1085 // Make sure we add any physregs we define in the block as liveins to the
1086 // new block.
1088 LiveRegs.init(*MF->getSubtarget().getRegisterInfo());
1089 LiveRegs.addLiveOuts(*this);
1090 for (auto I = rbegin(), E = Prev.getReverse(); I != E; ++I)
1091 LiveRegs.stepBackward(*I);
1092 }
1093
1094 MachineBasicBlock *SplitBB = MF->CreateMachineBasicBlock(getBasicBlock());
1095
1096 MF->insert(++MachineFunction::iterator(this), SplitBB);
1097 SplitBB->splice(SplitBB->begin(), this, SplitPoint, end());
1098
1099 SplitBB->transferSuccessorsAndUpdatePHIs(this);
1100 addSuccessor(SplitBB);
1101
1102 if (UpdateLiveIns)
1103 addLiveIns(*SplitBB, LiveRegs);
1104
1105 if (LIS)
1106 LIS->splitAt(*this, *SplitBB);
1107
1108 return SplitBB;
1109}
1110
1111// Returns `true` if there are possibly other users of the jump table at
1112// `JumpTableIndex` except for the ones in `IgnoreMBB`.
1114 const MachineBasicBlock &IgnoreMBB,
1115 int JumpTableIndex) {
1116 assert(JumpTableIndex >= 0 && "need valid index");
1117 const MachineJumpTableInfo &MJTI = *MF.getJumpTableInfo();
1118 const MachineJumpTableEntry &MJTE = MJTI.getJumpTables()[JumpTableIndex];
1119 // Take any basic block from the table; every user of the jump table must
1120 // show up in the predecessor list.
1121 const MachineBasicBlock *MBB = nullptr;
1122 for (MachineBasicBlock *B : MJTE.MBBs) {
1123 if (B != nullptr) {
1124 MBB = B;
1125 break;
1126 }
1127 }
1128 if (MBB == nullptr)
1129 return true; // can't rule out other users if there isn't any block.
1132 for (MachineBasicBlock *Pred : MBB->predecessors()) {
1133 if (Pred == &IgnoreMBB)
1134 continue;
1135 MachineBasicBlock *DummyT = nullptr;
1136 MachineBasicBlock *DummyF = nullptr;
1137 Cond.clear();
1138 if (!TII.analyzeBranch(*Pred, DummyT, DummyF, Cond,
1139 /*AllowModify=*/false)) {
1140 // analyzable direct jump
1141 continue;
1142 }
1143 int PredJTI = findJumpTableIndex(*Pred);
1144 if (PredJTI >= 0) {
1145 if (PredJTI == JumpTableIndex)
1146 return true;
1147 continue;
1148 }
1149 // Be conservative for unanalyzable jumps.
1150 return true;
1151 }
1152 return false;
1153}
1154
1156private:
1157 MachineFunction &MF;
1158 SlotIndexes *Indexes;
1160
1161public:
1163 : MF(MF), Indexes(Indexes) {
1164 MF.setDelegate(this);
1165 }
1166
1168 MF.resetDelegate(this);
1169 for (auto MI : Insertions)
1170 Indexes->insertMachineInstrInMaps(*MI);
1171 }
1172
1174 // This is called before MI is inserted into block so defer index update.
1175 if (Indexes)
1176 Insertions.insert(&MI);
1177 }
1178
1180 if (Indexes && !Insertions.remove(&MI))
1181 Indexes->removeMachineInstrFromMaps(MI);
1182 }
1183};
1184
1188 MachineDomTreeUpdater *MDTU) {
1189#define GET_RESULT(RESULT, GETTER, INFIX) \
1190 [MF, P, MFAM]() { \
1191 if (P) { \
1192 auto *Wrapper = P->getAnalysisIfAvailable<RESULT##INFIX##WrapperPass>(); \
1193 return Wrapper ? &Wrapper->GETTER() : nullptr; \
1194 } \
1195 return MFAM->getCachedResult<RESULT##Analysis>(*MF); \
1196 }()
1197
1198 assert((P || MFAM) && "Need a way to get analysis results!");
1199 MachineFunction *MF = getParent();
1200 LiveIntervals *LIS = GET_RESULT(LiveIntervals, getLIS, );
1201 SlotIndexes *Indexes = GET_RESULT(SlotIndexes, getSI, );
1202 MachineLoopInfo *MLI = GET_RESULT(MachineLoop, getLI, Info);
1203 return SplitCriticalEdge(Succ, {LIS, Indexes, MLI}, MDTU);
1204#undef GET_RESULT
1205}
1206
1209 const SplitCriticalEdgeAnalyses &Analyses,
1210 MachineDomTreeUpdater *MDTU) {
1211 if (!canSplitCriticalEdge(Succ, Analyses.MLI))
1212 return nullptr;
1213
1214 MachineFunction *MF = getParent();
1215 MachineBasicBlock *PrevFallthrough = getNextNode();
1216
1217 MachineBasicBlock *NMBB = MF->CreateMachineBasicBlock();
1218 NMBB->setCallFrameSize(Succ->getCallFrameSize());
1219
1220 // Is there an indirect jump with jump table?
1221 bool ChangedIndirectJump = false;
1222 int JTI = findJumpTableIndex(*this);
1223 if (JTI >= 0) {
1225 MJTI.ReplaceMBBInJumpTable(JTI, Succ, NMBB);
1226 ChangedIndirectJump = true;
1227 }
1228
1229 MF->insert(std::next(MachineFunction::iterator(this)), NMBB);
1230 LLVM_DEBUG(dbgs() << "Splitting critical edge: " << printMBBReference(*this)
1231 << " -- " << printMBBReference(*NMBB) << " -- "
1232 << printMBBReference(*Succ) << '\n');
1233 auto *LIS = Analyses.LIS;
1234 if (LIS)
1235 LIS->insertMBBInMaps(NMBB);
1236 else if (Analyses.SI)
1237 Analyses.SI->insertMBBInMaps(NMBB);
1238
1239 SmallVector<Register, 4> UsedRegs;
1240 if (LIS) {
1241 for (MachineInstr &MI :
1243 for (const MachineOperand &MO : MI.operands()) {
1244 if (!MO.isReg() || MO.getReg() == 0)
1245 continue;
1246
1247 Register Reg = MO.getReg();
1248 if (!is_contained(UsedRegs, Reg))
1249 UsedRegs.push_back(Reg);
1250 }
1251 }
1252 }
1253
1254 ReplaceUsesOfBlockWith(Succ, NMBB);
1255
1256 // Since we replaced all uses of Succ with NMBB, that should also be treated
1257 // as the fallthrough successor
1258 if (Succ == PrevFallthrough)
1259 PrevFallthrough = NMBB;
1260 auto *Indexes = Analyses.SI;
1261 if (!ChangedIndirectJump) {
1262 SlotIndexUpdateDelegate SlotUpdater(*MF, Indexes);
1263 updateTerminator(PrevFallthrough);
1264 }
1265
1266 // Insert unconditional "jump Succ" instruction in NMBB if necessary.
1267 NMBB->addSuccessor(Succ);
1268 if (!NMBB->isLayoutSuccessor(Succ)) {
1269 SlotIndexUpdateDelegate SlotUpdater(*MF, Indexes);
1272
1273 // In original 'this' BB, there must be a branch instruction targeting at
1274 // Succ. We can not find it out since currently getBranchDestBlock was not
1275 // implemented for all targets. However, if the merged DL has column or line
1276 // number, the scope and non-zero column and line number is same with that
1277 // branch instruction so we can safely use it.
1278 DebugLoc DL, MergedDL = findBranchDebugLoc();
1279 if (MergedDL && (MergedDL.getLine() || MergedDL.getCol()))
1280 DL = MergedDL;
1281 TII->insertBranch(*NMBB, Succ, nullptr, Cond, DL);
1282 }
1283
1284 // Fix PHI nodes in Succ so they refer to NMBB instead of this, and find the
1285 // registers used from NMBB in them.
1286 SmallSet<Register, 8> PHISrcRegs;
1287 for (MachineInstr &MI : Succ->phis()) {
1288 for (unsigned I = 1, E = MI.getNumOperands(); I != E; I += 2) {
1289 MachineOperand &MBBOp = MI.getOperand(I + 1);
1290 if (MBBOp.getMBB() != this)
1291 continue;
1292 MBBOp.setMBB(NMBB);
1293 const MachineOperand &MO = MI.getOperand(I);
1294 if (LIS && !MO.isUndef())
1295 PHISrcRegs.insert(MO.getReg());
1296 }
1297 }
1298
1299 // Inherit live-ins from the successor
1300 for (const auto &LI : Succ->liveins())
1301 NMBB->addLiveIn(LI);
1302
1303 if (LIS) {
1304 // After splitting the edge and updating SlotIndexes, live intervals may be
1305 // in one of two situations, depending on whether this block was the last in
1306 // the function. If the original block was the last in the function, all
1307 // live intervals will end prior to the beginning of the new split block. If
1308 // the original block was not at the end of the function, all live intervals
1309 // will extend to the end of the new split block.
1310
1311 bool isLastMBB =
1312 std::next(MachineFunction::iterator(NMBB)) == getParent()->end();
1313
1314 SlotIndex StartIndex = Indexes->getMBBEndIdx(this);
1315 SlotIndex PrevIndex = StartIndex.getPrevSlot();
1316 SlotIndex EndIndex = Indexes->getMBBEndIdx(NMBB);
1317
1318 for (Register Reg : PHISrcRegs) {
1319 LiveInterval &LI = LIS->getInterval(Reg);
1320 VNInfo *VNI = LI.getVNInfoAt(PrevIndex);
1321 assert(VNI && "PHI sources should be live out of their predecessors.");
1322 LI.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1323 for (auto &SR : LI.subranges()) {
1324 if (VNInfo *SRVNI = SR.getVNInfoAt(PrevIndex))
1325 SR.addSegment(LiveInterval::Segment(StartIndex, EndIndex, SRVNI));
1326 }
1327 }
1328
1329 auto UpdateLiveOutReg = [&](Register Reg) {
1330 if (PHISrcRegs.count(Reg))
1331 return true;
1332 if (!LIS->hasInterval(Reg))
1333 return false;
1334
1335 LiveInterval &LI = LIS->getInterval(Reg);
1336 if (!LI.liveAt(PrevIndex))
1337 return false;
1338
1339 bool isLiveOut = LI.liveAt(LIS->getMBBStartIdx(Succ));
1340 if (isLiveOut && isLastMBB) {
1341 VNInfo *VNI = LI.getVNInfoAt(PrevIndex);
1342 assert(VNI && "LiveInterval should have VNInfo where it is live.");
1343 LI.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1344 // Update subranges with live values
1345 for (auto &SR : LI.subranges()) {
1346 VNInfo *VNI = SR.getVNInfoAt(PrevIndex);
1347 if (VNI)
1348 SR.addSegment(LiveInterval::Segment(StartIndex, EndIndex, VNI));
1349 }
1350 } else if (!isLiveOut && !isLastMBB) {
1351 LI.removeSegment(StartIndex, EndIndex);
1352 // The main range is live across NMBB, but an individual lane need not
1353 // be.
1354 for (auto &SR : LI.subranges()) {
1355 if (SR.liveAt(PrevIndex))
1356 SR.removeSegment(StartIndex, EndIndex);
1357 }
1358 }
1359 return isLiveOut;
1360 };
1361
1362 if (std::vector<SparseBitVector<>> *LiveOutSets = Analyses.LiveOutSets) {
1363 LiveOutSets->resize(MF->getNumBlockIDs());
1364 const SparseBitVector<> &LiveOut = (*LiveOutSets)[getNumber()];
1365 SparseBitVector<> &NewLiveOut = (*LiveOutSets)[NMBB->getNumber()];
1366 for (unsigned Idx : LiveOut) {
1367 if (UpdateLiveOutReg(Register::index2VirtReg(Idx)))
1368 NewLiveOut.set(Idx);
1369 }
1370 } else {
1372 for (unsigned i = 0, e = MRI->getNumVirtRegs(); i != e; ++i)
1373 UpdateLiveOutReg(Register::index2VirtReg(i));
1374 }
1375
1376 // Update all intervals for registers whose uses may have been modified by
1377 // updateTerminator().
1378 LIS->repairIntervalsInRange(this, getFirstTerminator(), end(), UsedRegs);
1379
1380 // repairIntervalsInRange() does not update physregs; clear their ranges
1381 // since updateTerminator() may have replaced defs.
1382 for (Register Reg : UsedRegs) {
1383 if (Reg.isPhysical())
1384 LIS->removeAllRegUnitsForPhysReg(Reg.asMCReg());
1385 }
1386 }
1387
1388 if (MDTU)
1389 MDTU->splitCriticalEdge(this, Succ, NMBB);
1390
1391 if (MachineLoopInfo *MLI = Analyses.MLI)
1392 if (MachineLoop *TIL = MLI->getLoopFor(this)) {
1393 // If one or the other blocks were not in a loop, the new block is not
1394 // either, and thus LI doesn't need to be updated.
1395 if (MachineLoop *DestLoop = MLI->getLoopFor(Succ)) {
1396 if (TIL == DestLoop) {
1397 // Both in the same loop, the NMBB joins loop.
1398 DestLoop->addBasicBlockToLoop(NMBB, *MLI);
1399 } else if (TIL->contains(DestLoop)) {
1400 // Edge from an outer loop to an inner loop. Add to the outer loop.
1401 TIL->addBasicBlockToLoop(NMBB, *MLI);
1402 } else if (DestLoop->contains(TIL)) {
1403 // Edge from an inner loop to an outer loop. Add to the outer loop.
1404 DestLoop->addBasicBlockToLoop(NMBB, *MLI);
1405 } else {
1406 // Edge from two loops with no containment relation. Because these
1407 // are natural loops, we know that the destination block must be the
1408 // header of its loop (adding a branch into a loop elsewhere would
1409 // create an irreducible loop).
1410 assert(DestLoop->getHeader() == Succ &&
1411 "Should not create irreducible loops!");
1412 if (MachineLoop *P = DestLoop->getParentLoop())
1413 P->addBasicBlockToLoop(NMBB, *MLI);
1414 }
1415 }
1416 }
1417
1418 return NMBB;
1419}
1420
1421bool MachineBasicBlock::canSplitCriticalEdge(const MachineBasicBlock *Succ,
1422 const MachineLoopInfo *MLI) const {
1423 // Splitting the critical edge to a landing pad block is non-trivial. Don't do
1424 // it in this generic function.
1425 if (Succ->isEHPad())
1426 return false;
1427
1428 // Splitting the critical edge to a callbr's indirect block isn't advised.
1429 // Don't do it in this generic function.
1430 if (Succ->isInlineAsmBrIndirectTarget())
1431 return false;
1432
1433 const MachineFunction *MF = getParent();
1434 // Performance might be harmed on HW that implements branching using exec mask
1435 // where both sides of the branches are always executed.
1436
1437 if (MF->getTarget().requiresStructuredCFG()) {
1438 if (!MLI)
1439 return false;
1440 const MachineLoop *L = MLI->getLoopFor(Succ);
1441 // Only if `Succ` is a loop header, splitting the critical edge will not
1442 // break structured CFG. And fallthrough to check if this's terminator is
1443 // analyzable.
1444 if (!L || L->getHeader() != Succ)
1445 return false;
1446 }
1447
1448 // Do we have an Indirect jump with a jumptable that we can rewrite?
1449 int JTI = findJumpTableIndex(*this);
1450 if (JTI >= 0 && !jumpTableHasOtherUses(*MF, *this, JTI))
1451 return true;
1452
1453 // We may need to update this's terminator, but we can't do that if
1454 // analyzeBranch fails.
1456 const MachineBasicBlock *TBB = nullptr, *FBB = nullptr;
1458 // AnalyzeBanch should modify this, since we did not allow modification.
1459 if (TII->analyzeBranch(*this, TBB, FBB, Cond))
1460 return false;
1461
1462 // Handle weird inputs (e.g., generated by a test case reducer/fuzzer): A
1463 // block may end with a conditional branch but jumps to the same MBB is either
1464 // case. We have duplicate CFG edges in that case that we can't handle. Since
1465 // this never happens in properly optimized code, just skip those edges.
1466 if (TBB && TBB == FBB) {
1467 LLVM_DEBUG(dbgs() << "Won't split critical edge after degenerate "
1468 << printMBBReference(*this) << '\n');
1469 return false;
1470 }
1471 return true;
1472}
1473
1474/// Prepare MI to be removed from its bundle. This fixes bundle flags on MI's
1475/// neighboring instructions so the bundle won't be broken by removing MI.
1477 // Removing the first instruction in a bundle.
1478 if (MI->isBundledWithSucc() && !MI->isBundledWithPred())
1479 MI->unbundleFromSucc();
1480 // Removing the last instruction in a bundle.
1481 if (MI->isBundledWithPred() && !MI->isBundledWithSucc())
1482 MI->unbundleFromPred();
1483 // If MI is not bundled, or if it is internal to a bundle, the neighbor flags
1484 // are already fine.
1485}
1486
1492
1495 MI->clearFlag(MachineInstr::BundledPred);
1496 MI->clearFlag(MachineInstr::BundledSucc);
1497 return Insts.remove(MI);
1498}
1499
1502 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1503 "Cannot insert instruction with bundle flags");
1504 // Set the bundle flags when inserting inside a bundle.
1505 if (I != instr_end() && I->isBundledWithPred()) {
1506 MI->setFlag(MachineInstr::BundledPred);
1507 MI->setFlag(MachineInstr::BundledSucc);
1508 }
1509 return Insts.insert(I, MI);
1510}
1511
1512/// This method unlinks 'this' from the containing function, and returns it, but
1513/// does not delete it.
1515 assert(getParent() && "Not embedded in a function!");
1516 getParent()->remove(this);
1517 return this;
1518}
1519
1520/// This method unlinks 'this' from the containing function, and deletes it.
1522 assert(getParent() && "Not embedded in a function!");
1523 getParent()->erase(this);
1524}
1525
1526/// Given a machine basic block that branched to 'Old', change the code and CFG
1527/// so that it branches to 'New' instead.
1529 MachineBasicBlock *New) {
1530 assert(Old != New && "Cannot replace self with self!");
1531
1533 while (I != instr_begin()) {
1534 --I;
1535 if (!I->isTerminator()) break;
1536
1537 // Scan the operands of this machine instruction, replacing any uses of Old
1538 // with New.
1539 for (MachineOperand &MO : I->operands())
1540 if (MO.isMBB() && MO.getMBB() == Old)
1541 MO.setMBB(New);
1542 }
1543
1544 // Update the successor information.
1545 replaceSuccessor(Old, New);
1546}
1547
1548void MachineBasicBlock::replacePhiUsesWith(MachineBasicBlock *Old,
1549 MachineBasicBlock *New) {
1550 for (MachineInstr &MI : phis())
1551 for (unsigned i = 2, e = MI.getNumOperands() + 1; i != e; i += 2) {
1552 MachineOperand &MO = MI.getOperand(i);
1553 if (MO.getMBB() == Old)
1554 MO.setMBB(New);
1555 }
1556}
1557
1558/// Find the next valid DebugLoc starting at MBBI, skipping any debug
1559/// instructions. Return UnknownLoc if there is none.
1562 // Skip debug declarations, we don't want a DebugLoc from them.
1564 if (MBBI != instr_end())
1565 return MBBI->getDebugLoc();
1566 return {};
1567}
1568
1570 if (MBBI == instr_rend())
1571 return findDebugLoc(instr_begin());
1572 // Skip debug declarations, we don't want a DebugLoc from them.
1574 if (!MBBI->isDebugInstr())
1575 return MBBI->getDebugLoc();
1576 return {};
1577}
1578
1579/// Find the previous valid DebugLoc preceding MBBI, skipping any debug
1580/// instructions. Return UnknownLoc if there is none.
1582 if (MBBI == instr_begin())
1583 return {};
1584 // Skip debug instructions, we don't want a DebugLoc from them.
1586 if (!MBBI->isDebugInstr())
1587 return MBBI->getDebugLoc();
1588 return {};
1589}
1590
1592 if (MBBI == instr_rend())
1593 return {};
1594 // Skip debug declarations, we don't want a DebugLoc from them.
1596 if (MBBI != instr_rend())
1597 return MBBI->getDebugLoc();
1598 return {};
1599}
1600
1601/// Find and return the merged DebugLoc of the branch instructions of the block.
1602/// Return UnknownLoc if there is none.
1605 DebugLoc DL;
1606 auto TI = getFirstTerminator();
1607 while (TI != end() && !TI->isBranch())
1608 ++TI;
1609
1610 if (TI != end()) {
1611 DL = TI->getDebugLoc();
1612 for (++TI ; TI != end() ; ++TI)
1613 if (TI->isBranch())
1614 DL = DebugLoc::getMergedLocation(DL, TI->getDebugLoc());
1615 }
1616 return DL;
1617}
1618
1619/// Return probability of the edge from this block to MBB.
1622 if (Probs.empty())
1623 return BranchProbability(1, succ_size());
1624
1625 const auto &Prob = *getProbabilityIterator(Succ);
1626 if (!Prob.isUnknown())
1627 return Prob;
1628 // For unknown probabilities, collect the sum of all known ones, and evenly
1629 // ditribute the complemental of the sum to each unknown probability.
1630 unsigned KnownProbNum = 0;
1631 auto Sum = BranchProbability::getZero();
1632 for (const auto &P : Probs) {
1633 if (!P.isUnknown()) {
1634 Sum += P;
1635 KnownProbNum++;
1636 }
1637 }
1638 return Sum.getCompl() / (Probs.size() - KnownProbNum);
1639}
1640
1642 if (succ_size() <= 1)
1643 return true;
1645 return true;
1646
1647 SmallVector<BranchProbability, 8> Normalized(Probs.begin(), Probs.end());
1649
1650 // Normalize assuming unknown probabilities. This will assign equal
1651 // probabilities to all successors.
1652 SmallVector<BranchProbability, 8> Equal(Normalized.size());
1654
1655 return llvm::equal(Normalized, Equal);
1656}
1657
1658/// Set successor probability of a given iterator.
1660 BranchProbability Prob) {
1661 assert(!Prob.isUnknown());
1662 if (Probs.empty())
1663 return;
1664 *getProbabilityIterator(I) = Prob;
1665}
1666
1667/// Return probability iterator corresonding to the I successor iterator
1668MachineBasicBlock::const_probability_iterator
1669MachineBasicBlock::getProbabilityIterator(
1671 assert(Probs.size() == Successors.size() && "Async probability list!");
1672 const size_t index = std::distance(Successors.begin(), I);
1673 assert(index < Probs.size() && "Not a current successor!");
1674 return Probs.begin() + index;
1675}
1676
1677/// Return probability iterator corresonding to the I successor iterator.
1678MachineBasicBlock::probability_iterator
1679MachineBasicBlock::getProbabilityIterator(MachineBasicBlock::succ_iterator I) {
1680 assert(Probs.size() == Successors.size() && "Async probability list!");
1681 const size_t index = std::distance(Successors.begin(), I);
1682 assert(index < Probs.size() && "Not a current successor!");
1683 return Probs.begin() + index;
1684}
1685
1686/// Return whether (physical) register "Reg" has been <def>ined and not <kill>ed
1687/// as of just before "MI".
1688///
1689/// Search is localised to a neighborhood of
1690/// Neighborhood instructions before (searching for defs or kills) and N
1691/// instructions after (searching just for defs) MI.
1694 MCRegister Reg, const_iterator Before,
1695 unsigned Neighborhood) const {
1696 assert(Reg.isPhysical());
1697 unsigned N = Neighborhood;
1698
1699 // Try searching forwards from Before, looking for reads or defs.
1700 const_iterator I(Before);
1701 for (; I != end() && N > 0; ++I) {
1702 if (I->isDebugOrPseudoInstr())
1703 continue;
1704
1705 --N;
1706
1707 PhysRegInfo Info = AnalyzePhysRegInBundle(*I, Reg, TRI);
1708
1709 // Register is live when we read it here.
1710 if (Info.Read)
1711 return LQR_Live;
1712 // Register is dead if we can fully overwrite or clobber it here.
1713 if (Info.FullyDefined || Info.Clobbered)
1714 return LQR_Dead;
1715 }
1716
1717 // If we reached the end, it is safe to clobber Reg at the end of a block of
1718 // no successor has it live in.
1719 if (I == end()) {
1720 for (MachineBasicBlock *S : successors()) {
1721 for (const MachineBasicBlock::RegisterMaskPair &LI : S->liveins()) {
1722 if (TRI->regsOverlap(LI.PhysReg, Reg))
1723 return LQR_Live;
1724 }
1725 }
1726
1727 return LQR_Dead;
1728 }
1729
1730
1731 N = Neighborhood;
1732
1733 // Start by searching backwards from Before, looking for kills, reads or defs.
1734 I = const_iterator(Before);
1735 // If this is the first insn in the block, don't search backwards.
1736 if (I != begin()) {
1737 do {
1738 --I;
1739
1740 if (I->isDebugOrPseudoInstr())
1741 continue;
1742
1743 --N;
1744
1745 PhysRegInfo Info = AnalyzePhysRegInBundle(*I, Reg, TRI);
1746
1747 // Defs happen after uses so they take precedence if both are present.
1748
1749 // Register is dead after a dead def of the full register.
1750 if (Info.DeadDef)
1751 return LQR_Dead;
1752 // Register is (at least partially) live after a def.
1753 if (Info.Defined) {
1754 if (!Info.PartialDeadDef)
1755 return LQR_Live;
1756 // As soon as we saw a partial definition (dead or not),
1757 // we cannot tell if the value is partial live without
1758 // tracking the lanemasks. We are not going to do this,
1759 // so fall back on the remaining of the analysis.
1760 break;
1761 }
1762 // Register is dead after a full kill or clobber and no def.
1763 if (Info.Killed || Info.Clobbered)
1764 return LQR_Dead;
1765 // Register must be live if we read it.
1766 if (Info.Read)
1767 return LQR_Live;
1768
1769 } while (I != begin() && N > 0);
1770 }
1771
1772 // If all the instructions before this in the block are debug instructions,
1773 // skip over them.
1774 while (I != begin() && std::prev(I)->isDebugOrPseudoInstr())
1775 --I;
1776
1777 // Did we get to the start of the block?
1778 if (I == begin()) {
1779 // If so, the register's state is definitely defined by the live-in state.
1781 if (TRI->regsOverlap(LI.PhysReg, Reg))
1782 return LQR_Live;
1783
1784 return LQR_Dead;
1785 }
1786
1787 // At this point we have no idea of the liveness of the register.
1788 return LQR_Unknown;
1789}
1790
1791const uint32_t *
1793 // EH funclet entry does not preserve any registers.
1794 return isEHFuncletEntry() ? TRI->getNoPreservedMask() : nullptr;
1795}
1796
1797const uint32_t *
1799 // If we see a return block with successors, this must be a funclet return,
1800 // which does not preserve any registers. If there are no successors, we don't
1801 // care what kind of return it is, putting a mask after it is a no-op.
1802 return isReturnBlock() && !succ_empty() ? TRI->getNoPreservedMask() : nullptr;
1803}
1804
1806 LiveIns.clear();
1807}
1808
1810 std::vector<RegisterMaskPair> &OldLiveIns) {
1811 assert(OldLiveIns.empty() && "Vector must be empty");
1812 std::swap(LiveIns, OldLiveIns);
1813}
1814
1816 assert(getParent()->getProperties().hasTracksLiveness() &&
1817 "Liveness information is accurate");
1818 return LiveIns.begin();
1819}
1820
1822 const MachineFunction &MF = *getParent();
1823 const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
1824 MCRegister ExceptionPointer, ExceptionSelector;
1825 if (MF.getFunction().hasPersonalityFn()) {
1826 auto PersonalityFn = MF.getFunction().getPersonalityFn();
1827 // Prefer the "exception-model" module flag, else the TargetOptions default.
1831 ExceptionPointer = TLI.getExceptionPointerRegister(EH, PersonalityFn);
1832 ExceptionSelector = TLI.getExceptionSelectorRegister(EH, PersonalityFn);
1833 }
1834
1835 return liveout_iterator(*this, ExceptionPointer, ExceptionSelector, false);
1836}
1837
1839 unsigned Cntr = 0;
1840 auto R = instructionsWithoutDebug(begin(), end());
1841 for (auto I = R.begin(), E = R.end(); I != E; ++I) {
1842 if (++Cntr > Limit)
1843 return true;
1844 }
1845 return false;
1846}
1847
1849 const MachineBasicBlock &PredMBB) {
1850 for (MachineInstr &Phi : phis())
1851 Phi.removePHIIncomingValueFor(PredMBB);
1852}
1853
1855const 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:686
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:186
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...
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
unsigned getMaxBytesForAlignment() const
Return the maximum amount of padding allowed for aligning the basic block.
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.
MachineBasicBlock * SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P, MachineDomTreeUpdater *MDTU=nullptr)
bool isEHContTarget() const
Returns true if this is a target of Windows EH Continuation Guard.
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
bool isCleanupFuncletEntry() const
Returns true if this is the entry block of a cleanup funclet.
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.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
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:719
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
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.
void set(unsigned Idx)
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:82
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