LLVM 24.0.0git
Instruction.cpp
Go to the documentation of this file.
1//===-- Instruction.cpp - Implement the Instruction class -----------------===//
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 Instruction class for the IR library.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/IR/Instruction.h"
14#include "llvm/ADT/DenseSet.h"
15#include "llvm/ADT/STLExtras.h"
17#include "llvm/IR/Attributes.h"
18#include "llvm/IR/Constants.h"
19#include "llvm/IR/InstrTypes.h"
22#include "llvm/IR/Intrinsics.h"
23#include "llvm/IR/LLVMContext.h"
25#include "llvm/IR/Module.h"
26#include "llvm/IR/Operator.h"
28#include "llvm/IR/Type.h"
31using namespace llvm;
32
33namespace llvm {
34
35// FIXME: Flag used for an ablation performance test, Issue #147390. Placing it
36// here because referencing IR should be feasible from anywhere. Will be
37// removed after the ablation test.
39 "profcheck-disable-metadata-fixes", cl::Hidden, cl::init(false),
41 "Disable metadata propagation fixes discovered through Issue #147390"));
42
43} // end namespace llvm
44
46 : InsertAt(InsertAtEnd ? InsertAtEnd->end() : InstListType::iterator()) {}
47
48Instruction::Instruction(Type *ty, unsigned it, AllocInfo AllocInfo,
49 InsertPosition InsertBefore)
50 : User(ty, Value::InstructionVal + it, AllocInfo) {
51 // When called with an iterator, there must be a block to insert into.
52 if (InstListType::iterator InsertIt = InsertBefore; InsertIt.isValid()) {
53 BasicBlock *BB = InsertIt.getNodeParent();
54 assert(BB && "Instruction to insert before is not in a basic block!");
55 insertInto(BB, InsertBefore);
56 }
57}
58
60 assert(!getParent() && "Instruction still linked in the program!");
61
62 // Replace any extant metadata uses of this instruction with poison to
63 // preserve debug info accuracy. Some alternatives include:
64 // - Treat Instruction like any other Value, and point its extant metadata
65 // uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
66 // trivially dead (i.e. fair game for deletion in many passes), leading to
67 // stale dbg.values being in effect for too long.
68 // - Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
69 // correct. OTOH results in wasted work in some common cases (e.g. when all
70 // instructions in a BasicBlock are deleted).
71 if (isUsedByMetadata())
73
74 // Remove associated metadata from context.
75 if (hasMetadata()) {
76 // Explicitly remove DIAssignID metadata to clear up ID -> Instruction(s)
77 // mapping in LLVMContext.
78 updateDIAssignIDMapping(nullptr);
79 clearMetadata();
80 }
81}
82
83const Module *Instruction::getModule() const {
84 return getParent()->getModule();
85}
86
88 return getParent()->getParent();
89}
90
92 return getModule()->getDataLayout();
93}
94
96 // Perform any debug-info maintenence required.
97 handleMarkerRemoval();
98
99 getParent()->getInstList().remove(getIterator());
100}
101
103 if (!DebugMarker)
104 return;
105
106 DebugMarker->removeMarker();
107}
108
110 handleMarkerRemoval();
111 return getParent()->getInstList().erase(getIterator());
112}
113
114/// Insert an unlinked instruction into a basic block immediately before the
115/// specified instruction.
117 insertBefore(*InsertPos->getParent(), InsertPos);
118}
119
120/// Insert an unlinked instruction into a basic block immediately after the
121/// specified instruction.
122void Instruction::insertAfter(Instruction *InsertPos) {
123 BasicBlock *DestParent = InsertPos->getParent();
124
125 DestParent->getInstList().insertAfter(InsertPos->getIterator(), this);
126}
127
129 BasicBlock *DestParent = InsertPos->getParent();
130
131 DestParent->getInstList().insertAfter(InsertPos, this);
132}
133
136 assert(getParent() == nullptr && "Expected detached instruction");
137 assert((It == ParentBB->end() || It->getParent() == ParentBB) &&
138 "It not in ParentBB");
139 insertBefore(*ParentBB, It);
140 return getIterator();
141}
142
144 InstListType::iterator InsertPos) {
145 assert(!DebugMarker);
146
147 BB.getInstList().insert(InsertPos, this);
148
149 // We've inserted "this": if InsertAtHead is set then it comes before any
150 // DbgVariableRecords attached to InsertPos. But if it's not set, then any
151 // DbgRecords should now come before "this".
152 bool InsertAtHead = InsertPos.getHeadBit();
153 if (!InsertAtHead) {
154 DbgMarker *SrcMarker = BB.getMarker(InsertPos);
155 if (SrcMarker && !SrcMarker->empty()) {
156 // If this assertion fires, the calling code is about to insert a PHI
157 // after debug-records, which would form a sequence like:
158 // %0 = PHI
159 // #dbg_value
160 // %1 = PHI
161 // Which is de-normalised and undesired -- hence the assertion. To avoid
162 // this, you must insert at that position using an iterator, and it must
163 // be aquired by calling getFirstNonPHIIt / begin or similar methods on
164 // the block. This will signal to this behind-the-scenes debug-info
165 // maintenence code that you intend the PHI to be ahead of everything,
166 // including any debug-info.
167 assert(!isa<PHINode>(this) && "Inserting PHI after debug-records!");
168 adoptDbgRecords(&BB, InsertPos, false);
169 }
170 }
171
172 // If we're inserting a terminator, check if we need to flush out
173 // TrailingDbgRecords. Inserting instructions at the end of an incomplete
174 // block is handled by the code block above.
175 if (isTerminator())
176 getParent()->flushTerminatorDbgRecords();
177}
178
179/// Unlink this instruction from its current basic block and insert it into the
180/// basic block that MovePos lives in, right before MovePos.
182 moveBeforeImpl(*MovePos->getParent(), MovePos, false);
183}
184
186 moveBeforeImpl(*MovePos->getParent(), MovePos, true);
187}
188
189void Instruction::moveAfter(Instruction *MovePos) {
190 auto NextIt = std::next(MovePos->getIterator());
191 // We want this instruction to be moved to after NextIt in the instruction
192 // list, but before NextIt's debug value range.
193 NextIt.setHeadBit(true);
194 moveBeforeImpl(*MovePos->getParent(), NextIt, false);
195}
196
197void Instruction::moveAfter(InstListType::iterator MovePos) {
198 // We want this instruction to be moved to after NextIt in the instruction
199 // list, but before NextIt's debug value range.
200 MovePos.setHeadBit(true);
201 moveBeforeImpl(*MovePos->getParent(), MovePos, false);
202}
203
205 auto NextIt = std::next(MovePos->getIterator());
206 // We want this instruction and its debug range to be moved to after NextIt
207 // in the instruction list, but before NextIt's debug value range.
208 NextIt.setHeadBit(true);
209 moveBeforeImpl(*MovePos->getParent(), NextIt, true);
210}
211
212void Instruction::moveBefore(BasicBlock &BB, InstListType::iterator I) {
213 moveBeforeImpl(BB, I, false);
214}
215
217 InstListType::iterator I) {
218 moveBeforeImpl(BB, I, true);
219}
220
221void Instruction::moveBeforeImpl(BasicBlock &BB, InstListType::iterator I,
222 bool Preserve) {
223 assert(I == BB.end() || I->getParent() == &BB);
224 bool InsertAtHead = I.getHeadBit();
225
226 // If we've been given the "Preserve" flag, then just move the DbgRecords with
227 // the instruction, no more special handling needed.
228 if (DebugMarker && !Preserve) {
229 if (I != this->getIterator() || InsertAtHead) {
230 // "this" is definitely moving in the list, or it's moving ahead of its
231 // attached DbgVariableRecords. Detach any existing DbgRecords.
232 handleMarkerRemoval();
233 }
234 }
235
236 // Move this single instruction. Use the list splice method directly, not
237 // the block splicer, which will do more debug-info things.
238 BB.getInstList().splice(I, getParent()->getInstList(), getIterator());
239
240 if (!Preserve) {
241 DbgMarker *NextMarker = getParent()->getNextMarker(this);
242
243 // If we're inserting at point I, and not in front of the DbgRecords
244 // attached there, then we should absorb the DbgRecords attached to I.
245 if (!InsertAtHead && NextMarker && !NextMarker->empty()) {
246 adoptDbgRecords(&BB, I, false);
247 }
248 }
249
250 if (isTerminator())
251 getParent()->flushTerminatorDbgRecords();
252}
253
255 const Instruction *From, std::optional<DbgRecord::self_iterator> FromHere,
256 bool InsertAtHead) {
257 if (!From->DebugMarker)
259
260 if (!DebugMarker)
261 getParent()->createMarker(this);
262
263 return DebugMarker->cloneDebugInfoFrom(From->DebugMarker, FromHere,
264 InsertAtHead);
265}
266
267std::optional<DbgRecord::self_iterator>
269 // Is there a marker on the next instruction?
270 DbgMarker *NextMarker = getParent()->getNextMarker(this);
271 if (!NextMarker)
272 return std::nullopt;
273
274 // Are there any DbgRecords in the next marker?
275 if (NextMarker->StoredDbgRecords.empty())
276 return std::nullopt;
277
278 return NextMarker->StoredDbgRecords.begin();
279}
280
281bool Instruction::hasDbgRecords() const { return !getDbgRecordRange().empty(); }
282
284 bool InsertAtHead) {
285 DbgMarker *SrcMarker = BB->getMarker(It);
286 auto ReleaseTrailingDbgRecords = [BB, It, SrcMarker]() {
287 if (BB->end() == It) {
288 SrcMarker->eraseFromParent();
290 }
291 };
292
293 if (!SrcMarker || SrcMarker->StoredDbgRecords.empty()) {
294 ReleaseTrailingDbgRecords();
295 return;
296 }
297
298 // If we have DbgMarkers attached to this instruction, we have to honour the
299 // ordering of DbgRecords between this and the other marker. Fall back to just
300 // absorbing from the source.
301 if (DebugMarker || It == BB->end()) {
302 // Ensure we _do_ have a marker.
303 getParent()->createMarker(this);
304 DebugMarker->absorbDebugValues(*SrcMarker, InsertAtHead);
305
306 // Having transferred everything out of SrcMarker, we _could_ clean it up
307 // and free the marker now. However, that's a lot of heap-accounting for a
308 // small amount of memory with a good chance of re-use. Leave it for the
309 // moment. It will be released when the Instruction is freed in the worst
310 // case.
311 // However: if we transferred from a trailing marker off the end of the
312 // block, it's important to not leave the empty marker trailing. It will
313 // give a misleading impression that some debug records have been left
314 // trailing.
315 ReleaseTrailingDbgRecords();
316 } else {
317 // Optimisation: we're transferring all the DbgRecords from the source
318 // marker onto this empty location: just adopt the other instructions
319 // marker.
320 DebugMarker = SrcMarker;
321 DebugMarker->MarkedInstr = this;
322 It->DebugMarker = nullptr;
323 }
324}
325
327 if (DebugMarker)
328 DebugMarker->dropDbgRecords();
329}
330
332 DebugMarker->dropOneDbgRecord(DVR);
333}
334
335bool Instruction::comesBefore(const Instruction *Other) const {
336 assert(getParent() && Other->getParent() &&
337 "instructions without BB parents have no order");
338 assert(getParent() == Other->getParent() &&
339 "cross-BB instruction order comparison");
340 if (!getParent()->isInstrOrderValid())
341 const_cast<BasicBlock *>(getParent())->renumberInstructions();
342 return Order < Other->Order;
343}
344
345std::optional<BasicBlock::iterator> Instruction::getInsertionPointAfterDef() {
346 assert(!getType()->isVoidTy() && "Instruction must define result");
347 BasicBlock *InsertBB;
348 BasicBlock::iterator InsertPt;
349 if (auto *PN = dyn_cast<PHINode>(this)) {
350 InsertBB = PN->getParent();
351 InsertPt = InsertBB->getFirstInsertionPt();
352 } else if (auto *II = dyn_cast<InvokeInst>(this)) {
353 InsertBB = II->getNormalDest();
354 InsertPt = InsertBB->getFirstInsertionPt();
355 } else if (isa<CallBrInst>(this)) {
356 // Def is available in multiple successors, there's no single dominating
357 // insertion point.
358 return std::nullopt;
359 } else {
360 assert(!isTerminator() && "Only invoke/callbr terminators return value");
361 InsertBB = getParent();
362 InsertPt = std::next(getIterator());
363 // Any instruction inserted immediately after "this" will come before any
364 // debug-info records take effect -- thus, set the head bit indicating that
365 // to debug-info-transfer code.
366 InsertPt.setHeadBit(true);
367 }
368
369 // catchswitch blocks don't have any legal insertion point (because they
370 // are both an exception pad and a terminator).
371 if (InsertPt == InsertBB->end())
372 return std::nullopt;
373 return InsertPt;
374}
375
377 return any_of(operands(), [](const Value *V) { return V->hasOneUser(); });
378}
379
381 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
382 Inst->setHasNoUnsignedWrap(b);
383 else
384 cast<TruncInst>(this)->setHasNoUnsignedWrap(b);
385}
386
388 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
389 Inst->setHasNoSignedWrap(b);
390 else
391 cast<TruncInst>(this)->setHasNoSignedWrap(b);
392}
393
394void Instruction::setIsExact(bool b) {
395 cast<PossiblyExactOperator>(this)->setIsExact(b);
396}
397
398void Instruction::setNonNeg(bool b) {
399 assert(isa<PossiblyNonNegInst>(this) && "Must be zext/uitofp");
400 SubclassOptionalData = (SubclassOptionalData & ~PossiblyNonNegInst::NonNeg) |
402}
403
405 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
406 return Inst->hasNoUnsignedWrap();
407
408 return cast<TruncInst>(this)->hasNoUnsignedWrap();
409}
410
411bool Instruction::hasNoSignedWrap() const {
412 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
413 return Inst->hasNoSignedWrap();
414
415 return cast<TruncInst>(this)->hasNoSignedWrap();
416}
417
418bool Instruction::hasNonNeg() const {
419 assert(isa<PossiblyNonNegInst>(this) && "Must be zext/uitofp");
420 return (SubclassOptionalData & PossiblyNonNegInst::NonNeg) != 0;
421}
422
424 return cast<Operator>(this)->hasPoisonGeneratingFlags();
425}
426
428 switch (getOpcode()) {
429 case Instruction::Add:
430 case Instruction::Sub:
431 case Instruction::Mul:
432 case Instruction::Shl:
433 cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(false);
434 cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(false);
435 break;
436
437 case Instruction::UDiv:
438 case Instruction::SDiv:
439 case Instruction::AShr:
440 case Instruction::LShr:
441 cast<PossiblyExactOperator>(this)->setIsExact(false);
442 break;
443
444 case Instruction::Or:
445 cast<PossiblyDisjointInst>(this)->setIsDisjoint(false);
446 break;
447
448 case Instruction::GetElementPtr:
449 cast<GetElementPtrInst>(this)->setNoWrapFlags(GEPNoWrapFlags::none());
450 break;
451
452 case Instruction::UIToFP:
453 case Instruction::ZExt:
454 setNonNeg(false);
455 break;
456
457 case Instruction::Trunc:
458 cast<TruncInst>(this)->setHasNoUnsignedWrap(false);
459 cast<TruncInst>(this)->setHasNoSignedWrap(false);
460 break;
461
462 case Instruction::ICmp:
463 cast<ICmpInst>(this)->setSameSign(false);
464 break;
465
466 case Instruction::AddrSpaceCast:
467 cast<AddrSpaceCastInst>(this)->setNonNull(false);
468 break;
469
470 case Instruction::Call: {
471 if (auto *II = dyn_cast<IntrinsicInst>(this)) {
472 switch (II->getIntrinsicID()) {
473 case Intrinsic::ctlz:
474 case Intrinsic::cttz:
475 case Intrinsic::abs:
476 II->setOperand(1, ConstantInt::getFalse(getContext()));
477 break;
478 }
479 }
480 break;
481 }
482 }
483
484 if (isa<FPMathOperator>(this)) {
485 setHasNoNaNs(false);
486 setHasNoInfs(false);
487 }
488
489 assert(!hasPoisonGeneratingFlags() && "must be kept in sync");
490}
491
494 [this](unsigned ID) { return hasMetadata(ID); });
495}
496
498 // If there is no loop metadata at all, we also don't have
499 // non-debug loop metadata, obviously.
500 if (!hasMetadata(LLVMContext::MD_loop))
501 return false;
502
503 // If we do have loop metadata, retrieve it.
504 MDNode *LoopMD = getMetadata(LLVMContext::MD_loop);
505
506 // Check if the existing operands are debug locations. This loop
507 // should terminate after at most three iterations. Skip
508 // the first item because it is a self-reference.
509 for (const MDOperand &Op : llvm::drop_begin(LoopMD->operands())) {
510 // check for debug location type by attempting a cast.
511 if (!isa<DILocation>(Op)) {
512 return true;
513 }
514 }
515
516 // If we get here, then all we have is debug locations in the loop metadata.
517 return false;
518}
519
521 for (unsigned ID : Metadata::PoisonGeneratingIDs)
522 eraseMetadata(ID);
523}
524
526 if (const auto *CB = dyn_cast<CallBase>(this)) {
527 auto HasPoisonGeneratingAttributes = [](AttributeSet Attrs) {
528 return Attrs.hasAttribute(Attribute::Range) ||
529 Attrs.hasAttribute(Attribute::Alignment) ||
530 Attrs.hasAttribute(Attribute::NonNull) ||
531 Attrs.hasAttribute(Attribute::NoFPClass);
532 };
533 if (HasPoisonGeneratingAttributes(CB->getRetAttributes()))
534 return true;
535 for (unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
536 if (HasPoisonGeneratingAttributes(CB->getParamAttributes(ArgNo)))
537 return true;
538 }
539 return false;
540}
541
543 if (auto *CB = dyn_cast<CallBase>(this)) {
544 AttributeMask AM;
545 AM.addAttribute(Attribute::Range);
546 AM.addAttribute(Attribute::Alignment);
547 AM.addAttribute(Attribute::NonNull);
548 AM.addAttribute(Attribute::NoFPClass);
549 CB->removeRetAttrs(AM);
550 for (unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
551 CB->removeParamAttrs(ArgNo, AM);
552 }
553 assert(!hasPoisonGeneratingAttributes() && "must be kept in sync");
554}
555
557 ArrayRef<unsigned> KnownIDs) {
558 dropUnknownNonDebugMetadata(KnownIDs);
559 auto *CB = dyn_cast<CallBase>(this);
560 if (!CB)
561 return;
562 // For call instructions, we also need to drop parameter and return attributes
563 // that can cause UB if the call is moved to a location where the attribute is
564 // not valid.
565 AttributeList AL = CB->getAttributes();
566 if (AL.isEmpty())
567 return;
568 AttributeMask UBImplyingAttributes =
569 AttributeFuncs::getUBImplyingAttributes();
570 for (unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
571 CB->removeParamAttrs(ArgNo, UBImplyingAttributes);
572 CB->removeRetAttrs(UBImplyingAttributes);
573}
574
576 // !annotation and !prof metadata does not impact semantics.
577 // !range, !nonnull, !align and !nofpclass produce poison, so they are safe to
578 // speculate.
579 // !fpmath specifies floating-point precision and does not imply UB.
580 // !mem.cache_hint is a performance hint and does not imply UB.
581 // !noundef and various AA metadata must be dropped, as it generally produces
582 // immediate undefined behavior.
583 static const unsigned KnownIDs[] = {
584 LLVMContext::MD_annotation, LLVMContext::MD_range,
585 LLVMContext::MD_nonnull, LLVMContext::MD_align,
586 LLVMContext::MD_fpmath, LLVMContext::MD_prof,
587 LLVMContext::MD_mem_cache_hint, LLVMContext::MD_nofpclass};
588 SmallVector<unsigned> KeepIDs;
589 KeepIDs.reserve(Keep.size() + std::size(KnownIDs));
590 append_range(KeepIDs, (!ProfcheckDisableMetadataFixes ? KnownIDs
591 : drop_end(KnownIDs)));
592 append_range(KeepIDs, Keep);
593 dropUBImplyingAttrsAndUnknownMetadata(KeepIDs);
594}
595
597 auto *CB = dyn_cast<CallBase>(this);
598 if (!CB)
599 return false;
600 // For call instructions, we also need to check parameter and return
601 // attributes that can cause UB.
602 for (unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
603 if (CB->isPassingUndefUB(ArgNo))
604 return true;
605 return CB->hasRetAttr(Attribute::NoUndef) ||
606 CB->hasRetAttr(Attribute::Dereferenceable) ||
607 CB->hasRetAttr(Attribute::DereferenceableOrNull);
608}
609
610bool Instruction::isExact() const {
611 return cast<PossiblyExactOperator>(this)->isExact();
612}
613
614void Instruction::setFast(bool B) {
615 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
616 cast<FPMathOperator>(this)->setFast(B);
617}
618
620 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
621 cast<FPMathOperator>(this)->setHasAllowReassoc(B);
622}
623
624void Instruction::setHasNoNaNs(bool B) {
625 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
626 cast<FPMathOperator>(this)->setHasNoNaNs(B);
627}
628
629void Instruction::setHasNoInfs(bool B) {
630 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
631 cast<FPMathOperator>(this)->setHasNoInfs(B);
632}
633
635 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
636 cast<FPMathOperator>(this)->setHasNoSignedZeros(B);
637}
638
640 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
641 cast<FPMathOperator>(this)->setHasAllowReciprocal(B);
642}
643
645 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
646 cast<FPMathOperator>(this)->setHasAllowContract(B);
647}
648
650 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
651 cast<FPMathOperator>(this)->setHasApproxFunc(B);
652}
653
655 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
656 cast<FPMathOperator>(this)->setFastMathFlags(FMF);
657}
658
660 assert(isa<FPMathOperator>(this) && "copying fast-math flag on invalid op");
661 cast<FPMathOperator>(this)->copyFastMathFlags(FMF);
662}
663
664bool Instruction::isFast() const {
665 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
666 return cast<FPMathOperator>(this)->isFast();
667}
668
669bool Instruction::hasAllowReassoc() const {
670 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
671 return cast<FPMathOperator>(this)->hasAllowReassoc();
672}
673
674bool Instruction::hasNoNaNs() const {
675 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
676 return cast<FPMathOperator>(this)->hasNoNaNs();
677}
678
679bool Instruction::hasNoInfs() const {
680 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
681 return cast<FPMathOperator>(this)->hasNoInfs();
682}
683
685 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
686 return cast<FPMathOperator>(this)->hasNoSignedZeros();
687}
688
690 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
691 return cast<FPMathOperator>(this)->hasAllowReciprocal();
692}
693
695 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
696 return cast<FPMathOperator>(this)->hasAllowContract();
697}
698
699bool Instruction::hasApproxFunc() const {
700 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
701 return cast<FPMathOperator>(this)->hasApproxFunc();
702}
703
705 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
706 return cast<FPMathOperator>(this)->getFastMathFlags();
707}
708
710 if (!isa<FPMathOperator>(this))
711 return {};
712 return cast<FPMathOperator>(this)->getFastMathFlags();
713}
714
716 copyFastMathFlags(I->getFastMathFlags());
717}
718
719void Instruction::copyIRFlags(const Value *V, bool IncludeWrapFlags) {
720 // Copy the wrapping flags.
721 if (IncludeWrapFlags && isa<OverflowingBinaryOperator>(this)) {
722 if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
723 setHasNoSignedWrap(OB->hasNoSignedWrap());
724 setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());
725 }
726 }
727
728 if (auto *TI = dyn_cast<TruncInst>(V)) {
729 if (isa<TruncInst>(this)) {
730 setHasNoSignedWrap(TI->hasNoSignedWrap());
731 setHasNoUnsignedWrap(TI->hasNoUnsignedWrap());
732 }
733 }
734
735 // Copy the exact flag.
736 if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
738 setIsExact(PE->isExact());
739
740 if (auto *SrcPD = dyn_cast<PossiblyDisjointInst>(V))
741 if (auto *DestPD = dyn_cast<PossiblyDisjointInst>(this))
742 DestPD->setIsDisjoint(SrcPD->isDisjoint());
743
744 // Copy the fast-math flags.
745 if (auto *FP = dyn_cast<FPMathOperator>(V))
746 if (isa<FPMathOperator>(this))
747 copyFastMathFlags(FP->getFastMathFlags());
748
749 if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(V))
750 if (auto *DestGEP = dyn_cast<GetElementPtrInst>(this))
751 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() |
752 DestGEP->getNoWrapFlags());
753
754 if (auto *NNI = dyn_cast<PossiblyNonNegInst>(V))
755 if (isa<PossiblyNonNegInst>(this))
756 setNonNeg(NNI->hasNonNeg());
757
758 if (auto *SrcICmp = dyn_cast<ICmpInst>(V))
759 if (auto *DestICmp = dyn_cast<ICmpInst>(this))
760 DestICmp->setSameSign(SrcICmp->hasSameSign());
761
762 if (auto *SrcASC = dyn_cast<AddrSpaceCastInst>(V))
763 if (auto *DestASC = dyn_cast<AddrSpaceCastInst>(this)) {
764 assert(DestASC->getSrcAddressSpace() == SrcASC->getSrcAddressSpace() &&
765 "nonull flag cannot be safely preserved with different source "
766 "address spaces");
767 DestASC->setNonNull(SrcASC->hasNonNull());
768 }
769}
770
771void Instruction::andIRFlags(const Value *V) {
772 if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
774 setHasNoSignedWrap(hasNoSignedWrap() && OB->hasNoSignedWrap());
775 setHasNoUnsignedWrap(hasNoUnsignedWrap() && OB->hasNoUnsignedWrap());
776 }
777 }
778
779 if (auto *TI = dyn_cast<TruncInst>(V)) {
780 if (isa<TruncInst>(this)) {
781 setHasNoSignedWrap(hasNoSignedWrap() && TI->hasNoSignedWrap());
782 setHasNoUnsignedWrap(hasNoUnsignedWrap() && TI->hasNoUnsignedWrap());
783 }
784 }
785
786 if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
788 setIsExact(isExact() && PE->isExact());
789
790 if (auto *SrcPD = dyn_cast<PossiblyDisjointInst>(V))
791 if (auto *DestPD = dyn_cast<PossiblyDisjointInst>(this))
792 DestPD->setIsDisjoint(DestPD->isDisjoint() && SrcPD->isDisjoint());
793
794 if (auto *FP = dyn_cast<FPMathOperator>(V)) {
795 if (isa<FPMathOperator>(this)) {
797 FM &= FP->getFastMathFlags();
798 copyFastMathFlags(FM);
799 }
800 }
801
802 if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(V))
803 if (auto *DestGEP = dyn_cast<GetElementPtrInst>(this))
804 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() &
805 DestGEP->getNoWrapFlags());
806
807 if (auto *NNI = dyn_cast<PossiblyNonNegInst>(V))
808 if (isa<PossiblyNonNegInst>(this))
809 setNonNeg(hasNonNeg() && NNI->hasNonNeg());
810
811 if (auto *SrcICmp = dyn_cast<ICmpInst>(V))
812 if (auto *DestICmp = dyn_cast<ICmpInst>(this))
813 DestICmp->setSameSign(DestICmp->hasSameSign() && SrcICmp->hasSameSign());
814
815 if (auto *SrcASC = dyn_cast<AddrSpaceCastInst>(V))
816 if (auto *DestASC = dyn_cast<AddrSpaceCastInst>(this)) {
817 assert(DestASC->getSrcAddressSpace() == SrcASC->getSrcAddressSpace() &&
818 "nonull flag cannot be safely preserved with different source "
819 "address spaces");
820 DestASC->setNonNull(DestASC->hasNonNull() && SrcASC->hasNonNull());
821 }
822}
823
824const char *Instruction::getOpcodeName(unsigned OpCode) {
825 switch (OpCode) {
826 // Terminators
827 case Ret: return "ret";
828 case UncondBr: return "br";
829 case CondBr: return "br";
830 case Switch: return "switch";
831 case IndirectBr: return "indirectbr";
832 case Invoke: return "invoke";
833 case Resume: return "resume";
834 case Unreachable: return "unreachable";
835 case CleanupRet: return "cleanupret";
836 case CatchRet: return "catchret";
837 case CatchPad: return "catchpad";
838 case CatchSwitch: return "catchswitch";
839 case CallBr: return "callbr";
840
841 // Standard unary operators...
842 case FNeg: return "fneg";
843
844 // Standard binary operators...
845 case Add: return "add";
846 case FAdd: return "fadd";
847 case Sub: return "sub";
848 case FSub: return "fsub";
849 case Mul: return "mul";
850 case FMul: return "fmul";
851 case UDiv: return "udiv";
852 case SDiv: return "sdiv";
853 case FDiv: return "fdiv";
854 case URem: return "urem";
855 case SRem: return "srem";
856 case FRem: return "frem";
857
858 // Logical operators...
859 case And: return "and";
860 case Or : return "or";
861 case Xor: return "xor";
862
863 // Memory instructions...
864 case Alloca: return "alloca";
865 case Load: return "load";
866 case Store: return "store";
867 case AtomicCmpXchg: return "cmpxchg";
868 case AtomicRMW: return "atomicrmw";
869 case Fence: return "fence";
870 case GetElementPtr: return "getelementptr";
871
872 // Convert instructions...
873 case Trunc: return "trunc";
874 case ZExt: return "zext";
875 case SExt: return "sext";
876 case FPTrunc: return "fptrunc";
877 case FPExt: return "fpext";
878 case FPToUI: return "fptoui";
879 case FPToSI: return "fptosi";
880 case UIToFP: return "uitofp";
881 case SIToFP: return "sitofp";
882 case IntToPtr: return "inttoptr";
883 case PtrToAddr: return "ptrtoaddr";
884 case PtrToInt: return "ptrtoint";
885 case BitCast: return "bitcast";
886 case AddrSpaceCast: return "addrspacecast";
887
888 // Other instructions...
889 case ICmp: return "icmp";
890 case FCmp: return "fcmp";
891 case PHI: return "phi";
892 case Select: return "select";
893 case Call: return "call";
894 case Shl: return "shl";
895 case LShr: return "lshr";
896 case AShr: return "ashr";
897 case VAArg: return "va_arg";
898 case ExtractElement: return "extractelement";
899 case InsertElement: return "insertelement";
900 case ShuffleVector: return "shufflevector";
901 case ExtractValue: return "extractvalue";
902 case InsertValue: return "insertvalue";
903 case LandingPad: return "landingpad";
904 case CleanupPad: return "cleanuppad";
905 case Freeze: return "freeze";
906
907 default: return "<Invalid operator> ";
908 }
909}
910
911/// This must be kept in sync with FunctionComparator::cmpOperations in
912/// lib/Transforms/Utils/FunctionComparator.cpp.
914 bool IgnoreAlignment,
915 bool IntersectAttrs) const {
916 const auto *I1 = this;
917 assert(I1->getOpcode() == I2->getOpcode() &&
918 "Can not compare special state of different instructions");
919
920 auto CheckAttrsSame = [IntersectAttrs](const CallBase *CB0,
921 const CallBase *CB1) {
922 return IntersectAttrs
923 ? CB0->getAttributes()
924 .intersectWith(CB0->getContext(), CB1->getAttributes())
925 .has_value()
926 : CB0->getAttributes() == CB1->getAttributes();
927 };
928
929 if (const AllocaInst *AI = dyn_cast<AllocaInst>(I1))
930 return AI->getAllocatedType() == cast<AllocaInst>(I2)->getAllocatedType() &&
931 (AI->getAlign() == cast<AllocaInst>(I2)->getAlign() ||
932 IgnoreAlignment);
933 if (const LoadInst *LI = dyn_cast<LoadInst>(I1))
934 return LI->isVolatile() == cast<LoadInst>(I2)->isVolatile() &&
935 LI->isElementwise() == cast<LoadInst>(I2)->isElementwise() &&
936 (LI->getAlign() == cast<LoadInst>(I2)->getAlign() ||
937 IgnoreAlignment) &&
938 LI->getOrdering() == cast<LoadInst>(I2)->getOrdering() &&
939 LI->getSyncScopeID() == cast<LoadInst>(I2)->getSyncScopeID();
940 if (const StoreInst *SI = dyn_cast<StoreInst>(I1))
941 return SI->isVolatile() == cast<StoreInst>(I2)->isVolatile() &&
942 SI->isElementwise() == cast<StoreInst>(I2)->isElementwise() &&
943 (SI->getAlign() == cast<StoreInst>(I2)->getAlign() ||
944 IgnoreAlignment) &&
945 SI->getOrdering() == cast<StoreInst>(I2)->getOrdering() &&
946 SI->getSyncScopeID() == cast<StoreInst>(I2)->getSyncScopeID();
947 if (const CmpInst *CI = dyn_cast<CmpInst>(I1))
948 return CI->getPredicate() == cast<CmpInst>(I2)->getPredicate();
949 if (const CallInst *CI = dyn_cast<CallInst>(I1))
950 return CI->isTailCall() == cast<CallInst>(I2)->isTailCall() &&
951 CI->getCallingConv() == cast<CallInst>(I2)->getCallingConv() &&
952 CheckAttrsSame(CI, cast<CallInst>(I2)) &&
953 CI->hasIdenticalOperandBundleSchema(*cast<CallInst>(I2));
954 if (const InvokeInst *CI = dyn_cast<InvokeInst>(I1))
955 return CI->getCallingConv() == cast<InvokeInst>(I2)->getCallingConv() &&
956 CheckAttrsSame(CI, cast<InvokeInst>(I2)) &&
957 CI->hasIdenticalOperandBundleSchema(*cast<InvokeInst>(I2));
958 if (const CallBrInst *CI = dyn_cast<CallBrInst>(I1))
959 return CI->getCallingConv() == cast<CallBrInst>(I2)->getCallingConv() &&
960 CheckAttrsSame(CI, cast<CallBrInst>(I2)) &&
961 CI->hasIdenticalOperandBundleSchema(*cast<CallBrInst>(I2));
962 if (const SwitchInst *SI = dyn_cast<SwitchInst>(I1)) {
963 for (auto [Case1, Case2] : zip(SI->cases(), cast<SwitchInst>(I2)->cases()))
964 if (Case1.getCaseValue() != Case2.getCaseValue())
965 return false;
966 return true;
967 }
968 if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(I1))
969 return IVI->getIndices() == cast<InsertValueInst>(I2)->getIndices();
970 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(I1))
971 return EVI->getIndices() == cast<ExtractValueInst>(I2)->getIndices();
972 if (const FenceInst *FI = dyn_cast<FenceInst>(I1))
973 return FI->getOrdering() == cast<FenceInst>(I2)->getOrdering() &&
974 FI->getSyncScopeID() == cast<FenceInst>(I2)->getSyncScopeID();
976 return CXI->isVolatile() == cast<AtomicCmpXchgInst>(I2)->isVolatile() &&
977 (CXI->getAlign() == cast<AtomicCmpXchgInst>(I2)->getAlign() ||
978 IgnoreAlignment) &&
979 CXI->isWeak() == cast<AtomicCmpXchgInst>(I2)->isWeak() &&
980 CXI->getSuccessOrdering() ==
981 cast<AtomicCmpXchgInst>(I2)->getSuccessOrdering() &&
982 CXI->getFailureOrdering() ==
983 cast<AtomicCmpXchgInst>(I2)->getFailureOrdering() &&
984 CXI->getSyncScopeID() ==
985 cast<AtomicCmpXchgInst>(I2)->getSyncScopeID();
986 if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(I1))
987 return RMWI->getOperation() == cast<AtomicRMWInst>(I2)->getOperation() &&
988 RMWI->isElementwise() == cast<AtomicRMWInst>(I2)->isElementwise() &&
989 RMWI->isVolatile() == cast<AtomicRMWInst>(I2)->isVolatile() &&
990 (RMWI->getAlign() == cast<AtomicRMWInst>(I2)->getAlign() ||
991 IgnoreAlignment) &&
992 RMWI->getOrdering() == cast<AtomicRMWInst>(I2)->getOrdering() &&
993 RMWI->getSyncScopeID() == cast<AtomicRMWInst>(I2)->getSyncScopeID();
995 return SVI->getShuffleMask() ==
996 cast<ShuffleVectorInst>(I2)->getShuffleMask();
998 return GEP->getSourceElementType() ==
999 cast<GetElementPtrInst>(I2)->getSourceElementType();
1000
1001 return true;
1002}
1003
1004bool Instruction::isIdenticalTo(const Instruction *I) const {
1005 return isIdenticalToWhenDefined(I) &&
1006 SubclassOptionalData == I->SubclassOptionalData;
1007}
1008
1010 bool IntersectAttrs) const {
1011 if (getOpcode() != I->getOpcode() ||
1012 getNumOperands() != I->getNumOperands() || getType() != I->getType())
1013 return false;
1014
1015 // If both instructions have no operands, they are identical.
1016 if (getNumOperands() == 0 && I->getNumOperands() == 0)
1017 return this->hasSameSpecialState(I, /*IgnoreAlignment=*/false,
1018 IntersectAttrs);
1019
1020 // We have two instructions of identical opcode and #operands. Check to see
1021 // if all operands are the same.
1022 if (!equal(operands(), I->operands()))
1023 return false;
1024
1025 // WARNING: this logic must be kept in sync with EliminateDuplicatePHINodes()!
1026 if (const PHINode *Phi = dyn_cast<PHINode>(this)) {
1027 const PHINode *OtherPhi = cast<PHINode>(I);
1028 return equal(Phi->blocks(), OtherPhi->blocks());
1029 }
1030
1031 return this->hasSameSpecialState(I, /*IgnoreAlignment=*/false,
1032 IntersectAttrs);
1033}
1034
1035// Keep this in sync with FunctionComparator::cmpOperations in
1036// lib/Transforms/IPO/MergeFunctions.cpp.
1038 unsigned flags) const {
1039 bool IgnoreAlignment = flags & CompareIgnoringAlignment;
1040 bool UseScalarTypes = flags & CompareUsingScalarTypes;
1041 bool IntersectAttrs = flags & CompareUsingIntersectedAttrs;
1042 bool CheckCallTargets = flags & CompareCallTargets;
1043
1044 if (getOpcode() != I->getOpcode() ||
1045 getNumOperands() != I->getNumOperands() ||
1046 (UseScalarTypes ?
1047 getType()->getScalarType() != I->getType()->getScalarType() :
1048 getType() != I->getType()))
1049 return false;
1050
1051 // We have two instructions of identical opcode and #operands. Check to see
1052 // if all operands are the same type
1053 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
1054 if (UseScalarTypes ?
1055 getOperand(i)->getType()->getScalarType() !=
1056 I->getOperand(i)->getType()->getScalarType() :
1057 getOperand(i)->getType() != I->getOperand(i)->getType())
1058 return false;
1059
1060 if (CheckCallTargets)
1061 if (const auto *CB = dyn_cast<CallBase>(this))
1062 if (CB->getCalledOperand() != cast<CallBase>(I)->getCalledOperand())
1063 return false;
1064
1065 return this->hasSameSpecialState(I, IgnoreAlignment, IntersectAttrs);
1066}
1067
1068bool Instruction::isUsedOutsideOfBlock(const BasicBlock *BB) const {
1069 for (const Use &U : uses()) {
1070 // PHI nodes uses values in the corresponding predecessor block. For other
1071 // instructions, just check to see whether the parent of the use matches up.
1072 const Instruction *I = cast<Instruction>(U.getUser());
1073 const PHINode *PN = dyn_cast<PHINode>(I);
1074 if (!PN) {
1075 if (I->getParent() != BB)
1076 return true;
1077 continue;
1078 }
1079
1080 if (PN->getIncomingBlock(U) != BB)
1081 return true;
1082 }
1083 return false;
1084}
1085
1087 auto GetEffects = [](ModRefInfo BaseMR, AtomicOrdering Ordering,
1088 bool IsVolatile) {
1089 if (isStrongerThanMonotonic(Ordering))
1090 return MemoryEffects::unknown();
1091
1092 if (IsVolatile)
1094
1095 if (isStrongerThanUnordered(Ordering))
1097
1098 return MemoryEffects::argMemOnly(BaseMR);
1099 };
1100 switch (getOpcode()) {
1101 default:
1102 return MemoryEffects::none();
1103 case Instruction::VAArg:
1105 case Instruction::CatchPad:
1106 case Instruction::CatchRet:
1107 case Instruction::Fence:
1108 return MemoryEffects::unknown();
1109 case Instruction::Call:
1110 case Instruction::Invoke:
1111 case Instruction::CallBr:
1112 return cast<CallBase>(this)->getMemoryEffects();
1113 case Instruction::Load: {
1114 auto *LI = cast<LoadInst>(this);
1115 return GetEffects(ModRefInfo::Ref, LI->getOrdering(), LI->isVolatile());
1116 }
1117 case Instruction::Store: {
1118 auto *SI = cast<StoreInst>(this);
1119 return GetEffects(ModRefInfo::Mod, SI->getOrdering(), SI->isVolatile());
1120 }
1121 case Instruction::AtomicRMW: {
1122 auto *RMW = cast<AtomicRMWInst>(this);
1123 return GetEffects(ModRefInfo::ModRef, RMW->getOrdering(),
1124 RMW->isVolatile());
1125 }
1126 case Instruction::AtomicCmpXchg: {
1127 auto *CX = cast<AtomicCmpXchgInst>(this);
1128 return GetEffects(ModRefInfo::ModRef, CX->getMergedOrdering(),
1129 CX->isVolatile());
1130 }
1131 }
1132}
1133
1134// This is duplicating the logic from getMemoryEffects() for performance
1135// reasons. Computing the full MemoryEffects just to perform a Mod/Ref check
1136// is expensive.
1137
1138bool Instruction::mayReadFromMemory() const {
1139 switch (getOpcode()) {
1140 default: return false;
1141 case Instruction::VAArg:
1142 case Instruction::Load:
1143 case Instruction::Fence: // FIXME: refine definition of mayReadFromMemory
1144 case Instruction::AtomicCmpXchg:
1145 case Instruction::AtomicRMW:
1146 case Instruction::CatchPad:
1147 case Instruction::CatchRet:
1148 return true;
1149 case Instruction::Call:
1150 case Instruction::Invoke:
1151 case Instruction::CallBr:
1152 return !cast<CallBase>(this)->onlyWritesMemory();
1153 case Instruction::Store:
1154 return !cast<StoreInst>(this)->isUnordered();
1155 }
1156}
1157
1158bool Instruction::mayWriteToMemory() const {
1159 switch (getOpcode()) {
1160 default: return false;
1161 case Instruction::Fence: // FIXME: refine definition of mayWriteToMemory
1162 case Instruction::Store:
1163 case Instruction::VAArg:
1164 case Instruction::AtomicCmpXchg:
1165 case Instruction::AtomicRMW:
1166 case Instruction::CatchPad:
1167 case Instruction::CatchRet:
1168 return true;
1169 case Instruction::Call:
1170 case Instruction::Invoke:
1171 case Instruction::CallBr:
1172 return !cast<CallBase>(this)->onlyReadsMemory();
1173 case Instruction::Load:
1174 return !cast<LoadInst>(this)->isUnordered();
1175 }
1176}
1177
1178bool Instruction::isAtomic() const {
1179 switch (getOpcode()) {
1180 default:
1181 return false;
1182 case Instruction::AtomicCmpXchg:
1183 case Instruction::AtomicRMW:
1184 case Instruction::Fence:
1185 return true;
1186 case Instruction::Load:
1187 return cast<LoadInst>(this)->getOrdering() != AtomicOrdering::NotAtomic;
1188 case Instruction::Store:
1189 return cast<StoreInst>(this)->getOrdering() != AtomicOrdering::NotAtomic;
1190 }
1191}
1192
1193bool Instruction::hasAtomicLoad() const {
1194 assert(isAtomic());
1195 switch (getOpcode()) {
1196 default:
1197 return false;
1198 case Instruction::AtomicCmpXchg:
1199 case Instruction::AtomicRMW:
1200 case Instruction::Load:
1201 return true;
1202 }
1203}
1204
1205bool Instruction::hasAtomicStore() const {
1206 assert(isAtomic());
1207 switch (getOpcode()) {
1208 default:
1209 return false;
1210 case Instruction::AtomicCmpXchg:
1211 case Instruction::AtomicRMW:
1212 case Instruction::Store:
1213 return true;
1214 }
1215}
1216
1217bool Instruction::isVolatile() const {
1218 switch (getOpcode()) {
1219 default:
1220 return false;
1221 case Instruction::AtomicRMW:
1222 return cast<AtomicRMWInst>(this)->isVolatile();
1223 case Instruction::Store:
1224 return cast<StoreInst>(this)->isVolatile();
1225 case Instruction::Load:
1226 return cast<LoadInst>(this)->isVolatile();
1227 case Instruction::AtomicCmpXchg:
1228 return cast<AtomicCmpXchgInst>(this)->isVolatile();
1229 case Instruction::Call:
1230 case Instruction::Invoke:
1231 // There are a very limited number of intrinsics with volatile flags.
1232 if (auto *II = dyn_cast<IntrinsicInst>(this)) {
1233 if (auto *MI = dyn_cast<MemIntrinsic>(II))
1234 return MI->isVolatile();
1235 switch (II->getIntrinsicID()) {
1236 default: break;
1237 case Intrinsic::matrix_column_major_load:
1238 return cast<ConstantInt>(II->getArgOperand(2))->isOne();
1239 case Intrinsic::matrix_column_major_store:
1240 return cast<ConstantInt>(II->getArgOperand(3))->isOne();
1241 }
1242 }
1243 return false;
1244 }
1245}
1246
1247bool Instruction::maySynchronize() const {
1248 // FIXME: This currently treats atomics with monotonic ordering as
1249 // synchronizing. This is unnecessarily conservative and does not match
1250 // our LangRef definition of the property.
1251 switch (getOpcode()) {
1252 default:
1253 assert(!isAtomic() && "Unhandled atomic instruction");
1254 return false;
1255 case Instruction::Fence: {
1256 // All legal orderings for fence are stronger than monotonic.
1257 auto *FI = cast<FenceInst>(this);
1258 return FI->getSyncScopeID() != SyncScope::SingleThread;
1259 }
1260 case Instruction::AtomicRMW:
1261 case Instruction::AtomicCmpXchg:
1262 return true;
1263 case Instruction::Store:
1264 return isStrongerThanUnordered(cast<StoreInst>(this)->getOrdering());
1265 case Instruction::Load:
1266 return isStrongerThanUnordered(cast<LoadInst>(this)->getOrdering());
1267 case Instruction::Call:
1268 case Instruction::Invoke:
1269 case Instruction::CallBr:
1270 return !cast<CallBase>(this)->hasFnAttr(Attribute::NoSync);
1271 }
1272}
1273
1274Type *Instruction::getAccessType() const {
1275 switch (getOpcode()) {
1276 case Instruction::Store:
1277 return cast<StoreInst>(this)->getValueOperand()->getType();
1278 case Instruction::Load:
1279 case Instruction::AtomicRMW:
1280 return getType();
1281 case Instruction::AtomicCmpXchg:
1282 return cast<AtomicCmpXchgInst>(this)->getNewValOperand()->getType();
1283 case Instruction::Call:
1284 case Instruction::Invoke:
1285 if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(this)) {
1286 switch (II->getIntrinsicID()) {
1287 case Intrinsic::masked_load:
1288 case Intrinsic::masked_gather:
1289 case Intrinsic::masked_expandload:
1290 case Intrinsic::vp_load:
1291 case Intrinsic::vp_gather:
1292 case Intrinsic::experimental_vp_strided_load:
1293 return II->getType();
1294 case Intrinsic::masked_store:
1295 case Intrinsic::masked_scatter:
1296 case Intrinsic::masked_compressstore:
1297 case Intrinsic::vp_store:
1298 case Intrinsic::vp_scatter:
1299 case Intrinsic::experimental_vp_strided_store:
1300 return II->getOperand(0)->getType();
1301 default:
1302 break;
1303 }
1304 }
1305 }
1306
1307 return nullptr;
1308}
1309
1310static bool canUnwindPastLandingPad(const LandingPadInst *LP,
1311 bool IncludePhaseOneUnwind) {
1312 // Because phase one unwinding skips cleanup landingpads, we effectively
1313 // unwind past this frame, and callers need to have valid unwind info.
1314 if (LP->isCleanup())
1315 return IncludePhaseOneUnwind;
1316
1317 for (unsigned I = 0; I < LP->getNumClauses(); ++I) {
1318 Constant *Clause = LP->getClause(I);
1319 // catch ptr null catches all exceptions.
1320 if (LP->isCatch(I) && isa<ConstantPointerNull>(Clause))
1321 return false;
1322 // filter [0 x ptr] catches all exceptions.
1323 if (LP->isFilter(I) && Clause->getType()->getArrayNumElements() == 0)
1324 return false;
1325 }
1326
1327 // May catch only some subset of exceptions, in which case other exceptions
1328 // will continue unwinding.
1329 return true;
1330}
1331
1332bool Instruction::mayThrow(bool IncludePhaseOneUnwind) const {
1333 switch (getOpcode()) {
1334 case Instruction::Call:
1335 return !cast<CallInst>(this)->doesNotThrow();
1336 case Instruction::CleanupRet:
1337 return cast<CleanupReturnInst>(this)->unwindsToCaller();
1338 case Instruction::CatchSwitch:
1339 return cast<CatchSwitchInst>(this)->unwindsToCaller();
1340 case Instruction::Resume:
1341 return true;
1342 case Instruction::Invoke: {
1343 // Landingpads themselves don't unwind -- however, an invoke of a skipped
1344 // landingpad may continue unwinding.
1345 BasicBlock *UnwindDest = cast<InvokeInst>(this)->getUnwindDest();
1346 BasicBlock::iterator Pad = UnwindDest->getFirstNonPHIIt();
1347 if (auto *LP = dyn_cast<LandingPadInst>(Pad))
1348 return canUnwindPastLandingPad(LP, IncludePhaseOneUnwind);
1349 return false;
1350 }
1351 case Instruction::CleanupPad:
1352 // Treat the same as cleanup landingpad.
1353 return IncludePhaseOneUnwind;
1354 default:
1355 return false;
1356 }
1357}
1358
1360 return mayWriteToMemory() || mayThrow() || !willReturn();
1361}
1362
1363bool Instruction::isSafeToRemove() const {
1364 return (!isa<CallInst>(this) || !this->mayHaveSideEffects()) &&
1365 !this->isTerminator() && !this->isEHPad();
1366}
1367
1368bool Instruction::willReturn() const {
1369 // Volatile operations are not guaranteed to return.
1370 if (isVolatile())
1371 return false;
1372
1373 if (const auto *CB = dyn_cast<CallBase>(this))
1374 return CB->hasFnAttr(Attribute::WillReturn);
1375 return true;
1376}
1377
1379 auto *II = dyn_cast<IntrinsicInst>(this);
1380 if (!II)
1381 return false;
1382 Intrinsic::ID ID = II->getIntrinsicID();
1383 return ID == Intrinsic::lifetime_start || ID == Intrinsic::lifetime_end;
1384}
1385
1387 auto *II = dyn_cast<IntrinsicInst>(this);
1388 if (!II)
1389 return false;
1390 Intrinsic::ID ID = II->getIntrinsicID();
1391 return ID == Intrinsic::launder_invariant_group ||
1392 ID == Intrinsic::strip_invariant_group;
1393}
1394
1396 return isa<DbgInfoIntrinsic>(this) || isa<PseudoProbeInst>(this);
1397}
1398
1400 return getDebugLoc();
1401}
1402
1403bool Instruction::isAssociative() const {
1404 if (auto *II = dyn_cast<IntrinsicInst>(this))
1405 return II->isAssociative();
1406 unsigned Opcode = getOpcode();
1407 if (isAssociative(Opcode))
1408 return true;
1409
1410 switch (Opcode) {
1411 case FMul:
1412 return cast<FPMathOperator>(this)->hasAllowReassoc();
1413 case FAdd:
1414 return cast<FPMathOperator>(this)->hasAllowReassoc() &&
1415 cast<FPMathOperator>(this)->hasNoSignedZeros();
1416 default:
1417 return false;
1418 }
1419}
1420
1421bool Instruction::isCommutative() const {
1422 if (auto *II = dyn_cast<IntrinsicInst>(this))
1423 return II->isCommutative();
1424 // TODO: Should allow icmp/fcmp?
1425 return isCommutative(getOpcode());
1426}
1427
1428bool Instruction::isCommutableOperand(unsigned Op) const {
1429 if (auto *II = dyn_cast<IntrinsicInst>(this))
1430 return II->isCommutableOperand(Op);
1431 // TODO: Should allow icmp/fcmp?
1432 return isCommutative(getOpcode());
1433}
1434
1435unsigned Instruction::getNumSuccessors() const {
1436 switch (getOpcode()) {
1437#define HANDLE_TERM_INST(N, OPC, CLASS) \
1438 case Instruction::OPC: \
1439 return static_cast<const CLASS *>(this)->getNumSuccessors();
1440#include "llvm/IR/Instruction.def"
1441 default:
1442 break;
1443 }
1444 llvm_unreachable("not a terminator");
1445}
1446
1447BasicBlock *Instruction::getSuccessor(unsigned idx) const {
1448 switch (getOpcode()) {
1449#define HANDLE_TERM_INST(N, OPC, CLASS) \
1450 case Instruction::OPC: \
1451 return static_cast<const CLASS *>(this)->getSuccessor(idx);
1452#include "llvm/IR/Instruction.def"
1453 default:
1454 break;
1455 }
1456 llvm_unreachable("not a terminator");
1457}
1458
1459void Instruction::setSuccessor(unsigned idx, BasicBlock *B) {
1460 switch (getOpcode()) {
1461#define HANDLE_TERM_INST(N, OPC, CLASS) \
1462 case Instruction::OPC: \
1463 return static_cast<CLASS *>(this)->setSuccessor(idx, B);
1464#include "llvm/IR/Instruction.def"
1465 default:
1466 break;
1467 }
1468 llvm_unreachable("not a terminator");
1469}
1470
1473 switch (getOpcode()) {
1474#define HANDLE_TERM_INST(N, OPC, CLASS) \
1475 case Instruction::OPC: \
1476 return static_cast<const CLASS *>(this)->successors();
1477#include "llvm/IR/Instruction.def"
1478 default:
1479 break;
1480 }
1481 llvm_unreachable("not a terminator");
1482}
1483
1485 auto Succs = successors();
1486 for (auto I = Succs.begin(), E = Succs.end(); I != E; ++I)
1487 if (*I == OldBB)
1488 I.getUse()->set(NewBB);
1489}
1490
1491Instruction *Instruction::cloneImpl() const {
1492 llvm_unreachable("Subclass of Instruction failed to implement cloneImpl");
1493}
1494
1496 MDNode *ProfileData = getBranchWeightMDNode(*this);
1497 if (!ProfileData)
1498 return;
1499 unsigned FirstIdx = getBranchWeightOffset(ProfileData);
1500 if (ProfileData->getNumOperands() != 2 + FirstIdx)
1501 return;
1502
1503 unsigned SecondIdx = FirstIdx + 1;
1505 // If there are more weights past the second, we can't swap them
1506 if (ProfileData->getNumOperands() > SecondIdx + 1)
1507 return;
1508 for (unsigned Idx = 0; Idx < FirstIdx; ++Idx) {
1509 Ops.push_back(ProfileData->getOperand(Idx));
1510 }
1511 // Switch the order of the weights
1512 Ops.push_back(ProfileData->getOperand(SecondIdx));
1513 Ops.push_back(ProfileData->getOperand(FirstIdx));
1514 setMetadata(LLVMContext::MD_prof,
1515 MDNode::get(ProfileData->getContext(), Ops));
1516}
1517
1519 // TODO: Include additional metadata in the future if appropriate.
1520 static const unsigned SafeIDs[] = {
1521 LLVMContext::MD_dbg, LLVMContext::MD_prof, LLVMContext::MD_memprof,
1522 LLVMContext::MD_callsite};
1523 copyMetadata(SrcInst, SafeIDs);
1524}
1525
1526void Instruction::copyMetadata(const Instruction &SrcInst,
1527 ArrayRef<unsigned> WL) {
1528 if (WL.empty() || is_contained(WL, LLVMContext::MD_dbg))
1529 setDebugLoc(SrcInst.getDebugLoc().orElse(getDebugLoc()));
1530
1531 if (!SrcInst.hasMetadata())
1532 return;
1533
1534 SmallDenseSet<unsigned, 4> WLS(WL.begin(), WL.end());
1535
1536 // Otherwise, enumerate and copy over metadata from the old instruction to the
1537 // new one.
1539 SrcInst.getAllMetadataOtherThanDebugLoc(TheMDs);
1540 for (const auto &MD : TheMDs) {
1541 if (WL.empty() || WLS.count(MD.first))
1542 setMetadata(MD.first, MD.second);
1543 }
1544}
1545
1547 Instruction *New = nullptr;
1548 switch (getOpcode()) {
1549 default:
1550 llvm_unreachable("Unhandled Opcode.");
1551#define HANDLE_INST(num, opc, clas) \
1552 case Instruction::opc: \
1553 New = cast<clas>(this)->cloneImpl(); \
1554 break;
1555#include "llvm/IR/Instruction.def"
1556#undef HANDLE_INST
1557 }
1558
1559 New->SubclassOptionalData = SubclassOptionalData;
1560 New->copyMetadata(*this);
1561 return New;
1562}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseSet and SmallDenseSet classes.
Hexagon Common GEP
static MaybeAlign getAlign(Value *Ptr)
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
static bool hasNoSignedWrap(BinaryOperator &I)
static bool hasNoUnsignedWrap(BinaryOperator &I)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
static DebugLoc getDebugLoc(MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
Return the first DebugLoc that has line number information, given a range of instructions.
This file provides utility for Memory Model Relaxation Annotations (MMRAs).
uint64_t IntrinsicInst * II
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
This file contains the declarations for profiling metadata utility functions.
static bool mayHaveSideEffects(MachineInstr &MI)
Func MI getDebugLoc()))
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static unsigned getFastMathFlags(const MachineInstr &I, const SPIRVSubtarget &ST)
This file contains some templates that are useful if you are working with the STL at all.
static bool canUnwindPastLandingPad(const LandingPadInst *LP, bool IncludePhaseOneUnwind)
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
static bool isAssociative(const COFFSection &Section)
BinaryOperator * Mul
an instruction to allocate memory on the stack
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
iterator begin() const
Definition ArrayRef.h:129
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
This class stores enough information to efficiently remove some attributes from an existing AttrBuild...
AttributeMask & addAttribute(Attribute::AttrKind Val)
Add an attribute to the mask.
This class holds the attributes for a particular argument, parameter, function, or return value.
Definition Attributes.h:407
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator end()
Definition BasicBlock.h:459
LLVM_ABI void deleteTrailingDbgRecords()
Delete any trailing DbgRecords at the end of this block, see setTrailingDbgRecords.
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...
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
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 DbgMarker * getMarker(InstListType::iterator It)
Return the DbgMarker for the position given by It, so that DbgRecords can be inserted there.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
AttributeList getAttributes() const
Return the attributes for this call.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Per-instruction record of debug-info.
static iterator_range< simple_ilist< DbgRecord >::iterator > getEmptyDbgRecordRange()
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
LLVM_ABI void eraseFromParent()
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
Base class for non-instruction debug metadata records that have positions within IR.
A debug info location.
Definition DebugLoc.h:126
DebugLoc orElse(DebugLoc Other) const
If this DebugLoc is non-empty, returns this DebugLoc; otherwise, selects Other.
Definition DebugLoc.h:187
This instruction extracts a struct member or array element value from an aggregate value.
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
An instruction for ordering other memory operations.
static GEPNoWrapFlags none()
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
InsertPosition(std::nullptr_t)
Definition Instruction.h:56
This instruction inserts a struct field of array element value into an aggregate value.
LLVM_ABI const DebugLoc & getStableDebugLoc() const
Fetch the debug location for this node, unless this is a debug intrinsic, in which case fetch the deb...
LLVM_ABI void dropUBImplyingAttrsAndMetadata(ArrayRef< unsigned > Keep={})
Drop any attributes or metadata that can cause immediate undefined behavior.
DbgMarker * DebugMarker
Optional marker recording the position for debugging information that takes effect immediately before...
LLVM_ABI MemoryEffects getMemoryEffects() const LLVM_READONLY
Return memory effects of the instruction.
LLVM_ABI bool mayThrow(bool IncludePhaseOneUnwind=false) const LLVM_READONLY
Return true if this instruction may throw an exception.
LLVM_ABI Instruction * clone() const
Create a copy of 'this' instruction that is identical in all ways except the following:
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
LLVM_ABI void removeFromParent()
This method unlinks 'this' from the containing basic block, but does not delete it.
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI bool isLifetimeStartOrEnd() const LLVM_READONLY
Return true if the instruction is a llvm.lifetime.start or llvm.lifetime.end marker.
LLVM_ABI bool hasPoisonGeneratingAttributes() const LLVM_READONLY
Return true if this instruction has poison-generating attribute.
LLVM_ABI void copyFastMathFlags(FastMathFlags FMF)
Convenience function for transferring all fast-math flag values to this instruction,...
LLVM_ABI bool isSameOperationAs(const Instruction *I, unsigned flags=0) const LLVM_READONLY
This function determines if the specified instruction executes the same operation as the current one.
LLVM_ABI ~Instruction()
LLVM_ABI void setHasNoSignedZeros(bool B)
Set or clear the no-signed-zeros flag on this instruction, which must be an operator which supports t...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
LLVM_ABI iterator_range< simple_ilist< DbgRecord >::iterator > cloneDebugInfoFrom(const Instruction *From, std::optional< simple_ilist< DbgRecord >::iterator > FromHere=std::nullopt, bool InsertAtHead=false)
Clone any debug-info attached to From onto this instruction.
LLVM_ABI FastMathFlags getFastMathFlagsOrNone() const LLVM_READONLY
Convenience function for getting fast-math flags, or default-constructed FastMathFlags when not a FPM...
LLVM_ABI void copyProfileAndDebugMetadata(const Instruction &SrcInst)
Copy debug, profile, and memprof metadata from SrcInst to this instruction without copying alias-anal...
LLVM_ABI bool isDebugOrPseudoInst() const LLVM_READONLY
Return true if the instruction is a DbgInfoIntrinsic or PseudoProbeInst.
LLVM_ABI unsigned getNumSuccessors() const LLVM_READONLY
Return the number of successors that this instruction has.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
LLVM_ABI bool mayWriteToMemory() const LLVM_READONLY
Return true if this instruction may modify memory.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
LLVM_ABI void setHasAllowContract(bool B)
Set or clear the allow-contract flag on this instruction, which must be an operator which supports th...
LLVM_ABI bool hasAtomicStore() const LLVM_READONLY
Return true if this atomic instruction stores to memory.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI bool isOnlyUserOfAnyOperand()
It checks if this instruction is the only user of at least one of its operands.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
LLVM_ABI void setHasNoNaNs(bool B)
Set or clear the no-nans flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
LLVM_ABI void setHasApproxFunc(bool B)
Set or clear the approximate-math-functions flag on this instruction, which must be an operator which...
LLVM_ABI void moveAfter(Instruction *MovePos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI bool hasSameSpecialState(const Instruction *I2, bool IgnoreAlignment=false, bool IntersectAttrs=false) const LLVM_READONLY
This function determines if the speficied instruction has the same "special" characteristics as the c...
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI bool isAtomic() const LLVM_READONLY
Return true if this instruction has an AtomicOrdering of unordered or higher.
LLVM_ABI void setHasAllowReassoc(bool B)
Set or clear the reassociation flag on this instruction, which must be an operator which supports thi...
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool isIdenticalToWhenDefined(const Instruction *I, bool IntersectAttrs=false) const LLVM_READONLY
This is like isIdenticalTo, except that it ignores the SubclassOptionalData flags,...
LLVM_ABI bool isFast() const LLVM_READONLY
Determine whether all fast-math-flags are set.
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI void swapProfMetadata()
If the instruction has "branch_weights" MD_prof metadata and the MDNode has three operands (including...
LLVM_ABI BasicBlock * getSuccessor(unsigned Idx) const LLVM_READONLY
Return the specified successor. This instruction must be a terminator.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI void dropOneDbgRecord(DbgRecord *I)
Erase a single DbgRecord I that is attached to this instruction.
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
LLVM_ABI Type * getAccessType() const LLVM_READONLY
Return the type this instruction accesses in memory, if any.
LLVM_ABI bool hasAllowReciprocal() const LLVM_READONLY
Determine whether the allow-reciprocal flag is set.
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...
LLVM_ABI bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
LLVM_ABI bool maySynchronize() const LLVM_READONLY
Return true if this instruction may synchronize, in the sense that it may introduce a synchronizes-wi...
LLVM_ABI bool hasPoisonGeneratingFlags() const LLVM_READONLY
Return true if this operator has flags which may cause this instruction to evaluate to poison despite...
LLVM_ABI bool mayReadFromMemory() const LLVM_READONLY
Return true if this instruction may read memory.
LLVM_ABI bool isUsedOutsideOfBlock(const BasicBlock *BB) const LLVM_READONLY
Return true if there are any uses of this instruction in blocks other than the specified block.
LLVM_ABI bool isVolatile() const LLVM_READONLY
Return true if this instruction has a volatile memory access.
LLVM_ABI void setHasNoInfs(bool B)
Set or clear the no-infs flag on this instruction, which must be an operator which supports this flag...
LLVM_ABI iterator_range< const_succ_iterator > successors() const LLVM_READONLY
LLVM_ABI void adoptDbgRecords(BasicBlock *BB, InstListType::iterator It, bool InsertAtHead)
Transfer any DbgRecords on the position It onto this instruction, by simply adopting the sequence of ...
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
const char * getOpcodeName() const
LLVM_ABI bool willReturn() const LLVM_READONLY
Return true if the instruction will return (unwinding is considered as a form of returning control fl...
LLVM_ABI bool hasNonDebugLocLoopMetadata() const
LLVM_ABI bool hasApproxFunc() const LLVM_READONLY
Determine whether the approximate-math-functions flag is set.
void getAllMetadataOtherThanDebugLoc(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
This does the same thing as getAllMetadata, except that it filters out the debug location.
LLVM_ABI void moveAfterPreserving(Instruction *MovePos)
See moveBeforePreserving .
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI bool hasAtomicLoad() const LLVM_READONLY
Return true if this atomic instruction loads from memory.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void dropPoisonGeneratingMetadata()
Drops metadata that may generate poison.
LLVM_ABI void setHasAllowReciprocal(bool B)
Set or clear the allow-reciprocal flag on this instruction, which must be an operator which supports ...
LLVM_ABI void handleMarkerRemoval()
Handle the debug-info implications of this instruction being removed.
LLVM_ABI bool hasUBImplyingAttrs() const LLVM_READONLY
Return true if this instruction has UB-implying attributes that can cause immediate undefined behavio...
LLVM_ABI std::optional< InstListType::iterator > getInsertionPointAfterDef()
Get the first insertion point at which the result of this instruction is defined.
LLVM_ABI void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
LLVM_ABI void dropPoisonGeneratingAttributes()
Drops attributes that may generate poison.
LLVM_ABI void dropUBImplyingAttrsAndUnknownMetadata(ArrayRef< unsigned > KnownIDs={})
This function drops non-debug unknown metadata (through dropUnknownNonDebugMetadata).
LLVM_ABI bool isIdenticalTo(const Instruction *I) const LLVM_READONLY
Return true if the specified instruction is exactly identical to the current one.
LLVM_ABI std::optional< simple_ilist< DbgRecord >::iterator > getDbgReinsertionPosition()
Return an iterator to the position of the "Next" DbgRecord after this instruction,...
LLVM_ABI bool isLaunderOrStripInvariantGroup() const LLVM_READONLY
Return true if the instruction is a llvm.launder.invariant.group or llvm.strip.invariant....
LLVM_ABI bool hasAllowContract() const LLVM_READONLY
Determine whether the allow-contract flag is set.
LLVM_ABI void moveBeforePreserving(InstListType::iterator MovePos)
Perform a moveBefore operation, while signalling that the caller intends to preserve the original ord...
LLVM_ABI bool hasPoisonGeneratingMetadata() const LLVM_READONLY
Return true if this instruction has poison-generating metadata.
Instruction(const Instruction &)=delete
LLVM_ABI void setSuccessor(unsigned Idx, BasicBlock *BB)
Update the specified successor to point at the provided block.
LLVM_ABI bool isCommutableOperand(unsigned Op) const LLVM_READONLY
Checks if the operand is commutative.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
LLVM_ABI void setFast(bool B)
Set or clear all fast-math-flags on this instruction, which must be an operator which supports this f...
LLVM_ABI bool hasAllowReassoc() const LLVM_READONLY
Determine whether the allow-reassociation flag is set.
LLVM_ABI void dropDbgRecords()
Erase any DbgRecords attached to this instruction.
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this instruction belongs to.
LLVM_ABI bool isSafeToRemove() const LLVM_READONLY
Return true if the instruction can be removed if the result is unused.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
LLVM_ABI bool hasDbgRecords() const
Returns true if any DbgRecords are attached to this instruction.
A wrapper class for inspecting calls to intrinsic functions.
Invoke instruction.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
bool isFilter(unsigned Idx) const
Return 'true' if the clause and index Idx is a filter clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
An instruction for reading from memory.
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1424
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1432
LLVMContext & getContext() const
Definition Metadata.h:1233
Tracking metadata reference owned by Metadata.
Definition Metadata.h:891
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:143
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:166
static MemoryEffectsBase none()
Definition ModRef.h:128
static MemoryEffectsBase unknown()
Definition ModRef.h:123
static constexpr const unsigned PoisonGeneratingIDs[]
Metadata IDs that may generate poison.
Definition Metadata.h:146
iterator_range< const_block_iterator > blocks() const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Instruction that can have a nneg flag (zext/uitofp).
Definition InstrTypes.h:703
This instruction constructs a fixed permutation of two input vectors.
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:293
void reserve(size_type N)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Multiway switch.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
static LLVM_ABI void handleRAUW(Value *From, Value *To)
Definition Metadata.cpp:553
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
void splice(iterator where, iplist_impl &L2)
Definition ilist.h:266
iterator insertAfter(iterator where, pointer New)
Definition ilist.h:174
iterator insert(iterator where, pointer New)
Definition ilist.h:165
A range adaptor for a pair of iterators.
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char IsVolatile[]
Key for Kernel::Arg::Metadata::mIsVolatile.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr bool isAtomic(const T &...O)
Definition SIDefines.h:396
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
Definition LLVMContext.h:55
bool mayThrow(const MachineInstr &MI)
@ OB
OB - OneByte - Set if this instruction has a one byte opcode.
initializer< Ty > init(const Ty &Val)
@ Switch
The "resume-switch" lowering, where there are separate resume and destroy functions that are shared b...
Definition CoroShape.h:32
constexpr double e
NodeAddr< PhiNode * > Phi
Definition RDFGraph.h:390
iterator end() const
Definition BasicBlock.h:89
bool isCommutative(const Instruction *I, const Value *ValWithUses, bool IsCopyable)
Definition SLPUtils.cpp:165
unsigned getOpcode(const VPValue *V)
Return the instruction opcode for the recipe defining V or 0 for unsupported recipes and VPValues not...
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:315
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:830
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
Definition LoopInfo.cpp:60
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
bool isStrongerThanMonotonic(AtomicOrdering AO)
auto successors(const MachineBasicBlock *BB)
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
LLVM_ABI MDNode * getBranchWeightMDNode(const Instruction &I)
Get the branch weights metadata node.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
bool isStrongerThanUnordered(AtomicOrdering AO)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange(DbgMarker *DebugMarker)
Inline helper to return a range of DbgRecords attached to a marker.
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
auto drop_end(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the last N elements excluded.
Definition STLExtras.h:322
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ ModRef
The access may reference and may modify the value stored in memory.
Definition ModRef.h:36
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
@ Other
Any other memory.
Definition ModRef.h:68
@ FSub
Subtraction of floats.
@ Xor
Bitwise or logical XOR of integers.
@ FMul
Product of floats.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ FAdd
Sum of floats.
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1947
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
Definition STLExtras.h:2146
@ Keep
No function return thunk.
Definition CodeGen.h:229
Summary of memprof metadata on allocations.
Matching combinators.