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/IR/AttributeMask.h"
16 #include "llvm/IR/Attributes.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/InstrTypes.h"
19 #include "llvm/IR/Instructions.h"
20 #include "llvm/IR/IntrinsicInst.h"
21 #include "llvm/IR/Intrinsics.h"
22 #include "llvm/IR/MemoryModelRelaxationAnnotations.h"
23 #include "llvm/IR/Module.h"
24 #include "llvm/IR/Operator.h"
25 #include "llvm/IR/ProfDataUtils.h"
26 #include "llvm/IR/Type.h"
27 using namespace llvm;
28
InsertPosition(Instruction * InsertBefore)29 InsertPosition::InsertPosition(Instruction *InsertBefore)
30 : InsertAt(InsertBefore ? InsertBefore->getIterator()
31 : InstListType::iterator()) {}
InsertPosition(BasicBlock * InsertAtEnd)32 InsertPosition::InsertPosition(BasicBlock *InsertAtEnd)
33 : InsertAt(InsertAtEnd ? InsertAtEnd->end() : InstListType::iterator()) {}
34
Instruction(Type * ty,unsigned it,Use * Ops,unsigned NumOps,InsertPosition InsertBefore)35 Instruction::Instruction(Type *ty, unsigned it, Use *Ops, unsigned NumOps,
36 InsertPosition InsertBefore)
37 : User(ty, Value::InstructionVal + it, Ops, NumOps) {
38 // When called with an iterator, there must be a block to insert into.
39 if (InstListType::iterator InsertIt = InsertBefore; InsertIt.isValid()) {
40 BasicBlock *BB = InsertIt.getNodeParent();
41 assert(BB && "Instruction to insert before is not in a basic block!");
42 insertInto(BB, InsertBefore);
43 }
44 }
45
~Instruction()46 Instruction::~Instruction() {
47 assert(!getParent() && "Instruction still linked in the program!");
48
49 // Replace any extant metadata uses of this instruction with undef to
50 // preserve debug info accuracy. Some alternatives include:
51 // - Treat Instruction like any other Value, and point its extant metadata
52 // uses to an empty ValueAsMetadata node. This makes extant dbg.value uses
53 // trivially dead (i.e. fair game for deletion in many passes), leading to
54 // stale dbg.values being in effect for too long.
55 // - Call salvageDebugInfoOrMarkUndef. Not needed to make instruction removal
56 // correct. OTOH results in wasted work in some common cases (e.g. when all
57 // instructions in a BasicBlock are deleted).
58 if (isUsedByMetadata())
59 ValueAsMetadata::handleRAUW(this, UndefValue::get(getType()));
60
61 // Explicitly remove DIAssignID metadata to clear up ID -> Instruction(s)
62 // mapping in LLVMContext.
63 setMetadata(LLVMContext::MD_DIAssignID, nullptr);
64 }
65
getModule() const66 const Module *Instruction::getModule() const {
67 return getParent()->getModule();
68 }
69
getFunction() const70 const Function *Instruction::getFunction() const {
71 return getParent()->getParent();
72 }
73
getDataLayout() const74 const DataLayout &Instruction::getDataLayout() const {
75 return getModule()->getDataLayout();
76 }
77
removeFromParent()78 void Instruction::removeFromParent() {
79 // Perform any debug-info maintenence required.
80 handleMarkerRemoval();
81
82 getParent()->getInstList().remove(getIterator());
83 }
84
handleMarkerRemoval()85 void Instruction::handleMarkerRemoval() {
86 if (!getParent()->IsNewDbgInfoFormat || !DebugMarker)
87 return;
88
89 DebugMarker->removeMarker();
90 }
91
eraseFromParent()92 BasicBlock::iterator Instruction::eraseFromParent() {
93 handleMarkerRemoval();
94 return getParent()->getInstList().erase(getIterator());
95 }
96
insertBefore(Instruction * InsertPos)97 void Instruction::insertBefore(Instruction *InsertPos) {
98 insertBefore(InsertPos->getIterator());
99 }
100
101 /// Insert an unlinked instruction into a basic block immediately before the
102 /// specified instruction.
insertBefore(BasicBlock::iterator InsertPos)103 void Instruction::insertBefore(BasicBlock::iterator InsertPos) {
104 insertBefore(*InsertPos->getParent(), InsertPos);
105 }
106
107 /// Insert an unlinked instruction into a basic block immediately after the
108 /// specified instruction.
insertAfter(Instruction * InsertPos)109 void Instruction::insertAfter(Instruction *InsertPos) {
110 BasicBlock *DestParent = InsertPos->getParent();
111
112 DestParent->getInstList().insertAfter(InsertPos->getIterator(), this);
113 }
114
insertInto(BasicBlock * ParentBB,BasicBlock::iterator It)115 BasicBlock::iterator Instruction::insertInto(BasicBlock *ParentBB,
116 BasicBlock::iterator It) {
117 assert(getParent() == nullptr && "Expected detached instruction");
118 assert((It == ParentBB->end() || It->getParent() == ParentBB) &&
119 "It not in ParentBB");
120 insertBefore(*ParentBB, It);
121 return getIterator();
122 }
123
124 extern cl::opt<bool> UseNewDbgInfoFormat;
125
insertBefore(BasicBlock & BB,InstListType::iterator InsertPos)126 void Instruction::insertBefore(BasicBlock &BB,
127 InstListType::iterator InsertPos) {
128 assert(!DebugMarker);
129
130 BB.getInstList().insert(InsertPos, this);
131
132 if (!BB.IsNewDbgInfoFormat)
133 return;
134
135 // We've inserted "this": if InsertAtHead is set then it comes before any
136 // DbgVariableRecords attached to InsertPos. But if it's not set, then any
137 // DbgRecords should now come before "this".
138 bool InsertAtHead = InsertPos.getHeadBit();
139 if (!InsertAtHead) {
140 DbgMarker *SrcMarker = BB.getMarker(InsertPos);
141 if (SrcMarker && !SrcMarker->empty()) {
142 // If this assertion fires, the calling code is about to insert a PHI
143 // after debug-records, which would form a sequence like:
144 // %0 = PHI
145 // #dbg_value
146 // %1 = PHI
147 // Which is de-normalised and undesired -- hence the assertion. To avoid
148 // this, you must insert at that position using an iterator, and it must
149 // be aquired by calling getFirstNonPHIIt / begin or similar methods on
150 // the block. This will signal to this behind-the-scenes debug-info
151 // maintenence code that you intend the PHI to be ahead of everything,
152 // including any debug-info.
153 assert(!isa<PHINode>(this) && "Inserting PHI after debug-records!");
154 adoptDbgRecords(&BB, InsertPos, false);
155 }
156 }
157
158 // If we're inserting a terminator, check if we need to flush out
159 // TrailingDbgRecords. Inserting instructions at the end of an incomplete
160 // block is handled by the code block above.
161 if (isTerminator())
162 getParent()->flushTerminatorDbgRecords();
163 }
164
165 /// Unlink this instruction from its current basic block and insert it into the
166 /// basic block that MovePos lives in, right before MovePos.
moveBefore(Instruction * MovePos)167 void Instruction::moveBefore(Instruction *MovePos) {
168 moveBeforeImpl(*MovePos->getParent(), MovePos->getIterator(), false);
169 }
170
moveBeforePreserving(Instruction * MovePos)171 void Instruction::moveBeforePreserving(Instruction *MovePos) {
172 moveBeforeImpl(*MovePos->getParent(), MovePos->getIterator(), true);
173 }
174
moveAfter(Instruction * MovePos)175 void Instruction::moveAfter(Instruction *MovePos) {
176 auto NextIt = std::next(MovePos->getIterator());
177 // We want this instruction to be moved to before NextIt in the instruction
178 // list, but before NextIt's debug value range.
179 NextIt.setHeadBit(true);
180 moveBeforeImpl(*MovePos->getParent(), NextIt, false);
181 }
182
moveAfterPreserving(Instruction * MovePos)183 void Instruction::moveAfterPreserving(Instruction *MovePos) {
184 auto NextIt = std::next(MovePos->getIterator());
185 // We want this instruction and its debug range to be moved to before NextIt
186 // in the instruction list, but before NextIt's debug value range.
187 NextIt.setHeadBit(true);
188 moveBeforeImpl(*MovePos->getParent(), NextIt, true);
189 }
190
moveBefore(BasicBlock & BB,InstListType::iterator I)191 void Instruction::moveBefore(BasicBlock &BB, InstListType::iterator I) {
192 moveBeforeImpl(BB, I, false);
193 }
194
moveBeforePreserving(BasicBlock & BB,InstListType::iterator I)195 void Instruction::moveBeforePreserving(BasicBlock &BB,
196 InstListType::iterator I) {
197 moveBeforeImpl(BB, I, true);
198 }
199
moveBeforeImpl(BasicBlock & BB,InstListType::iterator I,bool Preserve)200 void Instruction::moveBeforeImpl(BasicBlock &BB, InstListType::iterator I,
201 bool Preserve) {
202 assert(I == BB.end() || I->getParent() == &BB);
203 bool InsertAtHead = I.getHeadBit();
204
205 // If we've been given the "Preserve" flag, then just move the DbgRecords with
206 // the instruction, no more special handling needed.
207 if (BB.IsNewDbgInfoFormat && DebugMarker && !Preserve) {
208 if (I != this->getIterator() || InsertAtHead) {
209 // "this" is definitely moving in the list, or it's moving ahead of its
210 // attached DbgVariableRecords. Detach any existing DbgRecords.
211 handleMarkerRemoval();
212 }
213 }
214
215 // Move this single instruction. Use the list splice method directly, not
216 // the block splicer, which will do more debug-info things.
217 BB.getInstList().splice(I, getParent()->getInstList(), getIterator());
218
219 if (BB.IsNewDbgInfoFormat && !Preserve) {
220 DbgMarker *NextMarker = getParent()->getNextMarker(this);
221
222 // If we're inserting at point I, and not in front of the DbgRecords
223 // attached there, then we should absorb the DbgRecords attached to I.
224 if (!InsertAtHead && NextMarker && !NextMarker->empty()) {
225 adoptDbgRecords(&BB, I, false);
226 }
227 }
228
229 if (isTerminator())
230 getParent()->flushTerminatorDbgRecords();
231 }
232
cloneDebugInfoFrom(const Instruction * From,std::optional<DbgRecord::self_iterator> FromHere,bool InsertAtHead)233 iterator_range<DbgRecord::self_iterator> Instruction::cloneDebugInfoFrom(
234 const Instruction *From, std::optional<DbgRecord::self_iterator> FromHere,
235 bool InsertAtHead) {
236 if (!From->DebugMarker)
237 return DbgMarker::getEmptyDbgRecordRange();
238
239 assert(getParent()->IsNewDbgInfoFormat);
240 assert(getParent()->IsNewDbgInfoFormat ==
241 From->getParent()->IsNewDbgInfoFormat);
242
243 if (!DebugMarker)
244 getParent()->createMarker(this);
245
246 return DebugMarker->cloneDebugInfoFrom(From->DebugMarker, FromHere,
247 InsertAtHead);
248 }
249
250 std::optional<DbgRecord::self_iterator>
getDbgReinsertionPosition()251 Instruction::getDbgReinsertionPosition() {
252 // Is there a marker on the next instruction?
253 DbgMarker *NextMarker = getParent()->getNextMarker(this);
254 if (!NextMarker)
255 return std::nullopt;
256
257 // Are there any DbgRecords in the next marker?
258 if (NextMarker->StoredDbgRecords.empty())
259 return std::nullopt;
260
261 return NextMarker->StoredDbgRecords.begin();
262 }
263
hasDbgRecords() const264 bool Instruction::hasDbgRecords() const { return !getDbgRecordRange().empty(); }
265
adoptDbgRecords(BasicBlock * BB,BasicBlock::iterator It,bool InsertAtHead)266 void Instruction::adoptDbgRecords(BasicBlock *BB, BasicBlock::iterator It,
267 bool InsertAtHead) {
268 DbgMarker *SrcMarker = BB->getMarker(It);
269 auto ReleaseTrailingDbgRecords = [BB, It, SrcMarker]() {
270 if (BB->end() == It) {
271 SrcMarker->eraseFromParent();
272 BB->deleteTrailingDbgRecords();
273 }
274 };
275
276 if (!SrcMarker || SrcMarker->StoredDbgRecords.empty()) {
277 ReleaseTrailingDbgRecords();
278 return;
279 }
280
281 // If we have DbgMarkers attached to this instruction, we have to honour the
282 // ordering of DbgRecords between this and the other marker. Fall back to just
283 // absorbing from the source.
284 if (DebugMarker || It == BB->end()) {
285 // Ensure we _do_ have a marker.
286 getParent()->createMarker(this);
287 DebugMarker->absorbDebugValues(*SrcMarker, InsertAtHead);
288
289 // Having transferred everything out of SrcMarker, we _could_ clean it up
290 // and free the marker now. However, that's a lot of heap-accounting for a
291 // small amount of memory with a good chance of re-use. Leave it for the
292 // moment. It will be released when the Instruction is freed in the worst
293 // case.
294 // However: if we transferred from a trailing marker off the end of the
295 // block, it's important to not leave the empty marker trailing. It will
296 // give a misleading impression that some debug records have been left
297 // trailing.
298 ReleaseTrailingDbgRecords();
299 } else {
300 // Optimisation: we're transferring all the DbgRecords from the source
301 // marker onto this empty location: just adopt the other instructions
302 // marker.
303 DebugMarker = SrcMarker;
304 DebugMarker->MarkedInstr = this;
305 It->DebugMarker = nullptr;
306 }
307 }
308
dropDbgRecords()309 void Instruction::dropDbgRecords() {
310 if (DebugMarker)
311 DebugMarker->dropDbgRecords();
312 }
313
dropOneDbgRecord(DbgRecord * DVR)314 void Instruction::dropOneDbgRecord(DbgRecord *DVR) {
315 DebugMarker->dropOneDbgRecord(DVR);
316 }
317
comesBefore(const Instruction * Other) const318 bool Instruction::comesBefore(const Instruction *Other) const {
319 assert(getParent() && Other->getParent() &&
320 "instructions without BB parents have no order");
321 assert(getParent() == Other->getParent() &&
322 "cross-BB instruction order comparison");
323 if (!getParent()->isInstrOrderValid())
324 const_cast<BasicBlock *>(getParent())->renumberInstructions();
325 return Order < Other->Order;
326 }
327
getInsertionPointAfterDef()328 std::optional<BasicBlock::iterator> Instruction::getInsertionPointAfterDef() {
329 assert(!getType()->isVoidTy() && "Instruction must define result");
330 BasicBlock *InsertBB;
331 BasicBlock::iterator InsertPt;
332 if (auto *PN = dyn_cast<PHINode>(this)) {
333 InsertBB = PN->getParent();
334 InsertPt = InsertBB->getFirstInsertionPt();
335 } else if (auto *II = dyn_cast<InvokeInst>(this)) {
336 InsertBB = II->getNormalDest();
337 InsertPt = InsertBB->getFirstInsertionPt();
338 } else if (isa<CallBrInst>(this)) {
339 // Def is available in multiple successors, there's no single dominating
340 // insertion point.
341 return std::nullopt;
342 } else {
343 assert(!isTerminator() && "Only invoke/callbr terminators return value");
344 InsertBB = getParent();
345 InsertPt = std::next(getIterator());
346 // Any instruction inserted immediately after "this" will come before any
347 // debug-info records take effect -- thus, set the head bit indicating that
348 // to debug-info-transfer code.
349 InsertPt.setHeadBit(true);
350 }
351
352 // catchswitch blocks don't have any legal insertion point (because they
353 // are both an exception pad and a terminator).
354 if (InsertPt == InsertBB->end())
355 return std::nullopt;
356 return InsertPt;
357 }
358
isOnlyUserOfAnyOperand()359 bool Instruction::isOnlyUserOfAnyOperand() {
360 return any_of(operands(), [](Value *V) { return V->hasOneUser(); });
361 }
362
setHasNoUnsignedWrap(bool b)363 void Instruction::setHasNoUnsignedWrap(bool b) {
364 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
365 Inst->setHasNoUnsignedWrap(b);
366 else
367 cast<TruncInst>(this)->setHasNoUnsignedWrap(b);
368 }
369
setHasNoSignedWrap(bool b)370 void Instruction::setHasNoSignedWrap(bool b) {
371 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
372 Inst->setHasNoSignedWrap(b);
373 else
374 cast<TruncInst>(this)->setHasNoSignedWrap(b);
375 }
376
setIsExact(bool b)377 void Instruction::setIsExact(bool b) {
378 cast<PossiblyExactOperator>(this)->setIsExact(b);
379 }
380
setNonNeg(bool b)381 void Instruction::setNonNeg(bool b) {
382 assert(isa<PossiblyNonNegInst>(this) && "Must be zext/uitofp");
383 SubclassOptionalData = (SubclassOptionalData & ~PossiblyNonNegInst::NonNeg) |
384 (b * PossiblyNonNegInst::NonNeg);
385 }
386
hasNoUnsignedWrap() const387 bool Instruction::hasNoUnsignedWrap() const {
388 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
389 return Inst->hasNoUnsignedWrap();
390
391 return cast<TruncInst>(this)->hasNoUnsignedWrap();
392 }
393
hasNoSignedWrap() const394 bool Instruction::hasNoSignedWrap() const {
395 if (auto *Inst = dyn_cast<OverflowingBinaryOperator>(this))
396 return Inst->hasNoSignedWrap();
397
398 return cast<TruncInst>(this)->hasNoSignedWrap();
399 }
400
hasNonNeg() const401 bool Instruction::hasNonNeg() const {
402 assert(isa<PossiblyNonNegInst>(this) && "Must be zext/uitofp");
403 return (SubclassOptionalData & PossiblyNonNegInst::NonNeg) != 0;
404 }
405
hasPoisonGeneratingFlags() const406 bool Instruction::hasPoisonGeneratingFlags() const {
407 return cast<Operator>(this)->hasPoisonGeneratingFlags();
408 }
409
dropPoisonGeneratingFlags()410 void Instruction::dropPoisonGeneratingFlags() {
411 switch (getOpcode()) {
412 case Instruction::Add:
413 case Instruction::Sub:
414 case Instruction::Mul:
415 case Instruction::Shl:
416 cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(false);
417 cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(false);
418 break;
419
420 case Instruction::UDiv:
421 case Instruction::SDiv:
422 case Instruction::AShr:
423 case Instruction::LShr:
424 cast<PossiblyExactOperator>(this)->setIsExact(false);
425 break;
426
427 case Instruction::Or:
428 cast<PossiblyDisjointInst>(this)->setIsDisjoint(false);
429 break;
430
431 case Instruction::GetElementPtr:
432 cast<GetElementPtrInst>(this)->setNoWrapFlags(GEPNoWrapFlags::none());
433 break;
434
435 case Instruction::UIToFP:
436 case Instruction::ZExt:
437 setNonNeg(false);
438 break;
439
440 case Instruction::Trunc:
441 cast<TruncInst>(this)->setHasNoUnsignedWrap(false);
442 cast<TruncInst>(this)->setHasNoSignedWrap(false);
443 break;
444 }
445
446 if (isa<FPMathOperator>(this)) {
447 setHasNoNaNs(false);
448 setHasNoInfs(false);
449 }
450
451 assert(!hasPoisonGeneratingFlags() && "must be kept in sync");
452 }
453
hasPoisonGeneratingMetadata() const454 bool Instruction::hasPoisonGeneratingMetadata() const {
455 return hasMetadata(LLVMContext::MD_range) ||
456 hasMetadata(LLVMContext::MD_nonnull) ||
457 hasMetadata(LLVMContext::MD_align);
458 }
459
dropPoisonGeneratingMetadata()460 void Instruction::dropPoisonGeneratingMetadata() {
461 eraseMetadata(LLVMContext::MD_range);
462 eraseMetadata(LLVMContext::MD_nonnull);
463 eraseMetadata(LLVMContext::MD_align);
464 }
465
hasPoisonGeneratingReturnAttributes() const466 bool Instruction::hasPoisonGeneratingReturnAttributes() const {
467 if (const auto *CB = dyn_cast<CallBase>(this)) {
468 AttributeSet RetAttrs = CB->getAttributes().getRetAttrs();
469 return RetAttrs.hasAttribute(Attribute::Range) ||
470 RetAttrs.hasAttribute(Attribute::Alignment) ||
471 RetAttrs.hasAttribute(Attribute::NonNull);
472 }
473 return false;
474 }
475
dropPoisonGeneratingReturnAttributes()476 void Instruction::dropPoisonGeneratingReturnAttributes() {
477 if (auto *CB = dyn_cast<CallBase>(this)) {
478 AttributeMask AM;
479 AM.addAttribute(Attribute::Range);
480 AM.addAttribute(Attribute::Alignment);
481 AM.addAttribute(Attribute::NonNull);
482 CB->removeRetAttrs(AM);
483 }
484 assert(!hasPoisonGeneratingReturnAttributes() && "must be kept in sync");
485 }
486
dropUBImplyingAttrsAndUnknownMetadata(ArrayRef<unsigned> KnownIDs)487 void Instruction::dropUBImplyingAttrsAndUnknownMetadata(
488 ArrayRef<unsigned> KnownIDs) {
489 dropUnknownNonDebugMetadata(KnownIDs);
490 auto *CB = dyn_cast<CallBase>(this);
491 if (!CB)
492 return;
493 // For call instructions, we also need to drop parameter and return attributes
494 // that are can cause UB if the call is moved to a location where the
495 // attribute is not valid.
496 AttributeList AL = CB->getAttributes();
497 if (AL.isEmpty())
498 return;
499 AttributeMask UBImplyingAttributes =
500 AttributeFuncs::getUBImplyingAttributes();
501 for (unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
502 CB->removeParamAttrs(ArgNo, UBImplyingAttributes);
503 CB->removeRetAttrs(UBImplyingAttributes);
504 }
505
dropUBImplyingAttrsAndMetadata()506 void Instruction::dropUBImplyingAttrsAndMetadata() {
507 // !annotation metadata does not impact semantics.
508 // !range, !nonnull and !align produce poison, so they are safe to speculate.
509 // !noundef and various AA metadata must be dropped, as it generally produces
510 // immediate undefined behavior.
511 unsigned KnownIDs[] = {LLVMContext::MD_annotation, LLVMContext::MD_range,
512 LLVMContext::MD_nonnull, LLVMContext::MD_align};
513 dropUBImplyingAttrsAndUnknownMetadata(KnownIDs);
514 }
515
isExact() const516 bool Instruction::isExact() const {
517 return cast<PossiblyExactOperator>(this)->isExact();
518 }
519
setFast(bool B)520 void Instruction::setFast(bool B) {
521 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
522 cast<FPMathOperator>(this)->setFast(B);
523 }
524
setHasAllowReassoc(bool B)525 void Instruction::setHasAllowReassoc(bool B) {
526 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
527 cast<FPMathOperator>(this)->setHasAllowReassoc(B);
528 }
529
setHasNoNaNs(bool B)530 void Instruction::setHasNoNaNs(bool B) {
531 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
532 cast<FPMathOperator>(this)->setHasNoNaNs(B);
533 }
534
setHasNoInfs(bool B)535 void Instruction::setHasNoInfs(bool B) {
536 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
537 cast<FPMathOperator>(this)->setHasNoInfs(B);
538 }
539
setHasNoSignedZeros(bool B)540 void Instruction::setHasNoSignedZeros(bool B) {
541 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
542 cast<FPMathOperator>(this)->setHasNoSignedZeros(B);
543 }
544
setHasAllowReciprocal(bool B)545 void Instruction::setHasAllowReciprocal(bool B) {
546 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
547 cast<FPMathOperator>(this)->setHasAllowReciprocal(B);
548 }
549
setHasAllowContract(bool B)550 void Instruction::setHasAllowContract(bool B) {
551 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
552 cast<FPMathOperator>(this)->setHasAllowContract(B);
553 }
554
setHasApproxFunc(bool B)555 void Instruction::setHasApproxFunc(bool B) {
556 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
557 cast<FPMathOperator>(this)->setHasApproxFunc(B);
558 }
559
setFastMathFlags(FastMathFlags FMF)560 void Instruction::setFastMathFlags(FastMathFlags FMF) {
561 assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
562 cast<FPMathOperator>(this)->setFastMathFlags(FMF);
563 }
564
copyFastMathFlags(FastMathFlags FMF)565 void Instruction::copyFastMathFlags(FastMathFlags FMF) {
566 assert(isa<FPMathOperator>(this) && "copying fast-math flag on invalid op");
567 cast<FPMathOperator>(this)->copyFastMathFlags(FMF);
568 }
569
isFast() const570 bool Instruction::isFast() const {
571 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
572 return cast<FPMathOperator>(this)->isFast();
573 }
574
hasAllowReassoc() const575 bool Instruction::hasAllowReassoc() const {
576 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
577 return cast<FPMathOperator>(this)->hasAllowReassoc();
578 }
579
hasNoNaNs() const580 bool Instruction::hasNoNaNs() const {
581 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
582 return cast<FPMathOperator>(this)->hasNoNaNs();
583 }
584
hasNoInfs() const585 bool Instruction::hasNoInfs() const {
586 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
587 return cast<FPMathOperator>(this)->hasNoInfs();
588 }
589
hasNoSignedZeros() const590 bool Instruction::hasNoSignedZeros() const {
591 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
592 return cast<FPMathOperator>(this)->hasNoSignedZeros();
593 }
594
hasAllowReciprocal() const595 bool Instruction::hasAllowReciprocal() const {
596 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
597 return cast<FPMathOperator>(this)->hasAllowReciprocal();
598 }
599
hasAllowContract() const600 bool Instruction::hasAllowContract() const {
601 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
602 return cast<FPMathOperator>(this)->hasAllowContract();
603 }
604
hasApproxFunc() const605 bool Instruction::hasApproxFunc() const {
606 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
607 return cast<FPMathOperator>(this)->hasApproxFunc();
608 }
609
getFastMathFlags() const610 FastMathFlags Instruction::getFastMathFlags() const {
611 assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
612 return cast<FPMathOperator>(this)->getFastMathFlags();
613 }
614
copyFastMathFlags(const Instruction * I)615 void Instruction::copyFastMathFlags(const Instruction *I) {
616 copyFastMathFlags(I->getFastMathFlags());
617 }
618
copyIRFlags(const Value * V,bool IncludeWrapFlags)619 void Instruction::copyIRFlags(const Value *V, bool IncludeWrapFlags) {
620 // Copy the wrapping flags.
621 if (IncludeWrapFlags && isa<OverflowingBinaryOperator>(this)) {
622 if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
623 setHasNoSignedWrap(OB->hasNoSignedWrap());
624 setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());
625 }
626 }
627
628 if (auto *TI = dyn_cast<TruncInst>(V)) {
629 if (isa<TruncInst>(this)) {
630 setHasNoSignedWrap(TI->hasNoSignedWrap());
631 setHasNoUnsignedWrap(TI->hasNoUnsignedWrap());
632 }
633 }
634
635 // Copy the exact flag.
636 if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
637 if (isa<PossiblyExactOperator>(this))
638 setIsExact(PE->isExact());
639
640 if (auto *SrcPD = dyn_cast<PossiblyDisjointInst>(V))
641 if (auto *DestPD = dyn_cast<PossiblyDisjointInst>(this))
642 DestPD->setIsDisjoint(SrcPD->isDisjoint());
643
644 // Copy the fast-math flags.
645 if (auto *FP = dyn_cast<FPMathOperator>(V))
646 if (isa<FPMathOperator>(this))
647 copyFastMathFlags(FP->getFastMathFlags());
648
649 if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(V))
650 if (auto *DestGEP = dyn_cast<GetElementPtrInst>(this))
651 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() |
652 DestGEP->getNoWrapFlags());
653
654 if (auto *NNI = dyn_cast<PossiblyNonNegInst>(V))
655 if (isa<PossiblyNonNegInst>(this))
656 setNonNeg(NNI->hasNonNeg());
657 }
658
andIRFlags(const Value * V)659 void Instruction::andIRFlags(const Value *V) {
660 if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
661 if (isa<OverflowingBinaryOperator>(this)) {
662 setHasNoSignedWrap(hasNoSignedWrap() && OB->hasNoSignedWrap());
663 setHasNoUnsignedWrap(hasNoUnsignedWrap() && OB->hasNoUnsignedWrap());
664 }
665 }
666
667 if (auto *TI = dyn_cast<TruncInst>(V)) {
668 if (isa<TruncInst>(this)) {
669 setHasNoSignedWrap(hasNoSignedWrap() && TI->hasNoSignedWrap());
670 setHasNoUnsignedWrap(hasNoUnsignedWrap() && TI->hasNoUnsignedWrap());
671 }
672 }
673
674 if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
675 if (isa<PossiblyExactOperator>(this))
676 setIsExact(isExact() && PE->isExact());
677
678 if (auto *SrcPD = dyn_cast<PossiblyDisjointInst>(V))
679 if (auto *DestPD = dyn_cast<PossiblyDisjointInst>(this))
680 DestPD->setIsDisjoint(DestPD->isDisjoint() && SrcPD->isDisjoint());
681
682 if (auto *FP = dyn_cast<FPMathOperator>(V)) {
683 if (isa<FPMathOperator>(this)) {
684 FastMathFlags FM = getFastMathFlags();
685 FM &= FP->getFastMathFlags();
686 copyFastMathFlags(FM);
687 }
688 }
689
690 if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(V))
691 if (auto *DestGEP = dyn_cast<GetElementPtrInst>(this))
692 DestGEP->setNoWrapFlags(SrcGEP->getNoWrapFlags() &
693 DestGEP->getNoWrapFlags());
694
695 if (auto *NNI = dyn_cast<PossiblyNonNegInst>(V))
696 if (isa<PossiblyNonNegInst>(this))
697 setNonNeg(hasNonNeg() && NNI->hasNonNeg());
698 }
699
getOpcodeName(unsigned OpCode)700 const char *Instruction::getOpcodeName(unsigned OpCode) {
701 switch (OpCode) {
702 // Terminators
703 case Ret: return "ret";
704 case Br: return "br";
705 case Switch: return "switch";
706 case IndirectBr: return "indirectbr";
707 case Invoke: return "invoke";
708 case Resume: return "resume";
709 case Unreachable: return "unreachable";
710 case CleanupRet: return "cleanupret";
711 case CatchRet: return "catchret";
712 case CatchPad: return "catchpad";
713 case CatchSwitch: return "catchswitch";
714 case CallBr: return "callbr";
715
716 // Standard unary operators...
717 case FNeg: return "fneg";
718
719 // Standard binary operators...
720 case Add: return "add";
721 case FAdd: return "fadd";
722 case Sub: return "sub";
723 case FSub: return "fsub";
724 case Mul: return "mul";
725 case FMul: return "fmul";
726 case UDiv: return "udiv";
727 case SDiv: return "sdiv";
728 case FDiv: return "fdiv";
729 case URem: return "urem";
730 case SRem: return "srem";
731 case FRem: return "frem";
732
733 // Logical operators...
734 case And: return "and";
735 case Or : return "or";
736 case Xor: return "xor";
737
738 // Memory instructions...
739 case Alloca: return "alloca";
740 case Load: return "load";
741 case Store: return "store";
742 case AtomicCmpXchg: return "cmpxchg";
743 case AtomicRMW: return "atomicrmw";
744 case Fence: return "fence";
745 case GetElementPtr: return "getelementptr";
746
747 // Convert instructions...
748 case Trunc: return "trunc";
749 case ZExt: return "zext";
750 case SExt: return "sext";
751 case FPTrunc: return "fptrunc";
752 case FPExt: return "fpext";
753 case FPToUI: return "fptoui";
754 case FPToSI: return "fptosi";
755 case UIToFP: return "uitofp";
756 case SIToFP: return "sitofp";
757 case IntToPtr: return "inttoptr";
758 case PtrToInt: return "ptrtoint";
759 case BitCast: return "bitcast";
760 case AddrSpaceCast: return "addrspacecast";
761
762 // Other instructions...
763 case ICmp: return "icmp";
764 case FCmp: return "fcmp";
765 case PHI: return "phi";
766 case Select: return "select";
767 case Call: return "call";
768 case Shl: return "shl";
769 case LShr: return "lshr";
770 case AShr: return "ashr";
771 case VAArg: return "va_arg";
772 case ExtractElement: return "extractelement";
773 case InsertElement: return "insertelement";
774 case ShuffleVector: return "shufflevector";
775 case ExtractValue: return "extractvalue";
776 case InsertValue: return "insertvalue";
777 case LandingPad: return "landingpad";
778 case CleanupPad: return "cleanuppad";
779 case Freeze: return "freeze";
780
781 default: return "<Invalid operator> ";
782 }
783 }
784
785 /// This must be kept in sync with FunctionComparator::cmpOperations in
786 /// lib/Transforms/IPO/MergeFunctions.cpp.
hasSameSpecialState(const Instruction * I2,bool IgnoreAlignment) const787 bool Instruction::hasSameSpecialState(const Instruction *I2,
788 bool IgnoreAlignment) const {
789 auto I1 = this;
790 assert(I1->getOpcode() == I2->getOpcode() &&
791 "Can not compare special state of different instructions");
792
793 if (const AllocaInst *AI = dyn_cast<AllocaInst>(I1))
794 return AI->getAllocatedType() == cast<AllocaInst>(I2)->getAllocatedType() &&
795 (AI->getAlign() == cast<AllocaInst>(I2)->getAlign() ||
796 IgnoreAlignment);
797 if (const LoadInst *LI = dyn_cast<LoadInst>(I1))
798 return LI->isVolatile() == cast<LoadInst>(I2)->isVolatile() &&
799 (LI->getAlign() == cast<LoadInst>(I2)->getAlign() ||
800 IgnoreAlignment) &&
801 LI->getOrdering() == cast<LoadInst>(I2)->getOrdering() &&
802 LI->getSyncScopeID() == cast<LoadInst>(I2)->getSyncScopeID();
803 if (const StoreInst *SI = dyn_cast<StoreInst>(I1))
804 return SI->isVolatile() == cast<StoreInst>(I2)->isVolatile() &&
805 (SI->getAlign() == cast<StoreInst>(I2)->getAlign() ||
806 IgnoreAlignment) &&
807 SI->getOrdering() == cast<StoreInst>(I2)->getOrdering() &&
808 SI->getSyncScopeID() == cast<StoreInst>(I2)->getSyncScopeID();
809 if (const CmpInst *CI = dyn_cast<CmpInst>(I1))
810 return CI->getPredicate() == cast<CmpInst>(I2)->getPredicate();
811 if (const CallInst *CI = dyn_cast<CallInst>(I1))
812 return CI->isTailCall() == cast<CallInst>(I2)->isTailCall() &&
813 CI->getCallingConv() == cast<CallInst>(I2)->getCallingConv() &&
814 CI->getAttributes() == cast<CallInst>(I2)->getAttributes() &&
815 CI->hasIdenticalOperandBundleSchema(*cast<CallInst>(I2));
816 if (const InvokeInst *CI = dyn_cast<InvokeInst>(I1))
817 return CI->getCallingConv() == cast<InvokeInst>(I2)->getCallingConv() &&
818 CI->getAttributes() == cast<InvokeInst>(I2)->getAttributes() &&
819 CI->hasIdenticalOperandBundleSchema(*cast<InvokeInst>(I2));
820 if (const CallBrInst *CI = dyn_cast<CallBrInst>(I1))
821 return CI->getCallingConv() == cast<CallBrInst>(I2)->getCallingConv() &&
822 CI->getAttributes() == cast<CallBrInst>(I2)->getAttributes() &&
823 CI->hasIdenticalOperandBundleSchema(*cast<CallBrInst>(I2));
824 if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(I1))
825 return IVI->getIndices() == cast<InsertValueInst>(I2)->getIndices();
826 if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(I1))
827 return EVI->getIndices() == cast<ExtractValueInst>(I2)->getIndices();
828 if (const FenceInst *FI = dyn_cast<FenceInst>(I1))
829 return FI->getOrdering() == cast<FenceInst>(I2)->getOrdering() &&
830 FI->getSyncScopeID() == cast<FenceInst>(I2)->getSyncScopeID();
831 if (const AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(I1))
832 return CXI->isVolatile() == cast<AtomicCmpXchgInst>(I2)->isVolatile() &&
833 CXI->isWeak() == cast<AtomicCmpXchgInst>(I2)->isWeak() &&
834 CXI->getSuccessOrdering() ==
835 cast<AtomicCmpXchgInst>(I2)->getSuccessOrdering() &&
836 CXI->getFailureOrdering() ==
837 cast<AtomicCmpXchgInst>(I2)->getFailureOrdering() &&
838 CXI->getSyncScopeID() ==
839 cast<AtomicCmpXchgInst>(I2)->getSyncScopeID();
840 if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(I1))
841 return RMWI->getOperation() == cast<AtomicRMWInst>(I2)->getOperation() &&
842 RMWI->isVolatile() == cast<AtomicRMWInst>(I2)->isVolatile() &&
843 RMWI->getOrdering() == cast<AtomicRMWInst>(I2)->getOrdering() &&
844 RMWI->getSyncScopeID() == cast<AtomicRMWInst>(I2)->getSyncScopeID();
845 if (const ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I1))
846 return SVI->getShuffleMask() ==
847 cast<ShuffleVectorInst>(I2)->getShuffleMask();
848 if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I1))
849 return GEP->getSourceElementType() ==
850 cast<GetElementPtrInst>(I2)->getSourceElementType();
851
852 return true;
853 }
854
isIdenticalTo(const Instruction * I) const855 bool Instruction::isIdenticalTo(const Instruction *I) const {
856 return isIdenticalToWhenDefined(I) &&
857 SubclassOptionalData == I->SubclassOptionalData;
858 }
859
isIdenticalToWhenDefined(const Instruction * I) const860 bool Instruction::isIdenticalToWhenDefined(const Instruction *I) const {
861 if (getOpcode() != I->getOpcode() ||
862 getNumOperands() != I->getNumOperands() ||
863 getType() != I->getType())
864 return false;
865
866 // If both instructions have no operands, they are identical.
867 if (getNumOperands() == 0 && I->getNumOperands() == 0)
868 return this->hasSameSpecialState(I);
869
870 // We have two instructions of identical opcode and #operands. Check to see
871 // if all operands are the same.
872 if (!std::equal(op_begin(), op_end(), I->op_begin()))
873 return false;
874
875 // WARNING: this logic must be kept in sync with EliminateDuplicatePHINodes()!
876 if (const PHINode *thisPHI = dyn_cast<PHINode>(this)) {
877 const PHINode *otherPHI = cast<PHINode>(I);
878 return std::equal(thisPHI->block_begin(), thisPHI->block_end(),
879 otherPHI->block_begin());
880 }
881
882 return this->hasSameSpecialState(I);
883 }
884
885 // Keep this in sync with FunctionComparator::cmpOperations in
886 // lib/Transforms/IPO/MergeFunctions.cpp.
isSameOperationAs(const Instruction * I,unsigned flags) const887 bool Instruction::isSameOperationAs(const Instruction *I,
888 unsigned flags) const {
889 bool IgnoreAlignment = flags & CompareIgnoringAlignment;
890 bool UseScalarTypes = flags & CompareUsingScalarTypes;
891
892 if (getOpcode() != I->getOpcode() ||
893 getNumOperands() != I->getNumOperands() ||
894 (UseScalarTypes ?
895 getType()->getScalarType() != I->getType()->getScalarType() :
896 getType() != I->getType()))
897 return false;
898
899 // We have two instructions of identical opcode and #operands. Check to see
900 // if all operands are the same type
901 for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
902 if (UseScalarTypes ?
903 getOperand(i)->getType()->getScalarType() !=
904 I->getOperand(i)->getType()->getScalarType() :
905 getOperand(i)->getType() != I->getOperand(i)->getType())
906 return false;
907
908 return this->hasSameSpecialState(I, IgnoreAlignment);
909 }
910
isUsedOutsideOfBlock(const BasicBlock * BB) const911 bool Instruction::isUsedOutsideOfBlock(const BasicBlock *BB) const {
912 for (const Use &U : uses()) {
913 // PHI nodes uses values in the corresponding predecessor block. For other
914 // instructions, just check to see whether the parent of the use matches up.
915 const Instruction *I = cast<Instruction>(U.getUser());
916 const PHINode *PN = dyn_cast<PHINode>(I);
917 if (!PN) {
918 if (I->getParent() != BB)
919 return true;
920 continue;
921 }
922
923 if (PN->getIncomingBlock(U) != BB)
924 return true;
925 }
926 return false;
927 }
928
mayReadFromMemory() const929 bool Instruction::mayReadFromMemory() const {
930 switch (getOpcode()) {
931 default: return false;
932 case Instruction::VAArg:
933 case Instruction::Load:
934 case Instruction::Fence: // FIXME: refine definition of mayReadFromMemory
935 case Instruction::AtomicCmpXchg:
936 case Instruction::AtomicRMW:
937 case Instruction::CatchPad:
938 case Instruction::CatchRet:
939 return true;
940 case Instruction::Call:
941 case Instruction::Invoke:
942 case Instruction::CallBr:
943 return !cast<CallBase>(this)->onlyWritesMemory();
944 case Instruction::Store:
945 return !cast<StoreInst>(this)->isUnordered();
946 }
947 }
948
mayWriteToMemory() const949 bool Instruction::mayWriteToMemory() const {
950 switch (getOpcode()) {
951 default: return false;
952 case Instruction::Fence: // FIXME: refine definition of mayWriteToMemory
953 case Instruction::Store:
954 case Instruction::VAArg:
955 case Instruction::AtomicCmpXchg:
956 case Instruction::AtomicRMW:
957 case Instruction::CatchPad:
958 case Instruction::CatchRet:
959 return true;
960 case Instruction::Call:
961 case Instruction::Invoke:
962 case Instruction::CallBr:
963 return !cast<CallBase>(this)->onlyReadsMemory();
964 case Instruction::Load:
965 return !cast<LoadInst>(this)->isUnordered();
966 }
967 }
968
isAtomic() const969 bool Instruction::isAtomic() const {
970 switch (getOpcode()) {
971 default:
972 return false;
973 case Instruction::AtomicCmpXchg:
974 case Instruction::AtomicRMW:
975 case Instruction::Fence:
976 return true;
977 case Instruction::Load:
978 return cast<LoadInst>(this)->getOrdering() != AtomicOrdering::NotAtomic;
979 case Instruction::Store:
980 return cast<StoreInst>(this)->getOrdering() != AtomicOrdering::NotAtomic;
981 }
982 }
983
hasAtomicLoad() const984 bool Instruction::hasAtomicLoad() const {
985 assert(isAtomic());
986 switch (getOpcode()) {
987 default:
988 return false;
989 case Instruction::AtomicCmpXchg:
990 case Instruction::AtomicRMW:
991 case Instruction::Load:
992 return true;
993 }
994 }
995
hasAtomicStore() const996 bool Instruction::hasAtomicStore() const {
997 assert(isAtomic());
998 switch (getOpcode()) {
999 default:
1000 return false;
1001 case Instruction::AtomicCmpXchg:
1002 case Instruction::AtomicRMW:
1003 case Instruction::Store:
1004 return true;
1005 }
1006 }
1007
isVolatile() const1008 bool Instruction::isVolatile() const {
1009 switch (getOpcode()) {
1010 default:
1011 return false;
1012 case Instruction::AtomicRMW:
1013 return cast<AtomicRMWInst>(this)->isVolatile();
1014 case Instruction::Store:
1015 return cast<StoreInst>(this)->isVolatile();
1016 case Instruction::Load:
1017 return cast<LoadInst>(this)->isVolatile();
1018 case Instruction::AtomicCmpXchg:
1019 return cast<AtomicCmpXchgInst>(this)->isVolatile();
1020 case Instruction::Call:
1021 case Instruction::Invoke:
1022 // There are a very limited number of intrinsics with volatile flags.
1023 if (auto *II = dyn_cast<IntrinsicInst>(this)) {
1024 if (auto *MI = dyn_cast<MemIntrinsic>(II))
1025 return MI->isVolatile();
1026 switch (II->getIntrinsicID()) {
1027 default: break;
1028 case Intrinsic::matrix_column_major_load:
1029 return cast<ConstantInt>(II->getArgOperand(2))->isOne();
1030 case Intrinsic::matrix_column_major_store:
1031 return cast<ConstantInt>(II->getArgOperand(3))->isOne();
1032 }
1033 }
1034 return false;
1035 }
1036 }
1037
getAccessType() const1038 Type *Instruction::getAccessType() const {
1039 switch (getOpcode()) {
1040 case Instruction::Store:
1041 return cast<StoreInst>(this)->getValueOperand()->getType();
1042 case Instruction::Load:
1043 case Instruction::AtomicRMW:
1044 return getType();
1045 case Instruction::AtomicCmpXchg:
1046 return cast<AtomicCmpXchgInst>(this)->getNewValOperand()->getType();
1047 case Instruction::Call:
1048 case Instruction::Invoke:
1049 if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(this)) {
1050 switch (II->getIntrinsicID()) {
1051 case Intrinsic::masked_load:
1052 case Intrinsic::masked_gather:
1053 case Intrinsic::masked_expandload:
1054 case Intrinsic::vp_load:
1055 case Intrinsic::vp_gather:
1056 case Intrinsic::experimental_vp_strided_load:
1057 return II->getType();
1058 case Intrinsic::masked_store:
1059 case Intrinsic::masked_scatter:
1060 case Intrinsic::masked_compressstore:
1061 case Intrinsic::vp_store:
1062 case Intrinsic::vp_scatter:
1063 case Intrinsic::experimental_vp_strided_store:
1064 return II->getOperand(0)->getType();
1065 default:
1066 break;
1067 }
1068 }
1069 }
1070
1071 return nullptr;
1072 }
1073
canUnwindPastLandingPad(const LandingPadInst * LP,bool IncludePhaseOneUnwind)1074 static bool canUnwindPastLandingPad(const LandingPadInst *LP,
1075 bool IncludePhaseOneUnwind) {
1076 // Because phase one unwinding skips cleanup landingpads, we effectively
1077 // unwind past this frame, and callers need to have valid unwind info.
1078 if (LP->isCleanup())
1079 return IncludePhaseOneUnwind;
1080
1081 for (unsigned I = 0; I < LP->getNumClauses(); ++I) {
1082 Constant *Clause = LP->getClause(I);
1083 // catch ptr null catches all exceptions.
1084 if (LP->isCatch(I) && isa<ConstantPointerNull>(Clause))
1085 return false;
1086 // filter [0 x ptr] catches all exceptions.
1087 if (LP->isFilter(I) && Clause->getType()->getArrayNumElements() == 0)
1088 return false;
1089 }
1090
1091 // May catch only some subset of exceptions, in which case other exceptions
1092 // will continue unwinding.
1093 return true;
1094 }
1095
mayThrow(bool IncludePhaseOneUnwind) const1096 bool Instruction::mayThrow(bool IncludePhaseOneUnwind) const {
1097 switch (getOpcode()) {
1098 case Instruction::Call:
1099 return !cast<CallInst>(this)->doesNotThrow();
1100 case Instruction::CleanupRet:
1101 return cast<CleanupReturnInst>(this)->unwindsToCaller();
1102 case Instruction::CatchSwitch:
1103 return cast<CatchSwitchInst>(this)->unwindsToCaller();
1104 case Instruction::Resume:
1105 return true;
1106 case Instruction::Invoke: {
1107 // Landingpads themselves don't unwind -- however, an invoke of a skipped
1108 // landingpad may continue unwinding.
1109 BasicBlock *UnwindDest = cast<InvokeInst>(this)->getUnwindDest();
1110 Instruction *Pad = UnwindDest->getFirstNonPHI();
1111 if (auto *LP = dyn_cast<LandingPadInst>(Pad))
1112 return canUnwindPastLandingPad(LP, IncludePhaseOneUnwind);
1113 return false;
1114 }
1115 case Instruction::CleanupPad:
1116 // Treat the same as cleanup landingpad.
1117 return IncludePhaseOneUnwind;
1118 default:
1119 return false;
1120 }
1121 }
1122
mayHaveSideEffects() const1123 bool Instruction::mayHaveSideEffects() const {
1124 return mayWriteToMemory() || mayThrow() || !willReturn();
1125 }
1126
isSafeToRemove() const1127 bool Instruction::isSafeToRemove() const {
1128 return (!isa<CallInst>(this) || !this->mayHaveSideEffects()) &&
1129 !this->isTerminator() && !this->isEHPad();
1130 }
1131
willReturn() const1132 bool Instruction::willReturn() const {
1133 // Volatile store isn't guaranteed to return; see LangRef.
1134 if (auto *SI = dyn_cast<StoreInst>(this))
1135 return !SI->isVolatile();
1136
1137 if (const auto *CB = dyn_cast<CallBase>(this))
1138 return CB->hasFnAttr(Attribute::WillReturn);
1139 return true;
1140 }
1141
isLifetimeStartOrEnd() const1142 bool Instruction::isLifetimeStartOrEnd() const {
1143 auto *II = dyn_cast<IntrinsicInst>(this);
1144 if (!II)
1145 return false;
1146 Intrinsic::ID ID = II->getIntrinsicID();
1147 return ID == Intrinsic::lifetime_start || ID == Intrinsic::lifetime_end;
1148 }
1149
isLaunderOrStripInvariantGroup() const1150 bool Instruction::isLaunderOrStripInvariantGroup() const {
1151 auto *II = dyn_cast<IntrinsicInst>(this);
1152 if (!II)
1153 return false;
1154 Intrinsic::ID ID = II->getIntrinsicID();
1155 return ID == Intrinsic::launder_invariant_group ||
1156 ID == Intrinsic::strip_invariant_group;
1157 }
1158
isDebugOrPseudoInst() const1159 bool Instruction::isDebugOrPseudoInst() const {
1160 return isa<DbgInfoIntrinsic>(this) || isa<PseudoProbeInst>(this);
1161 }
1162
1163 const Instruction *
getNextNonDebugInstruction(bool SkipPseudoOp) const1164 Instruction::getNextNonDebugInstruction(bool SkipPseudoOp) const {
1165 for (const Instruction *I = getNextNode(); I; I = I->getNextNode())
1166 if (!isa<DbgInfoIntrinsic>(I) && !(SkipPseudoOp && isa<PseudoProbeInst>(I)))
1167 return I;
1168 return nullptr;
1169 }
1170
1171 const Instruction *
getPrevNonDebugInstruction(bool SkipPseudoOp) const1172 Instruction::getPrevNonDebugInstruction(bool SkipPseudoOp) const {
1173 for (const Instruction *I = getPrevNode(); I; I = I->getPrevNode())
1174 if (!isa<DbgInfoIntrinsic>(I) && !(SkipPseudoOp && isa<PseudoProbeInst>(I)))
1175 return I;
1176 return nullptr;
1177 }
1178
getStableDebugLoc() const1179 const DebugLoc &Instruction::getStableDebugLoc() const {
1180 if (isa<DbgInfoIntrinsic>(this))
1181 if (const Instruction *Next = getNextNonDebugInstruction())
1182 return Next->getDebugLoc();
1183 return getDebugLoc();
1184 }
1185
isAssociative() const1186 bool Instruction::isAssociative() const {
1187 if (auto *II = dyn_cast<IntrinsicInst>(this))
1188 return II->isAssociative();
1189 unsigned Opcode = getOpcode();
1190 if (isAssociative(Opcode))
1191 return true;
1192
1193 switch (Opcode) {
1194 case FMul:
1195 case FAdd:
1196 return cast<FPMathOperator>(this)->hasAllowReassoc() &&
1197 cast<FPMathOperator>(this)->hasNoSignedZeros();
1198 default:
1199 return false;
1200 }
1201 }
1202
isCommutative() const1203 bool Instruction::isCommutative() const {
1204 if (auto *II = dyn_cast<IntrinsicInst>(this))
1205 return II->isCommutative();
1206 // TODO: Should allow icmp/fcmp?
1207 return isCommutative(getOpcode());
1208 }
1209
getNumSuccessors() const1210 unsigned Instruction::getNumSuccessors() const {
1211 switch (getOpcode()) {
1212 #define HANDLE_TERM_INST(N, OPC, CLASS) \
1213 case Instruction::OPC: \
1214 return static_cast<const CLASS *>(this)->getNumSuccessors();
1215 #include "llvm/IR/Instruction.def"
1216 default:
1217 break;
1218 }
1219 llvm_unreachable("not a terminator");
1220 }
1221
getSuccessor(unsigned idx) const1222 BasicBlock *Instruction::getSuccessor(unsigned idx) const {
1223 switch (getOpcode()) {
1224 #define HANDLE_TERM_INST(N, OPC, CLASS) \
1225 case Instruction::OPC: \
1226 return static_cast<const CLASS *>(this)->getSuccessor(idx);
1227 #include "llvm/IR/Instruction.def"
1228 default:
1229 break;
1230 }
1231 llvm_unreachable("not a terminator");
1232 }
1233
setSuccessor(unsigned idx,BasicBlock * B)1234 void Instruction::setSuccessor(unsigned idx, BasicBlock *B) {
1235 switch (getOpcode()) {
1236 #define HANDLE_TERM_INST(N, OPC, CLASS) \
1237 case Instruction::OPC: \
1238 return static_cast<CLASS *>(this)->setSuccessor(idx, B);
1239 #include "llvm/IR/Instruction.def"
1240 default:
1241 break;
1242 }
1243 llvm_unreachable("not a terminator");
1244 }
1245
replaceSuccessorWith(BasicBlock * OldBB,BasicBlock * NewBB)1246 void Instruction::replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB) {
1247 for (unsigned Idx = 0, NumSuccessors = Instruction::getNumSuccessors();
1248 Idx != NumSuccessors; ++Idx)
1249 if (getSuccessor(Idx) == OldBB)
1250 setSuccessor(Idx, NewBB);
1251 }
1252
cloneImpl() const1253 Instruction *Instruction::cloneImpl() const {
1254 llvm_unreachable("Subclass of Instruction failed to implement cloneImpl");
1255 }
1256
swapProfMetadata()1257 void Instruction::swapProfMetadata() {
1258 MDNode *ProfileData = getBranchWeightMDNode(*this);
1259 if (!ProfileData)
1260 return;
1261 unsigned FirstIdx = getBranchWeightOffset(ProfileData);
1262 if (ProfileData->getNumOperands() != 2 + FirstIdx)
1263 return;
1264
1265 unsigned SecondIdx = FirstIdx + 1;
1266 SmallVector<Metadata *, 4> Ops;
1267 // If there are more weights past the second, we can't swap them
1268 if (ProfileData->getNumOperands() > SecondIdx + 1)
1269 return;
1270 for (unsigned Idx = 0; Idx < FirstIdx; ++Idx) {
1271 Ops.push_back(ProfileData->getOperand(Idx));
1272 }
1273 // Switch the order of the weights
1274 Ops.push_back(ProfileData->getOperand(SecondIdx));
1275 Ops.push_back(ProfileData->getOperand(FirstIdx));
1276 setMetadata(LLVMContext::MD_prof,
1277 MDNode::get(ProfileData->getContext(), Ops));
1278 }
1279
copyMetadata(const Instruction & SrcInst,ArrayRef<unsigned> WL)1280 void Instruction::copyMetadata(const Instruction &SrcInst,
1281 ArrayRef<unsigned> WL) {
1282 if (!SrcInst.hasMetadata())
1283 return;
1284
1285 SmallDenseSet<unsigned, 4> WLS(WL.begin(), WL.end());
1286
1287 // Otherwise, enumerate and copy over metadata from the old instruction to the
1288 // new one.
1289 SmallVector<std::pair<unsigned, MDNode *>, 4> TheMDs;
1290 SrcInst.getAllMetadataOtherThanDebugLoc(TheMDs);
1291 for (const auto &MD : TheMDs) {
1292 if (WL.empty() || WLS.count(MD.first))
1293 setMetadata(MD.first, MD.second);
1294 }
1295 if (WL.empty() || WLS.count(LLVMContext::MD_dbg))
1296 setDebugLoc(SrcInst.getDebugLoc());
1297 }
1298
clone() const1299 Instruction *Instruction::clone() const {
1300 Instruction *New = nullptr;
1301 switch (getOpcode()) {
1302 default:
1303 llvm_unreachable("Unhandled Opcode.");
1304 #define HANDLE_INST(num, opc, clas) \
1305 case Instruction::opc: \
1306 New = cast<clas>(this)->cloneImpl(); \
1307 break;
1308 #include "llvm/IR/Instruction.def"
1309 #undef HANDLE_INST
1310 }
1311
1312 New->SubclassOptionalData = SubclassOptionalData;
1313 New->copyMetadata(*this);
1314 return New;
1315 }
1316