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