LLVM 24.0.0git
BasicBlock.cpp
Go to the documentation of this file.
1//===-- BasicBlock.cpp - Implement BasicBlock related methods -------------===//
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// This file implements the BasicBlock class for the IR library.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/IR/BasicBlock.h"
15#include "llvm/ADT/STLExtras.h"
16#include "llvm/ADT/Statistic.h"
17#include "llvm/IR/CFG.h"
18#include "llvm/IR/Constants.h"
22#include "llvm/IR/LLVMContext.h"
23#include "llvm/IR/Type.h"
25
26#include "LLVMContextImpl.h"
27
28using namespace llvm;
29
30#define DEBUG_TYPE "ir"
31STATISTIC(NumInstrRenumberings, "Number of renumberings across all blocks");
32
34 if (I->DebugMarker)
35 return I->DebugMarker;
36 DbgMarker *Marker = new DbgMarker();
37 Marker->MarkedInstr = I;
38 I->DebugMarker = Marker;
39 return Marker;
40}
41
42DbgMarker *BasicBlock::createMarker(InstListType::iterator It) {
43 if (It != end())
44 return createMarker(&*It);
45 DbgMarker *DM = getTrailingDbgRecords();
46 if (DM)
47 return DM;
48 DM = new DbgMarker();
49 setTrailingDbgRecords(DM);
50 return DM;
51}
52
54 // Iterate over all instructions in the instruction list, collecting debug
55 // info intrinsics and converting them to DbgRecords. Once we find a "real"
56 // instruction, attach all those DbgRecords to a DbgMarker in that
57 // instruction.
59 for (Instruction &I : make_early_inc_range(InstList)) {
61 // Convert this dbg.value to a DbgVariableRecord.
62 DbgVariableRecord *Value = new DbgVariableRecord(DVI);
63 DbgVarRecs.push_back(Value);
64 DVI->eraseFromParent();
65 continue;
66 }
67
69 DbgVarRecs.push_back(
70 new DbgLabelRecord(DLI->getLabel(), DLI->getDebugLoc()));
71 DLI->eraseFromParent();
72 continue;
73 }
74
75 if (DbgVarRecs.empty())
76 continue;
77
78 // Create a marker to store DbgRecords in.
79 createMarker(&I);
80 DbgMarker *Marker = I.DebugMarker;
81
82 for (DbgRecord *DVR : DbgVarRecs)
83 Marker->insertDbgRecord(DVR, false);
84
85 DbgVarRecs.clear();
86 }
87}
88
90 invalidateOrders();
91
92 // Iterate over the block, finding instructions annotated with DbgMarkers.
93 // Convert any attached DbgRecords to debug intrinsics and insert ahead of the
94 // instruction.
95 for (auto &Inst : *this) {
96 if (!Inst.DebugMarker)
97 continue;
98
99 DbgMarker &Marker = *Inst.DebugMarker;
100 for (DbgRecord &DR : Marker.getDbgRecordRange())
101 InstList.insert(Inst.getIterator(),
102 DR.createDebugIntrinsic(getModule(), nullptr));
103
104 Marker.eraseFromParent();
105 }
106
107 // Assume no trailing DbgRecords: we could technically create them at the end
108 // of the block, after a terminator, but this would be non-cannonical and
109 // indicates that something else is broken somewhere.
110 assert(!getTrailingDbgRecords());
111}
112
113#ifndef NDEBUG
114void BasicBlock::dumpDbgValues() const {
115 for (auto &Inst : *this) {
116 if (!Inst.DebugMarker)
117 continue;
118
119 dbgs() << "@ " << Inst.DebugMarker << " ";
120 Inst.DebugMarker->dump();
121 };
122}
123#endif
124
126 if (Function *F = getParent())
127 return F->getValueSymbolTable();
128 return nullptr;
129}
130
132 return getType()->getContext();
133}
134
136 BB->invalidateOrders();
137}
138
139// Explicit instantiation of SymbolTableListTraits since some of the methods
140// are not in the public header file...
141template class llvm::SymbolTableListTraits<
143
144BasicBlock::BasicBlock(LLVMContext &C, const Twine &Name, Function *NewParent,
145 BasicBlock *InsertBefore)
146 : Value(Type::getLabelTy(C), Value::BasicBlockVal), Parent(nullptr) {
147
148 if (NewParent)
149 insertInto(NewParent, InsertBefore);
150 else
151 assert(!InsertBefore &&
152 "Cannot insert block before another block with no function!");
153
154 end().getNodePtr()->setParent(this);
155 setName(Name);
156}
157
158void BasicBlock::insertInto(Function *NewParent, BasicBlock *InsertBefore) {
159 assert(NewParent && "Expected a parent");
160 assert(!Parent && "Already has a parent");
161
162 if (InsertBefore)
163 NewParent->insert(InsertBefore->getIterator(), this);
164 else
165 NewParent->insert(NewParent->end(), this);
166}
167
169 validateInstrOrdering();
170
171 // If the address of the block is taken and it is being deleted (e.g. because
172 // it is dead), this means that there is either a dangling constant expr
173 // hanging off the block, or an undefined use of the block (source code
174 // expecting the address of a label to keep the block alive even though there
175 // is no indirect branch). Handle these cases by zapping the BlockAddress
176 // nodes. There are no other possible uses at this point.
177 if (hasAddressTaken()) {
179
180 Constant *Replacement = ConstantInt::get(Type::getInt32Ty(getContext()), 1);
182 ConstantExpr::getIntToPtr(Replacement, BA->getType()));
183 BA->destroyConstant();
184 }
185
186 assert(getParent() == nullptr && "BasicBlock still linked into the program!");
187 dropAllReferences();
188 for (auto &Inst : *this) {
189 if (!Inst.DebugMarker)
190 continue;
191 Inst.DebugMarker->eraseFromParent();
192 }
193 InstList.clear();
194}
195
196void BasicBlock::setParent(Function *parent) {
197 // Set Parent=parent, updating instruction symtab entries as appropriate.
198 if (Parent != parent)
199 Number = parent ? parent->NextBlockNum++ : -1u;
200 InstList.setSymTabObject(&Parent, parent);
201}
202
204 getParent()->getBasicBlockList().remove(getIterator());
205}
206
208 return getParent()->getBasicBlockList().erase(getIterator());
209}
210
212 getParent()->splice(MovePos, getParent(), getIterator());
213}
214
215void BasicBlock::moveAfter(BasicBlock *MovePos) {
216 MovePos->getParent()->splice(++MovePos->getIterator(), getParent(),
217 getIterator());
218}
219
220const Module *BasicBlock::getModule() const {
221 return getParent()->getParent();
222}
223
225 return getModule()->getDataLayout();
226}
227
229 if (InstList.empty())
230 return nullptr;
231 const ReturnInst *RI = dyn_cast<ReturnInst>(&InstList.back());
232 if (!RI || RI == &InstList.front())
233 return nullptr;
234
235 const Instruction *Prev = RI->getPrevNode();
236 if (!Prev)
237 return nullptr;
238
239 if (Value *RV = RI->getReturnValue()) {
240 if (RV != Prev)
241 return nullptr;
242 }
243
244 if (auto *CI = dyn_cast<CallInst>(Prev)) {
245 if (CI->isMustTailCall())
246 return CI;
247 }
248 return nullptr;
249}
250
252 if (InstList.empty())
253 return nullptr;
254 auto *RI = dyn_cast<ReturnInst>(&InstList.back());
255 if (!RI || RI == &InstList.front())
256 return nullptr;
257
258 if (auto *CI = dyn_cast_or_null<CallInst>(RI->getPrevNode()))
259 if (Function *F = CI->getCalledFunction())
260 if (F->getIntrinsicID() == Intrinsic::experimental_deoptimize)
261 return CI;
262
263 return nullptr;
264}
265
267 const BasicBlock* BB = this;
269 Visited.insert(BB);
270 while (auto *Succ = BB->getUniqueSuccessor()) {
271 if (!Visited.insert(Succ).second)
272 return nullptr;
273 BB = Succ;
274 }
275 return BB->getTerminatingDeoptimizeCall();
276}
277
279 if (InstList.empty())
280 return nullptr;
281 for (const Instruction &I : *this)
283 return &I;
284 return nullptr;
285}
286
288 for (const Instruction &I : *this) {
289 if (isa<PHINode>(I))
290 continue;
291
292 BasicBlock::const_iterator It = I.getIterator();
293 // Set the head-inclusive bit to indicate that this iterator includes
294 // any debug-info at the start of the block. This is a no-op unless the
295 // appropriate CMake flag is set.
296 It.setHeadBit(true);
297 return It;
298 }
299
300 return end();
301}
302
304BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const {
305 for (const Instruction &I : *this) {
307 continue;
308
309 if (SkipPseudoOp && isa<PseudoProbeInst>(I))
310 continue;
311
312 BasicBlock::const_iterator It = I.getIterator();
313 // This position comes after any debug records, the head bit should remain
314 // unset.
315 assert(!It.getHeadBit());
316 return It;
317 }
318 return end();
319}
320
322BasicBlock::getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const {
323 for (const Instruction &I : *this) {
325 continue;
326
327 if (I.isLifetimeStartOrEnd())
328 continue;
329
330 if (SkipPseudoOp && isa<PseudoProbeInst>(I))
331 continue;
332
333 BasicBlock::const_iterator It = I.getIterator();
334 // This position comes after any debug records, the head bit should remain
335 // unset.
336 assert(!It.getHeadBit());
337
338 return It;
339 }
340 return end();
341}
342
344 const_iterator InsertPt = getFirstNonPHIIt();
345 if (InsertPt == end())
346 return end();
347
348 if (InsertPt->isEHPad()) ++InsertPt;
349 // Set the head-inclusive bit to indicate that this iterator includes
350 // any debug-info at the start of the block. This is a no-op unless the
351 // appropriate CMake flag is set.
352 InsertPt.setHeadBit(true);
353 return InsertPt;
354}
355
357 const_iterator InsertPt = getFirstNonPHIIt();
358 if (InsertPt == end())
359 return end();
360
361 if (InsertPt->isEHPad())
362 ++InsertPt;
363
364 if (isEntryBlock()) {
365 const_iterator End = end();
366 while (InsertPt != End &&
367 (isa<AllocaInst>(*InsertPt) || isa<DbgInfoIntrinsic>(*InsertPt) ||
368 isa<PseudoProbeInst>(*InsertPt))) {
369 if (const AllocaInst *AI = dyn_cast<AllocaInst>(&*InsertPt)) {
370 if (!AI->isStaticAlloca())
371 break;
372 }
373 ++InsertPt;
374 }
375 }
376
377 // Signal that this comes after any debug records.
378 InsertPt.setHeadBit(false);
379 return InsertPt;
380}
381
383 for (Instruction &I : *this)
384 I.dropAllReferences();
385}
386
388 const_pred_iterator PI = pred_begin(this), E = pred_end(this);
389 if (PI == E) return nullptr; // No preds.
390 const BasicBlock *ThePred = *PI;
391 ++PI;
392 return (PI == E) ? ThePred : nullptr /*multiple preds*/;
393}
394
396 const_pred_iterator PI = pred_begin(this), E = pred_end(this);
397 if (PI == E) return nullptr; // No preds.
398 const BasicBlock *PredBB = *PI;
399 ++PI;
400 for (;PI != E; ++PI) {
401 if (*PI != PredBB)
402 return nullptr;
403 // The same predecessor appears multiple times in the predecessor list.
404 // This is OK.
405 }
406 return PredBB;
407}
408
409bool BasicBlock::hasNPredecessors(unsigned N) const {
410 return hasNItems(pred_begin(this), pred_end(this), N);
411}
412
413bool BasicBlock::hasNPredecessorsOrMore(unsigned N) const {
414 return hasNItemsOrMore(pred_begin(this), pred_end(this), N);
415}
416
418 const_succ_iterator SI = succ_begin(this), E = succ_end(this);
419 if (SI == E) return nullptr; // no successors
420 const BasicBlock *TheSucc = *SI;
421 ++SI;
422 return (SI == E) ? TheSucc : nullptr /* multiple successors */;
423}
424
426 const_succ_iterator SI = succ_begin(this), E = succ_end(this);
427 if (SI == E) return nullptr; // No successors
428 const BasicBlock *SuccBB = *SI;
429 ++SI;
430 for (;SI != E; ++SI) {
431 if (*SI != SuccBB)
432 return nullptr;
433 // The same successor appears multiple times in the successor list.
434 // This is OK.
435 }
436 return SuccBB;
437}
438
440 PHINode *P = empty() ? nullptr : dyn_cast<PHINode>(&*begin());
441 return make_range<phi_iterator>(P, nullptr);
442}
443
445 bool KeepOneInputPHIs) {
446 // Use hasNUsesOrMore to bound the cost of this assertion for complex CFGs.
447 assert((hasNUsesOrMore(16) || llvm::is_contained(predecessors(this), Pred)) &&
448 "Pred is not a predecessor!");
449
450 // Return early if there are no PHI nodes to update.
451 if (empty() || !isa<PHINode>(begin()))
452 return;
453
454 unsigned NumPreds = cast<PHINode>(front()).getNumIncomingValues();
455 for (PHINode &Phi : make_early_inc_range(phis())) {
456 Phi.removeIncomingValue(Pred, !KeepOneInputPHIs);
457 if (KeepOneInputPHIs)
458 continue;
459
460 // If we have a single predecessor, removeIncomingValue may have erased the
461 // PHI node itself.
462 if (NumPreds == 1)
463 continue;
464
465 // Try to replace the PHI node with a constant value.
466 if (Value *PhiConstant = Phi.hasConstantValue()) {
467 Phi.replaceAllUsesWith(PhiConstant);
468 Phi.eraseFromParent();
469 }
470 }
471}
472
474 const_iterator FirstNonPHI = getFirstNonPHIIt();
475 if (isa<LandingPadInst>(FirstNonPHI))
476 return true;
477 // This is perhaps a little conservative because constructs like
478 // CleanupBlockInst are pretty easy to split. However, SplitBlockPredecessors
479 // cannot handle such things just yet.
480 if (FirstNonPHI->isEHPad())
481 return false;
482 return true;
483}
484
486 auto *Term = getTerminator();
487 // No terminator means the block is under construction.
488 if (!Term)
489 return true;
490
491 // If the block has no successors, there can be no instructions to hoist.
492 assert(Term->getNumSuccessors() > 0);
493
494 // Instructions should not be hoisted across special terminators, which may
495 // have side effects or return values.
496 return !Term->isSpecialTerminator();
497}
498
499bool BasicBlock::isEntryBlock() const {
500 const Function *F = getParent();
501 assert(F && "Block must have a parent function to use this API");
502 return this == &F->getEntryBlock();
503}
504
505BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) {
506 assert(getTerminator() && "Can't use splitBasicBlock on degenerate BB!");
507 assert(I != InstList.end() &&
508 "Trying to get me to create degenerate basic block!");
509
511 this->getNextNode());
512
513 // Save DebugLoc of split point before invalidating iterator.
514 DebugLoc Loc = I->getStableDebugLoc();
515 if (Loc)
516 Loc = Loc->getWithoutAtom();
517
518 // Move all of the specified instructions from the original basic block into
519 // the new basic block.
520 New->splice(New->end(), this, I, end());
521
522 // Add a branch instruction to the newly formed basic block.
523 UncondBrInst *BI = UncondBrInst::Create(New, this);
524 BI->setDebugLoc(Loc);
525
526 // Now we must loop through all of the successors of the New block (which
527 // _were_ the successors of the 'this' block), and update any PHI nodes in
528 // successors. If there were PHI nodes in the successors, then they need to
529 // know that incoming branches will be from New, not from Old (this).
530 //
531 New->replaceSuccessorsPhiUsesWith(this, New);
532 return New;
533}
534
535BasicBlock *BasicBlock::splitBasicBlockBefore(iterator I, const Twine &BBName) {
537 "Can't use splitBasicBlockBefore on degenerate BB!");
538 assert(I != InstList.end() &&
539 "Trying to get me to create degenerate basic block!");
540
541 assert((!isa<PHINode>(*I) || getSinglePredecessor()) &&
542 "cannot split on multi incoming phis");
543
545 // Save DebugLoc of split point before invalidating iterator.
546 DebugLoc Loc = I->getDebugLoc();
547 if (Loc)
548 Loc = Loc->getWithoutAtom();
549
550 // Move all of the specified instructions from the original basic block into
551 // the new basic block.
552 New->splice(New->end(), this, begin(), I);
553
554 // Loop through all of the predecessors of the 'this' block (which will be the
555 // predecessors of the New block), replace the specified successor 'this'
556 // block to point at the New block and update any PHI nodes in 'this' block.
557 // If there were PHI nodes in 'this' block, the PHI nodes are updated
558 // to reflect that the incoming branches will be from the New block and not
559 // from predecessors of the 'this' block.
560 // Save predecessors to separate vector before modifying them.
561 SmallVector<BasicBlock *, 4> Predecessors(predecessors(this));
562 for (BasicBlock *Pred : Predecessors) {
563 Instruction *TI = Pred->getTerminator();
564 TI->replaceSuccessorWith(this, New);
565 this->replacePhiUsesWith(Pred, New);
566 }
567 // Add a branch instruction from "New" to "this" Block.
568 UncondBrInst *BI = UncondBrInst::Create(this, New);
569 BI->setDebugLoc(Loc);
570
571 return New;
572}
573
576 for (Instruction &I : make_early_inc_range(make_range(FromIt, ToIt)))
577 I.eraseFromParent();
578 return ToIt;
579}
580
582 // N.B. This might not be a complete BasicBlock, so don't assume
583 // that it ends with a non-phi instruction.
584 for (Instruction &I : *this) {
586 if (!PN)
587 break;
588 PN->replaceIncomingBlockWith(Old, New);
589 }
590}
591
593 BasicBlock *New) {
594 Instruction *TI = getTerminatorOrNull();
595 if (!TI)
596 // Cope with being called on a BasicBlock that doesn't have a terminator
597 // yet. Clang's CodeGenFunction::EmitReturnBlock() likes to do this.
598 return;
599 for (BasicBlock *Succ : successors(TI))
600 Succ->replacePhiUsesWith(Old, New);
601}
602
604 this->replaceSuccessorsPhiUsesWith(this, New);
605}
606
607bool BasicBlock::isLandingPad() const {
608 return isa<LandingPadInst>(getFirstNonPHIIt());
609}
610
612 return dyn_cast<LandingPadInst>(getFirstNonPHIIt());
613}
614
615std::optional<uint64_t> BasicBlock::getIrrLoopHeaderWeight() const {
616 const Instruction *TI = getTerminator();
617 if (MDNode *MDIrrLoopHeader =
618 TI->getMetadata(LLVMContext::MD_irr_loop)) {
619 MDString *MDName = cast<MDString>(MDIrrLoopHeader->getOperand(0));
620 if (MDName->getString() == "loop_header_weight") {
621 auto *CI = mdconst::extract<ConstantInt>(MDIrrLoopHeader->getOperand(1));
622 return std::optional<uint64_t>(CI->getValue().getZExtValue());
623 }
624 }
625 return std::nullopt;
626}
627
629 while (isa<DbgInfoIntrinsic>(It))
630 ++It;
631 return It;
632}
633
635 unsigned Order = 0;
636 for (Instruction &I : *this)
637 I.Order = Order++;
638
639 // Set the bit to indicate that the instruction order valid and cached.
640 SubclassOptionalData |= InstrOrderValid;
641
642 NumInstrRenumberings++;
643}
644
646 // If we erase the terminator in a block, any DbgRecords will sink and "fall
647 // off the end", existing after any terminator that gets inserted. With
648 // dbg.value intrinsics we would just insert the terminator at end() and
649 // the dbg.values would come before the terminator. With DbgRecords, we must
650 // do this manually.
651 // To get out of this unfortunate form, whenever we insert a terminator,
652 // check whether there's anything trailing at the end and move those
653 // DbgRecords in front of the terminator.
654
655 // If there's no terminator, there's nothing to do.
656 Instruction *Term = getTerminatorOrNull();
657 if (!Term)
658 return;
659
660 // Are there any dangling DbgRecords?
661 DbgMarker *TrailingDbgRecords = getTrailingDbgRecords();
662 if (!TrailingDbgRecords)
663 return;
664
665 // Transfer DbgRecords from the trailing position onto the terminator.
666 createMarker(Term);
667 Term->DebugMarker->absorbDebugValues(*TrailingDbgRecords, false);
668 TrailingDbgRecords->eraseFromParent();
669 deleteTrailingDbgRecords();
670}
671
672void BasicBlock::spliceDebugInfoEmptyBlock(BasicBlock::iterator Dest,
673 BasicBlock *Src,
676 // Imagine the folowing:
677 //
678 // bb1:
679 // dbg.value(...
680 // ret i32 0
681 //
682 // If an optimisation pass attempts to splice the contents of the block from
683 // BB1->begin() to BB1->getTerminator(), then the dbg.value will be
684 // transferred to the destination.
685 // However, in the "new" DbgRecord format for debug-info, that range is empty:
686 // begin() returns an iterator to the terminator, as there will only be a
687 // single instruction in the block. We must piece together from the bits set
688 // in the iterators whether there was the intention to transfer any debug
689 // info.
690
691 assert(First == Last);
692 bool InsertAtHead = Dest.getHeadBit();
693 bool ReadFromHead = First.getHeadBit();
694
695 // If the source block is completely empty, including no terminator, then
696 // transfer any trailing DbgRecords that are still hanging around. This can
697 // occur when a block is optimised away and the terminator has been moved
698 // somewhere else.
699 if (Src->empty()) {
700 DbgMarker *SrcTrailingDbgRecords = Src->getTrailingDbgRecords();
701 if (!SrcTrailingDbgRecords)
702 return;
703
704 Dest->adoptDbgRecords(Src, Src->end(), InsertAtHead);
705 // adoptDbgRecords should have released the trailing DbgRecords.
706 assert(!Src->getTrailingDbgRecords());
707 return;
708 }
709
710 // There are instructions in this block; if the First iterator was
711 // with begin() / getFirstInsertionPt() then the caller intended debug-info
712 // at the start of the block to be transferred. Return otherwise.
713 if (Src->empty() || First != Src->begin() || !ReadFromHead)
714 return;
715
716 // Is there actually anything to transfer?
717 if (!First->hasDbgRecords())
718 return;
719
720 createMarker(Dest)->absorbDebugValues(*First->DebugMarker, InsertAtHead);
721}
722
723void BasicBlock::spliceDebugInfo(BasicBlock::iterator Dest, BasicBlock *Src,
726 /* Do a quick normalisation before calling the real splice implementation. We
727 might be operating on a degenerate basic block that has no instructions
728 in it, a legitimate transient state. In that case, Dest will be end() and
729 any DbgRecords temporarily stored in the TrailingDbgRecords map in
730 LLVMContext. We might illustrate it thus:
731
732 Dest
733 |
734 this-block: ~~~~~~~~
735 Src-block: ++++B---B---B---B:::C
736 | |
737 First Last
738
739 However: does the caller expect the "~" DbgRecords to end up before or
740 after the spliced segment? This is communciated in the "Head" bit of Dest,
741 which signals whether the caller called begin() or end() on this block.
742
743 If the head bit is set, then all is well, we leave DbgRecords trailing just
744 like how dbg.value instructions would trail after instructions spliced to
745 the beginning of this block.
746
747 If the head bit isn't set, then try to jam the "~" DbgRecords onto the
748 front of the First instruction, then splice like normal, which joins the
749 "~" DbgRecords with the "+" DbgRecords. However if the "+" DbgRecords are
750 supposed to be left behind in Src, then:
751 * detach the "+" DbgRecords,
752 * move the "~" DbgRecords onto First,
753 * splice like normal,
754 * replace the "+" DbgRecords onto the Last position.
755 Complicated, but gets the job done. */
756
757 // If we're inserting at end(), and not in front of dangling DbgRecords, then
758 // move the DbgRecords onto "First". They'll then be moved naturally in the
759 // splice process.
760 DbgMarker *MoreDanglingDbgRecords = nullptr;
761 DbgMarker *OurTrailingDbgRecords = getTrailingDbgRecords();
762 if (Dest == end() && !Dest.getHeadBit() && OurTrailingDbgRecords) {
763 // Are the "+" DbgRecords not supposed to move? If so, detach them
764 // temporarily.
765 if (!First.getHeadBit() && First->hasDbgRecords()) {
766 MoreDanglingDbgRecords = Src->getMarker(First);
767 MoreDanglingDbgRecords->removeFromParent();
768 }
769
770 if (First->hasDbgRecords()) {
771 // Place them at the front, it would look like this:
772 // Dest
773 // |
774 // this-block:
775 // Src-block: ~~~~~~~~++++B---B---B---B:::C
776 // | |
777 // First Last
778 First->adoptDbgRecords(this, end(), true);
779 } else {
780 // No current marker, create one and absorb in. (FIXME: we can avoid an
781 // allocation in the future).
782 DbgMarker *CurMarker = Src->createMarker(&*First);
783 CurMarker->absorbDebugValues(*OurTrailingDbgRecords, false);
784 OurTrailingDbgRecords->eraseFromParent();
785 }
786 deleteTrailingDbgRecords();
787 First.setHeadBit(true);
788 }
789
790 // Call the main debug-info-splicing implementation.
791 spliceDebugInfoImpl(Dest, Src, First, Last);
792
793 // Do we have some "+" DbgRecords hanging around that weren't supposed to
794 // move, and we detached to make things easier?
795 if (!MoreDanglingDbgRecords)
796 return;
797
798 // FIXME: we could avoid an allocation here sometimes. (adoptDbgRecords
799 // requires an iterator).
800 DbgMarker *LastMarker = Src->createMarker(Last);
801 LastMarker->absorbDebugValues(*MoreDanglingDbgRecords, true);
802 MoreDanglingDbgRecords->eraseFromParent();
803}
804
805void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src,
808 // Find out where to _place_ these dbg.values; if InsertAtHead is specified,
809 // this will be at the start of Dest's debug value range, otherwise this is
810 // just Dest's marker.
811 bool InsertAtHead = Dest.getHeadBit();
812 bool ReadFromHead = First.getHeadBit();
813 // Use this flag to signal the abnormal case, where we don't want to copy the
814 // DbgRecords ahead of the "Last" position.
815 bool ReadFromTail = !Last.getTailBit();
816 bool LastIsEnd = (Last == Src->end());
817
818 /*
819 Here's an illustration of what we're about to do. We have two blocks, this
820 and Src, and two segments of list. Each instruction is marked by a capital
821 while potential DbgRecord debug-info is marked out by "-" characters and a
822 few other special characters (+:=) where I want to highlight what's going
823 on.
824
825 Dest
826 |
827 this-block: A----A----A ====A----A----A----A---A---A
828 Src-block ++++B---B---B---B:::C
829 | |
830 First Last
831
832 The splice method is going to take all the instructions from First up to
833 (but not including) Last and insert them in _front_ of Dest, forming one
834 long list. All the DbgRecords attached to instructions _between_ First and
835 Last need no maintenence. However, we have to do special things with the
836 DbgRecords marked with the +:= characters. We only have three positions:
837 should the "+" DbgRecords be transferred, and if so to where? Do we move the
838 ":" DbgRecords? Would they go in front of the "=" DbgRecords, or should the
839 "=" DbgRecords go before "+" DbgRecords?
840
841 We're told which way it should be by the bits carried in the iterators. The
842 "Head" bit indicates whether the specified position is supposed to be at the
843 front of the attached DbgRecords (true) or not (false). The Tail bit is true
844 on the other end of a range: is the range intended to include DbgRecords up
845 to the end (false) or not (true).
846
847 FIXME: the tail bit doesn't need to be distinct from the head bit, we could
848 combine them.
849
850 Here are some examples of different configurations:
851
852 Dest.Head = true, First.Head = true, Last.Tail = false
853
854 this-block: A----A----A++++B---B---B---B:::====A----A----A----A---A---A
855 | |
856 First Dest
857
858 Wheras if we didn't want to read from the Src list,
859
860 Dest.Head = true, First.Head = false, Last.Tail = false
861
862 this-block: A----A----AB---B---B---B:::====A----A----A----A---A---A
863 | |
864 First Dest
865
866 Or if we didn't want to insert at the head of Dest:
867
868 Dest.Head = false, First.Head = false, Last.Tail = false
869
870 this-block: A----A----A====B---B---B---B:::A----A----A----A---A---A
871 | |
872 First Dest
873
874 Tests for these various configurations can be found in the unit test file
875 BasicBlockDbgInfoTest.cpp.
876
877 */
878
879 // Detach the marker at Dest -- this lets us move the "====" DbgRecords
880 // around.
881 DbgMarker *DestMarker = nullptr;
882 if ((DestMarker = getMarker(Dest))) {
883 if (Dest == end()) {
884 assert(DestMarker == getTrailingDbgRecords());
885 deleteTrailingDbgRecords();
886 } else {
887 DestMarker->removeFromParent();
888 }
889 }
890
891 // If we're moving the tail range of DbgRecords (":::"), absorb them into the
892 // front of the DbgRecords at Dest.
893 if (ReadFromTail && Src->getMarker(Last)) {
894 DbgMarker *FromLast = Src->getMarker(Last);
895 if (LastIsEnd) {
896 if (Dest == end()) {
897 // Abosrb the trailing markers from Src.
898 assert(FromLast == Src->getTrailingDbgRecords());
899 createMarker(Dest)->absorbDebugValues(*FromLast, true);
900 FromLast->eraseFromParent();
901 Src->deleteTrailingDbgRecords();
902 } else {
903 // adoptDbgRecords will release any trailers.
904 Dest->adoptDbgRecords(Src, Last, true);
905 }
906 assert(!Src->getTrailingDbgRecords());
907 } else {
908 // FIXME: can we use adoptDbgRecords here to reduce allocations?
909 DbgMarker *OntoDest = createMarker(Dest);
910 OntoDest->absorbDebugValues(*FromLast, true);
911 }
912 }
913
914 // If we're _not_ reading from the head of First, i.e. the "++++" DbgRecords,
915 // move their markers onto Last. They remain in the Src block. No action
916 // needed.
917 if (!ReadFromHead && First->hasDbgRecords()) {
918 if (Last != Src->end()) {
919 Last->adoptDbgRecords(Src, First, true);
920 } else {
921 DbgMarker *OntoLast = Src->createMarker(Last);
922 DbgMarker *FromFirst = Src->createMarker(First);
923 // Always insert at front of Last.
924 OntoLast->absorbDebugValues(*FromFirst, true);
925 }
926 }
927
928 // Finally, do something with the "====" DbgRecords we detached.
929 if (DestMarker) {
930 if (InsertAtHead) {
931 // Insert them at the end of the DbgRecords at Dest. The "::::" DbgRecords
932 // might be in front of them.
933 DbgMarker *NewDestMarker = createMarker(Dest);
934 NewDestMarker->absorbDebugValues(*DestMarker, false);
935 } else {
936 // Insert them right at the start of the range we moved, ahead of First
937 // and the "++++" DbgRecords.
938 // This also covers the rare circumstance where we insert at end(), and we
939 // did not generate the iterator with begin() / getFirstInsertionPt(),
940 // meaning any trailing debug-info at the end of the block would
941 // "normally" have been pushed in front of "First". We move it there now.
942 DbgMarker *FirstMarker = createMarker(First);
943 FirstMarker->absorbDebugValues(*DestMarker, true);
944 }
945 DestMarker->eraseFromParent();
946 }
947}
948
949void BasicBlock::splice(iterator Dest, BasicBlock *Src, iterator First,
950 iterator Last) {
951#ifdef EXPENSIVE_CHECKS
952 // Check that First is before Last.
953 auto FromBBEnd = Src->end();
954 for (auto It = First; It != Last; ++It)
955 assert(It != FromBBEnd && "FromBeginIt not before FromEndIt!");
956#endif // EXPENSIVE_CHECKS
957
958 // Lots of horrible special casing for empty transfers: the dbg.values between
959 // two positions could be spliced in dbg.value mode.
960 if (First == Last) {
961 spliceDebugInfoEmptyBlock(Dest, Src, First, Last);
962 return;
963 }
964
965 spliceDebugInfo(Dest, Src, First, Last);
966
967 // And move the instructions.
968 getInstList().splice(Dest, Src->getInstList(), First, Last);
969
970 flushTerminatorDbgRecords();
971}
972
974 assert(I->getParent() == this);
975
976 iterator NextIt = std::next(I->getIterator());
977 DbgMarker *NextMarker = createMarker(NextIt);
978 NextMarker->insertDbgRecord(DR, true);
979}
980
982 InstListType::iterator Where) {
983 assert(Where == end() || Where->getParent() == this);
984 bool InsertAtHead = Where.getHeadBit();
985 DbgMarker *M = createMarker(Where);
986 M->insertDbgRecord(DR, InsertAtHead);
987}
988
990 return getMarker(std::next(I->getIterator()));
991}
992
993DbgMarker *BasicBlock::getMarker(InstListType::iterator It) {
994 if (It == end()) {
995 DbgMarker *DM = getTrailingDbgRecords();
996 return DM;
997 }
998 return It->DebugMarker;
999}
1000
1002 Instruction *I, std::optional<DbgRecord::self_iterator> Pos) {
1003 // "I" was originally removed from a position where it was
1004 // immediately in front of Pos. Any DbgRecords on that position then "fell
1005 // down" onto Pos. "I" has been re-inserted at the front of that wedge of
1006 // DbgRecords, shuffle them around to represent the original positioning. To
1007 // illustrate:
1008 //
1009 // Instructions: I1---I---I0
1010 // DbgRecords: DDD DDD
1011 //
1012 // Instruction "I" removed,
1013 //
1014 // Instructions: I1------I0
1015 // DbgRecords: DDDDDD
1016 // ^Pos
1017 //
1018 // Instruction "I" re-inserted (now):
1019 //
1020 // Instructions: I1---I------I0
1021 // DbgRecords: DDDDDD
1022 // ^Pos
1023 //
1024 // After this method completes:
1025 //
1026 // Instructions: I1---I---I0
1027 // DbgRecords: DDD DDD
1028
1029 // This happens if there were no DbgRecords on I0. Are there now DbgRecords
1030 // there?
1031 if (!Pos) {
1032 DbgMarker *NextMarker = getNextMarker(I);
1033 if (!NextMarker)
1034 return;
1035 if (NextMarker->StoredDbgRecords.empty())
1036 return;
1037 // There are DbgMarkers there now -- they fell down from "I".
1038 DbgMarker *ThisMarker = createMarker(I);
1039 ThisMarker->absorbDebugValues(*NextMarker, false);
1040 return;
1041 }
1042
1043 // Is there even a range of DbgRecords to move?
1044 DbgMarker *DM = (*Pos)->getMarker();
1045 auto Range = make_range(DM->StoredDbgRecords.begin(), (*Pos));
1046 if (Range.begin() == Range.end())
1047 return;
1048
1049 // Otherwise: splice.
1050 DbgMarker *ThisMarker = createMarker(I);
1051 assert(ThisMarker->StoredDbgRecords.empty());
1052 ThisMarker->absorbDebugValues(Range, *DM, true);
1053}
1054
1055#ifndef NDEBUG
1056/// In asserts builds, this checks the numbering. In non-asserts builds, it
1057/// is defined as a no-op inline function in BasicBlock.h.
1059 if (!isInstrOrderValid())
1060 return;
1061 const Instruction *Prev = nullptr;
1062 for (const Instruction &I : *this) {
1063 assert((!Prev || Prev->comesBefore(&I)) &&
1064 "cached instruction ordering is incorrect");
1065 Prev = &I;
1066 }
1067}
1068#endif
1069
1071 getContext().pImpl->setTrailingDbgRecords(this, foo);
1072}
1073
1075 return getContext().pImpl->getTrailingDbgRecords(this);
1076}
1077
1079 getContext().pImpl->deleteTrailingDbgRecords(this);
1080}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
VarLocInsertPt getNextNode(const DbgRecord *DVR)
static const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static RegisterPass< DebugifyModulePass > DM("debugify", "Attach debug info to everything")
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
#define P(N)
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file contains some templates that are useful if you are working with the STL at all.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
an instruction to allocate memory on the stack
LLVM Basic Block Representation.
Definition BasicBlock.h:62
LLVM_ABI BasicBlock::iterator erase(BasicBlock::iterator FromIt, BasicBlock::iterator ToIt)
Erases a range of instructions from FromIt to (not including) ToIt.
LLVM_ABI void replaceSuccessorsPhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block's successors to refer to basic block New instead of basic bl...
LLVM_ABI void deleteTrailingDbgRecords()
Delete any trailing DbgRecords at the end of this block, see setTrailingDbgRecords.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:515
LLVM_ABI const LandingPadInst * getLandingPadInst() const
Return the landingpad instruction associated with the landing pad.
LLVM_ABI void setTrailingDbgRecords(DbgMarker *M)
Record that the collection of DbgRecords in M "trails" after the last instruction of this block.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI BasicBlock * splitBasicBlock(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction.
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI void renumberInstructions()
Renumber instructions and mark the ordering as valid.
LLVM_ABI DbgMarker * createMarker(Instruction *I)
Attach a DbgMarker to the given instruction.
LLVM_ABI BasicBlock * splitBasicBlockBefore(iterator I, const Twine &BBName="")
Split the basic block into two basic blocks at the specified instruction and insert the new basic blo...
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI void insertDbgRecordBefore(DbgRecord *DR, InstListType::iterator Here)
Insert a DbgRecord into a block at the position given by Here.
void invalidateOrders()
Mark instruction ordering invalid. Done on every instruction insert.
Definition BasicBlock.h:719
friend void Instruction::removeFromParent()
LLVM_ABI void convertToNewDbgValues()
Convert variable location debugging information stored in dbg.value intrinsics into DbgMarkers / DbgR...
InstListType::const_iterator const_iterator
Definition BasicBlock.h:171
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
friend BasicBlock::iterator Instruction::eraseFromParent()
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI ValueSymbolTable * getValueSymbolTable()
Returns a pointer to the symbol table if one exists.
LLVM_ABI void moveAfter(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it right after MovePos in the function M...
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode or a debug intrinsic,...
LLVM_ABI bool hasNPredecessors(unsigned N) const
Return true if this block has exactly N predecessors.
LLVM_ABI void convertFromNewDbgValues()
Convert variable location debugging information stored in DbgMarkers and DbgRecords into the dbg....
LLVM_ABI const BasicBlock * getUniqueSuccessor() const
Return the successor of this block if it has a unique successor.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
LLVM_ABI std::optional< uint64_t > getIrrLoopHeaderWeight() const
LLVM_ABI void dumpDbgValues() const
LLVM_ABI const CallInst * getTerminatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize prior to the terminating return in...
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
LLVM_ABI const BasicBlock * getSingleSuccessor() const
Return the successor of this block if it has a single successor.
LLVM_ABI void flushTerminatorDbgRecords()
Eject any debug-info trailing at the end of a block.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
LLVM_ABI void insertDbgRecordAfter(DbgRecord *DR, Instruction *I)
Insert a DbgRecord into a block at the position given by I.
LLVM_ABI void validateInstrOrdering() const
Asserts that instruction order numbers are marked invalid, or that they are in ascending order.
LLVM_ABI DbgMarker * getMarker(InstListType::iterator It)
Return the DbgMarker for the position given by It, so that DbgRecords can be inserted there.
LLVM_ABI ~BasicBlock()
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
LLVM_ABI const_iterator getFirstNonPHIOrDbgOrAlloca() const
Returns an iterator to the first instruction in this block that is not a PHINode, a debug intrinsic,...
LLVM_ABI void dropAllReferences()
Cause all subinstructions to "let go" of all the references that said subinstructions are maintaining...
LLVM_ABI void reinsertInstInDbgRecords(Instruction *I, std::optional< DbgRecord::self_iterator > Pos)
In rare circumstances instructions can be speculatively removed from blocks, and then be re-inserted ...
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
Definition BasicBlock.h:373
LLVM_ABI InstListType::const_iterator getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp=true) const
Returns a pointer to the first instruction in this block that is not a PHINode, a debug intrinsic,...
LLVM_ABI bool isLandingPad() const
Return true if this basic block is a landing pad.
LLVM_ABI DbgMarker * getTrailingDbgRecords()
Fetch the collection of DbgRecords that "trail" after the last instruction of this block,...
LLVM_ABI bool canSplitPredecessors() const
LLVM_ABI const CallInst * getTerminatingMustTailCall() const
Returns the call instruction marked 'musttail' prior to the terminating return instruction of this ba...
friend BasicBlock::iterator Instruction::insertInto(BasicBlock *BB, BasicBlock::iterator It)
LLVM_ABI bool isLegalToHoistInto() const
Return true if it is legal to hoist instructions into this block.
LLVM_ABI bool hasNPredecessorsOrMore(unsigned N) const
Return true if this block has N predecessors or more.
LLVM_ABI const CallInst * getPostdominatingDeoptimizeCall() const
Returns the call instruction calling @llvm.experimental.deoptimize that is present either in current ...
LLVM_ABI DbgMarker * getNextMarker(Instruction *I)
Return the DbgMarker for the position that comes after I.
LLVM_ABI const Instruction * getFirstMayFaultInst() const
Returns the first potential AsynchEH faulty instruction currently it checks for loads/stores (which m...
void splice(BasicBlock::iterator ToIt, BasicBlock *FromBB)
Transfer all instructions from FromBB to this basic block at ToIt.
Definition BasicBlock.h:644
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
The address of a basic block.
Definition Constants.h:1088
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
This class represents a function call, abstracting a target machine's calling convention.
static LLVM_ABI Constant * getIntToPtr(Constant *C, Type *Ty, bool OnlyIfReduced=false)
LLVM_ABI void destroyConstant()
Called if some element of this constant is no longer valid.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This represents the llvm.dbg.label instruction.
Records a position in IR for a source label (DILabel).
Per-instruction record of debug-info.
LLVM_ABI void removeFromParent()
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
LLVM_ABI void eraseFromParent()
LLVM_ABI iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange()
Produce a range over all the DbgRecords in this Marker.
LLVM_ABI void insertDbgRecord(DbgRecord *New, bool InsertAtHead)
Insert a DbgRecord into this DbgMarker, at the end of the list.
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
LLVM_ABI void absorbDebugValues(DbgMarker &Src, bool InsertAtHead)
Transfer any DbgRecords from Src into this DbgMarker.
Base class for non-instruction debug metadata records that have positions within IR.
This is the common base class for debug info intrinsics for variables.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
A debug info location.
Definition DebugLoc.h:126
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition Function.h:745
Function::iterator insert(Function::iterator Position, BasicBlock *BB)
Insert BB in the basic block list at Position.
Definition Function.h:739
iterator end()
Definition Function.h:839
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI bool comesBefore(const Instruction *Other) const
Given an instruction Other in the same basic block as this instruction, return true if this instructi...
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
The landingpad instruction holds all of the information necessary to generate correct exception handl...
Metadata node.
Definition Metadata.h:1069
A single uniqued string.
Definition Metadata.h:722
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:633
void replaceIncomingBlockWith(const BasicBlock *Old, BasicBlock *New)
Replace every incoming basic block Old to basic block New.
Return a value (possibly void), from a function.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
Unconditional Branch instruction.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
This class provides a symbol table of name/value pairs.
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
self_iterator getIterator()
Definition ilist_node.h:123
A range adaptor for a pair of iterators.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
bool empty() const
Definition BasicBlock.h:101
iterator end() const
Definition BasicBlock.h:89
LLVM_ABI iterator begin() const
LLVM_ABI Instruction * getTerminator() const
LLVM_ABI Instruction & front() const
This is an optimization pass for GlobalISel generic memory operations.
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:633
PredIterator< const BasicBlock, Value::const_user_iterator > const_pred_iterator
Definition CFG.h:94
bool hasNItemsOrMore(IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;}, std::enable_if_t< !std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< std::remove_reference_t< decltype(Begin)> >::iterator_category >::value, void > *=nullptr)
Return true if the sequence [Begin, End) has N or more items.
Definition STLExtras.h:2638
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
LLVM_ABI BasicBlock::iterator skipDebugIntrinsics(BasicBlock::iterator It)
Advance It while it points to a debug instruction and return the result.
bool hasNItems(IterTy &&Begin, IterTy &&End, unsigned N, Pred &&ShouldBeCounted=[](const decltype(*std::declval< IterTy >()) &) { return true;}, std::enable_if_t< !std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< std::remove_reference_t< decltype(Begin)> >::iterator_category >::value, void > *=nullptr)
Return true if the sequence [Begin, End) has exactly N items.
Definition STLExtras.h:2613
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
RNSuccIterator< NodeRef, BlockT, RegionT > succ_begin(NodeRef Node)
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
Definition ModRef.h:74
RNSuccIterator< NodeRef, BlockT, RegionT > succ_end(NodeRef Node)
void invalidateParentIListOrdering(ParentClass *Parent)
Notify basic blocks when an instruction is inserted.
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
Instruction::const_succ_iterator const_succ_iterator
Definition CFG.h:127
#define N
Option to add extra bits to the ilist_iterator.
Option to add a pointer to this list's owner in every node.