File indexing completed on 2026-05-10 08:43:57
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_IR_BASICBLOCK_H
0014 #define LLVM_IR_BASICBLOCK_H
0015
0016 #include "llvm-c/Types.h"
0017 #include "llvm/ADT/DenseMap.h"
0018 #include "llvm/ADT/Twine.h"
0019 #include "llvm/ADT/ilist.h"
0020 #include "llvm/ADT/ilist_node.h"
0021 #include "llvm/ADT/iterator.h"
0022 #include "llvm/ADT/iterator_range.h"
0023 #include "llvm/IR/DebugProgramInstruction.h"
0024 #include "llvm/IR/Instruction.h"
0025 #include "llvm/IR/SymbolTableListTraits.h"
0026 #include "llvm/IR/Value.h"
0027 #include <cassert>
0028 #include <cstddef>
0029 #include <iterator>
0030
0031 namespace llvm {
0032
0033 class AssemblyAnnotationWriter;
0034 class CallInst;
0035 class DataLayout;
0036 class Function;
0037 class LandingPadInst;
0038 class LLVMContext;
0039 class Module;
0040 class PHINode;
0041 class ValueSymbolTable;
0042 class DbgVariableRecord;
0043 class DbgMarker;
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 class BasicBlock final : public Value,
0061 public ilist_node_with_parent<BasicBlock, Function> {
0062 public:
0063 using InstListType = SymbolTableList<Instruction, ilist_iterator_bits<true>,
0064 ilist_parent<BasicBlock>>;
0065
0066
0067 bool IsNewDbgInfoFormat;
0068
0069 private:
0070
0071 friend class Function;
0072
0073 unsigned Number = -1u;
0074
0075 friend class BlockAddress;
0076 friend class SymbolTableListTraits<BasicBlock>;
0077
0078 InstListType InstList;
0079 Function *Parent;
0080
0081 public:
0082
0083
0084 DbgMarker *createMarker(Instruction *I);
0085 DbgMarker *createMarker(InstListType::iterator It);
0086
0087
0088
0089
0090
0091 void convertToNewDbgValues();
0092
0093
0094
0095
0096 void convertFromNewDbgValues();
0097
0098
0099
0100
0101 void setIsNewDbgInfoFormat(bool NewFlag);
0102 void setNewDbgInfoFormatFlag(bool NewFlag);
0103
0104 unsigned getNumber() const {
0105 assert(getParent() && "only basic blocks in functions have valid numbers");
0106 return Number;
0107 }
0108
0109
0110
0111
0112
0113 void setTrailingDbgRecords(DbgMarker *M);
0114
0115
0116
0117
0118 DbgMarker *getTrailingDbgRecords();
0119
0120
0121
0122 void deleteTrailingDbgRecords();
0123
0124 void dumpDbgValues() const;
0125
0126
0127
0128
0129 DbgMarker *getMarker(InstListType::iterator It);
0130
0131
0132
0133
0134 DbgMarker *getNextMarker(Instruction *I);
0135
0136
0137 void insertDbgRecordAfter(DbgRecord *DR, Instruction *I);
0138
0139
0140 void insertDbgRecordBefore(DbgRecord *DR, InstListType::iterator Here);
0141
0142
0143
0144
0145
0146 void flushTerminatorDbgRecords();
0147
0148
0149
0150
0151
0152
0153 void reinsertInstInDbgRecords(Instruction *I,
0154 std::optional<DbgRecord::self_iterator> Pos);
0155
0156 private:
0157 void setParent(Function *parent);
0158
0159
0160
0161
0162
0163
0164 explicit BasicBlock(LLVMContext &C, const Twine &Name = "",
0165 Function *Parent = nullptr,
0166 BasicBlock *InsertBefore = nullptr);
0167
0168 public:
0169 BasicBlock(const BasicBlock &) = delete;
0170 BasicBlock &operator=(const BasicBlock &) = delete;
0171 ~BasicBlock();
0172
0173
0174 LLVMContext &getContext() const;
0175
0176
0177 using iterator = InstListType::iterator;
0178 using const_iterator = InstListType::const_iterator;
0179 using reverse_iterator = InstListType::reverse_iterator;
0180 using const_reverse_iterator = InstListType::const_reverse_iterator;
0181
0182
0183 friend void Instruction::removeFromParent();
0184 friend BasicBlock::iterator Instruction::eraseFromParent();
0185 friend BasicBlock::iterator Instruction::insertInto(BasicBlock *BB,
0186 BasicBlock::iterator It);
0187 friend class llvm::SymbolTableListTraits<
0188 llvm::Instruction, ilist_iterator_bits<true>, ilist_parent<BasicBlock>>;
0189 friend class llvm::ilist_node_with_parent<llvm::Instruction, llvm::BasicBlock,
0190 ilist_iterator_bits<true>,
0191 ilist_parent<BasicBlock>>;
0192
0193
0194
0195 friend void Instruction::insertBefore(BasicBlock::iterator InsertPos);
0196 friend void Instruction::insertAfter(Instruction *InsertPos);
0197 friend void Instruction::insertAfter(BasicBlock::iterator InsertPos);
0198 friend void Instruction::insertBefore(BasicBlock &BB,
0199 InstListType::iterator InsertPos);
0200 friend void Instruction::moveBeforeImpl(BasicBlock &BB,
0201 InstListType::iterator I,
0202 bool Preserve);
0203 friend iterator_range<DbgRecord::self_iterator>
0204 Instruction::cloneDebugInfoFrom(
0205 const Instruction *From, std::optional<DbgRecord::self_iterator> FromHere,
0206 bool InsertAtHead);
0207
0208
0209
0210
0211
0212
0213 static BasicBlock *Create(LLVMContext &Context, const Twine &Name = "",
0214 Function *Parent = nullptr,
0215 BasicBlock *InsertBefore = nullptr) {
0216 return new BasicBlock(Context, Name, Parent, InsertBefore);
0217 }
0218
0219
0220 const Function *getParent() const { return Parent; }
0221 Function *getParent() { return Parent; }
0222
0223
0224
0225
0226
0227 const Module *getModule() const;
0228 Module *getModule() {
0229 return const_cast<Module *>(
0230 static_cast<const BasicBlock *>(this)->getModule());
0231 }
0232
0233
0234
0235
0236 const DataLayout &getDataLayout() const;
0237
0238
0239
0240 const Instruction *getTerminator() const LLVM_READONLY {
0241 if (InstList.empty() || !InstList.back().isTerminator())
0242 return nullptr;
0243 return &InstList.back();
0244 }
0245 Instruction *getTerminator() {
0246 return const_cast<Instruction *>(
0247 static_cast<const BasicBlock *>(this)->getTerminator());
0248 }
0249
0250
0251
0252
0253 const CallInst *getTerminatingDeoptimizeCall() const;
0254 CallInst *getTerminatingDeoptimizeCall() {
0255 return const_cast<CallInst *>(
0256 static_cast<const BasicBlock *>(this)->getTerminatingDeoptimizeCall());
0257 }
0258
0259
0260
0261
0262 const CallInst *getPostdominatingDeoptimizeCall() const;
0263 CallInst *getPostdominatingDeoptimizeCall() {
0264 return const_cast<CallInst *>(
0265 static_cast<const BasicBlock *>(this)->getPostdominatingDeoptimizeCall());
0266 }
0267
0268
0269
0270
0271 const CallInst *getTerminatingMustTailCall() const;
0272 CallInst *getTerminatingMustTailCall() {
0273 return const_cast<CallInst *>(
0274 static_cast<const BasicBlock *>(this)->getTerminatingMustTailCall());
0275 }
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286 LLVM_DEPRECATED("Use iterators as instruction positions", "getFirstNonPHIIt")
0287 const Instruction *getFirstNonPHI() const;
0288 LLVM_DEPRECATED("Use iterators as instruction positions instead",
0289 "getFirstNonPHIIt")
0290 Instruction *getFirstNonPHI();
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301 InstListType::const_iterator getFirstNonPHIIt() const;
0302 InstListType::iterator getFirstNonPHIIt() {
0303 BasicBlock::iterator It =
0304 static_cast<const BasicBlock *>(this)->getFirstNonPHIIt().getNonConst();
0305 It.setHeadBit(true);
0306 return It;
0307 }
0308
0309
0310
0311
0312 InstListType::const_iterator
0313 getFirstNonPHIOrDbg(bool SkipPseudoOp = true) const;
0314 InstListType::iterator getFirstNonPHIOrDbg(bool SkipPseudoOp = true) {
0315 return static_cast<const BasicBlock *>(this)
0316 ->getFirstNonPHIOrDbg(SkipPseudoOp)
0317 .getNonConst();
0318 }
0319
0320
0321
0322
0323 InstListType::const_iterator
0324 getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp = true) const;
0325 InstListType::iterator
0326 getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp = true) {
0327 return static_cast<const BasicBlock *>(this)
0328 ->getFirstNonPHIOrDbgOrLifetime(SkipPseudoOp)
0329 .getNonConst();
0330 }
0331
0332
0333
0334
0335
0336 const_iterator getFirstInsertionPt() const;
0337 iterator getFirstInsertionPt() {
0338 return static_cast<const BasicBlock *>(this)
0339 ->getFirstInsertionPt().getNonConst();
0340 }
0341
0342
0343
0344 const_iterator getFirstNonPHIOrDbgOrAlloca() const;
0345 iterator getFirstNonPHIOrDbgOrAlloca() {
0346 return static_cast<const BasicBlock *>(this)
0347 ->getFirstNonPHIOrDbgOrAlloca()
0348 .getNonConst();
0349 }
0350
0351
0352
0353
0354 const Instruction* getFirstMayFaultInst() const;
0355 Instruction* getFirstMayFaultInst() {
0356 return const_cast<Instruction*>(
0357 static_cast<const BasicBlock*>(this)->getFirstMayFaultInst());
0358 }
0359
0360
0361
0362
0363 iterator_range<filter_iterator<BasicBlock::const_iterator,
0364 std::function<bool(const Instruction &)>>>
0365 instructionsWithoutDebug(bool SkipPseudoOp = true) const;
0366
0367
0368
0369
0370 iterator_range<
0371 filter_iterator<BasicBlock::iterator, std::function<bool(Instruction &)>>>
0372 instructionsWithoutDebug(bool SkipPseudoOp = true);
0373
0374
0375 filter_iterator<BasicBlock::const_iterator,
0376 std::function<bool(const Instruction &)>>::difference_type
0377 sizeWithoutDebug() const;
0378
0379
0380 void removeFromParent();
0381
0382
0383
0384
0385 SymbolTableList<BasicBlock>::iterator eraseFromParent();
0386
0387
0388
0389 inline void moveBefore(BasicBlock *MovePos) {
0390 moveBefore(MovePos->getIterator());
0391 }
0392 void moveBefore(SymbolTableList<BasicBlock>::iterator MovePos);
0393
0394
0395
0396 void moveAfter(BasicBlock *MovePos);
0397
0398
0399
0400
0401
0402
0403
0404 void insertInto(Function *Parent, BasicBlock *InsertBefore = nullptr);
0405
0406
0407
0408 const BasicBlock *getSinglePredecessor() const;
0409 BasicBlock *getSinglePredecessor() {
0410 return const_cast<BasicBlock *>(
0411 static_cast<const BasicBlock *>(this)->getSinglePredecessor());
0412 }
0413
0414
0415
0416
0417
0418
0419
0420 const BasicBlock *getUniquePredecessor() const;
0421 BasicBlock *getUniquePredecessor() {
0422 return const_cast<BasicBlock *>(
0423 static_cast<const BasicBlock *>(this)->getUniquePredecessor());
0424 }
0425
0426
0427 bool hasNPredecessors(unsigned N) const;
0428
0429
0430 bool hasNPredecessorsOrMore(unsigned N) const;
0431
0432
0433
0434
0435
0436 const BasicBlock *getSingleSuccessor() const;
0437 BasicBlock *getSingleSuccessor() {
0438 return const_cast<BasicBlock *>(
0439 static_cast<const BasicBlock *>(this)->getSingleSuccessor());
0440 }
0441
0442
0443
0444
0445
0446 const BasicBlock *getUniqueSuccessor() const;
0447 BasicBlock *getUniqueSuccessor() {
0448 return const_cast<BasicBlock *>(
0449 static_cast<const BasicBlock *>(this)->getUniqueSuccessor());
0450 }
0451
0452
0453
0454 void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW = nullptr,
0455 bool ShouldPreserveUseListOrder = false,
0456 bool IsForDebug = false) const;
0457
0458
0459
0460
0461 inline iterator begin() {
0462 iterator It = InstList.begin();
0463
0464
0465
0466 It.setHeadBit(true);
0467 return It;
0468 }
0469 inline const_iterator begin() const {
0470 const_iterator It = InstList.begin();
0471 It.setHeadBit(true);
0472 return It;
0473 }
0474 inline iterator end () { return InstList.end(); }
0475 inline const_iterator end () const { return InstList.end(); }
0476
0477 inline reverse_iterator rbegin() { return InstList.rbegin(); }
0478 inline const_reverse_iterator rbegin() const { return InstList.rbegin(); }
0479 inline reverse_iterator rend () { return InstList.rend(); }
0480 inline const_reverse_iterator rend () const { return InstList.rend(); }
0481
0482 inline size_t size() const { return InstList.size(); }
0483 inline bool empty() const { return InstList.empty(); }
0484 inline const Instruction &front() const { return InstList.front(); }
0485 inline Instruction &front() { return InstList.front(); }
0486 inline const Instruction &back() const { return InstList.back(); }
0487 inline Instruction &back() { return InstList.back(); }
0488
0489
0490 template <typename PHINodeT = PHINode, typename BBIteratorT = iterator>
0491 class phi_iterator_impl
0492 : public iterator_facade_base<phi_iterator_impl<PHINodeT, BBIteratorT>,
0493 std::forward_iterator_tag, PHINodeT> {
0494 friend BasicBlock;
0495
0496 PHINodeT *PN;
0497
0498 phi_iterator_impl(PHINodeT *PN) : PN(PN) {}
0499
0500 public:
0501
0502
0503 phi_iterator_impl() = default;
0504
0505
0506 template <typename PHINodeU, typename BBIteratorU,
0507 typename = std::enable_if_t<
0508 std::is_convertible<PHINodeU *, PHINodeT *>::value>>
0509 phi_iterator_impl(const phi_iterator_impl<PHINodeU, BBIteratorU> &Arg)
0510 : PN(Arg.PN) {}
0511
0512 bool operator==(const phi_iterator_impl &Arg) const { return PN == Arg.PN; }
0513
0514 PHINodeT &operator*() const { return *PN; }
0515
0516 using phi_iterator_impl::iterator_facade_base::operator++;
0517 phi_iterator_impl &operator++() {
0518 assert(PN && "Cannot increment the end iterator!");
0519 PN = dyn_cast<PHINodeT>(std::next(BBIteratorT(PN)));
0520 return *this;
0521 }
0522 };
0523 using phi_iterator = phi_iterator_impl<>;
0524 using const_phi_iterator =
0525 phi_iterator_impl<const PHINode, BasicBlock::const_iterator>;
0526
0527
0528
0529
0530 iterator_range<const_phi_iterator> phis() const {
0531 return const_cast<BasicBlock *>(this)->phis();
0532 }
0533 iterator_range<phi_iterator> phis();
0534
0535 private:
0536
0537
0538
0539
0540 const InstListType &getInstList() const { return InstList; }
0541 InstListType &getInstList() { return InstList; }
0542
0543
0544
0545 static InstListType BasicBlock::*getSublistAccess(Instruction *) {
0546 return &BasicBlock::InstList;
0547 }
0548
0549
0550
0551
0552 void spliceDebugInfoEmptyBlock(BasicBlock::iterator ToIt, BasicBlock *FromBB,
0553 BasicBlock::iterator FromBeginIt,
0554 BasicBlock::iterator FromEndIt);
0555
0556
0557
0558
0559
0560 void spliceDebugInfo(BasicBlock::iterator ToIt, BasicBlock *FromBB,
0561 BasicBlock::iterator FromBeginIt,
0562 BasicBlock::iterator FromEndIt);
0563 void spliceDebugInfoImpl(BasicBlock::iterator ToIt, BasicBlock *FromBB,
0564 BasicBlock::iterator FromBeginIt,
0565 BasicBlock::iterator FromEndIt);
0566
0567 public:
0568
0569 ValueSymbolTable *getValueSymbolTable();
0570
0571
0572 static bool classof(const Value *V) {
0573 return V->getValueID() == Value::BasicBlockVal;
0574 }
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584 void dropAllReferences();
0585
0586
0587
0588
0589
0590
0591
0592 void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs = false);
0593
0594 bool canSplitPredecessors() const;
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614 BasicBlock *splitBasicBlock(iterator I, const Twine &BBName = "",
0615 bool Before = false);
0616 BasicBlock *splitBasicBlock(Instruction *I, const Twine &BBName = "",
0617 bool Before = false) {
0618 return splitBasicBlock(I->getIterator(), BBName, Before);
0619 }
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634
0635
0636
0637
0638 BasicBlock *splitBasicBlockBefore(iterator I, const Twine &BBName = "");
0639 BasicBlock *splitBasicBlockBefore(Instruction *I, const Twine &BBName = "") {
0640 return splitBasicBlockBefore(I->getIterator(), BBName);
0641 }
0642
0643
0644 void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB) {
0645 splice(ToIt, FromBB, FromBB->begin(), FromBB->end());
0646 }
0647
0648
0649
0650 void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB,
0651 BasicBlock::iterator FromIt) {
0652 auto FromItNext = std::next(FromIt);
0653
0654 if (ToIt == FromIt || ToIt == FromItNext)
0655 return;
0656 splice(ToIt, FromBB, FromIt, FromItNext);
0657 }
0658
0659
0660
0661 void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB,
0662 BasicBlock::iterator FromBeginIt,
0663 BasicBlock::iterator FromEndIt);
0664
0665
0666
0667 BasicBlock::iterator erase(BasicBlock::iterator FromIt, BasicBlock::iterator ToIt);
0668
0669
0670
0671 bool hasAddressTaken() const {
0672 return getBasicBlockBits().BlockAddressRefCount != 0;
0673 }
0674
0675
0676
0677 void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New);
0678
0679
0680
0681 void replaceSuccessorsPhiUsesWith(BasicBlock *Old, BasicBlock *New);
0682
0683
0684
0685 void replaceSuccessorsPhiUsesWith(BasicBlock *New);
0686
0687
0688 bool isEHPad() const { return getFirstNonPHIIt()->isEHPad(); }
0689
0690
0691
0692
0693
0694 bool isLandingPad() const;
0695
0696
0697 const LandingPadInst *getLandingPadInst() const;
0698 LandingPadInst *getLandingPadInst() {
0699 return const_cast<LandingPadInst *>(
0700 static_cast<const BasicBlock *>(this)->getLandingPadInst());
0701 }
0702
0703
0704 bool isLegalToHoistInto() const;
0705
0706
0707
0708 bool isEntryBlock() const;
0709
0710 std::optional<uint64_t> getIrrLoopHeaderWeight() const;
0711
0712
0713 bool isInstrOrderValid() const {
0714 return getBasicBlockBits().InstrOrderValid;
0715 }
0716
0717
0718 void invalidateOrders() {
0719 validateInstrOrdering();
0720 BasicBlockBits Bits = getBasicBlockBits();
0721 Bits.InstrOrderValid = false;
0722 setBasicBlockBits(Bits);
0723 }
0724
0725
0726 void renumberInstructions();
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736 void validateInstrOrdering() const;
0737
0738 private:
0739 #if defined(_AIX) && (!defined(__GNUC__) || defined(__clang__))
0740
0741
0742 #define BEGIN_TWO_BYTE_PACK() _Pragma("pack(2)")
0743 #define END_TWO_BYTE_PACK() _Pragma("pack(pop)")
0744 #else
0745 #define BEGIN_TWO_BYTE_PACK()
0746 #define END_TWO_BYTE_PACK()
0747 #endif
0748
0749 BEGIN_TWO_BYTE_PACK()
0750
0751 struct BasicBlockBits {
0752 unsigned short BlockAddressRefCount : 15;
0753 unsigned short InstrOrderValid : 1;
0754 };
0755 END_TWO_BYTE_PACK()
0756
0757 #undef BEGIN_TWO_BYTE_PACK
0758 #undef END_TWO_BYTE_PACK
0759
0760
0761 BasicBlockBits getBasicBlockBits() const {
0762 static_assert(sizeof(BasicBlockBits) == sizeof(unsigned short),
0763 "too many bits for Value::SubclassData");
0764 unsigned short ValueData = getSubclassDataFromValue();
0765 BasicBlockBits AsBits;
0766 memcpy(&AsBits, &ValueData, sizeof(AsBits));
0767 return AsBits;
0768 }
0769
0770
0771 void setBasicBlockBits(BasicBlockBits AsBits) {
0772 unsigned short D;
0773 memcpy(&D, &AsBits, sizeof(D));
0774 Value::setValueSubclassData(D);
0775 }
0776
0777
0778
0779
0780
0781
0782 void AdjustBlockAddressRefCount(int Amt) {
0783 BasicBlockBits Bits = getBasicBlockBits();
0784 Bits.BlockAddressRefCount += Amt;
0785 setBasicBlockBits(Bits);
0786 assert(Bits.BlockAddressRefCount < 255 && "Refcount wrap-around");
0787 }
0788
0789
0790
0791 void setValueSubclassData(unsigned short D) {
0792 Value::setValueSubclassData(D);
0793 }
0794 };
0795
0796
0797 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef)
0798
0799
0800
0801 BasicBlock::iterator skipDebugIntrinsics(BasicBlock::iterator It);
0802
0803 #ifdef NDEBUG
0804
0805
0806 inline void BasicBlock::validateInstrOrdering() const {}
0807 #endif
0808
0809
0810
0811
0812 template <> struct DenseMapInfo<BasicBlock::iterator> {
0813 static inline BasicBlock::iterator getEmptyKey() {
0814 return BasicBlock::iterator(nullptr);
0815 }
0816
0817 static inline BasicBlock::iterator getTombstoneKey() {
0818 BasicBlock::iterator It(nullptr);
0819 It.setHeadBit(true);
0820 return It;
0821 }
0822
0823 static unsigned getHashValue(const BasicBlock::iterator &It) {
0824 return DenseMapInfo<void *>::getHashValue(
0825 reinterpret_cast<void *>(It.getNodePtr())) ^
0826 (unsigned)It.getHeadBit();
0827 }
0828
0829 static bool isEqual(const BasicBlock::iterator &LHS,
0830 const BasicBlock::iterator &RHS) {
0831 return LHS == RHS && LHS.getHeadBit() == RHS.getHeadBit();
0832 }
0833 };
0834
0835 }
0836
0837 #endif