LLVM 22.0.0git
MachineBasicBlock.h
Go to the documentation of this file.
1//===- llvm/CodeGen/MachineBasicBlock.h -------------------------*- 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
13#ifndef LLVM_CODEGEN_MACHINEBASICBLOCK_H
14#define LLVM_CODEGEN_MACHINEBASICBLOCK_H
15
19#include "llvm/ADT/ilist.h"
24#include "llvm/IR/DebugLoc.h"
25#include "llvm/MC/LaneBitmask.h"
29#include <cassert>
30#include <cstdint>
31#include <iterator>
32#include <string>
33#include <vector>
34
35namespace llvm {
36
37class BasicBlock;
39class MachineFunction;
40class MachineLoopInfo;
41class MCSymbol;
43class Pass;
44class Printable;
45class SlotIndexes;
46class StringRef;
47class raw_ostream;
48class LiveIntervals;
49class LiveVariables;
52
53// This structure uniquely identifies a basic block section.
54// Possible values are
55// {Type: Default, Number: (unsigned)} (These are regular section IDs)
56// {Type: Exception, Number: 0} (ExceptionSectionID)
57// {Type: Cold, Number: 0} (ColdSectionID)
60 Default = 0, // Regular section (these sections are distinguished by the
61 // Number field).
62 Exception, // Special section type for exception handling blocks
63 Cold, // Special section type for cold blocks
65 unsigned Number;
66
67 MBBSectionID(unsigned N) : Type(Default), Number(N) {}
68
69 // Special unique sections for cold and exception blocks.
72
73 bool operator==(const MBBSectionID &Other) const {
74 return Type == Other.Type && Number == Other.Number;
75 }
76
77 bool operator!=(const MBBSectionID &Other) const { return !(*this == Other); }
78
79private:
80 // This is only used to construct the special cold and exception sections.
81 MBBSectionID(SectionType T) : Type(T), Number(0) {}
82};
83
84template <> struct DenseMapInfo<MBBSectionID> {
87
88 static inline MBBSectionID getEmptyKey() {
89 return MBBSectionID(NumberInfo::getEmptyKey());
90 }
91 static inline MBBSectionID getTombstoneKey() {
92 return MBBSectionID(NumberInfo::getTombstoneKey());
93 }
94 static unsigned getHashValue(const MBBSectionID &SecID) {
95 return detail::combineHashValue(TypeInfo::getHashValue(SecID.Type),
96 NumberInfo::getHashValue(SecID.Number));
97 }
98 static bool isEqual(const MBBSectionID &LHS, const MBBSectionID &RHS) {
99 return LHS == RHS;
100 }
101};
102
103template <> struct ilist_traits<MachineInstr> {
104private:
105 friend class MachineBasicBlock; // Set by the owning MachineBasicBlock.
106
107 MachineBasicBlock *Parent;
108
109 using instr_iterator =
111
112public:
116 instr_iterator First,
117 instr_iterator Last);
119};
120
121class MachineBasicBlock
122 : public ilist_node_with_parent<MachineBasicBlock, MachineFunction> {
123public:
124 /// Pair of physical register and lane mask.
125 /// This is not simply a std::pair typedef because the members should be named
126 /// clearly as they both have an integer type.
139
140private:
142
143 const BasicBlock *BB;
144 int Number;
145
146 /// The call frame size on entry to this basic block due to call frame setup
147 /// instructions in a predecessor. This is usually zero, unless basic blocks
148 /// are split in the middle of a call sequence.
149 ///
150 /// This information is only maintained until PrologEpilogInserter eliminates
151 /// call frame pseudos.
152 unsigned CallFrameSize = 0;
153
154 MachineFunction *xParent;
155 Instructions Insts;
156
157 /// Keep track of the predecessor / successor basic blocks.
160
161 /// Keep track of the probabilities to the successors. This vector has the
162 /// same order as Successors, or it is empty if we don't use it (disable
163 /// optimization).
164 std::vector<BranchProbability> Probs;
165 using probability_iterator = std::vector<BranchProbability>::iterator;
166 using const_probability_iterator =
167 std::vector<BranchProbability>::const_iterator;
168
169 std::optional<uint64_t> IrrLoopHeaderWeight;
170
171 /// Keep track of the physical registers that are livein of the basicblock.
172 using LiveInVector = std::vector<RegisterMaskPair>;
173 LiveInVector LiveIns;
174
175 /// Alignment of the basic block. One if the basic block does not need to be
176 /// aligned.
177 Align Alignment;
178 /// Maximum amount of bytes that can be added to align the basic block. If the
179 /// alignment cannot be reached in this many bytes, no bytes are emitted.
180 /// Zero to represent no maximum.
181 unsigned MaxBytesForAlignment = 0;
182
183 /// Indicate that this basic block is entered via an exception handler.
184 bool IsEHPad = false;
185
186 /// Indicate that this MachineBasicBlock is referenced somewhere other than
187 /// as predecessor/successor, a terminator MachineInstr, or a jump table.
188 bool MachineBlockAddressTaken = false;
189
190 /// If this MachineBasicBlock corresponds to an IR-level "blockaddress"
191 /// constant, this contains a pointer to that block.
192 BasicBlock *AddressTakenIRBlock = nullptr;
193
194 /// Indicate that this basic block needs its symbol be emitted regardless of
195 /// whether the flow just falls-through to it.
196 bool LabelMustBeEmitted = false;
197
198 /// Indicate that this basic block is the entry block of an EH scope, i.e.,
199 /// the block that used to have a catchpad or cleanuppad instruction in the
200 /// LLVM IR.
201 bool IsEHScopeEntry = false;
202
203 /// Indicates if this is a target of Windows EH Continuation Guard.
204 bool IsEHContTarget = false;
205
206 /// Indicate that this basic block is the entry block of an EH funclet.
207 bool IsEHFuncletEntry = false;
208
209 /// Indicate that this basic block is the entry block of a cleanup funclet.
210 bool IsCleanupFuncletEntry = false;
211
212 /// Fixed unique ID assigned to this basic block upon creation. Used with
213 /// basic block sections and basic block labels.
214 std::optional<UniqueBBID> BBID;
215
216 /// With basic block sections, this stores the Section ID of the basic block.
217 MBBSectionID SectionID{0};
218
219 // Indicate that this basic block begins a section.
220 bool IsBeginSection = false;
221
222 // Indicate that this basic block ends a section.
223 bool IsEndSection = false;
224
225 /// Indicate that this basic block is the indirect dest of an INLINEASM_BR.
226 bool IsInlineAsmBrIndirectTarget = false;
227
228 /// since getSymbol is a relatively heavy-weight operation, the symbol
229 /// is only computed once and is cached.
230 mutable MCSymbol *CachedMCSymbol = nullptr;
231
232 /// Cached MCSymbol for this block (used if IsEHContTarget).
233 mutable MCSymbol *CachedEHContMCSymbol = nullptr;
234
235 /// Marks the end of the basic block. Used during basic block sections to
236 /// calculate the size of the basic block, or the BB section ending with it.
237 mutable MCSymbol *CachedEndMCSymbol = nullptr;
238
239 // Intrusive list support
240 MachineBasicBlock() = default;
241
242 explicit MachineBasicBlock(MachineFunction &MF, const BasicBlock *BB);
243
244 ~MachineBasicBlock();
245
246 // MachineBasicBlocks are allocated and owned by MachineFunction.
247 friend class MachineFunction;
248
249public:
250 /// Return the LLVM basic block that this instance corresponded to originally.
251 /// Note that this may be NULL if this instance does not correspond directly
252 /// to an LLVM basic block.
253 const BasicBlock *getBasicBlock() const { return BB; }
254
255 /// Remove the reference to the underlying IR BasicBlock. This is for
256 /// reduction tools and should generally not be used.
258 BB = nullptr;
259 }
260
261 /// Check if there is a name of corresponding LLVM basic block.
262 LLVM_ABI bool hasName() const;
263
264 /// Return the name of the corresponding LLVM basic block, or an empty string.
265 LLVM_ABI StringRef getName() const;
266
267 /// Return a formatted string to identify this block and its parent function.
268 LLVM_ABI std::string getFullName() const;
269
270 /// Test whether this block is used as something other than the target
271 /// of a terminator, exception-handling target, or jump table. This is
272 /// either the result of an IR-level "blockaddress", or some form
273 /// of target-specific branch lowering.
274 ///
275 /// The name of this function `hasAddressTaken` implies that the address of
276 /// the block is known and used in a general sense, but not necessarily that
277 /// the address is used by an indirect branch instruction. So branch target
278 /// enforcement need not put a BTI instruction (or equivalent) at the start
279 /// of a block just because this function returns true. The decision about
280 /// whether to add a BTI can be more subtle than that, and depends on the
281 /// more detailed checks that this function aggregates together.
282 bool hasAddressTaken() const {
283 return MachineBlockAddressTaken || AddressTakenIRBlock ||
284 IsInlineAsmBrIndirectTarget;
285 }
286
287 /// Test whether this block is used as something other than the target of a
288 /// terminator, exception-handling target, jump table, or IR blockaddress.
289 /// For example, its address might be loaded into a register, or
290 /// stored in some branch table that isn't part of MachineJumpTableInfo.
291 ///
292 /// If this function returns true, it _does_ mean that branch target
293 /// enforcement needs to put a BTI or equivalent at the start of the block.
294 bool isMachineBlockAddressTaken() const { return MachineBlockAddressTaken; }
295
296 /// Test whether this block is the target of an IR BlockAddress. (There can
297 /// more than one MBB associated with an IR BB where the address is taken.)
298 ///
299 /// If this function returns true, it _does_ mean that branch target
300 /// enforcement needs to put a BTI or equivalent at the start of the block.
301 bool isIRBlockAddressTaken() const { return AddressTakenIRBlock; }
302
303 /// Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
304 BasicBlock *getAddressTakenIRBlock() const { return AddressTakenIRBlock; }
305
306 /// Set this block to indicate that its address is used as something other
307 /// than the target of a terminator, exception-handling target, jump table,
308 /// or IR-level "blockaddress".
309 void setMachineBlockAddressTaken() { MachineBlockAddressTaken = true; }
310
311 /// Set this block to reflect that it corresponds to an IR-level basic block
312 /// with a BlockAddress.
313 void setAddressTakenIRBlock(BasicBlock *BB) { AddressTakenIRBlock = BB; }
314
315 /// Test whether this block must have its label emitted.
316 bool hasLabelMustBeEmitted() const { return LabelMustBeEmitted; }
317
318 /// Set this block to reflect that, regardless how we flow to it, we need
319 /// its label be emitted.
320 void setLabelMustBeEmitted() { LabelMustBeEmitted = true; }
321
322 /// Return the MachineFunction containing this basic block.
323 const MachineFunction *getParent() const { return xParent; }
324 MachineFunction *getParent() { return xParent; }
325
326 /// Returns true if the original IR terminator is an `indirectbr` with
327 /// successor blocks. This typically corresponds to a `goto` in C, rather than
328 /// jump tables.
330 return back().isIndirectBranch() && !succ_empty() &&
331 llvm::all_of(successors(), [](const MachineBasicBlock *Succ) {
332 return Succ->isIRBlockAddressTaken();
333 });
334 }
335
340
346
347 unsigned size() const { return (unsigned)Insts.size(); }
348 LLVM_ABI bool sizeWithoutDebugLargerThan(unsigned Limit) const;
349 bool empty() const { return Insts.empty(); }
350
351 MachineInstr &instr_front() { return Insts.front(); }
352 MachineInstr &instr_back() { return Insts.back(); }
353 const MachineInstr &instr_front() const { return Insts.front(); }
354 const MachineInstr &instr_back() const { return Insts.back(); }
355
356 MachineInstr &front() { return Insts.front(); }
357 MachineInstr &back() { return *--end(); }
358 const MachineInstr &front() const { return Insts.front(); }
359 const MachineInstr &back() const { return *--end(); }
360
361 instr_iterator instr_begin() { return Insts.begin(); }
362 const_instr_iterator instr_begin() const { return Insts.begin(); }
363 instr_iterator instr_end() { return Insts.end(); }
364 const_instr_iterator instr_end() const { return Insts.end(); }
365 reverse_instr_iterator instr_rbegin() { return Insts.rbegin(); }
366 const_reverse_instr_iterator instr_rbegin() const { return Insts.rbegin(); }
367 reverse_instr_iterator instr_rend () { return Insts.rend(); }
368 const_reverse_instr_iterator instr_rend () const { return Insts.rend(); }
369
376
377 iterator begin() { return instr_begin(); }
378 const_iterator begin() const { return instr_begin(); }
379 iterator end () { return instr_end(); }
380 const_iterator end () const { return instr_end(); }
391
392 /// Support for MachineInstr::getNextNode().
393 static Instructions MachineBasicBlock::*getSublistAccess(MachineInstr *) {
394 return &MachineBasicBlock::Insts;
395 }
396
403
404 /// Returns a range that iterates over the phis in the basic block.
406 return make_range(begin(), getFirstNonPHI());
407 }
409 return const_cast<MachineBasicBlock *>(this)->phis();
410 }
411
412 // Machine-CFG iterators
427 pred_iterator pred_begin() { return Predecessors.begin(); }
428 const_pred_iterator pred_begin() const { return Predecessors.begin(); }
429 pred_iterator pred_end() { return Predecessors.end(); }
430 const_pred_iterator pred_end() const { return Predecessors.end(); }
432 { return Predecessors.rbegin();}
434 { return Predecessors.rbegin();}
436 { return Predecessors.rend(); }
438 { return Predecessors.rend(); }
439 unsigned pred_size() const {
440 return (unsigned)Predecessors.size();
441 }
442 bool pred_empty() const { return Predecessors.empty(); }
443 succ_iterator succ_begin() { return Successors.begin(); }
444 const_succ_iterator succ_begin() const { return Successors.begin(); }
445 succ_iterator succ_end() { return Successors.end(); }
446 const_succ_iterator succ_end() const { return Successors.end(); }
448 { return Successors.rbegin(); }
450 { return Successors.rbegin(); }
452 { return Successors.rend(); }
454 { return Successors.rend(); }
455 unsigned succ_size() const {
456 return (unsigned)Successors.size();
457 }
458 bool succ_empty() const { return Successors.empty(); }
459
472
473 // LiveIn management methods.
474
475 /// Adds the specified register as a live in. Note that it is an error to add
476 /// the same register to the same set more than once unless the intention is
477 /// to call sortUniqueLiveIns after all registers are added.
478 void addLiveIn(MCRegister PhysReg,
479 LaneBitmask LaneMask = LaneBitmask::getAll()) {
480 LiveIns.push_back(RegisterMaskPair(PhysReg, LaneMask));
481 }
482 void addLiveIn(const RegisterMaskPair &RegMaskPair) {
483 LiveIns.push_back(RegMaskPair);
484 }
485
486 /// Sorts and uniques the LiveIns vector. It can be significantly faster to do
487 /// this than repeatedly calling isLiveIn before calling addLiveIn for every
488 /// LiveIn insertion.
490
491 /// Clear live in list.
492 LLVM_ABI void clearLiveIns();
493
494 /// Clear the live in list, and return the removed live in's in \p OldLiveIns.
495 /// Requires that the vector \p OldLiveIns is empty.
496 LLVM_ABI void clearLiveIns(std::vector<RegisterMaskPair> &OldLiveIns);
497
498 /// Add PhysReg as live in to this block, and ensure that there is a copy of
499 /// PhysReg to a virtual register of class RC. Return the virtual register
500 /// that is a copy of the live in PhysReg.
502 const TargetRegisterClass *RC);
503
504 /// Remove the specified register from the live in set.
506 LaneBitmask LaneMask = LaneBitmask::getAll());
507
508 /// Remove the specified register from any overlapped live in. The method is
509 /// subreg-aware and removes Reg and its subregs from the live in set. It also
510 /// clears the corresponding bitmask from its live-in super registers.
512
513 /// Return true if the specified register is in the live in set.
515 LaneBitmask LaneMask = LaneBitmask::getAll()) const;
516
517 // Iteration support for live in sets. These sets are kept in sorted
518 // order by their register number.
519 using livein_iterator = LiveInVector::const_iterator;
520
521 /// Unlike livein_begin, this method does not check that the liveness
522 /// information is accurate. Still for debug purposes it may be useful
523 /// to have iterators that won't assert if the liveness information
524 /// is not current.
525 livein_iterator livein_begin_dbg() const { return LiveIns.begin(); }
529
531 livein_iterator livein_end() const { return LiveIns.end(); }
532 bool livein_empty() const { return LiveIns.empty(); }
536
537 /// Remove entry from the livein set and return iterator to the next.
539
540 const std::vector<RegisterMaskPair> &getLiveIns() const { return LiveIns; }
541
543 public:
544 using iterator_category = std::input_iterator_tag;
545 using difference_type = std::ptrdiff_t;
547 using pointer = const RegisterMaskPair *;
549
550 liveout_iterator(const MachineBasicBlock &MBB, MCPhysReg ExceptionPointer,
551 MCPhysReg ExceptionSelector, bool End)
552 : ExceptionPointer(ExceptionPointer),
553 ExceptionSelector(ExceptionSelector), BlockI(MBB.succ_begin()),
554 BlockEnd(MBB.succ_end()) {
555 if (End)
556 BlockI = BlockEnd;
557 else if (BlockI != BlockEnd) {
558 LiveRegI = (*BlockI)->livein_begin();
559 if (!advanceToValidPosition())
560 return;
561 if ((*BlockI)->isEHPad() && (LiveRegI->PhysReg == ExceptionPointer ||
562 LiveRegI->PhysReg == ExceptionSelector))
563 ++(*this);
564 }
565 }
566
568 do {
569 ++LiveRegI;
570 if (!advanceToValidPosition())
571 return *this;
572 } while ((*BlockI)->isEHPad() &&
573 (LiveRegI->PhysReg == ExceptionPointer ||
574 LiveRegI->PhysReg == ExceptionSelector));
575 return *this;
576 }
577
579 liveout_iterator Tmp = *this;
580 ++(*this);
581 return Tmp;
582 }
583
585 return *LiveRegI;
586 }
587
589 return &*LiveRegI;
590 }
591
592 bool operator==(const liveout_iterator &RHS) const {
593 if (BlockI != BlockEnd)
594 return BlockI == RHS.BlockI && LiveRegI == RHS.LiveRegI;
595 return RHS.BlockI == BlockEnd;
596 }
597
598 bool operator!=(const liveout_iterator &RHS) const {
599 return !(*this == RHS);
600 }
601 private:
602 bool advanceToValidPosition() {
603 if (LiveRegI != (*BlockI)->livein_end())
604 return true;
605
606 do {
607 ++BlockI;
608 } while (BlockI != BlockEnd && (*BlockI)->livein_empty());
609 if (BlockI == BlockEnd)
610 return false;
611
612 LiveRegI = (*BlockI)->livein_begin();
613 return true;
614 }
615
616 MCPhysReg ExceptionPointer, ExceptionSelector;
617 const_succ_iterator BlockI;
618 const_succ_iterator BlockEnd;
619 livein_iterator LiveRegI;
620 };
621
622 /// Iterator scanning successor basic blocks' liveins to determine the
623 /// registers potentially live at the end of this block. There may be
624 /// duplicates or overlapping registers in the list returned.
627 return liveout_iterator(*this, 0, 0, true);
628 }
632
633 /// Get the clobber mask for the start of this basic block. Funclets use this
634 /// to prevent register allocation across funclet transitions.
635 LLVM_ABI const uint32_t *
637
638 /// Get the clobber mask for the end of the basic block.
639 /// \see getBeginClobberMask()
640 LLVM_ABI const uint32_t *
642
643 /// Return alignment of the basic block.
644 Align getAlignment() const { return Alignment; }
645
646 /// Set alignment of the basic block.
647 void setAlignment(Align A) { Alignment = A; }
648
649 void setAlignment(Align A, unsigned MaxBytes) {
651 setMaxBytesForAlignment(MaxBytes);
652 }
653
654 /// Return the maximum amount of padding allowed for aligning the basic block.
655 unsigned getMaxBytesForAlignment() const { return MaxBytesForAlignment; }
656
657 /// Set the maximum amount of padding allowed for aligning the basic block
658 void setMaxBytesForAlignment(unsigned MaxBytes) {
659 MaxBytesForAlignment = MaxBytes;
660 }
661
662 /// Returns true if the block is a landing pad. That is this basic block is
663 /// entered via an exception handler.
664 bool isEHPad() const { return IsEHPad; }
665
666 /// Indicates the block is a landing pad. That is this basic block is entered
667 /// via an exception handler.
668 void setIsEHPad(bool V = true) { IsEHPad = V; }
669
670 LLVM_ABI bool hasEHPadSuccessor() const;
671
672 /// Returns true if this is the entry block of the function.
673 LLVM_ABI bool isEntryBlock() const;
674
675 /// Returns true if this is the entry block of an EH scope, i.e., the block
676 /// that used to have a catchpad or cleanuppad instruction in the LLVM IR.
677 bool isEHScopeEntry() const { return IsEHScopeEntry; }
678
679 /// Indicates if this is the entry block of an EH scope, i.e., the block that
680 /// that used to have a catchpad or cleanuppad instruction in the LLVM IR.
681 void setIsEHScopeEntry(bool V = true) { IsEHScopeEntry = V; }
682
683 /// Returns true if this is a target of Windows EH Continuation Guard.
684 bool isEHContTarget() const { return IsEHContTarget; }
685
686 /// Indicates if this is a target of Windows EH Continuation Guard.
687 void setIsEHContTarget(bool V = true) { IsEHContTarget = V; }
688
689 /// Returns true if this is the entry block of an EH funclet.
690 bool isEHFuncletEntry() const { return IsEHFuncletEntry; }
691
692 /// Indicates if this is the entry block of an EH funclet.
693 void setIsEHFuncletEntry(bool V = true) { IsEHFuncletEntry = V; }
694
695 /// Returns true if this is the entry block of a cleanup funclet.
696 bool isCleanupFuncletEntry() const { return IsCleanupFuncletEntry; }
697
698 /// Indicates if this is the entry block of a cleanup funclet.
699 void setIsCleanupFuncletEntry(bool V = true) { IsCleanupFuncletEntry = V; }
700
701 /// Returns true if this block begins any section.
702 bool isBeginSection() const { return IsBeginSection; }
703
704 /// Returns true if this block ends any section.
705 bool isEndSection() const { return IsEndSection; }
706
707 void setIsBeginSection(bool V = true) { IsBeginSection = V; }
708
709 void setIsEndSection(bool V = true) { IsEndSection = V; }
710
711 std::optional<UniqueBBID> getBBID() const { return BBID; }
712
713 /// Returns the section ID of this basic block.
714 MBBSectionID getSectionID() const { return SectionID; }
715
716 /// Sets the fixed BBID of this basic block.
717 void setBBID(const UniqueBBID &V) {
718 assert(!BBID.has_value() && "Cannot change BBID.");
719 BBID = V;
720 }
721
722 /// Sets the section ID for this basic block.
723 void setSectionID(MBBSectionID V) { SectionID = V; }
724
725 /// Returns the MCSymbol marking the end of this basic block.
727
728 /// Returns true if this block may have an INLINEASM_BR (overestimate, by
729 /// checking if any of the successors are indirect targets of any inlineasm_br
730 /// in the function).
731 LLVM_ABI bool mayHaveInlineAsmBr() const;
732
733 /// Returns true if this is the indirect dest of an INLINEASM_BR.
735 return IsInlineAsmBrIndirectTarget;
736 }
737
738 /// Indicates if this is the indirect dest of an INLINEASM_BR.
739 void setIsInlineAsmBrIndirectTarget(bool V = true) {
740 IsInlineAsmBrIndirectTarget = V;
741 }
742
743 /// Returns true if it is legal to hoist instructions into this block.
744 LLVM_ABI bool isLegalToHoistInto() const;
745
746 // Code Layout methods.
747
748 /// Move 'this' block before or after the specified block. This only moves
749 /// the block, it does not modify the CFG or adjust potential fall-throughs at
750 /// the end of the block.
751 LLVM_ABI void moveBefore(MachineBasicBlock *NewAfter);
752 LLVM_ABI void moveAfter(MachineBasicBlock *NewBefore);
753
754 /// Returns true if this and MBB belong to the same section.
755 bool sameSection(const MachineBasicBlock *MBB) const {
756 return getSectionID() == MBB->getSectionID();
757 }
758
759 /// Update the terminator instructions in block to account for changes to
760 /// block layout which may have been made. PreviousLayoutSuccessor should be
761 /// set to the block which may have been used as fallthrough before the block
762 /// layout was modified. If the block previously fell through to that block,
763 /// it may now need a branch. If it previously branched to another block, it
764 /// may now be able to fallthrough to the current layout successor.
765 LLVM_ABI void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor);
766
767 // Machine-CFG mutators
768
769 /// Add Succ as a successor of this MachineBasicBlock. The Predecessors list
770 /// of Succ is automatically updated. PROB parameter is stored in
771 /// Probabilities list. The default probability is set as unknown. Mixing
772 /// known and unknown probabilities in successor list is not allowed. When all
773 /// successors have unknown probabilities, 1 / N is returned as the
774 /// probability for each successor, where N is the number of successors.
775 ///
776 /// Note that duplicate Machine CFG edges are not allowed.
777 LLVM_ABI void
780
781 /// Add Succ as a successor of this MachineBasicBlock. The Predecessors list
782 /// of Succ is automatically updated. The probability is not provided because
783 /// BPI is not available (e.g. -O0 is used), in which case edge probabilities
784 /// won't be used. Using this interface can save some space.
786
787 /// Set successor probability of a given iterator.
789
790 /// Normalize probabilities of all successors so that the sum of them becomes
791 /// one. This is usually done when the current update on this MBB is done, and
792 /// the sum of its successors' probabilities is not guaranteed to be one. The
793 /// user is responsible for the correct use of this function.
794 /// MBB::removeSuccessor() has an option to do this automatically.
796 BranchProbability::normalizeProbabilities(Probs.begin(), Probs.end());
797 }
798
799 /// Validate successors' probabilities and check if the sum of them is
800 /// approximate one. This only works in DEBUG mode.
801 LLVM_ABI void validateSuccProbs() const;
802
803 /// Remove successor from the successors list of this MachineBasicBlock. The
804 /// Predecessors list of Succ is automatically updated.
805 /// If NormalizeSuccProbs is true, then normalize successors' probabilities
806 /// after the successor is removed.
808 bool NormalizeSuccProbs = false);
809
810 /// Remove specified successor from the successors list of this
811 /// MachineBasicBlock. The Predecessors list of Succ is automatically updated.
812 /// If NormalizeSuccProbs is true, then normalize successors' probabilities
813 /// after the successor is removed.
814 /// Return the iterator to the element after the one removed.
816 bool NormalizeSuccProbs = false);
817
818 /// Replace successor OLD with NEW and update probability info.
820 MachineBasicBlock *New);
821
822 /// Copy a successor (and any probability info) from original block to this
823 /// block's. Uses an iterator into the original blocks successors.
824 ///
825 /// This is useful when doing a partial clone of successors. Afterward, the
826 /// probabilities may need to be normalized.
828
829 /// Split the old successor into old plus new and updates the probability
830 /// info.
832 bool NormalizeSuccProbs = false);
833
834 /// Transfers all the successors from MBB to this machine basic block (i.e.,
835 /// copies all the successors FromMBB and remove all the successors from
836 /// FromMBB).
838
839 /// Transfers all the successors, as in transferSuccessors, and update PHI
840 /// operands in the successor blocks which refer to FromMBB to refer to this.
842
843 /// Return true if any of the successors have probabilities attached to them.
844 bool hasSuccessorProbabilities() const { return !Probs.empty(); }
845
846 /// Return true if the specified MBB is a predecessor of this block.
847 LLVM_ABI bool isPredecessor(const MachineBasicBlock *MBB) const;
848
849 /// Return true if the specified MBB is a successor of this block.
850 LLVM_ABI bool isSuccessor(const MachineBasicBlock *MBB) const;
851
852 /// Return true if the specified MBB will be emitted immediately after this
853 /// block, such that if this block exits by falling through, control will
854 /// transfer to the specified MBB. Note that MBB need not be a successor at
855 /// all, for example if this block ends with an unconditional branch to some
856 /// other block.
858
859 /// Return the successor of this block if it has a single successor.
860 /// Otherwise return a null pointer.
861 ///
863 MachineBasicBlock *getSingleSuccessor() {
864 return const_cast<MachineBasicBlock *>(
865 static_cast<const MachineBasicBlock *>(this)->getSingleSuccessor());
866 }
867
868 /// Return the predecessor of this block if it has a single predecessor.
869 /// Otherwise return a null pointer.
870 ///
872 MachineBasicBlock *getSinglePredecessor() {
873 return const_cast<MachineBasicBlock *>(
874 static_cast<const MachineBasicBlock *>(this)->getSinglePredecessor());
875 }
876
877 /// Return the fallthrough block if the block can implicitly
878 /// transfer control to the block after it by falling off the end of
879 /// it. If an explicit branch to the fallthrough block is not allowed,
880 /// set JumpToFallThrough to be false. Non-null return is a conservative
881 /// answer.
882 LLVM_ABI MachineBasicBlock *getFallThrough(bool JumpToFallThrough = true);
883
884 /// Return the fallthrough block if the block can implicitly
885 /// transfer control to it's successor, whether by a branch or
886 /// a fallthrough. Non-null return is a conservative answer.
887 MachineBasicBlock *getLogicalFallThrough() { return getFallThrough(false); }
888
889 /// Return true if the block can implicitly transfer control to the
890 /// block after it by falling off the end of it. This should return
891 /// false if it can reach the block after it, but it uses an
892 /// explicit branch to do so (e.g., a table jump). True is a
893 /// conservative answer.
895
896 /// Returns a pointer to the first instruction in this block that is not a
897 /// PHINode instruction. When adding instructions to the beginning of the
898 /// basic block, they should be added before the returned value, not before
899 /// the first instruction, which might be PHI.
900 /// Returns end() is there's no non-PHI instruction.
903 return const_cast<MachineBasicBlock *>(this)->getFirstNonPHI();
904 }
905
906 /// Return the first instruction in MBB after I that is not a PHI or a label.
907 /// This is the correct point to insert lowered copies at the beginning of a
908 /// basic block that must be before any debugging information.
910
911 /// Return the first instruction in MBB after I that is not a PHI, label or
912 /// debug. This is the correct point to insert copies at the beginning of a
913 /// basic block. \p Reg is the register being used by a spill or defined for a
914 /// restore/split during register allocation.
917 bool SkipPseudoOp = true);
918
919 /// Returns an iterator to the first terminator instruction of this basic
920 /// block. If a terminator does not exist, it returns end().
923 return const_cast<MachineBasicBlock *>(this)->getFirstTerminator();
924 }
925
926 /// Same getFirstTerminator but it ignores bundles and return an
927 /// instr_iterator instead.
928 LLVM_ABI instr_iterator getFirstInstrTerminator();
929
930 /// Finds the first terminator in a block by scanning forward. This can handle
931 /// cases in GlobalISel where there may be non-terminator instructions between
932 /// terminators, for which getFirstTerminator() will not work correctly.
934
935 /// Returns an iterator to the first non-debug instruction in the basic block,
936 /// or end(). Skip any pseudo probe operation if \c SkipPseudoOp is true.
937 /// Pseudo probes are like debug instructions which do not turn into real
938 /// machine code. We try to use the function to skip both debug instructions
939 /// and pseudo probe operations to avoid API proliferation. This should work
940 /// most of the time when considering optimizing the rest of code in the
941 /// block, except for certain cases where pseudo probes are designed to block
942 /// the optimizations. For example, code merge like optimizations are supposed
943 /// to be blocked by pseudo probes for better AutoFDO profile quality.
944 /// Therefore, they should be considered as a valid instruction when this
945 /// function is called in a context of such optimizations. On the other hand,
946 /// \c SkipPseudoOp should be true when it's used in optimizations that
947 /// unlikely hurt profile quality, e.g., without block merging. The default
948 /// value of \c SkipPseudoOp is set to true to maximize code quality in
949 /// general, with an explict false value passed in in a few places like branch
950 /// folding and if-conversion to favor profile quality.
951 LLVM_ABI iterator getFirstNonDebugInstr(bool SkipPseudoOp = true);
952 const_iterator getFirstNonDebugInstr(bool SkipPseudoOp = true) const {
953 return const_cast<MachineBasicBlock *>(this)->getFirstNonDebugInstr(
954 SkipPseudoOp);
955 }
956
957 /// Returns an iterator to the last non-debug instruction in the basic block,
958 /// or end(). Skip any pseudo operation if \c SkipPseudoOp is true.
959 /// Pseudo probes are like debug instructions which do not turn into real
960 /// machine code. We try to use the function to skip both debug instructions
961 /// and pseudo probe operations to avoid API proliferation. This should work
962 /// most of the time when considering optimizing the rest of code in the
963 /// block, except for certain cases where pseudo probes are designed to block
964 /// the optimizations. For example, code merge like optimizations are supposed
965 /// to be blocked by pseudo probes for better AutoFDO profile quality.
966 /// Therefore, they should be considered as a valid instruction when this
967 /// function is called in a context of such optimizations. On the other hand,
968 /// \c SkipPseudoOp should be true when it's used in optimizations that
969 /// unlikely hurt profile quality, e.g., without block merging. The default
970 /// value of \c SkipPseudoOp is set to true to maximize code quality in
971 /// general, with an explict false value passed in in a few places like branch
972 /// folding and if-conversion to favor profile quality.
973 LLVM_ABI iterator getLastNonDebugInstr(bool SkipPseudoOp = true);
974 const_iterator getLastNonDebugInstr(bool SkipPseudoOp = true) const {
975 return const_cast<MachineBasicBlock *>(this)->getLastNonDebugInstr(
976 SkipPseudoOp);
977 }
978
979 /// Convenience function that returns true if the block ends in a return
980 /// instruction.
981 bool isReturnBlock() const {
982 return !empty() && back().isReturn();
983 }
984
985 /// Convenience function that returns true if the bock ends in a EH scope
986 /// return instruction.
987 bool isEHScopeReturnBlock() const {
988 return !empty() && back().isEHScopeReturn();
989 }
990
991 /// Split a basic block into 2 pieces at \p SplitPoint. A new block will be
992 /// inserted after this block, and all instructions after \p SplitInst moved
993 /// to it (\p SplitInst will be in the original block). If \p LIS is provided,
994 /// LiveIntervals will be appropriately updated. \return the newly inserted
995 /// block.
996 ///
997 /// If \p UpdateLiveIns is true, this will ensure the live ins list is
998 /// accurate, including for physreg uses/defs in the original block.
1000 bool UpdateLiveIns = true,
1001 LiveIntervals *LIS = nullptr);
1002
1003 /// Split the critical edge from this block to the given successor block, and
1004 /// return the newly created block, or null if splitting is not possible.
1005 ///
1006 /// This function updates LiveVariables, MachineDominatorTree, and
1007 /// MachineLoopInfo, as applicable.
1014
1015 MachineBasicBlock *
1016 SplitCriticalEdge(MachineBasicBlock *Succ, Pass &P,
1017 std::vector<SparseBitVector<>> *LiveInSets = nullptr,
1018 MachineDomTreeUpdater *MDTU = nullptr) {
1019 return SplitCriticalEdge(Succ, &P, nullptr, LiveInSets, MDTU);
1020 }
1021
1023 SplitCriticalEdge(MachineBasicBlock *Succ,
1025 std::vector<SparseBitVector<>> *LiveInSets = nullptr,
1026 MachineDomTreeUpdater *MDTU = nullptr) {
1027 return SplitCriticalEdge(Succ, nullptr, &MFAM, LiveInSets, MDTU);
1028 }
1029
1030 // Helper method for new pass manager migration.
1032 MachineBasicBlock *Succ, const SplitCriticalEdgeAnalyses &Analyses,
1033 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU);
1034
1037 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU);
1038
1039 /// Check if the edge between this block and the given successor \p
1040 /// Succ, can be split. If this returns true a subsequent call to
1041 /// SplitCriticalEdge is guaranteed to return a valid basic block if
1042 /// no changes occurred in the meantime.
1043 LLVM_ABI bool
1045 const MachineLoopInfo *MLI = nullptr) const;
1046
1047 void pop_front() { Insts.pop_front(); }
1048 void pop_back() { Insts.pop_back(); }
1049 void push_back(MachineInstr *MI) { Insts.push_back(MI); }
1050
1051 /// Insert MI into the instruction list before I, possibly inside a bundle.
1052 ///
1053 /// If the insertion point is inside a bundle, MI will be added to the bundle,
1054 /// otherwise MI will not be added to any bundle. That means this function
1055 /// alone can't be used to prepend or append instructions to bundles. See
1056 /// MIBundleBuilder::insert() for a more reliable way of doing that.
1057 LLVM_ABI instr_iterator insert(instr_iterator I, MachineInstr *M);
1058
1059 /// Insert a range of instructions into the instruction list before I.
1060 template<typename IT>
1061 void insert(iterator I, IT S, IT E) {
1062 assert((I == end() || I->getParent() == this) &&
1063 "iterator points outside of basic block");
1064 Insts.insert(I.getInstrIterator(), S, E);
1065 }
1066
1067 /// Insert MI into the instruction list before I.
1069 assert((I == end() || I->getParent() == this) &&
1070 "iterator points outside of basic block");
1071 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1072 "Cannot insert instruction with bundle flags");
1073 return Insts.insert(I.getInstrIterator(), MI);
1074 }
1075
1076 /// Insert MI into the instruction list after I.
1078 assert((I == end() || I->getParent() == this) &&
1079 "iterator points outside of basic block");
1080 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1081 "Cannot insert instruction with bundle flags");
1082 return Insts.insertAfter(I.getInstrIterator(), MI);
1083 }
1084
1085 /// If I is bundled then insert MI into the instruction list after the end of
1086 /// the bundle, otherwise insert MI immediately after I.
1088 assert((I == instr_end() || I->getParent() == this) &&
1089 "iterator points outside of basic block");
1090 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1091 "Cannot insert instruction with bundle flags");
1092 while (I->isBundledWithSucc())
1093 ++I;
1094 return Insts.insertAfter(I, MI);
1095 }
1096
1097 /// Remove an instruction from the instruction list and delete it.
1098 ///
1099 /// If the instruction is part of a bundle, the other instructions in the
1100 /// bundle will still be bundled after removing the single instruction.
1101 LLVM_ABI instr_iterator erase(instr_iterator I);
1102
1103 /// Remove an instruction from the instruction list and delete it.
1104 ///
1105 /// If the instruction is part of a bundle, the other instructions in the
1106 /// bundle will still be bundled after removing the single instruction.
1110
1111 /// Remove a range of instructions from the instruction list and delete them.
1113 return Insts.erase(I.getInstrIterator(), E.getInstrIterator());
1114 }
1115
1116 /// Remove an instruction or bundle from the instruction list and delete it.
1117 ///
1118 /// If I points to a bundle of instructions, they are all erased.
1120 return erase(I, std::next(I));
1121 }
1122
1123 /// Remove an instruction from the instruction list and delete it.
1124 ///
1125 /// If I is the head of a bundle of instructions, the whole bundle will be
1126 /// erased.
1128 return erase(iterator(I));
1129 }
1130
1131 /// Remove the unbundled instruction from the instruction list without
1132 /// deleting it.
1133 ///
1134 /// This function can not be used to remove bundled instructions, use
1135 /// remove_instr to remove individual instructions from a bundle.
1137 assert(!I->isBundled() && "Cannot remove bundled instructions");
1138 return Insts.remove(instr_iterator(I));
1139 }
1140
1141 /// Remove the possibly bundled instruction from the instruction list
1142 /// without deleting it.
1143 ///
1144 /// If the instruction is part of a bundle, the other instructions in the
1145 /// bundle will still be bundled after removing the single instruction.
1147
1148 void clear() {
1149 Insts.clear();
1150 }
1151
1152 /// Take an instruction from MBB 'Other' at the position From, and insert it
1153 /// into this MBB right before 'Where'.
1154 ///
1155 /// If From points to a bundle of instructions, the whole bundle is moved.
1156 void splice(iterator Where, MachineBasicBlock *Other, iterator From) {
1157 // The range splice() doesn't allow noop moves, but this one does.
1158 if (Where != From)
1159 splice(Where, Other, From, std::next(From));
1160 }
1161
1162 /// Take a block of instructions from MBB 'Other' in the range [From, To),
1163 /// and insert them into this MBB right before 'Where'.
1164 ///
1165 /// The instruction at 'Where' must not be included in the range of
1166 /// instructions to move.
1167 void splice(iterator Where, MachineBasicBlock *Other,
1168 iterator From, iterator To) {
1169 Insts.splice(Where.getInstrIterator(), Other->Insts,
1170 From.getInstrIterator(), To.getInstrIterator());
1171 }
1172
1173 /// This method unlinks 'this' from the containing function, and returns it,
1174 /// but does not delete it.
1176
1177 /// This method unlinks 'this' from the containing function and deletes it.
1179
1180 /// Given a machine basic block that branched to 'Old', change the code and
1181 /// CFG so that it branches to 'New' instead.
1183 MachineBasicBlock *New);
1184
1185 /// Update all phi nodes in this basic block to refer to basic block \p New
1186 /// instead of basic block \p Old.
1188 MachineBasicBlock *New);
1189
1190 /// Find the next valid DebugLoc starting at MBBI, skipping any debug
1191 /// instructions. Return UnknownLoc if there is none.
1192 LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI);
1194 return findDebugLoc(MBBI.getInstrIterator());
1195 }
1196
1197 /// Has exact same behavior as @ref findDebugLoc (it also searches towards the
1198 /// end of this MBB) except that this function takes a reverse iterator to
1199 /// identify the starting MI.
1202 return rfindDebugLoc(MBBI.getInstrIterator());
1203 }
1204
1205 /// Find the previous valid DebugLoc preceding MBBI, skipping any debug
1206 /// instructions. It is possible to find the last DebugLoc in the MBB using
1207 /// findPrevDebugLoc(instr_end()). Return UnknownLoc if there is none.
1208 LLVM_ABI DebugLoc findPrevDebugLoc(instr_iterator MBBI);
1210 return findPrevDebugLoc(MBBI.getInstrIterator());
1211 }
1212
1213 /// Has exact same behavior as @ref findPrevDebugLoc (it also searches towards
1214 /// the beginning of this MBB) except that this function takes reverse
1215 /// iterator to identify the starting MI. A minor difference compared to
1216 /// findPrevDebugLoc is that we can't start scanning at "instr_end".
1219 return rfindPrevDebugLoc(MBBI.getInstrIterator());
1220 }
1221
1222 /// Find and return the merged DebugLoc of the branch instructions of the
1223 /// block. Return UnknownLoc if there is none.
1225
1226 /// Possible outcome of a register liveness query to computeRegisterLiveness()
1228 LQR_Live, ///< Register is known to be (at least partially) live.
1229 LQR_Dead, ///< Register is known to be fully dead.
1230 LQR_Unknown ///< Register liveness not decidable from local neighborhood.
1231 };
1232
1233 /// Return whether (physical) register \p Reg has been defined and not
1234 /// killed as of just before \p Before.
1235 ///
1236 /// Search is localised to a neighborhood of \p Neighborhood instructions
1237 /// before (searching for defs or kills) and \p Neighborhood instructions
1238 /// after (searching just for defs) \p Before.
1239 ///
1240 /// \p Reg must be a physical register.
1243 unsigned Neighborhood = 10) const;
1244
1245 // Debugging methods.
1246 LLVM_ABI void dump() const;
1247 LLVM_ABI void print(raw_ostream &OS, const SlotIndexes * = nullptr,
1248 bool IsStandalone = true) const;
1250 const SlotIndexes * = nullptr,
1251 bool IsStandalone = true) const;
1252
1254 PrintNameIr = (1 << 0), ///< Add IR name where available
1255 PrintNameAttributes = (1 << 1), ///< Print attributes
1256 };
1257
1259 unsigned printNameFlags = PrintNameIr,
1260 ModuleSlotTracker *moduleSlotTracker = nullptr) const;
1261
1262 // Printing method used by LoopInfo.
1263 LLVM_ABI void printAsOperand(raw_ostream &OS, bool PrintType = true) const;
1264
1265 /// MachineBasicBlocks are uniquely numbered at the function level, unless
1266 /// they're not in a MachineFunction yet, in which case this will return -1.
1267 int getNumber() const { return Number; }
1268 void setNumber(int N) { Number = N; }
1269
1270 /// Return the call frame size on entry to this basic block.
1271 unsigned getCallFrameSize() const { return CallFrameSize; }
1272 /// Set the call frame size on entry to this basic block.
1273 void setCallFrameSize(unsigned N) { CallFrameSize = N; }
1274
1275 /// Return the MCSymbol for this basic block.
1276 LLVM_ABI MCSymbol *getSymbol() const;
1277
1278 /// Return the Windows EH Continuation Symbol for this basic block.
1280
1281 std::optional<uint64_t> getIrrLoopHeaderWeight() const {
1282 return IrrLoopHeaderWeight;
1283 }
1284
1286 IrrLoopHeaderWeight = Weight;
1287 }
1288
1289 /// Return probability of the edge from this block to MBB. This method should
1290 /// NOT be called directly, but by using getEdgeProbability method from
1291 /// MachineBranchProbabilityInfo class.
1293
1294 // Helper function for MIRPrinter.
1296
1297 /// Iterate over block PHI instructions and remove all incoming values for
1298 /// PredMBB.
1299 ///
1300 /// Method does not erase PHI instructions even if they have single income or
1301 /// do not have incoming values ar all. It is a caller responsibility to make
1302 /// decision how to process PHI instructions after incoming values removal.
1303 LLVM_ABI void
1305
1306private:
1307 /// Return probability iterator corresponding to the I successor iterator.
1308 probability_iterator getProbabilityIterator(succ_iterator I);
1309 const_probability_iterator
1310 getProbabilityIterator(const_succ_iterator I) const;
1311
1313
1314 // Methods used to maintain doubly linked list of blocks...
1315 friend struct ilist_callback_traits<MachineBasicBlock>;
1316
1317 // Machine-CFG mutators
1318
1319 /// Add Pred as a predecessor of this MachineBasicBlock. Don't do this
1320 /// unless you know what you're doing, because it doesn't update Pred's
1321 /// successors list. Use Pred->addSuccessor instead.
1322 void addPredecessor(MachineBasicBlock *Pred);
1323
1324 /// Remove Pred as a predecessor of this MachineBasicBlock. Don't do this
1325 /// unless you know what you're doing, because it doesn't update Pred's
1326 /// successors list. Use Pred->removeSuccessor instead.
1327 void removePredecessor(MachineBasicBlock *Pred);
1328};
1329
1331
1332/// Prints a machine basic block reference.
1333///
1334/// The format is:
1335/// %bb.5 - a machine basic block with MBB.getNumber() == 5.
1336///
1337/// Usage: OS << printMBBReference(MBB) << '\n';
1339
1340// This is useful when building IndexedMaps keyed on basic block pointers.
1343 unsigned operator()(const MachineBasicBlock *MBB) const {
1344 return MBB->getNumber();
1345 }
1346};
1347
1348//===--------------------------------------------------------------------===//
1349// GraphTraits specializations for machine basic block graphs (machine-CFGs)
1350//===--------------------------------------------------------------------===//
1351
1352// Provide specializations of GraphTraits to be able to treat a
1353// MachineFunction as a graph of MachineBasicBlocks.
1354//
1355
1356template <> struct GraphTraits<MachineBasicBlock *> {
1359
1360 static NodeRef getEntryNode(MachineBasicBlock *BB) { return BB; }
1361 static ChildIteratorType child_begin(NodeRef N) { return N->succ_begin(); }
1362 static ChildIteratorType child_end(NodeRef N) { return N->succ_end(); }
1363
1364 static unsigned getNumber(MachineBasicBlock *BB) {
1365 assert(BB->getNumber() >= 0 && "negative block number");
1366 return BB->getNumber();
1367 }
1368};
1369
1371 "GraphTraits getNumber() not detected");
1372
1373template <> struct GraphTraits<const MachineBasicBlock *> {
1376
1377 static NodeRef getEntryNode(const MachineBasicBlock *BB) { return BB; }
1378 static ChildIteratorType child_begin(NodeRef N) { return N->succ_begin(); }
1379 static ChildIteratorType child_end(NodeRef N) { return N->succ_end(); }
1380
1381 static unsigned getNumber(const MachineBasicBlock *BB) {
1382 assert(BB->getNumber() >= 0 && "negative block number");
1383 return BB->getNumber();
1384 }
1385};
1386
1388 "GraphTraits getNumber() not detected");
1389
1390// Provide specializations of GraphTraits to be able to treat a
1391// MachineFunction as a graph of MachineBasicBlocks and to walk it
1392// in inverse order. Inverse order for a function is considered
1393// to be when traversing the predecessor edges of a MBB
1394// instead of the successor edges.
1395//
1399
1401 return G.Graph;
1402 }
1403
1404 static ChildIteratorType child_begin(NodeRef N) { return N->pred_begin(); }
1405 static ChildIteratorType child_end(NodeRef N) { return N->pred_end(); }
1406
1407 static unsigned getNumber(MachineBasicBlock *BB) {
1408 assert(BB->getNumber() >= 0 && "negative block number");
1409 return BB->getNumber();
1410 }
1411};
1412
1414 "GraphTraits getNumber() not detected");
1415
1419
1421 return G.Graph;
1422 }
1423
1424 static ChildIteratorType child_begin(NodeRef N) { return N->pred_begin(); }
1425 static ChildIteratorType child_end(NodeRef N) { return N->pred_end(); }
1426
1427 static unsigned getNumber(const MachineBasicBlock *BB) {
1428 assert(BB->getNumber() >= 0 && "negative block number");
1429 return BB->getNumber();
1430 }
1431};
1432
1434 "GraphTraits getNumber() not detected");
1435
1436// These accessors are handy for sharing templated code between IR and MIR.
1437inline auto successors(const MachineBasicBlock *BB) { return BB->successors(); }
1438inline auto predecessors(const MachineBasicBlock *BB) {
1439 return BB->predecessors();
1440}
1441inline auto succ_size(const MachineBasicBlock *BB) { return BB->succ_size(); }
1442inline auto pred_size(const MachineBasicBlock *BB) { return BB->pred_size(); }
1443inline auto succ_begin(const MachineBasicBlock *BB) { return BB->succ_begin(); }
1444inline auto pred_begin(const MachineBasicBlock *BB) { return BB->pred_begin(); }
1445inline auto succ_end(const MachineBasicBlock *BB) { return BB->succ_end(); }
1446inline auto pred_end(const MachineBasicBlock *BB) { return BB->pred_end(); }
1447
1448/// MachineInstrSpan provides an interface to get an iteration range
1449/// containing the instruction it was initialized with, along with all
1450/// those instructions inserted prior to or following that instruction
1451/// at some point after the MachineInstrSpan is constructed.
1453 MachineBasicBlock &MBB;
1455
1456public:
1458 : MBB(*BB), I(I), B(I == MBB.begin() ? MBB.end() : std::prev(I)),
1459 E(std::next(I)) {
1460 assert(I == BB->end() || I->getParent() == BB);
1461 }
1462
1464 return B == MBB.end() ? MBB.begin() : std::next(B);
1465 }
1467 bool empty() { return begin() == end(); }
1468
1470};
1471
1472/// Increment \p It until it points to a non-debug instruction or to \p End
1473/// and return the resulting iterator. This function should only be used
1474/// MachineBasicBlock::{iterator, const_iterator, instr_iterator,
1475/// const_instr_iterator} and the respective reverse iterators.
1476template <typename IterT>
1477inline IterT skipDebugInstructionsForward(IterT It, IterT End,
1478 bool SkipPseudoOp = true) {
1479 while (It != End &&
1480 (It->isDebugInstr() || (SkipPseudoOp && It->isPseudoProbe())))
1481 ++It;
1482 return It;
1483}
1484
1485/// Decrement \p It until it points to a non-debug instruction or to \p Begin
1486/// and return the resulting iterator. This function should only be used
1487/// MachineBasicBlock::{iterator, const_iterator, instr_iterator,
1488/// const_instr_iterator} and the respective reverse iterators.
1489template <class IterT>
1490inline IterT skipDebugInstructionsBackward(IterT It, IterT Begin,
1491 bool SkipPseudoOp = true) {
1492 while (It != Begin &&
1493 (It->isDebugInstr() || (SkipPseudoOp && It->isPseudoProbe())))
1494 --It;
1495 return It;
1496}
1497
1498/// Increment \p It, then continue incrementing it while it points to a debug
1499/// instruction. A replacement for std::next.
1500template <typename IterT>
1501inline IterT next_nodbg(IterT It, IterT End, bool SkipPseudoOp = true) {
1502 return skipDebugInstructionsForward(std::next(It), End, SkipPseudoOp);
1503}
1504
1505/// Decrement \p It, then continue decrementing it while it points to a debug
1506/// instruction. A replacement for std::prev.
1507template <typename IterT>
1508inline IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp = true) {
1509 return skipDebugInstructionsBackward(std::prev(It), Begin, SkipPseudoOp);
1510}
1511
1512/// Construct a range iterator which begins at \p It and moves forwards until
1513/// \p End is reached, skipping any debug instructions.
1514template <typename IterT>
1515inline auto instructionsWithoutDebug(IterT It, IterT End,
1516 bool SkipPseudoOp = true) {
1517 return make_filter_range(make_range(It, End), [=](const MachineInstr &MI) {
1518 return !MI.isDebugInstr() && !(SkipPseudoOp && MI.isPseudoProbe());
1519 });
1520}
1521
1522} // end namespace llvm
1523
1524#endif // LLVM_CODEGEN_MACHINEBASICBLOCK_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator MBBI
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
This file defines DenseMapInfo traits for DenseMap.
This file defines the little GraphTraits<X> template class that should be specialized by classes that...
IRTranslator LLVM IR MI
A common definition of LaneBitmask for use in TableGen and CodeGen.
#define I(x, y, z)
Definition MD5.cpp:58
#define G(x, y, z)
Definition MD5.cpp:56
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define T
#define P(N)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
This file defines the SparseBitVector class.
Value * RHS
Value * LHS
LLVM Basic Block Representation.
Definition BasicBlock.h:62
static BranchProbability getUnknown()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
A debug info location.
Definition DebugLoc.h:124
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:33
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
liveout_iterator(const MachineBasicBlock &MBB, MCPhysReg ExceptionPointer, MCPhysReg ExceptionSelector, bool End)
bool operator==(const liveout_iterator &RHS) const
bool operator!=(const liveout_iterator &RHS) const
const MachineInstr & instr_front() const
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...
Instructions::const_reverse_iterator const_reverse_instr_iterator
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 setBBID(const UniqueBBID &V)
Sets the fixed BBID of this basic block.
iterator erase(MachineInstr *I)
Remove an instruction from the instruction list and delete it.
void normalizeSuccProbs()
Normalize probabilities of all successors so that the sum of them becomes one.
void setAddressTakenIRBlock(BasicBlock *BB)
Set this block to reflect that it corresponds to an IR-level basic block with a BlockAddress.
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.
iterator_range< liveout_iterator > liveouts() const
const MachineInstr & back() const
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.
void setIsEndSection(bool V=true)
MachineInstrBundleIterator< const MachineInstr > const_iterator
void setIrrLoopHeaderWeight(uint64_t Weight)
MachineBasicBlock * getLogicalFallThrough()
Return the fallthrough block if the block can implicitly transfer control to it's successor,...
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
void setIsCleanupFuncletEntry(bool V=true)
Indicates if this is the entry block of a cleanup funclet.
DebugLoc rfindPrevDebugLoc(reverse_iterator MBBI)
const_pred_iterator pred_end() const
LLVM_ABI void moveBefore(MachineBasicBlock *NewAfter)
Move 'this' block before or after the specified block.
void setLabelMustBeEmitted()
Set this block to reflect that, regardless how we flow to it, we need its label be emitted.
LLVM_ABI void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New)
Replace successor OLD with NEW and update probability info.
SmallVectorImpl< MachineBasicBlock * >::reverse_iterator succ_reverse_iterator
const_pred_reverse_iterator pred_rend() const
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.
const_iterator getFirstNonDebugInstr(bool SkipPseudoOp=true) const
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.
const_reverse_instr_iterator instr_rend() const
iterator_range< livein_iterator > liveins() const
void setAlignment(Align A, unsigned MaxBytes)
iterator_range< iterator > phis()
Returns a range that iterates over the phis in the basic block.
reverse_instr_iterator instr_rbegin()
instr_iterator erase_instr(MachineInstr *I)
Remove an instruction from the instruction list and delete it.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
void push_back(MachineInstr *MI)
LLVM_ABI iterator SkipPHIsAndLabels(iterator I)
Return the first instruction in MBB after I that is not a PHI or a label.
pred_reverse_iterator pred_rbegin()
LLVM_ABI void addSuccessorWithoutProb(MachineBasicBlock *Succ)
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::const_iterator const_succ_iterator
SmallVectorImpl< MachineBasicBlock * >::const_reverse_iterator const_pred_reverse_iterator
LLVM_ABI bool hasName() const
Check if there is a name of corresponding LLVM basic block.
MachineBasicBlock * getSinglePredecessor()
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.
liveout_iterator liveout_end() const
const_instr_iterator instr_begin() const
const_succ_iterator succ_begin() const
const_succ_reverse_iterator succ_rbegin() const
pred_reverse_iterator pred_rend()
@ 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().
DebugLoc rfindDebugLoc(reverse_iterator MBBI)
bool terminatorIsComputedGotoWithSuccessors() const
Returns true if the original IR terminator is an indirectbr with successor blocks.
LLVM_ABI void removeLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Remove the specified register from the live in set.
iterator erase(iterator I, iterator E)
Remove a range of instructions from the instruction list and delete them.
const MachineInstr & front() const
LLVM_ABI void printAsOperand(raw_ostream &OS, bool PrintType=true) const
MachineInstr * remove(MachineInstr *I)
Remove the unbundled instruction from the instruction list without deleting it.
const_instr_range instrs() const
const_reverse_iterator rbegin() const
void clearBasicBlock()
Remove the reference to the underlying IR BasicBlock.
unsigned getMaxBytesForAlignment() const
Return the maximum amount of padding allowed for aligning the basic block.
void setMaxBytesForAlignment(unsigned MaxBytes)
Set 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.
iterator_range< const_pred_iterator > predecessors() const
const MachineInstr & instr_back() const
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.
void splice(iterator Where, MachineBasicBlock *Other, iterator From, iterator To)
Take a block of instructions from MBB 'Other' in the range [From, To), and insert them into this MBB ...
LLVM_ABI void clearLiveIns()
Clear live in list.
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
const_iterator getLastNonDebugInstr(bool SkipPseudoOp=true) const
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.
bool sameSection(const MachineBasicBlock *MBB) const
Returns true if this and MBB belong to the same section.
const std::vector< RegisterMaskPair > & getLiveIns() const
iterator insert(iterator I, MachineInstr *MI)
Insert MI into the instruction list before I.
LLVM_ABI livein_iterator livein_begin() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
iterator_range< livein_iterator > liveins_dbg() const
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.
bool hasAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
void setAlignment(Align A)
Set alignment of the 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.
iterator_range< const_instr_iterator > const_instr_range
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
SmallVectorImpl< MachineBasicBlock * >::const_reverse_iterator const_succ_reverse_iterator
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
const_pred_reverse_iterator pred_rbegin() const
void addLiveIn(const RegisterMaskPair &RegMaskPair)
MachineBasicBlock * SplitCriticalEdge(MachineBasicBlock *Succ, MachineFunctionAnalysisManager &MFAM, std::vector< SparseBitVector<> > *LiveInSets=nullptr, MachineDomTreeUpdater *MDTU=nullptr)
MachineBasicBlock * getSingleSuccessor()
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
const_iterator getFirstNonPHI() const
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.
iterator_range< const_iterator > phis() const
const_instr_iterator instr_end() const
LLVM_ABI liveout_iterator liveout_begin() const
Iterator scanning successor basic blocks' liveins to determine the registers potentially live at the ...
DebugLoc findDebugLoc(iterator MBBI)
SmallVectorImpl< MachineBasicBlock * >::iterator pred_iterator
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
const_succ_iterator succ_end() const
LLVM_ABI iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const_iterator begin() const
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.
void setSectionID(MBBSectionID V)
Sets the section ID for this basic block.
iterator_range< const_iterator > terminators() const
livein_iterator livein_begin_dbg() const
Unlike livein_begin, this method does not check that the liveness information is accurate.
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...
const_pred_iterator pred_begin() const
LLVM_ABI void print(raw_ostream &OS, const SlotIndexes *=nullptr, bool IsStandalone=true) const
reverse_instr_iterator instr_rend()
const_reverse_iterator rend() const
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...
MachineInstrBundleIterator< MachineInstr, true > reverse_iterator
succ_reverse_iterator succ_rbegin()
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...
static Instructions MachineBasicBlock::* getSublistAccess(MachineInstr *)
Support for MachineInstr::getNextNode().
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.
MachineFunction * getParent()
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 setIsInlineAsmBrIndirectTarget(bool V=true)
Indicates if this is the indirect dest of an INLINEASM_BR.
Instructions::const_iterator const_instr_iterator
iterator_range< const_succ_iterator > successors() const
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const_iterator getFirstTerminator() const
const_succ_reverse_iterator succ_rend() const
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void setIsEHContTarget(bool V=true)
Indicates if this is a target of Windows EH Continuation Guard.
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.
DebugLoc findPrevDebugLoc(iterator MBBI)
iterator_range< iterator > terminators()
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.
void setIsEHFuncletEntry(bool V=true)
Indicates if this is the entry block of an EH funclet.
friend class MachineBranchProbabilityInfo
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:
iterator insertAfter(iterator I, MachineInstr *MI)
Insert MI into the instruction list after I.
SmallVectorImpl< MachineBasicBlock * >::reverse_iterator pred_reverse_iterator
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 '...
bool isEHScopeReturnBlock() const
Convenience function that returns true if the bock ends in a EH scope return instruction.
bool isEndSection() const
Returns true if this block ends any section.
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
const_reverse_instr_iterator instr_rbegin() const
iterator erase(iterator I)
Remove an instruction or bundle from the instruction list and delete it.
instr_iterator insertAfterBundle(instr_iterator I, MachineInstr *MI)
If I is bundled then insert MI into the instruction list after the end of the bundle,...
const_iterator end() 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.
MachineInstrBundleIterator< const MachineInstr, true > const_reverse_iterator
SmallVectorImpl< MachineBasicBlock * >::const_iterator const_pred_iterator
void setIsEHScopeEntry(bool V=true)
Indicates if this is the entry block of an EH scope, i.e., the block that that used to have a catchpa...
LLVM_ABI void moveAfter(MachineBasicBlock *NewBefore)
succ_reverse_iterator succ_rend()
void setMachineBlockAddressTaken()
Set this block to indicate that its address is used as something other than the target of a terminato...
std::optional< uint64_t > getIrrLoopHeaderWeight() const
LLVM_ABI const uint32_t * getEndClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the end of the basic block.
void setIsBeginSection(bool V=true)
LLVM_ABI bool sizeWithoutDebugLargerThan(unsigned Limit) const
iterator_range< instr_iterator > instr_range
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.
void insert(iterator I, IT S, IT E)
Insert a range of instructions into the instruction list before I.
void setIsEHPad(bool V=true)
Indicates the block is a landing pad.
Instructions::reverse_iterator reverse_instr_iterator
bool isCleanupFuncletEntry() const
Returns true if this is the entry block of a cleanup funclet.
MachineBasicBlock iterator that automatically skips over MIs that are inside bundles (i....
static MachineInstrBundleIterator getAtBundleBegin(instr_iterator MI)
MachineBasicBlock::iterator getInitial()
MachineInstrSpan(MachineBasicBlock::iterator I, MachineBasicBlock *BB)
MachineBasicBlock::iterator begin()
MachineBasicBlock::iterator end()
Representation of each machine instruction.
bool isReturn(QueryType Type=AnyInBundle) const
bool isEHScopeReturn(QueryType Type=AnyInBundle) const
Return true if this is an instruction that marks the end of an EH scope, i.e., a catchpad or a cleanu...
bool isIndirectBranch(QueryType Type=AnyInBundle) const
Return true if this is an indirect branch, such as a branch through a register.
Manage lifetime of a slot tracker for printing IR.
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:19
SlotIndexes pass.
typename SuperClass::const_iterator const_iterator
typename SuperClass::iterator iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
std::reverse_iterator< iterator > reverse_iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
base_list_type::const_reverse_iterator const_reverse_iterator
Definition ilist.h:125
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
A simple intrusive list implementation.
This file defines classes to implement an intrusive doubly linked list class (i.e.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
unsigned combineHashValue(unsigned a, unsigned b)
Simplistic combination of 32-bit hash values into 32-bit hash values.
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.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1705
auto pred_end(const MachineBasicBlock *BB)
auto successors(const MachineBasicBlock *BB)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
constexpr bool GraphHasNodeNumbers
Indicate whether a GraphTraits<NodeT>::getNumber() is supported.
auto pred_size(const MachineBasicBlock *BB)
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.
iplist< T, Options... > ilist
Definition ilist.h:344
auto succ_size(const MachineBasicBlock *BB)
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
Definition STLExtras.h:552
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...
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
@ Other
Any other memory.
Definition ModRef.h:68
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:71
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
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 pred_begin(const MachineBasicBlock *BB)
auto predecessors(const MachineBasicBlock *BB)
SuccIterator< Instruction, BasicBlock > succ_iterator
Definition CFG.h:243
SuccIterator< const Instruction, const BasicBlock > const_succ_iterator
Definition CFG.h:244
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
DenseMapInfo< unsigned > NumberInfo
static unsigned getHashValue(const MBBSectionID &SecID)
DenseMapInfo< MBBSectionID::SectionType > TypeInfo
static bool isEqual(const MBBSectionID &LHS, const MBBSectionID &RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
static NodeRef getEntryNode(Inverse< MachineBasicBlock * > G)
static unsigned getNumber(MachineBasicBlock *BB)
static unsigned getNumber(const MachineBasicBlock *BB)
static NodeRef getEntryNode(Inverse< const MachineBasicBlock * > G)
MachineBasicBlock::const_pred_iterator ChildIteratorType
static unsigned getNumber(MachineBasicBlock *BB)
MachineBasicBlock::succ_iterator ChildIteratorType
static NodeRef getEntryNode(MachineBasicBlock *BB)
static ChildIteratorType child_end(NodeRef N)
static ChildIteratorType child_begin(NodeRef N)
MachineBasicBlock::const_succ_iterator ChildIteratorType
static ChildIteratorType child_begin(NodeRef N)
static unsigned getNumber(const MachineBasicBlock *BB)
static NodeRef getEntryNode(const MachineBasicBlock *BB)
static ChildIteratorType child_end(NodeRef N)
static constexpr LaneBitmask getAll()
Definition LaneBitmask.h:82
unsigned operator()(const MachineBasicBlock *MBB) const
const MachineBasicBlock * argument_type
bool operator!=(const MBBSectionID &Other) const
LLVM_ABI static const MBBSectionID ExceptionSectionID
LLVM_ABI static const MBBSectionID ColdSectionID
enum llvm::MBBSectionID::SectionType Type
bool operator==(const MBBSectionID &Other) const
Pair of physical register and lane mask.
RegisterMaskPair(MCPhysReg PhysReg, LaneBitmask LaneMask)
bool operator==(const RegisterMaskPair &other) const
Split the critical edge from this block to the given successor block, and return the newly created bl...
Callbacks do nothing by default in iplist and ilist.
Definition ilist.h:65
LLVM_ABI void addNodeToList(MachineInstr *N)
LLVM_ABI void transferNodesFromList(ilist_traits &FromList, instr_iterator First, instr_iterator Last)
LLVM_ABI void removeNodeFromList(MachineInstr *N)
LLVM_ABI void deleteNode(MachineInstr *MI)
Template traits for intrusive list.
Definition ilist.h:90