LLVM 23.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
287const Instruction* BasicBlock::getFirstNonPHI() const {
288 for (const Instruction &I : *this)
289 if (!isa<PHINode>(I))
290 return &I;
291 return nullptr;
292}
293
294Instruction *BasicBlock::getFirstNonPHI() {
295 for (Instruction &I : *this)
296 if (!isa<PHINode>(I))
297 return &I;
298 return nullptr;
299}
300
302 for (const Instruction &I : *this) {
303 if (isa<PHINode>(I))
304 continue;
305
306 BasicBlock::const_iterator It = I.getIterator();
307 // Set the head-inclusive bit to indicate that this iterator includes
308 // any debug-info at the start of the block. This is a no-op unless the
309 // appropriate CMake flag is set.
310 It.setHeadBit(true);
311 return It;
312 }
313
314 return end();
315}
316
318BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const {
319 for (const Instruction &I : *this) {
321 continue;
322
323 if (SkipPseudoOp && isa<PseudoProbeInst>(I))
324 continue;
325
326 BasicBlock::const_iterator It = I.getIterator();
327 // This position comes after any debug records, the head bit should remain
328 // unset.
329 assert(!It.getHeadBit());
330 return It;
331 }
332 return end();
333}
334
336BasicBlock::getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const {
337 for (const Instruction &I : *this) {
339 continue;
340
341 if (I.isLifetimeStartOrEnd())
342 continue;
343
344 if (SkipPseudoOp && isa<PseudoProbeInst>(I))
345 continue;
346
347 BasicBlock::const_iterator It = I.getIterator();
348 // This position comes after any debug records, the head bit should remain
349 // unset.
350 assert(!It.getHeadBit());
351
352 return It;
353 }
354 return end();
355}
356
358 const_iterator InsertPt = getFirstNonPHIIt();
359 if (InsertPt == end())
360 return end();
361
362 if (InsertPt->isEHPad()) ++InsertPt;
363 // Set the head-inclusive bit to indicate that this iterator includes
364 // any debug-info at the start of the block. This is a no-op unless the
365 // appropriate CMake flag is set.
366 InsertPt.setHeadBit(true);
367 return InsertPt;
368}
369
371 const_iterator InsertPt = getFirstNonPHIIt();
372 if (InsertPt == end())
373 return end();
374
375 if (InsertPt->isEHPad())
376 ++InsertPt;
377
378 if (isEntryBlock()) {
379 const_iterator End = end();
380 while (InsertPt != End &&
381 (isa<AllocaInst>(*InsertPt) || isa<DbgInfoIntrinsic>(*InsertPt) ||
382 isa<PseudoProbeInst>(*InsertPt))) {
383 if (const AllocaInst *AI = dyn_cast<AllocaInst>(&*InsertPt)) {
384 if (!AI->isStaticAlloca())
385 break;
386 }
387 ++InsertPt;
388 }
389 }
390
391 // Signal that this comes after any debug records.
392 InsertPt.setHeadBit(false);
393 return InsertPt;
394}
395
397 for (Instruction &I : *this)
398 I.dropAllReferences();
399}
400
402 const_pred_iterator PI = pred_begin(this), E = pred_end(this);
403 if (PI == E) return nullptr; // No preds.
404 const BasicBlock *ThePred = *PI;
405 ++PI;
406 return (PI == E) ? ThePred : nullptr /*multiple preds*/;
407}
408
410 const_pred_iterator PI = pred_begin(this), E = pred_end(this);
411 if (PI == E) return nullptr; // No preds.
412 const BasicBlock *PredBB = *PI;
413 ++PI;
414 for (;PI != E; ++PI) {
415 if (*PI != PredBB)
416 return nullptr;
417 // The same predecessor appears multiple times in the predecessor list.
418 // This is OK.
419 }
420 return PredBB;
421}
422
423bool BasicBlock::hasNPredecessors(unsigned N) const {
424 return hasNItems(pred_begin(this), pred_end(this), N);
425}
426
427bool BasicBlock::hasNPredecessorsOrMore(unsigned N) const {
428 return hasNItemsOrMore(pred_begin(this), pred_end(this), N);
429}
430
432 const_succ_iterator SI = succ_begin(this), E = succ_end(this);
433 if (SI == E) return nullptr; // no successors
434 const BasicBlock *TheSucc = *SI;
435 ++SI;
436 return (SI == E) ? TheSucc : nullptr /* multiple successors */;
437}
438
440 const_succ_iterator SI = succ_begin(this), E = succ_end(this);
441 if (SI == E) return nullptr; // No successors
442 const BasicBlock *SuccBB = *SI;
443 ++SI;
444 for (;SI != E; ++SI) {
445 if (*SI != SuccBB)
446 return nullptr;
447 // The same successor appears multiple times in the successor list.
448 // This is OK.
449 }
450 return SuccBB;
451}
452
454 PHINode *P = empty() ? nullptr : dyn_cast<PHINode>(&*begin());
455 return make_range<phi_iterator>(P, nullptr);
456}
457
459 bool KeepOneInputPHIs) {
460 // Use hasNUsesOrMore to bound the cost of this assertion for complex CFGs.
461 assert((hasNUsesOrMore(16) || llvm::is_contained(predecessors(this), Pred)) &&
462 "Pred is not a predecessor!");
463
464 // Return early if there are no PHI nodes to update.
465 if (empty() || !isa<PHINode>(begin()))
466 return;
467
468 unsigned NumPreds = cast<PHINode>(front()).getNumIncomingValues();
469 for (PHINode &Phi : make_early_inc_range(phis())) {
470 Phi.removeIncomingValue(Pred, !KeepOneInputPHIs);
471 if (KeepOneInputPHIs)
472 continue;
473
474 // If we have a single predecessor, removeIncomingValue may have erased the
475 // PHI node itself.
476 if (NumPreds == 1)
477 continue;
478
479 // Try to replace the PHI node with a constant value.
480 if (Value *PhiConstant = Phi.hasConstantValue()) {
481 Phi.replaceAllUsesWith(PhiConstant);
482 Phi.eraseFromParent();
483 }
484 }
485}
486
488 const_iterator FirstNonPHI = getFirstNonPHIIt();
489 if (isa<LandingPadInst>(FirstNonPHI))
490 return true;
491 // This is perhaps a little conservative because constructs like
492 // CleanupBlockInst are pretty easy to split. However, SplitBlockPredecessors
493 // cannot handle such things just yet.
494 if (FirstNonPHI->isEHPad())
495 return false;
496 return true;
497}
498
500 auto *Term = getTerminator();
501 // No terminator means the block is under construction.
502 if (!Term)
503 return true;
504
505 // If the block has no successors, there can be no instructions to hoist.
506 assert(Term->getNumSuccessors() > 0);
507
508 // Instructions should not be hoisted across special terminators, which may
509 // have side effects or return values.
510 return !Term->isSpecialTerminator();
511}
512
513bool BasicBlock::isEntryBlock() const {
514 const Function *F = getParent();
515 assert(F && "Block must have a parent function to use this API");
516 return this == &F->getEntryBlock();
517}
518
519BasicBlock *BasicBlock::splitBasicBlock(iterator I, const Twine &BBName) {
520 assert(getTerminator() && "Can't use splitBasicBlock on degenerate BB!");
521 assert(I != InstList.end() &&
522 "Trying to get me to create degenerate basic block!");
523
525 this->getNextNode());
526
527 // Save DebugLoc of split point before invalidating iterator.
528 DebugLoc Loc = I->getStableDebugLoc();
529 if (Loc)
530 Loc = Loc->getWithoutAtom();
531
532 // Move all of the specified instructions from the original basic block into
533 // the new basic block.
534 New->splice(New->end(), this, I, end());
535
536 // Add a branch instruction to the newly formed basic block.
537 UncondBrInst *BI = UncondBrInst::Create(New, this);
538 BI->setDebugLoc(Loc);
539
540 // Now we must loop through all of the successors of the New block (which
541 // _were_ the successors of the 'this' block), and update any PHI nodes in
542 // successors. If there were PHI nodes in the successors, then they need to
543 // know that incoming branches will be from New, not from Old (this).
544 //
545 New->replaceSuccessorsPhiUsesWith(this, New);
546 return New;
547}
548
549BasicBlock *BasicBlock::splitBasicBlockBefore(iterator I, const Twine &BBName) {
551 "Can't use splitBasicBlockBefore on degenerate BB!");
552 assert(I != InstList.end() &&
553 "Trying to get me to create degenerate basic block!");
554
555 assert((!isa<PHINode>(*I) || getSinglePredecessor()) &&
556 "cannot split on multi incoming phis");
557
559 // Save DebugLoc of split point before invalidating iterator.
560 DebugLoc Loc = I->getDebugLoc();
561 if (Loc)
562 Loc = Loc->getWithoutAtom();
563
564 // Move all of the specified instructions from the original basic block into
565 // the new basic block.
566 New->splice(New->end(), this, begin(), I);
567
568 // Loop through all of the predecessors of the 'this' block (which will be the
569 // predecessors of the New block), replace the specified successor 'this'
570 // block to point at the New block and update any PHI nodes in 'this' block.
571 // If there were PHI nodes in 'this' block, the PHI nodes are updated
572 // to reflect that the incoming branches will be from the New block and not
573 // from predecessors of the 'this' block.
574 // Save predecessors to separate vector before modifying them.
575 SmallVector<BasicBlock *, 4> Predecessors(predecessors(this));
576 for (BasicBlock *Pred : Predecessors) {
577 Instruction *TI = Pred->getTerminator();
578 TI->replaceSuccessorWith(this, New);
579 this->replacePhiUsesWith(Pred, New);
580 }
581 // Add a branch instruction from "New" to "this" Block.
582 UncondBrInst *BI = UncondBrInst::Create(this, New);
583 BI->setDebugLoc(Loc);
584
585 return New;
586}
587
590 for (Instruction &I : make_early_inc_range(make_range(FromIt, ToIt)))
591 I.eraseFromParent();
592 return ToIt;
593}
594
596 // N.B. This might not be a complete BasicBlock, so don't assume
597 // that it ends with a non-phi instruction.
598 for (Instruction &I : *this) {
600 if (!PN)
601 break;
602 PN->replaceIncomingBlockWith(Old, New);
603 }
604}
605
607 BasicBlock *New) {
608 Instruction *TI = getTerminatorOrNull();
609 if (!TI)
610 // Cope with being called on a BasicBlock that doesn't have a terminator
611 // yet. Clang's CodeGenFunction::EmitReturnBlock() likes to do this.
612 return;
613 for (BasicBlock *Succ : successors(TI))
614 Succ->replacePhiUsesWith(Old, New);
615}
616
618 this->replaceSuccessorsPhiUsesWith(this, New);
619}
620
621bool BasicBlock::isLandingPad() const {
622 return isa<LandingPadInst>(getFirstNonPHIIt());
623}
624
626 return dyn_cast<LandingPadInst>(getFirstNonPHIIt());
627}
628
629std::optional<uint64_t> BasicBlock::getIrrLoopHeaderWeight() const {
630 const Instruction *TI = getTerminator();
631 if (MDNode *MDIrrLoopHeader =
632 TI->getMetadata(LLVMContext::MD_irr_loop)) {
633 MDString *MDName = cast<MDString>(MDIrrLoopHeader->getOperand(0));
634 if (MDName->getString() == "loop_header_weight") {
635 auto *CI = mdconst::extract<ConstantInt>(MDIrrLoopHeader->getOperand(1));
636 return std::optional<uint64_t>(CI->getValue().getZExtValue());
637 }
638 }
639 return std::nullopt;
640}
641
643 while (isa<DbgInfoIntrinsic>(It))
644 ++It;
645 return It;
646}
647
649 unsigned Order = 0;
650 for (Instruction &I : *this)
651 I.Order = Order++;
652
653 // Set the bit to indicate that the instruction order valid and cached.
654 SubclassOptionalData |= InstrOrderValid;
655
656 NumInstrRenumberings++;
657}
658
660 // If we erase the terminator in a block, any DbgRecords will sink and "fall
661 // off the end", existing after any terminator that gets inserted. With
662 // dbg.value intrinsics we would just insert the terminator at end() and
663 // the dbg.values would come before the terminator. With DbgRecords, we must
664 // do this manually.
665 // To get out of this unfortunate form, whenever we insert a terminator,
666 // check whether there's anything trailing at the end and move those
667 // DbgRecords in front of the terminator.
668
669 // If there's no terminator, there's nothing to do.
670 Instruction *Term = getTerminatorOrNull();
671 if (!Term)
672 return;
673
674 // Are there any dangling DbgRecords?
675 DbgMarker *TrailingDbgRecords = getTrailingDbgRecords();
676 if (!TrailingDbgRecords)
677 return;
678
679 // Transfer DbgRecords from the trailing position onto the terminator.
680 createMarker(Term);
681 Term->DebugMarker->absorbDebugValues(*TrailingDbgRecords, false);
682 TrailingDbgRecords->eraseFromParent();
683 deleteTrailingDbgRecords();
684}
685
686void BasicBlock::spliceDebugInfoEmptyBlock(BasicBlock::iterator Dest,
687 BasicBlock *Src,
690 // Imagine the folowing:
691 //
692 // bb1:
693 // dbg.value(...
694 // ret i32 0
695 //
696 // If an optimisation pass attempts to splice the contents of the block from
697 // BB1->begin() to BB1->getTerminator(), then the dbg.value will be
698 // transferred to the destination.
699 // However, in the "new" DbgRecord format for debug-info, that range is empty:
700 // begin() returns an iterator to the terminator, as there will only be a
701 // single instruction in the block. We must piece together from the bits set
702 // in the iterators whether there was the intention to transfer any debug
703 // info.
704
705 assert(First == Last);
706 bool InsertAtHead = Dest.getHeadBit();
707 bool ReadFromHead = First.getHeadBit();
708
709 // If the source block is completely empty, including no terminator, then
710 // transfer any trailing DbgRecords that are still hanging around. This can
711 // occur when a block is optimised away and the terminator has been moved
712 // somewhere else.
713 if (Src->empty()) {
714 DbgMarker *SrcTrailingDbgRecords = Src->getTrailingDbgRecords();
715 if (!SrcTrailingDbgRecords)
716 return;
717
718 Dest->adoptDbgRecords(Src, Src->end(), InsertAtHead);
719 // adoptDbgRecords should have released the trailing DbgRecords.
720 assert(!Src->getTrailingDbgRecords());
721 return;
722 }
723
724 // There are instructions in this block; if the First iterator was
725 // with begin() / getFirstInsertionPt() then the caller intended debug-info
726 // at the start of the block to be transferred. Return otherwise.
727 if (Src->empty() || First != Src->begin() || !ReadFromHead)
728 return;
729
730 // Is there actually anything to transfer?
731 if (!First->hasDbgRecords())
732 return;
733
734 createMarker(Dest)->absorbDebugValues(*First->DebugMarker, InsertAtHead);
735}
736
737void BasicBlock::spliceDebugInfo(BasicBlock::iterator Dest, BasicBlock *Src,
740 /* Do a quick normalisation before calling the real splice implementation. We
741 might be operating on a degenerate basic block that has no instructions
742 in it, a legitimate transient state. In that case, Dest will be end() and
743 any DbgRecords temporarily stored in the TrailingDbgRecords map in
744 LLVMContext. We might illustrate it thus:
745
746 Dest
747 |
748 this-block: ~~~~~~~~
749 Src-block: ++++B---B---B---B:::C
750 | |
751 First Last
752
753 However: does the caller expect the "~" DbgRecords to end up before or
754 after the spliced segment? This is communciated in the "Head" bit of Dest,
755 which signals whether the caller called begin() or end() on this block.
756
757 If the head bit is set, then all is well, we leave DbgRecords trailing just
758 like how dbg.value instructions would trail after instructions spliced to
759 the beginning of this block.
760
761 If the head bit isn't set, then try to jam the "~" DbgRecords onto the
762 front of the First instruction, then splice like normal, which joins the
763 "~" DbgRecords with the "+" DbgRecords. However if the "+" DbgRecords are
764 supposed to be left behind in Src, then:
765 * detach the "+" DbgRecords,
766 * move the "~" DbgRecords onto First,
767 * splice like normal,
768 * replace the "+" DbgRecords onto the Last position.
769 Complicated, but gets the job done. */
770
771 // If we're inserting at end(), and not in front of dangling DbgRecords, then
772 // move the DbgRecords onto "First". They'll then be moved naturally in the
773 // splice process.
774 DbgMarker *MoreDanglingDbgRecords = nullptr;
775 DbgMarker *OurTrailingDbgRecords = getTrailingDbgRecords();
776 if (Dest == end() && !Dest.getHeadBit() && OurTrailingDbgRecords) {
777 // Are the "+" DbgRecords not supposed to move? If so, detach them
778 // temporarily.
779 if (!First.getHeadBit() && First->hasDbgRecords()) {
780 MoreDanglingDbgRecords = Src->getMarker(First);
781 MoreDanglingDbgRecords->removeFromParent();
782 }
783
784 if (First->hasDbgRecords()) {
785 // Place them at the front, it would look like this:
786 // Dest
787 // |
788 // this-block:
789 // Src-block: ~~~~~~~~++++B---B---B---B:::C
790 // | |
791 // First Last
792 First->adoptDbgRecords(this, end(), true);
793 } else {
794 // No current marker, create one and absorb in. (FIXME: we can avoid an
795 // allocation in the future).
796 DbgMarker *CurMarker = Src->createMarker(&*First);
797 CurMarker->absorbDebugValues(*OurTrailingDbgRecords, false);
798 OurTrailingDbgRecords->eraseFromParent();
799 }
800 deleteTrailingDbgRecords();
801 First.setHeadBit(true);
802 }
803
804 // Call the main debug-info-splicing implementation.
805 spliceDebugInfoImpl(Dest, Src, First, Last);
806
807 // Do we have some "+" DbgRecords hanging around that weren't supposed to
808 // move, and we detached to make things easier?
809 if (!MoreDanglingDbgRecords)
810 return;
811
812 // FIXME: we could avoid an allocation here sometimes. (adoptDbgRecords
813 // requires an iterator).
814 DbgMarker *LastMarker = Src->createMarker(Last);
815 LastMarker->absorbDebugValues(*MoreDanglingDbgRecords, true);
816 MoreDanglingDbgRecords->eraseFromParent();
817}
818
819void BasicBlock::spliceDebugInfoImpl(BasicBlock::iterator Dest, BasicBlock *Src,
822 // Find out where to _place_ these dbg.values; if InsertAtHead is specified,
823 // this will be at the start of Dest's debug value range, otherwise this is
824 // just Dest's marker.
825 bool InsertAtHead = Dest.getHeadBit();
826 bool ReadFromHead = First.getHeadBit();
827 // Use this flag to signal the abnormal case, where we don't want to copy the
828 // DbgRecords ahead of the "Last" position.
829 bool ReadFromTail = !Last.getTailBit();
830 bool LastIsEnd = (Last == Src->end());
831
832 /*
833 Here's an illustration of what we're about to do. We have two blocks, this
834 and Src, and two segments of list. Each instruction is marked by a capital
835 while potential DbgRecord debug-info is marked out by "-" characters and a
836 few other special characters (+:=) where I want to highlight what's going
837 on.
838
839 Dest
840 |
841 this-block: A----A----A ====A----A----A----A---A---A
842 Src-block ++++B---B---B---B:::C
843 | |
844 First Last
845
846 The splice method is going to take all the instructions from First up to
847 (but not including) Last and insert them in _front_ of Dest, forming one
848 long list. All the DbgRecords attached to instructions _between_ First and
849 Last need no maintenence. However, we have to do special things with the
850 DbgRecords marked with the +:= characters. We only have three positions:
851 should the "+" DbgRecords be transferred, and if so to where? Do we move the
852 ":" DbgRecords? Would they go in front of the "=" DbgRecords, or should the
853 "=" DbgRecords go before "+" DbgRecords?
854
855 We're told which way it should be by the bits carried in the iterators. The
856 "Head" bit indicates whether the specified position is supposed to be at the
857 front of the attached DbgRecords (true) or not (false). The Tail bit is true
858 on the other end of a range: is the range intended to include DbgRecords up
859 to the end (false) or not (true).
860
861 FIXME: the tail bit doesn't need to be distinct from the head bit, we could
862 combine them.
863
864 Here are some examples of different configurations:
865
866 Dest.Head = true, First.Head = true, Last.Tail = false
867
868 this-block: A----A----A++++B---B---B---B:::====A----A----A----A---A---A
869 | |
870 First Dest
871
872 Wheras if we didn't want to read from the Src list,
873
874 Dest.Head = true, First.Head = false, Last.Tail = false
875
876 this-block: A----A----AB---B---B---B:::====A----A----A----A---A---A
877 | |
878 First Dest
879
880 Or if we didn't want to insert at the head of Dest:
881
882 Dest.Head = false, First.Head = false, Last.Tail = false
883
884 this-block: A----A----A====B---B---B---B:::A----A----A----A---A---A
885 | |
886 First Dest
887
888 Tests for these various configurations can be found in the unit test file
889 BasicBlockDbgInfoTest.cpp.
890
891 */
892
893 // Detach the marker at Dest -- this lets us move the "====" DbgRecords
894 // around.
895 DbgMarker *DestMarker = nullptr;
896 if ((DestMarker = getMarker(Dest))) {
897 if (Dest == end()) {
898 assert(DestMarker == getTrailingDbgRecords());
899 deleteTrailingDbgRecords();
900 } else {
901 DestMarker->removeFromParent();
902 }
903 }
904
905 // If we're moving the tail range of DbgRecords (":::"), absorb them into the
906 // front of the DbgRecords at Dest.
907 if (ReadFromTail && Src->getMarker(Last)) {
908 DbgMarker *FromLast = Src->getMarker(Last);
909 if (LastIsEnd) {
910 if (Dest == end()) {
911 // Abosrb the trailing markers from Src.
912 assert(FromLast == Src->getTrailingDbgRecords());
913 createMarker(Dest)->absorbDebugValues(*FromLast, true);
914 FromLast->eraseFromParent();
915 Src->deleteTrailingDbgRecords();
916 } else {
917 // adoptDbgRecords will release any trailers.
918 Dest->adoptDbgRecords(Src, Last, true);
919 }
920 assert(!Src->getTrailingDbgRecords());
921 } else {
922 // FIXME: can we use adoptDbgRecords here to reduce allocations?
923 DbgMarker *OntoDest = createMarker(Dest);
924 OntoDest->absorbDebugValues(*FromLast, true);
925 }
926 }
927
928 // If we're _not_ reading from the head of First, i.e. the "++++" DbgRecords,
929 // move their markers onto Last. They remain in the Src block. No action
930 // needed.
931 if (!ReadFromHead && First->hasDbgRecords()) {
932 if (Last != Src->end()) {
933 Last->adoptDbgRecords(Src, First, true);
934 } else {
935 DbgMarker *OntoLast = Src->createMarker(Last);
936 DbgMarker *FromFirst = Src->createMarker(First);
937 // Always insert at front of Last.
938 OntoLast->absorbDebugValues(*FromFirst, true);
939 }
940 }
941
942 // Finally, do something with the "====" DbgRecords we detached.
943 if (DestMarker) {
944 if (InsertAtHead) {
945 // Insert them at the end of the DbgRecords at Dest. The "::::" DbgRecords
946 // might be in front of them.
947 DbgMarker *NewDestMarker = createMarker(Dest);
948 NewDestMarker->absorbDebugValues(*DestMarker, false);
949 } else {
950 // Insert them right at the start of the range we moved, ahead of First
951 // and the "++++" DbgRecords.
952 // This also covers the rare circumstance where we insert at end(), and we
953 // did not generate the iterator with begin() / getFirstInsertionPt(),
954 // meaning any trailing debug-info at the end of the block would
955 // "normally" have been pushed in front of "First". We move it there now.
956 DbgMarker *FirstMarker = createMarker(First);
957 FirstMarker->absorbDebugValues(*DestMarker, true);
958 }
959 DestMarker->eraseFromParent();
960 }
961}
962
963void BasicBlock::splice(iterator Dest, BasicBlock *Src, iterator First,
964 iterator Last) {
965#ifdef EXPENSIVE_CHECKS
966 // Check that First is before Last.
967 auto FromBBEnd = Src->end();
968 for (auto It = First; It != Last; ++It)
969 assert(It != FromBBEnd && "FromBeginIt not before FromEndIt!");
970#endif // EXPENSIVE_CHECKS
971
972 // Lots of horrible special casing for empty transfers: the dbg.values between
973 // two positions could be spliced in dbg.value mode.
974 if (First == Last) {
975 spliceDebugInfoEmptyBlock(Dest, Src, First, Last);
976 return;
977 }
978
979 spliceDebugInfo(Dest, Src, First, Last);
980
981 // And move the instructions.
982 getInstList().splice(Dest, Src->getInstList(), First, Last);
983
984 flushTerminatorDbgRecords();
985}
986
988 assert(I->getParent() == this);
989
990 iterator NextIt = std::next(I->getIterator());
991 DbgMarker *NextMarker = createMarker(NextIt);
992 NextMarker->insertDbgRecord(DR, true);
993}
994
996 InstListType::iterator Where) {
997 assert(Where == end() || Where->getParent() == this);
998 bool InsertAtHead = Where.getHeadBit();
999 DbgMarker *M = createMarker(Where);
1000 M->insertDbgRecord(DR, InsertAtHead);
1001}
1002
1004 return getMarker(std::next(I->getIterator()));
1005}
1006
1007DbgMarker *BasicBlock::getMarker(InstListType::iterator It) {
1008 if (It == end()) {
1009 DbgMarker *DM = getTrailingDbgRecords();
1010 return DM;
1011 }
1012 return It->DebugMarker;
1013}
1014
1016 Instruction *I, std::optional<DbgRecord::self_iterator> Pos) {
1017 // "I" was originally removed from a position where it was
1018 // immediately in front of Pos. Any DbgRecords on that position then "fell
1019 // down" onto Pos. "I" has been re-inserted at the front of that wedge of
1020 // DbgRecords, shuffle them around to represent the original positioning. To
1021 // illustrate:
1022 //
1023 // Instructions: I1---I---I0
1024 // DbgRecords: DDD DDD
1025 //
1026 // Instruction "I" removed,
1027 //
1028 // Instructions: I1------I0
1029 // DbgRecords: DDDDDD
1030 // ^Pos
1031 //
1032 // Instruction "I" re-inserted (now):
1033 //
1034 // Instructions: I1---I------I0
1035 // DbgRecords: DDDDDD
1036 // ^Pos
1037 //
1038 // After this method completes:
1039 //
1040 // Instructions: I1---I---I0
1041 // DbgRecords: DDD DDD
1042
1043 // This happens if there were no DbgRecords on I0. Are there now DbgRecords
1044 // there?
1045 if (!Pos) {
1046 DbgMarker *NextMarker = getNextMarker(I);
1047 if (!NextMarker)
1048 return;
1049 if (NextMarker->StoredDbgRecords.empty())
1050 return;
1051 // There are DbgMarkers there now -- they fell down from "I".
1052 DbgMarker *ThisMarker = createMarker(I);
1053 ThisMarker->absorbDebugValues(*NextMarker, false);
1054 return;
1055 }
1056
1057 // Is there even a range of DbgRecords to move?
1058 DbgMarker *DM = (*Pos)->getMarker();
1059 auto Range = make_range(DM->StoredDbgRecords.begin(), (*Pos));
1060 if (Range.begin() == Range.end())
1061 return;
1062
1063 // Otherwise: splice.
1064 DbgMarker *ThisMarker = createMarker(I);
1065 assert(ThisMarker->StoredDbgRecords.empty());
1066 ThisMarker->absorbDebugValues(Range, *DM, true);
1067}
1068
1069#ifndef NDEBUG
1070/// In asserts builds, this checks the numbering. In non-asserts builds, it
1071/// is defined as a no-op inline function in BasicBlock.h.
1073 if (!isInstrOrderValid())
1074 return;
1075 const Instruction *Prev = nullptr;
1076 for (const Instruction &I : *this) {
1077 assert((!Prev || Prev->comesBefore(&I)) &&
1078 "cached instruction ordering is incorrect");
1079 Prev = &I;
1080 }
1081}
1082#endif
1083
1085 getContext().pImpl->setTrailingDbgRecords(this, foo);
1086}
1087
1089 return getContext().pImpl->getTrailingDbgRecords(this);
1090}
1091
1093 getContext().pImpl->deleteTrailingDbgRecords(this);
1094}
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)
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:530
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:734
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_FOR_TEST 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:388
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:659
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:1082
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:124
void splice(Function::iterator ToIt, Function *FromF)
Transfer all blocks from FromF to this function at ToIt.
Definition Function.h:761
Function::iterator insert(Function::iterator Position, BasicBlock *BB)
Insert BB in the basic block list at Position.
Definition Function.h:755
iterator end()
Definition Function.h:855
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...
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:632
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:552
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
Context & getContext() const
Definition BasicBlock.h:99
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:2637
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:2612
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:1946
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.