LLVM 20.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"
23#include "llvm/IR/DebugLoc.h"
24#include "llvm/MC/LaneBitmask.h"
26#include <cassert>
27#include <cstdint>
28#include <iterator>
29#include <string>
30#include <vector>
31
32namespace llvm {
33
34class BasicBlock;
35class MachineDomTreeUpdater;
36class MachineFunction;
37class MCSymbol;
38class ModuleSlotTracker;
39class Pass;
40class Printable;
41class SlotIndexes;
42class StringRef;
43class raw_ostream;
44class LiveIntervals;
45class TargetRegisterClass;
46class TargetRegisterInfo;
47template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager;
49
50// This structure uniquely identifies a basic block section.
51// Possible values are
52// {Type: Default, Number: (unsigned)} (These are regular section IDs)
53// {Type: Exception, Number: 0} (ExceptionSectionID)
54// {Type: Cold, Number: 0} (ColdSectionID)
57 Default = 0, // Regular section (these sections are distinguished by the
58 // Number field).
59 Exception, // Special section type for exception handling blocks
60 Cold, // Special section type for cold blocks
62 unsigned Number;
63
64 MBBSectionID(unsigned N) : Type(Default), Number(N) {}
65
66 // Special unique sections for cold and exception blocks.
69
70 bool operator==(const MBBSectionID &Other) const {
71 return Type == Other.Type && Number == Other.Number;
72 }
73
74 bool operator!=(const MBBSectionID &Other) const { return !(*this == Other); }
75
76private:
77 // This is only used to construct the special cold and exception sections.
79};
80
81template <> struct DenseMapInfo<MBBSectionID> {
84
85 static inline MBBSectionID getEmptyKey() {
86 return MBBSectionID(NumberInfo::getEmptyKey());
87 }
88 static inline MBBSectionID getTombstoneKey() {
89 return MBBSectionID(NumberInfo::getTombstoneKey());
90 }
91 static unsigned getHashValue(const MBBSectionID &SecID) {
92 return detail::combineHashValue(TypeInfo::getHashValue(SecID.Type),
93 NumberInfo::getHashValue(SecID.Number));
94 }
95 static bool isEqual(const MBBSectionID &LHS, const MBBSectionID &RHS) {
96 return LHS == RHS;
97 }
98};
99
100// This structure represents the information for a basic block pertaining to
101// the basic block sections profile.
103 unsigned BaseID;
104 unsigned CloneID;
105};
106
107template <> struct ilist_traits<MachineInstr> {
108private:
109 friend class MachineBasicBlock; // Set by the owning MachineBasicBlock.
110
111 MachineBasicBlock *Parent;
112
113 using instr_iterator =
115
116public:
119 void transferNodesFromList(ilist_traits &FromList, instr_iterator First,
120 instr_iterator Last);
122};
123
125 : public ilist_node_with_parent<MachineBasicBlock, MachineFunction> {
126public:
127 /// Pair of physical register and lane mask.
128 /// This is not simply a std::pair typedef because the members should be named
129 /// clearly as they both have an integer type.
131 public:
134
137
138 bool operator==(const RegisterMaskPair &other) const {
139 return PhysReg == other.PhysReg && LaneMask == other.LaneMask;
140 }
141 };
142
143private:
145
146 const BasicBlock *BB;
147 int Number;
148
149 /// The call frame size on entry to this basic block due to call frame setup
150 /// instructions in a predecessor. This is usually zero, unless basic blocks
151 /// are split in the middle of a call sequence.
152 ///
153 /// This information is only maintained until PrologEpilogInserter eliminates
154 /// call frame pseudos.
155 unsigned CallFrameSize = 0;
156
157 MachineFunction *xParent;
158 Instructions Insts;
159
160 /// Keep track of the predecessor / successor basic blocks.
163
164 /// Keep track of the probabilities to the successors. This vector has the
165 /// same order as Successors, or it is empty if we don't use it (disable
166 /// optimization).
167 std::vector<BranchProbability> Probs;
168 using probability_iterator = std::vector<BranchProbability>::iterator;
169 using const_probability_iterator =
170 std::vector<BranchProbability>::const_iterator;
171
172 std::optional<uint64_t> IrrLoopHeaderWeight;
173
174 /// Keep track of the physical registers that are livein of the basicblock.
175 using LiveInVector = std::vector<RegisterMaskPair>;
176 LiveInVector LiveIns;
177
178 /// Alignment of the basic block. One if the basic block does not need to be
179 /// aligned.
180 Align Alignment;
181 /// Maximum amount of bytes that can be added to align the basic block. If the
182 /// alignment cannot be reached in this many bytes, no bytes are emitted.
183 /// Zero to represent no maximum.
184 unsigned MaxBytesForAlignment = 0;
185
186 /// Indicate that this basic block is entered via an exception handler.
187 bool IsEHPad = false;
188
189 /// Indicate that this MachineBasicBlock is referenced somewhere other than
190 /// as predecessor/successor, a terminator MachineInstr, or a jump table.
191 bool MachineBlockAddressTaken = false;
192
193 /// If this MachineBasicBlock corresponds to an IR-level "blockaddress"
194 /// constant, this contains a pointer to that block.
195 BasicBlock *AddressTakenIRBlock = nullptr;
196
197 /// Indicate that this basic block needs its symbol be emitted regardless of
198 /// whether the flow just falls-through to it.
199 bool LabelMustBeEmitted = false;
200
201 /// Indicate that this basic block is the entry block of an EH scope, i.e.,
202 /// the block that used to have a catchpad or cleanuppad instruction in the
203 /// LLVM IR.
204 bool IsEHScopeEntry = false;
205
206 /// Indicates if this is a target block of a catchret.
207 bool IsEHCatchretTarget = false;
208
209 /// Indicate that this basic block is the entry block of an EH funclet.
210 bool IsEHFuncletEntry = false;
211
212 /// Indicate that this basic block is the entry block of a cleanup funclet.
213 bool IsCleanupFuncletEntry = false;
214
215 /// Fixed unique ID assigned to this basic block upon creation. Used with
216 /// basic block sections and basic block labels.
217 std::optional<UniqueBBID> BBID;
218
219 /// With basic block sections, this stores the Section ID of the basic block.
220 MBBSectionID SectionID{0};
221
222 // Indicate that this basic block begins a section.
223 bool IsBeginSection = false;
224
225 // Indicate that this basic block ends a section.
226 bool IsEndSection = false;
227
228 /// Indicate that this basic block is the indirect dest of an INLINEASM_BR.
229 bool IsInlineAsmBrIndirectTarget = false;
230
231 /// since getSymbol is a relatively heavy-weight operation, the symbol
232 /// is only computed once and is cached.
233 mutable MCSymbol *CachedMCSymbol = nullptr;
234
235 /// Cached MCSymbol for this block (used if IsEHCatchRetTarget).
236 mutable MCSymbol *CachedEHCatchretMCSymbol = nullptr;
237
238 /// Marks the end of the basic block. Used during basic block sections to
239 /// calculate the size of the basic block, or the BB section ending with it.
240 mutable MCSymbol *CachedEndMCSymbol = nullptr;
241
242 // Intrusive list support
243 MachineBasicBlock() = default;
244
245 explicit MachineBasicBlock(MachineFunction &MF, const BasicBlock *BB);
246
247 ~MachineBasicBlock();
248
249 // MachineBasicBlocks are allocated and owned by MachineFunction.
250 friend class MachineFunction;
251
252public:
253 /// Return the LLVM basic block that this instance corresponded to originally.
254 /// Note that this may be NULL if this instance does not correspond directly
255 /// to an LLVM basic block.
256 const BasicBlock *getBasicBlock() const { return BB; }
257
258 /// Remove the reference to the underlying IR BasicBlock. This is for
259 /// reduction tools and should generally not be used.
261 BB = nullptr;
262 }
263
264 /// Check if there is a name of corresponding LLVM basic block.
265 bool hasName() const;
266
267 /// Return the name of the corresponding LLVM basic block, or an empty string.
268 StringRef getName() const;
269
270 /// Return a formatted string to identify this block and its parent function.
271 std::string getFullName() const;
272
273 /// Test whether this block is used as something other than the target
274 /// of a terminator, exception-handling target, or jump table. This is
275 /// either the result of an IR-level "blockaddress", or some form
276 /// of target-specific branch lowering.
277 bool hasAddressTaken() const {
278 return MachineBlockAddressTaken || AddressTakenIRBlock;
279 }
280
281 /// Test whether this block is used as something other than the target of a
282 /// terminator, exception-handling target, jump table, or IR blockaddress.
283 /// For example, its address might be loaded into a register, or
284 /// stored in some branch table that isn't part of MachineJumpTableInfo.
285 bool isMachineBlockAddressTaken() const { return MachineBlockAddressTaken; }
286
287 /// Test whether this block is the target of an IR BlockAddress. (There can
288 /// more than one MBB associated with an IR BB where the address is taken.)
289 bool isIRBlockAddressTaken() const { return AddressTakenIRBlock; }
290
291 /// Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
292 BasicBlock *getAddressTakenIRBlock() const { return AddressTakenIRBlock; }
293
294 /// Set this block to indicate that its address is used as something other
295 /// than the target of a terminator, exception-handling target, jump table,
296 /// or IR-level "blockaddress".
297 void setMachineBlockAddressTaken() { MachineBlockAddressTaken = true; }
298
299 /// Set this block to reflect that it corresponds to an IR-level basic block
300 /// with a BlockAddress.
301 void setAddressTakenIRBlock(BasicBlock *BB) { AddressTakenIRBlock = BB; }
302
303 /// Test whether this block must have its label emitted.
304 bool hasLabelMustBeEmitted() const { return LabelMustBeEmitted; }
305
306 /// Set this block to reflect that, regardless how we flow to it, we need
307 /// its label be emitted.
308 void setLabelMustBeEmitted() { LabelMustBeEmitted = true; }
309
310 /// Return the MachineFunction containing this basic block.
311 const MachineFunction *getParent() const { return xParent; }
312 MachineFunction *getParent() { return xParent; }
313
318
324
325 unsigned size() const { return (unsigned)Insts.size(); }
326 bool sizeWithoutDebugLargerThan(unsigned Limit) const;
327 bool empty() const { return Insts.empty(); }
328
329 MachineInstr &instr_front() { return Insts.front(); }
330 MachineInstr &instr_back() { return Insts.back(); }
331 const MachineInstr &instr_front() const { return Insts.front(); }
332 const MachineInstr &instr_back() const { return Insts.back(); }
333
334 MachineInstr &front() { return Insts.front(); }
335 MachineInstr &back() { return *--end(); }
336 const MachineInstr &front() const { return Insts.front(); }
337 const MachineInstr &back() const { return *--end(); }
338
339 instr_iterator instr_begin() { return Insts.begin(); }
340 const_instr_iterator instr_begin() const { return Insts.begin(); }
341 instr_iterator instr_end() { return Insts.end(); }
342 const_instr_iterator instr_end() const { return Insts.end(); }
343 reverse_instr_iterator instr_rbegin() { return Insts.rbegin(); }
344 const_reverse_instr_iterator instr_rbegin() const { return Insts.rbegin(); }
345 reverse_instr_iterator instr_rend () { return Insts.rend(); }
346 const_reverse_instr_iterator instr_rend () const { return Insts.rend(); }
347
353 }
354
355 iterator begin() { return instr_begin(); }
356 const_iterator begin() const { return instr_begin(); }
357 iterator end () { return instr_end(); }
358 const_iterator end () const { return instr_end(); }
361 }
364 }
368 }
369
370 /// Support for MachineInstr::getNextNode().
372 return &MachineBasicBlock::Insts;
373 }
374
376 return make_range(getFirstTerminator(), end());
377 }
379 return make_range(getFirstTerminator(), end());
380 }
381
382 /// Returns a range that iterates over the phis in the basic block.
384 return make_range(begin(), getFirstNonPHI());
385 }
387 return const_cast<MachineBasicBlock *>(this)->phis();
388 }
389
390 // Machine-CFG iterators
405 pred_iterator pred_begin() { return Predecessors.begin(); }
406 const_pred_iterator pred_begin() const { return Predecessors.begin(); }
407 pred_iterator pred_end() { return Predecessors.end(); }
408 const_pred_iterator pred_end() const { return Predecessors.end(); }
410 { return Predecessors.rbegin();}
412 { return Predecessors.rbegin();}
414 { return Predecessors.rend(); }
416 { return Predecessors.rend(); }
417 unsigned pred_size() const {
418 return (unsigned)Predecessors.size();
419 }
420 bool pred_empty() const { return Predecessors.empty(); }
421 succ_iterator succ_begin() { return Successors.begin(); }
422 const_succ_iterator succ_begin() const { return Successors.begin(); }
423 succ_iterator succ_end() { return Successors.end(); }
424 const_succ_iterator succ_end() const { return Successors.end(); }
426 { return Successors.rbegin(); }
428 { return Successors.rbegin(); }
430 { return Successors.rend(); }
432 { return Successors.rend(); }
433 unsigned succ_size() const {
434 return (unsigned)Successors.size();
435 }
436 bool succ_empty() const { return Successors.empty(); }
437
439 return make_range(pred_begin(), pred_end());
440 }
442 return make_range(pred_begin(), pred_end());
443 }
445 return make_range(succ_begin(), succ_end());
446 }
448 return make_range(succ_begin(), succ_end());
449 }
450
451 // LiveIn management methods.
452
453 /// Adds the specified register as a live in. Note that it is an error to add
454 /// the same register to the same set more than once unless the intention is
455 /// to call sortUniqueLiveIns after all registers are added.
456 void addLiveIn(MCRegister PhysReg,
457 LaneBitmask LaneMask = LaneBitmask::getAll()) {
458 LiveIns.push_back(RegisterMaskPair(PhysReg, LaneMask));
459 }
460 void addLiveIn(const RegisterMaskPair &RegMaskPair) {
461 LiveIns.push_back(RegMaskPair);
462 }
463
464 /// Sorts and uniques the LiveIns vector. It can be significantly faster to do
465 /// this than repeatedly calling isLiveIn before calling addLiveIn for every
466 /// LiveIn insertion.
467 void sortUniqueLiveIns();
468
469 /// Clear live in list.
470 void clearLiveIns();
471
472 /// Clear the live in list, and return the removed live in's in \p OldLiveIns.
473 /// Requires that the vector \p OldLiveIns is empty.
474 void clearLiveIns(std::vector<RegisterMaskPair> &OldLiveIns);
475
476 /// Add PhysReg as live in to this block, and ensure that there is a copy of
477 /// PhysReg to a virtual register of class RC. Return the virtual register
478 /// that is a copy of the live in PhysReg.
480
481 /// Remove the specified register from the live in set.
483 LaneBitmask LaneMask = LaneBitmask::getAll());
484
485 /// Return true if the specified register is in the live in set.
487 LaneBitmask LaneMask = LaneBitmask::getAll()) const;
488
489 // Iteration support for live in sets. These sets are kept in sorted
490 // order by their register number.
491 using livein_iterator = LiveInVector::const_iterator;
492
493 /// Unlike livein_begin, this method does not check that the liveness
494 /// information is accurate. Still for debug purposes it may be useful
495 /// to have iterators that won't assert if the liveness information
496 /// is not current.
497 livein_iterator livein_begin_dbg() const { return LiveIns.begin(); }
500 }
501
503 livein_iterator livein_end() const { return LiveIns.end(); }
504 bool livein_empty() const { return LiveIns.empty(); }
507 }
508
509 /// Remove entry from the livein set and return iterator to the next.
511
512 const std::vector<RegisterMaskPair> &getLiveIns() const { return LiveIns; }
513
515 public:
516 using iterator_category = std::input_iterator_tag;
517 using difference_type = std::ptrdiff_t;
519 using pointer = const RegisterMaskPair *;
521
523 MCPhysReg ExceptionSelector, bool End)
524 : ExceptionPointer(ExceptionPointer),
525 ExceptionSelector(ExceptionSelector), BlockI(MBB.succ_begin()),
526 BlockEnd(MBB.succ_end()) {
527 if (End)
528 BlockI = BlockEnd;
529 else if (BlockI != BlockEnd) {
530 LiveRegI = (*BlockI)->livein_begin();
531 if (!advanceToValidPosition())
532 return;
533 if (LiveRegI->PhysReg == ExceptionPointer ||
534 LiveRegI->PhysReg == ExceptionSelector)
535 ++(*this);
536 }
537 }
538
540 do {
541 ++LiveRegI;
542 if (!advanceToValidPosition())
543 return *this;
544 } while ((*BlockI)->isEHPad() &&
545 (LiveRegI->PhysReg == ExceptionPointer ||
546 LiveRegI->PhysReg == ExceptionSelector));
547 return *this;
548 }
549
551 liveout_iterator Tmp = *this;
552 ++(*this);
553 return Tmp;
554 }
555
557 return *LiveRegI;
558 }
559
561 return &*LiveRegI;
562 }
563
564 bool operator==(const liveout_iterator &RHS) const {
565 if (BlockI != BlockEnd)
566 return BlockI == RHS.BlockI && LiveRegI == RHS.LiveRegI;
567 return RHS.BlockI == BlockEnd;
568 }
569
570 bool operator!=(const liveout_iterator &RHS) const {
571 return !(*this == RHS);
572 }
573 private:
574 bool advanceToValidPosition() {
575 if (LiveRegI != (*BlockI)->livein_end())
576 return true;
577
578 do {
579 ++BlockI;
580 } while (BlockI != BlockEnd && (*BlockI)->livein_empty());
581 if (BlockI == BlockEnd)
582 return false;
583
584 LiveRegI = (*BlockI)->livein_begin();
585 return true;
586 }
587
588 MCPhysReg ExceptionPointer, ExceptionSelector;
589 const_succ_iterator BlockI;
590 const_succ_iterator BlockEnd;
591 livein_iterator LiveRegI;
592 };
593
594 /// Iterator scanning successor basic blocks' liveins to determine the
595 /// registers potentially live at the end of this block. There may be
596 /// duplicates or overlapping registers in the list returned.
597 liveout_iterator liveout_begin() const;
599 return liveout_iterator(*this, 0, 0, true);
600 }
603 }
604
605 /// Get the clobber mask for the start of this basic block. Funclets use this
606 /// to prevent register allocation across funclet transitions.
608
609 /// Get the clobber mask for the end of the basic block.
610 /// \see getBeginClobberMask()
612
613 /// Return alignment of the basic block.
614 Align getAlignment() const { return Alignment; }
615
616 /// Set alignment of the basic block.
617 void setAlignment(Align A) { Alignment = A; }
618
619 void setAlignment(Align A, unsigned MaxBytes) {
621 setMaxBytesForAlignment(MaxBytes);
622 }
623
624 /// Return the maximum amount of padding allowed for aligning the basic block.
625 unsigned getMaxBytesForAlignment() const { return MaxBytesForAlignment; }
626
627 /// Set the maximum amount of padding allowed for aligning the basic block
628 void setMaxBytesForAlignment(unsigned MaxBytes) {
629 MaxBytesForAlignment = MaxBytes;
630 }
631
632 /// Returns true if the block is a landing pad. That is this basic block is
633 /// entered via an exception handler.
634 bool isEHPad() const { return IsEHPad; }
635
636 /// Indicates the block is a landing pad. That is this basic block is entered
637 /// via an exception handler.
638 void setIsEHPad(bool V = true) { IsEHPad = V; }
639
640 bool hasEHPadSuccessor() const;
641
642 /// Returns true if this is the entry block of the function.
643 bool isEntryBlock() const;
644
645 /// Returns true if this is the entry block of an EH scope, i.e., the block
646 /// that used to have a catchpad or cleanuppad instruction in the LLVM IR.
647 bool isEHScopeEntry() const { return IsEHScopeEntry; }
648
649 /// Indicates if this is the entry block of an EH scope, i.e., the block that
650 /// that used to have a catchpad or cleanuppad instruction in the LLVM IR.
651 void setIsEHScopeEntry(bool V = true) { IsEHScopeEntry = V; }
652
653 /// Returns true if this is a target block of a catchret.
654 bool isEHCatchretTarget() const { return IsEHCatchretTarget; }
655
656 /// Indicates if this is a target block of a catchret.
657 void setIsEHCatchretTarget(bool V = true) { IsEHCatchretTarget = V; }
658
659 /// Returns true if this is the entry block of an EH funclet.
660 bool isEHFuncletEntry() const { return IsEHFuncletEntry; }
661
662 /// Indicates if this is the entry block of an EH funclet.
663 void setIsEHFuncletEntry(bool V = true) { IsEHFuncletEntry = V; }
664
665 /// Returns true if this is the entry block of a cleanup funclet.
666 bool isCleanupFuncletEntry() const { return IsCleanupFuncletEntry; }
667
668 /// Indicates if this is the entry block of a cleanup funclet.
669 void setIsCleanupFuncletEntry(bool V = true) { IsCleanupFuncletEntry = V; }
670
671 /// Returns true if this block begins any section.
672 bool isBeginSection() const { return IsBeginSection; }
673
674 /// Returns true if this block ends any section.
675 bool isEndSection() const { return IsEndSection; }
676
677 void setIsBeginSection(bool V = true) { IsBeginSection = V; }
678
679 void setIsEndSection(bool V = true) { IsEndSection = V; }
680
681 std::optional<UniqueBBID> getBBID() const { return BBID; }
682
683 /// Returns the section ID of this basic block.
684 MBBSectionID getSectionID() const { return SectionID; }
685
686 /// Sets the fixed BBID of this basic block.
687 void setBBID(const UniqueBBID &V) {
688 assert(!BBID.has_value() && "Cannot change BBID.");
689 BBID = V;
690 }
691
692 /// Sets the section ID for this basic block.
693 void setSectionID(MBBSectionID V) { SectionID = V; }
694
695 /// Returns the MCSymbol marking the end of this basic block.
696 MCSymbol *getEndSymbol() const;
697
698 /// Returns true if this block may have an INLINEASM_BR (overestimate, by
699 /// checking if any of the successors are indirect targets of any inlineasm_br
700 /// in the function).
701 bool mayHaveInlineAsmBr() const;
702
703 /// Returns true if this is the indirect dest of an INLINEASM_BR.
705 return IsInlineAsmBrIndirectTarget;
706 }
707
708 /// Indicates if this is the indirect dest of an INLINEASM_BR.
709 void setIsInlineAsmBrIndirectTarget(bool V = true) {
710 IsInlineAsmBrIndirectTarget = V;
711 }
712
713 /// Returns true if it is legal to hoist instructions into this block.
714 bool isLegalToHoistInto() const;
715
716 // Code Layout methods.
717
718 /// Move 'this' block before or after the specified block. This only moves
719 /// the block, it does not modify the CFG or adjust potential fall-throughs at
720 /// the end of the block.
721 void moveBefore(MachineBasicBlock *NewAfter);
722 void moveAfter(MachineBasicBlock *NewBefore);
723
724 /// Returns true if this and MBB belong to the same section.
725 bool sameSection(const MachineBasicBlock *MBB) const {
726 return getSectionID() == MBB->getSectionID();
727 }
728
729 /// Update the terminator instructions in block to account for changes to
730 /// block layout which may have been made. PreviousLayoutSuccessor should be
731 /// set to the block which may have been used as fallthrough before the block
732 /// layout was modified. If the block previously fell through to that block,
733 /// it may now need a branch. If it previously branched to another block, it
734 /// may now be able to fallthrough to the current layout successor.
735 void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor);
736
737 // Machine-CFG mutators
738
739 /// Add Succ as a successor of this MachineBasicBlock. The Predecessors list
740 /// of Succ is automatically updated. PROB parameter is stored in
741 /// Probabilities list. The default probability is set as unknown. Mixing
742 /// known and unknown probabilities in successor list is not allowed. When all
743 /// successors have unknown probabilities, 1 / N is returned as the
744 /// probability for each successor, where N is the number of successors.
745 ///
746 /// Note that duplicate Machine CFG edges are not allowed.
749
750 /// Add Succ as a successor of this MachineBasicBlock. The Predecessors list
751 /// of Succ is automatically updated. The probability is not provided because
752 /// BPI is not available (e.g. -O0 is used), in which case edge probabilities
753 /// won't be used. Using this interface can save some space.
755
756 /// Set successor probability of a given iterator.
758
759 /// Normalize probabilities of all successors so that the sum of them becomes
760 /// one. This is usually done when the current update on this MBB is done, and
761 /// the sum of its successors' probabilities is not guaranteed to be one. The
762 /// user is responsible for the correct use of this function.
763 /// MBB::removeSuccessor() has an option to do this automatically.
765 BranchProbability::normalizeProbabilities(Probs.begin(), Probs.end());
766 }
767
768 /// Validate successors' probabilities and check if the sum of them is
769 /// approximate one. This only works in DEBUG mode.
770 void validateSuccProbs() const;
771
772 /// Remove successor from the successors list of this MachineBasicBlock. The
773 /// Predecessors list of Succ is automatically updated.
774 /// If NormalizeSuccProbs is true, then normalize successors' probabilities
775 /// after the successor is removed.
777 bool NormalizeSuccProbs = false);
778
779 /// Remove specified successor from the successors list of this
780 /// MachineBasicBlock. The Predecessors list of Succ is automatically updated.
781 /// If NormalizeSuccProbs is true, then normalize successors' probabilities
782 /// after the successor is removed.
783 /// Return the iterator to the element after the one removed.
785 bool NormalizeSuccProbs = false);
786
787 /// Replace successor OLD with NEW and update probability info.
789
790 /// Copy a successor (and any probability info) from original block to this
791 /// block's. Uses an iterator into the original blocks successors.
792 ///
793 /// This is useful when doing a partial clone of successors. Afterward, the
794 /// probabilities may need to be normalized.
796
797 /// Split the old successor into old plus new and updates the probability
798 /// info.
800 bool NormalizeSuccProbs = false);
801
802 /// Transfers all the successors from MBB to this machine basic block (i.e.,
803 /// copies all the successors FromMBB and remove all the successors from
804 /// FromMBB).
806
807 /// Transfers all the successors, as in transferSuccessors, and update PHI
808 /// operands in the successor blocks which refer to FromMBB to refer to this.
810
811 /// Return true if any of the successors have probabilities attached to them.
812 bool hasSuccessorProbabilities() const { return !Probs.empty(); }
813
814 /// Return true if the specified MBB is a predecessor of this block.
815 bool isPredecessor(const MachineBasicBlock *MBB) const;
816
817 /// Return true if the specified MBB is a successor of this block.
818 bool isSuccessor(const MachineBasicBlock *MBB) const;
819
820 /// Return true if the specified MBB will be emitted immediately after this
821 /// block, such that if this block exits by falling through, control will
822 /// transfer to the specified MBB. Note that MBB need not be a successor at
823 /// all, for example if this block ends with an unconditional branch to some
824 /// other block.
825 bool isLayoutSuccessor(const MachineBasicBlock *MBB) const;
826
827 /// Return the successor of this block if it has a single successor.
828 /// Otherwise return a null pointer.
829 ///
832 return const_cast<MachineBasicBlock *>(
833 static_cast<const MachineBasicBlock *>(this)->getSingleSuccessor());
834 }
835
836 /// Return the predecessor of this block if it has a single predecessor.
837 /// Otherwise return a null pointer.
838 ///
841 return const_cast<MachineBasicBlock *>(
842 static_cast<const MachineBasicBlock *>(this)->getSinglePredecessor());
843 }
844
845 /// Return the fallthrough block if the block can implicitly
846 /// transfer control to the block after it by falling off the end of
847 /// it. If an explicit branch to the fallthrough block is not allowed,
848 /// set JumpToFallThrough to be false. Non-null return is a conservative
849 /// answer.
850 MachineBasicBlock *getFallThrough(bool JumpToFallThrough = true);
851
852 /// Return the fallthrough block if the block can implicitly
853 /// transfer control to it's successor, whether by a branch or
854 /// a fallthrough. Non-null return is a conservative answer.
856
857 /// Return true if the block can implicitly transfer control to the
858 /// block after it by falling off the end of it. This should return
859 /// false if it can reach the block after it, but it uses an
860 /// explicit branch to do so (e.g., a table jump). True is a
861 /// conservative answer.
862 bool canFallThrough();
863
864 /// Returns a pointer to the first instruction in this block that is not a
865 /// PHINode instruction. When adding instructions to the beginning of the
866 /// basic block, they should be added before the returned value, not before
867 /// the first instruction, which might be PHI.
868 /// Returns end() is there's no non-PHI instruction.
871 return const_cast<MachineBasicBlock *>(this)->getFirstNonPHI();
872 }
873
874 /// Return the first instruction in MBB after I that is not a PHI or a label.
875 /// This is the correct point to insert lowered copies at the beginning of a
876 /// basic block that must be before any debugging information.
878
879 /// Return the first instruction in MBB after I that is not a PHI, label or
880 /// debug. This is the correct point to insert copies at the beginning of a
881 /// basic block. \p Reg is the register being used by a spill or defined for a
882 /// restore/split during register allocation.
884 bool SkipPseudoOp = true);
885
886 /// Returns an iterator to the first terminator instruction of this basic
887 /// block. If a terminator does not exist, it returns end().
890 return const_cast<MachineBasicBlock *>(this)->getFirstTerminator();
891 }
892
893 /// Same getFirstTerminator but it ignores bundles and return an
894 /// instr_iterator instead.
896
897 /// Finds the first terminator in a block by scanning forward. This can handle
898 /// cases in GlobalISel where there may be non-terminator instructions between
899 /// terminators, for which getFirstTerminator() will not work correctly.
901
902 /// Returns an iterator to the first non-debug instruction in the basic block,
903 /// or end(). Skip any pseudo probe operation if \c SkipPseudoOp is true.
904 /// Pseudo probes are like debug instructions which do not turn into real
905 /// machine code. We try to use the function to skip both debug instructions
906 /// and pseudo probe operations to avoid API proliferation. This should work
907 /// most of the time when considering optimizing the rest of code in the
908 /// block, except for certain cases where pseudo probes are designed to block
909 /// the optimizations. For example, code merge like optimizations are supposed
910 /// to be blocked by pseudo probes for better AutoFDO profile quality.
911 /// Therefore, they should be considered as a valid instruction when this
912 /// function is called in a context of such optimizations. On the other hand,
913 /// \c SkipPseudoOp should be true when it's used in optimizations that
914 /// unlikely hurt profile quality, e.g., without block merging. The default
915 /// value of \c SkipPseudoOp is set to true to maximize code quality in
916 /// general, with an explict false value passed in in a few places like branch
917 /// folding and if-conversion to favor profile quality.
918 iterator getFirstNonDebugInstr(bool SkipPseudoOp = true);
919 const_iterator getFirstNonDebugInstr(bool SkipPseudoOp = true) const {
920 return const_cast<MachineBasicBlock *>(this)->getFirstNonDebugInstr(
921 SkipPseudoOp);
922 }
923
924 /// Returns an iterator to the last non-debug instruction in the basic block,
925 /// or end(). Skip any pseudo operation if \c SkipPseudoOp is true.
926 /// Pseudo probes are like debug instructions which do not turn into real
927 /// machine code. We try to use the function to skip both debug instructions
928 /// and pseudo probe operations to avoid API proliferation. This should work
929 /// most of the time when considering optimizing the rest of code in the
930 /// block, except for certain cases where pseudo probes are designed to block
931 /// the optimizations. For example, code merge like optimizations are supposed
932 /// to be blocked by pseudo probes for better AutoFDO profile quality.
933 /// Therefore, they should be considered as a valid instruction when this
934 /// function is called in a context of such optimizations. On the other hand,
935 /// \c SkipPseudoOp should be true when it's used in optimizations that
936 /// unlikely hurt profile quality, e.g., without block merging. The default
937 /// value of \c SkipPseudoOp is set to true to maximize code quality in
938 /// general, with an explict false value passed in in a few places like branch
939 /// folding and if-conversion to favor profile quality.
940 iterator getLastNonDebugInstr(bool SkipPseudoOp = true);
941 const_iterator getLastNonDebugInstr(bool SkipPseudoOp = true) const {
942 return const_cast<MachineBasicBlock *>(this)->getLastNonDebugInstr(
943 SkipPseudoOp);
944 }
945
946 /// Convenience function that returns true if the block ends in a return
947 /// instruction.
948 bool isReturnBlock() const {
949 return !empty() && back().isReturn();
950 }
951
952 /// Convenience function that returns true if the bock ends in a EH scope
953 /// return instruction.
954 bool isEHScopeReturnBlock() const {
955 return !empty() && back().isEHScopeReturn();
956 }
957
958 /// Split a basic block into 2 pieces at \p SplitPoint. A new block will be
959 /// inserted after this block, and all instructions after \p SplitInst moved
960 /// to it (\p SplitInst will be in the original block). If \p LIS is provided,
961 /// LiveIntervals will be appropriately updated. \return the newly inserted
962 /// block.
963 ///
964 /// If \p UpdateLiveIns is true, this will ensure the live ins list is
965 /// accurate, including for physreg uses/defs in the original block.
966 MachineBasicBlock *splitAt(MachineInstr &SplitInst, bool UpdateLiveIns = true,
967 LiveIntervals *LIS = nullptr);
968
969 /// Split the critical edge from this block to the given successor block, and
970 /// return the newly created block, or null if splitting is not possible.
971 ///
972 /// This function updates LiveVariables, MachineDominatorTree, and
973 /// MachineLoopInfo, as applicable.
976 std::vector<SparseBitVector<>> *LiveInSets = nullptr,
977 MachineDomTreeUpdater *MDTU = nullptr) {
978 return SplitCriticalEdge(Succ, &P, nullptr, LiveInSets, MDTU);
979 }
980
984 std::vector<SparseBitVector<>> *LiveInSets = nullptr,
985 MachineDomTreeUpdater *MDTU = nullptr) {
986 return SplitCriticalEdge(Succ, nullptr, &MFAM, LiveInSets, MDTU);
987 }
988
989 // Helper method for new pass manager migration.
992 std::vector<SparseBitVector<>> *LiveInSets, MachineDomTreeUpdater *MDTU);
993
994 /// Check if the edge between this block and the given successor \p
995 /// Succ, can be split. If this returns true a subsequent call to
996 /// SplitCriticalEdge is guaranteed to return a valid basic block if
997 /// no changes occurred in the meantime.
998 bool canSplitCriticalEdge(const MachineBasicBlock *Succ) const;
999
1000 void pop_front() { Insts.pop_front(); }
1001 void pop_back() { Insts.pop_back(); }
1002 void push_back(MachineInstr *MI) { Insts.push_back(MI); }
1003
1004 /// Insert MI into the instruction list before I, possibly inside a bundle.
1005 ///
1006 /// If the insertion point is inside a bundle, MI will be added to the bundle,
1007 /// otherwise MI will not be added to any bundle. That means this function
1008 /// alone can't be used to prepend or append instructions to bundles. See
1009 /// MIBundleBuilder::insert() for a more reliable way of doing that.
1011
1012 /// Insert a range of instructions into the instruction list before I.
1013 template<typename IT>
1014 void insert(iterator I, IT S, IT E) {
1015 assert((I == end() || I->getParent() == this) &&
1016 "iterator points outside of basic block");
1017 Insts.insert(I.getInstrIterator(), S, E);
1018 }
1019
1020 /// Insert MI into the instruction list before I.
1022 assert((I == end() || I->getParent() == this) &&
1023 "iterator points outside of basic block");
1024 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1025 "Cannot insert instruction with bundle flags");
1026 return Insts.insert(I.getInstrIterator(), MI);
1027 }
1028
1029 /// Insert MI into the instruction list after I.
1031 assert((I == end() || I->getParent() == this) &&
1032 "iterator points outside of basic block");
1033 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1034 "Cannot insert instruction with bundle flags");
1035 return Insts.insertAfter(I.getInstrIterator(), MI);
1036 }
1037
1038 /// If I is bundled then insert MI into the instruction list after the end of
1039 /// the bundle, otherwise insert MI immediately after I.
1041 assert((I == instr_end() || I->getParent() == this) &&
1042 "iterator points outside of basic block");
1043 assert(!MI->isBundledWithPred() && !MI->isBundledWithSucc() &&
1044 "Cannot insert instruction with bundle flags");
1045 while (I->isBundledWithSucc())
1046 ++I;
1047 return Insts.insertAfter(I, MI);
1048 }
1049
1050 /// Remove an instruction from the instruction list and delete it.
1051 ///
1052 /// If the instruction is part of a bundle, the other instructions in the
1053 /// bundle will still be bundled after removing the single instruction.
1055
1056 /// Remove an instruction from the instruction list and delete it.
1057 ///
1058 /// If the instruction is part of a bundle, the other instructions in the
1059 /// bundle will still be bundled after removing the single instruction.
1061 return erase(instr_iterator(I));
1062 }
1063
1064 /// Remove a range of instructions from the instruction list and delete them.
1066 return Insts.erase(I.getInstrIterator(), E.getInstrIterator());
1067 }
1068
1069 /// Remove an instruction or bundle from the instruction list and delete it.
1070 ///
1071 /// If I points to a bundle of instructions, they are all erased.
1073 return erase(I, std::next(I));
1074 }
1075
1076 /// Remove an instruction from the instruction list and delete it.
1077 ///
1078 /// If I is the head of a bundle of instructions, the whole bundle will be
1079 /// erased.
1081 return erase(iterator(I));
1082 }
1083
1084 /// Remove the unbundled instruction from the instruction list without
1085 /// deleting it.
1086 ///
1087 /// This function can not be used to remove bundled instructions, use
1088 /// remove_instr to remove individual instructions from a bundle.
1090 assert(!I->isBundled() && "Cannot remove bundled instructions");
1091 return Insts.remove(instr_iterator(I));
1092 }
1093
1094 /// Remove the possibly bundled instruction from the instruction list
1095 /// without deleting it.
1096 ///
1097 /// If the instruction is part of a bundle, the other instructions in the
1098 /// bundle will still be bundled after removing the single instruction.
1100
1101 void clear() {
1102 Insts.clear();
1103 }
1104
1105 /// Take an instruction from MBB 'Other' at the position From, and insert it
1106 /// into this MBB right before 'Where'.
1107 ///
1108 /// If From points to a bundle of instructions, the whole bundle is moved.
1110 // The range splice() doesn't allow noop moves, but this one does.
1111 if (Where != From)
1112 splice(Where, Other, From, std::next(From));
1113 }
1114
1115 /// Take a block of instructions from MBB 'Other' in the range [From, To),
1116 /// and insert them into this MBB right before 'Where'.
1117 ///
1118 /// The instruction at 'Where' must not be included in the range of
1119 /// instructions to move.
1121 iterator From, iterator To) {
1122 Insts.splice(Where.getInstrIterator(), Other->Insts,
1123 From.getInstrIterator(), To.getInstrIterator());
1124 }
1125
1126 /// This method unlinks 'this' from the containing function, and returns it,
1127 /// but does not delete it.
1129
1130 /// This method unlinks 'this' from the containing function and deletes it.
1131 void eraseFromParent();
1132
1133 /// Given a machine basic block that branched to 'Old', change the code and
1134 /// CFG so that it branches to 'New' instead.
1136
1137 /// Update all phi nodes in this basic block to refer to basic block \p New
1138 /// instead of basic block \p Old.
1140
1141 /// Find the next valid DebugLoc starting at MBBI, skipping any debug
1142 /// instructions. Return UnknownLoc if there is none.
1145 return findDebugLoc(MBBI.getInstrIterator());
1146 }
1147
1148 /// Has exact same behavior as @ref findDebugLoc (it also searches towards the
1149 /// end of this MBB) except that this function takes a reverse iterator to
1150 /// identify the starting MI.
1153 return rfindDebugLoc(MBBI.getInstrIterator());
1154 }
1155
1156 /// Find the previous valid DebugLoc preceding MBBI, skipping any debug
1157 /// instructions. It is possible to find the last DebugLoc in the MBB using
1158 /// findPrevDebugLoc(instr_end()). Return UnknownLoc if there is none.
1161 return findPrevDebugLoc(MBBI.getInstrIterator());
1162 }
1163
1164 /// Has exact same behavior as @ref findPrevDebugLoc (it also searches towards
1165 /// the beginning of this MBB) except that this function takes reverse
1166 /// iterator to identify the starting MI. A minor difference compared to
1167 /// findPrevDebugLoc is that we can't start scanning at "instr_end".
1170 return rfindPrevDebugLoc(MBBI.getInstrIterator());
1171 }
1172
1173 /// Find and return the merged DebugLoc of the branch instructions of the
1174 /// block. Return UnknownLoc if there is none.
1176
1177 /// Possible outcome of a register liveness query to computeRegisterLiveness()
1179 LQR_Live, ///< Register is known to be (at least partially) live.
1180 LQR_Dead, ///< Register is known to be fully dead.
1181 LQR_Unknown ///< Register liveness not decidable from local neighborhood.
1183
1184 /// Return whether (physical) register \p Reg has been defined and not
1185 /// killed as of just before \p Before.
1186 ///
1187 /// Search is localised to a neighborhood of \p Neighborhood instructions
1188 /// before (searching for defs or kills) and \p Neighborhood instructions
1189 /// after (searching just for defs) \p Before.
1190 ///
1191 /// \p Reg must be a physical register.
1195 unsigned Neighborhood = 10) const;
1196
1197 // Debugging methods.
1198 void dump() const;
1199 void print(raw_ostream &OS, const SlotIndexes * = nullptr,
1200 bool IsStandalone = true) const;
1202 const SlotIndexes * = nullptr, bool IsStandalone = true) const;
1203
1205 PrintNameIr = (1 << 0), ///< Add IR name where available
1206 PrintNameAttributes = (1 << 1), ///< Print attributes
1207 };
1208
1209 void printName(raw_ostream &os, unsigned printNameFlags = PrintNameIr,
1210 ModuleSlotTracker *moduleSlotTracker = nullptr) const;
1211
1212 // Printing method used by LoopInfo.
1213 void printAsOperand(raw_ostream &OS, bool PrintType = true) const;
1214
1215 /// MachineBasicBlocks are uniquely numbered at the function level, unless
1216 /// they're not in a MachineFunction yet, in which case this will return -1.
1217 int getNumber() const { return Number; }
1218 void setNumber(int N) { Number = N; }
1219
1220 /// Return the call frame size on entry to this basic block.
1221 unsigned getCallFrameSize() const { return CallFrameSize; }
1222 /// Set the call frame size on entry to this basic block.
1223 void setCallFrameSize(unsigned N) { CallFrameSize = N; }
1224
1225 /// Return the MCSymbol for this basic block.
1226 MCSymbol *getSymbol() const;
1227
1228 /// Return the EHCatchret Symbol for this basic block.
1230
1231 std::optional<uint64_t> getIrrLoopHeaderWeight() const {
1232 return IrrLoopHeaderWeight;
1233 }
1234
1236 IrrLoopHeaderWeight = Weight;
1237 }
1238
1239 /// Return probability of the edge from this block to MBB. This method should
1240 /// NOT be called directly, but by using getEdgeProbability method from
1241 /// MachineBranchProbabilityInfo class.
1243
1244private:
1245 /// Return probability iterator corresponding to the I successor iterator.
1246 probability_iterator getProbabilityIterator(succ_iterator I);
1247 const_probability_iterator
1248 getProbabilityIterator(const_succ_iterator I) const;
1249
1251 friend class MIPrinter;
1252
1253 // Methods used to maintain doubly linked list of blocks...
1255
1256 // Machine-CFG mutators
1257
1258 /// Add Pred as a predecessor of this MachineBasicBlock. Don't do this
1259 /// unless you know what you're doing, because it doesn't update Pred's
1260 /// successors list. Use Pred->addSuccessor instead.
1261 void addPredecessor(MachineBasicBlock *Pred);
1262
1263 /// Remove Pred as a predecessor of this MachineBasicBlock. Don't do this
1264 /// unless you know what you're doing, because it doesn't update Pred's
1265 /// successors list. Use Pred->removeSuccessor instead.
1266 void removePredecessor(MachineBasicBlock *Pred);
1267};
1268
1270
1271/// Prints a machine basic block reference.
1272///
1273/// The format is:
1274/// %bb.5 - a machine basic block with MBB.getNumber() == 5.
1275///
1276/// Usage: OS << printMBBReference(MBB) << '\n';
1278
1279// This is useful when building IndexedMaps keyed on basic block pointers.
1282 unsigned operator()(const MachineBasicBlock *MBB) const {
1283 return MBB->getNumber();
1284 }
1285};
1286
1287//===--------------------------------------------------------------------===//
1288// GraphTraits specializations for machine basic block graphs (machine-CFGs)
1289//===--------------------------------------------------------------------===//
1290
1291// Provide specializations of GraphTraits to be able to treat a
1292// MachineFunction as a graph of MachineBasicBlocks.
1293//
1294
1295template <> struct GraphTraits<MachineBasicBlock *> {
1298
1299 static NodeRef getEntryNode(MachineBasicBlock *BB) { return BB; }
1300 static ChildIteratorType child_begin(NodeRef N) { return N->succ_begin(); }
1301 static ChildIteratorType child_end(NodeRef N) { return N->succ_end(); }
1302
1303 static unsigned getNumber(MachineBasicBlock *BB) {
1304 assert(BB->getNumber() >= 0 && "negative block number");
1305 return BB->getNumber();
1306 }
1307};
1308
1309static_assert(GraphHasNodeNumbers<MachineBasicBlock *>,
1310 "GraphTraits getNumber() not detected");
1311
1312template <> struct GraphTraits<const MachineBasicBlock *> {
1315
1316 static NodeRef getEntryNode(const MachineBasicBlock *BB) { return BB; }
1317 static ChildIteratorType child_begin(NodeRef N) { return N->succ_begin(); }
1318 static ChildIteratorType child_end(NodeRef N) { return N->succ_end(); }
1319
1320 static unsigned getNumber(const MachineBasicBlock *BB) {
1321 assert(BB->getNumber() >= 0 && "negative block number");
1322 return BB->getNumber();
1323 }
1324};
1325
1326static_assert(GraphHasNodeNumbers<const MachineBasicBlock *>,
1327 "GraphTraits getNumber() not detected");
1328
1329// Provide specializations of GraphTraits to be able to treat a
1330// MachineFunction as a graph of MachineBasicBlocks and to walk it
1331// in inverse order. Inverse order for a function is considered
1332// to be when traversing the predecessor edges of a MBB
1333// instead of the successor edges.
1334//
1338
1340 return G.Graph;
1341 }
1342
1343 static ChildIteratorType child_begin(NodeRef N) { return N->pred_begin(); }
1344 static ChildIteratorType child_end(NodeRef N) { return N->pred_end(); }
1345
1346 static unsigned getNumber(MachineBasicBlock *BB) {
1347 assert(BB->getNumber() >= 0 && "negative block number");
1348 return BB->getNumber();
1349 }
1350};
1351
1352static_assert(GraphHasNodeNumbers<Inverse<MachineBasicBlock *>>,
1353 "GraphTraits getNumber() not detected");
1354
1358
1360 return G.Graph;
1361 }
1362
1363 static ChildIteratorType child_begin(NodeRef N) { return N->pred_begin(); }
1364 static ChildIteratorType child_end(NodeRef N) { return N->pred_end(); }
1365
1366 static unsigned getNumber(const MachineBasicBlock *BB) {
1367 assert(BB->getNumber() >= 0 && "negative block number");
1368 return BB->getNumber();
1369 }
1370};
1371
1372static_assert(GraphHasNodeNumbers<Inverse<const MachineBasicBlock *>>,
1373 "GraphTraits getNumber() not detected");
1374
1375// These accessors are handy for sharing templated code between IR and MIR.
1376inline auto successors(const MachineBasicBlock *BB) { return BB->successors(); }
1377inline auto predecessors(const MachineBasicBlock *BB) {
1378 return BB->predecessors();
1379}
1380inline auto succ_size(const MachineBasicBlock *BB) { return BB->succ_size(); }
1381inline auto pred_size(const MachineBasicBlock *BB) { return BB->pred_size(); }
1382inline auto succ_begin(const MachineBasicBlock *BB) { return BB->succ_begin(); }
1383inline auto pred_begin(const MachineBasicBlock *BB) { return BB->pred_begin(); }
1384inline auto succ_end(const MachineBasicBlock *BB) { return BB->succ_end(); }
1385inline auto pred_end(const MachineBasicBlock *BB) { return BB->pred_end(); }
1386
1387/// MachineInstrSpan provides an interface to get an iteration range
1388/// containing the instruction it was initialized with, along with all
1389/// those instructions inserted prior to or following that instruction
1390/// at some point after the MachineInstrSpan is constructed.
1392 MachineBasicBlock &MBB;
1394
1395public:
1397 : MBB(*BB), I(I), B(I == MBB.begin() ? MBB.end() : std::prev(I)),
1398 E(std::next(I)) {
1399 assert(I == BB->end() || I->getParent() == BB);
1400 }
1401
1403 return B == MBB.end() ? MBB.begin() : std::next(B);
1404 }
1406 bool empty() { return begin() == end(); }
1407
1409};
1410
1411/// Increment \p It until it points to a non-debug instruction or to \p End
1412/// and return the resulting iterator. This function should only be used
1413/// MachineBasicBlock::{iterator, const_iterator, instr_iterator,
1414/// const_instr_iterator} and the respective reverse iterators.
1415template <typename IterT>
1416inline IterT skipDebugInstructionsForward(IterT It, IterT End,
1417 bool SkipPseudoOp = true) {
1418 while (It != End &&
1419 (It->isDebugInstr() || (SkipPseudoOp && It->isPseudoProbe())))
1420 ++It;
1421 return It;
1422}
1423
1424/// Decrement \p It until it points to a non-debug instruction or to \p Begin
1425/// and return the resulting iterator. This function should only be used
1426/// MachineBasicBlock::{iterator, const_iterator, instr_iterator,
1427/// const_instr_iterator} and the respective reverse iterators.
1428template <class IterT>
1429inline IterT skipDebugInstructionsBackward(IterT It, IterT Begin,
1430 bool SkipPseudoOp = true) {
1431 while (It != Begin &&
1432 (It->isDebugInstr() || (SkipPseudoOp && It->isPseudoProbe())))
1433 --It;
1434 return It;
1435}
1436
1437/// Increment \p It, then continue incrementing it while it points to a debug
1438/// instruction. A replacement for std::next.
1439template <typename IterT>
1440inline IterT next_nodbg(IterT It, IterT End, bool SkipPseudoOp = true) {
1441 return skipDebugInstructionsForward(std::next(It), End, SkipPseudoOp);
1442}
1443
1444/// Decrement \p It, then continue decrementing it while it points to a debug
1445/// instruction. A replacement for std::prev.
1446template <typename IterT>
1447inline IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp = true) {
1448 return skipDebugInstructionsBackward(std::prev(It), Begin, SkipPseudoOp);
1449}
1450
1451/// Construct a range iterator which begins at \p It and moves forwards until
1452/// \p End is reached, skipping any debug instructions.
1453template <typename IterT>
1454inline auto instructionsWithoutDebug(IterT It, IterT End,
1455 bool SkipPseudoOp = true) {
1456 return make_filter_range(make_range(It, End), [=](const MachineInstr &MI) {
1457 return !MI.isDebugInstr() && !(SkipPseudoOp && MI.isPseudoProbe());
1458 });
1459}
1460
1461} // end namespace llvm
1462
1463#endif // LLVM_CODEGEN_MACHINEBASICBLOCK_H
aarch64 AArch64 CCMP Pass
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")))
BlockVerifier::State From
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines DenseMapInfo traits for DenseMap.
bool End
Definition: ELF_riscv.cpp:480
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
unsigned const TargetRegisterInfo * TRI
unsigned Reg
#define P(N)
uint32_t Number
Definition: Profile.cpp:47
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This file defines the SparseBitVector class.
Value * RHS
Value * LHS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:253
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
static BranchProbability getUnknown()
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
A debug info location.
Definition: DebugLoc.h:33
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:41
This class prints out the machine instructions using the MIR serialization format.
Definition: MIRPrinter.cpp:143
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.
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
unsigned pred_size() const
void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
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
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
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.
SmallVectorImpl< MachineBasicBlock * >::reverse_iterator pred_reverse_iterator
void setIsEHCatchretTarget(bool V=true)
Indicates if this is a target block of a catchret.
MachineInstr * remove_instr(MachineInstr *I)
Remove the possibly bundled instruction from the instruction list without deleting it.
instr_iterator instr_begin()
void setIsEndSection(bool V=true)
void setIrrLoopHeaderWeight(uint64_t Weight)
MachineBasicBlock * getLogicalFallThrough()
Return the fallthrough block if the block can implicitly transfer control to it's successor,...
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.
SmallVectorImpl< MachineBasicBlock * >::const_iterator const_succ_iterator
DebugLoc rfindPrevDebugLoc(reverse_iterator MBBI)
MCSymbol * getEHCatchretSymbol() const
Return the EHCatchret Symbol for this basic block.
const_pred_iterator pred_end() const
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.
reverse_iterator rend()
void replaceSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New)
Replace successor OLD with NEW and update probability info.
const_pred_reverse_iterator pred_rend() const
MachineBasicBlock * getFallThrough(bool JumpToFallThrough=true)
Return the fallthrough block if the block can implicitly transfer control to the block after it by fa...
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)
Split the critical edge from this block to the given successor block, and return the newly created bl...
bool hasLabelMustBeEmitted() const
Test whether this block must have its label emitted.
const_iterator getFirstNonDebugInstr(bool SkipPseudoOp=true) const
instr_iterator insert(instr_iterator I, MachineInstr *M)
Insert MI into the instruction list before I, possibly inside a bundle.
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()
MachineInstrBundleIterator< const MachineInstr, true > const_reverse_iterator
SmallVectorImpl< MachineBasicBlock * >::reverse_iterator succ_reverse_iterator
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)
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()
void addSuccessorWithoutProb(MachineBasicBlock *Succ)
Add Succ as a successor of this MachineBasicBlock.
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.
void splitSuccessor(MachineBasicBlock *Old, MachineBasicBlock *New, bool NormalizeSuccProbs=false)
Split the old successor into old plus new and updates the probability info.
SmallVectorImpl< MachineBasicBlock * >::const_reverse_iterator const_succ_reverse_iterator
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.
void updateTerminator(MachineBasicBlock *PreviousLayoutSuccessor)
Update the terminator instructions in block to account for changes to block layout which may have bee...
const MachineBasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor.
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.
bool canFallThrough()
Return true if the block can implicitly transfer control to the block after it by falling off the end...
void setSuccProbability(succ_iterator I, BranchProbability Prob)
Set successor probability of a given iterator.
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)
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
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.
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
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 ...
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
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.
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.
livein_iterator livein_begin() const
unsigned succ_size() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
iterator_range< livein_iterator > liveins_dbg() const
const uint32_t * getBeginClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the start of this basic block.
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.
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 ...
MachineInstr & instr_back()
bool isEntryBlock() const
Returns true if this is the entry block of the function.
iterator_range< const_instr_iterator > const_instr_range
void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
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.
bool isEHCatchretTarget() const
Returns true if this is a target block of a catchret.
const_iterator getFirstNonPHI() const
void sortUniqueLiveIns()
Sorts and uniques the LiveIns vector.
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
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
void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
const_succ_iterator succ_end() const
iterator getFirstNonPHI()
Returns a pointer to the first instruction in this block that is not a PHINode instruction.
const_iterator begin() const
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.
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
void print(raw_ostream &OS, const SlotIndexes *=nullptr, bool IsStandalone=true) const
reverse_instr_iterator instr_rend()
const_reverse_iterator rend() const
DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
Instructions::iterator instr_iterator
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
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()
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().
DebugLoc findPrevDebugLoc(instr_iterator MBBI)
Find the previous valid DebugLoc preceding MBBI, skipping any debug instructions.
MachineBasicBlock * splitAt(MachineInstr &SplitInst, bool UpdateLiveIns=true, LiveIntervals *LIS=nullptr)
Split a basic block into 2 pieces at SplitPoint.
MachineFunction * getParent()
void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
void setIsInlineAsmBrIndirectTarget(bool V=true)
Indicates if this is the indirect dest of an INLINEASM_BR.
instr_iterator instr_end()
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.
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
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()
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.
DebugLoc findBranchDebugLoc()
Find and return the merged DebugLoc of the branch instructions of the block.
iterator_range< succ_iterator > successors()
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,...
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.
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.
bool canSplitCriticalEdge(const MachineBasicBlock *Succ) const
Check if the edge between this block and the given successor Succ, can be split.
MachineInstrBundleIterator< MachineInstr > iterator
bool isLegalToHoistInto() const
Returns true if it is legal to hoist instructions into this block.
MachineInstr & instr_front()
SmallVectorImpl< MachineBasicBlock * >::const_iterator const_pred_iterator
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
StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
SmallVectorImpl< MachineBasicBlock * >::const_reverse_iterator const_pred_reverse_iterator
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.
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...
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
const uint32_t * getEndClobberMask(const TargetRegisterInfo *TRI) const
Get the clobber mask for the end of the basic block.
void setIsBeginSection(bool V=true)
bool sizeWithoutDebugLargerThan(unsigned Limit) const
iterator_range< instr_iterator > instr_range
bool isLiveIn(MCRegister Reg, LaneBitmask LaneMask=LaneBitmask::getAll()) const
Return true if the specified register is in the live in set.
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.
static MachineInstrBundleIterator getAtBundleBegin(instr_iterator MI)
Get the bundle iterator for the given instruction's bundle.
MachineInstrSpan provides an interface to get an iteration range containing the instruction it was in...
MachineBasicBlock::iterator getInitial()
MachineInstrSpan(MachineBasicBlock::iterator I, MachineBasicBlock *BB)
MachineBasicBlock::iterator begin()
MachineBasicBlock::iterator end()
Representation of each machine instruction.
Definition: MachineInstr.h:69
bool isReturn(QueryType Type=AnyInBundle) const
Definition: MachineInstr.h:946
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...
Definition: MachineInstr.h:952
Manage lifetime of a slot tracker for printing IR.
Pass interface - Implemented by all 'passes'.
Definition: Pass.h:94
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.
Definition: SlotIndexes.h:297
bool empty() const
Definition: SmallVector.h:81
size_t size() const
Definition: SmallVector.h:78
typename SuperClass::const_iterator const_iterator
Definition: SmallVector.h:578
typename SuperClass::iterator iterator
Definition: SmallVector.h:577
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: SmallVector.h:254
std::reverse_iterator< iterator > reverse_iterator
Definition: SmallVector.h:255
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
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
An ilist node that can access its parent list.
Definition: ilist_node.h:321
base_list_type::const_reverse_iterator const_reverse_iterator
Definition: ilist.h:125
An intrusive list with ownership and callbacks specified/controlled by ilist_traits,...
Definition: ilist.h:328
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:52
A simple intrusive list implementation.
Definition: simple_ilist.h:81
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.
@ BasicBlock
Various leaf nodes.
Definition: ISDOpcodes.h:71
unsigned combineHashValue(unsigned a, unsigned b)
Simplistic combination of 32-bit hash values into 32-bit hash values.
Definition: DenseMapInfo.h:39
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
IterT next_nodbg(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It, then continue incrementing it while it points to a debug instruction.
auto pred_end(const MachineBasicBlock *BB)
auto successors(const MachineBasicBlock *BB)
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition: MCRegister.h:21
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
auto pred_size(const MachineBasicBlock *BB)
IterT skipDebugInstructionsForward(IterT It, IterT End, bool SkipPseudoOp=true)
Increment It until it points to a non-debug instruction or to End and return the resulting iterator.
auto 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:573
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.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:303
auto pred_begin(const MachineBasicBlock *BB)
auto predecessors(const MachineBasicBlock *BB)
IterT prev_nodbg(IterT It, IterT Begin, bool SkipPseudoOp=true)
Decrement It, then continue decrementing it while it points to a debug instruction.
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:858
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
static unsigned getHashValue(const MBBSectionID &SecID)
static bool isEqual(const MBBSectionID &LHS, const MBBSectionID &RHS)
static MBBSectionID getTombstoneKey()
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:52
static NodeRef getEntryNode(Inverse< MachineBasicBlock * > G)
static unsigned getNumber(MachineBasicBlock *BB)
static ChildIteratorType child_begin(NodeRef N)
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
bool operator!=(const MBBSectionID &Other) const
static const MBBSectionID ExceptionSectionID
static const MBBSectionID ColdSectionID
MBBSectionID(unsigned N)
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
Callbacks do nothing by default in iplist and ilist.
Definition: ilist.h:65
void transferNodesFromList(ilist_traits &FromList, instr_iterator First, instr_iterator Last)
void addNodeToList(MachineInstr *N)
void removeNodeFromList(MachineInstr *N)
void deleteNode(MachineInstr *MI)
Template traits for intrusive list.
Definition: ilist.h:90