xref: /freebsd/contrib/llvm-project/llvm/lib/IR/Instruction.cpp (revision fe75646a0234a261c0013bf1840fdac4acaf0cec)
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/Constants.h"
17 #include "llvm/IR/Instructions.h"
18 #include "llvm/IR/IntrinsicInst.h"
19 #include "llvm/IR/Intrinsics.h"
20 #include "llvm/IR/Operator.h"
21 #include "llvm/IR/ProfDataUtils.h"
22 #include "llvm/IR/Type.h"
23 using namespace llvm;
24 
25 Instruction::Instruction(Type *ty, unsigned it, Use *Ops, unsigned NumOps,
26                          Instruction *InsertBefore)
27   : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(nullptr) {
28 
29   // If requested, insert this instruction into a basic block...
30   if (InsertBefore) {
31     BasicBlock *BB = InsertBefore->getParent();
32     assert(BB && "Instruction to insert before is not in a basic block!");
33     insertInto(BB, InsertBefore->getIterator());
34   }
35 }
36 
37 Instruction::Instruction(Type *ty, unsigned it, Use *Ops, unsigned NumOps,
38                          BasicBlock *InsertAtEnd)
39   : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(nullptr) {
40 
41   // append this instruction into the basic block
42   assert(InsertAtEnd && "Basic block to append to may not be NULL!");
43   insertInto(InsertAtEnd, InsertAtEnd->end());
44 }
45 
46 Instruction::~Instruction() {
47   assert(!Parent && "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 
66 
67 void Instruction::setParent(BasicBlock *P) {
68   Parent = P;
69 }
70 
71 const Module *Instruction::getModule() const {
72   return getParent()->getModule();
73 }
74 
75 const Function *Instruction::getFunction() const {
76   return getParent()->getParent();
77 }
78 
79 void Instruction::removeFromParent() {
80   getParent()->getInstList().remove(getIterator());
81 }
82 
83 iplist<Instruction>::iterator Instruction::eraseFromParent() {
84   return getParent()->getInstList().erase(getIterator());
85 }
86 
87 /// Insert an unlinked instruction into a basic block immediately before the
88 /// specified instruction.
89 void Instruction::insertBefore(Instruction *InsertPos) {
90   insertInto(InsertPos->getParent(), InsertPos->getIterator());
91 }
92 
93 /// Insert an unlinked instruction into a basic block immediately after the
94 /// specified instruction.
95 void Instruction::insertAfter(Instruction *InsertPos) {
96   insertInto(InsertPos->getParent(), std::next(InsertPos->getIterator()));
97 }
98 
99 BasicBlock::iterator Instruction::insertInto(BasicBlock *ParentBB,
100                                              BasicBlock::iterator It) {
101   assert(getParent() == nullptr && "Expected detached instruction");
102   assert((It == ParentBB->end() || It->getParent() == ParentBB) &&
103          "It not in ParentBB");
104   return ParentBB->getInstList().insert(It, this);
105 }
106 
107 /// Unlink this instruction from its current basic block and insert it into the
108 /// basic block that MovePos lives in, right before MovePos.
109 void Instruction::moveBefore(Instruction *MovePos) {
110   moveBefore(*MovePos->getParent(), MovePos->getIterator());
111 }
112 
113 void Instruction::moveAfter(Instruction *MovePos) {
114   moveBefore(*MovePos->getParent(), ++MovePos->getIterator());
115 }
116 
117 void Instruction::moveBefore(BasicBlock &BB,
118                              SymbolTableList<Instruction>::iterator I) {
119   assert(I == BB.end() || I->getParent() == &BB);
120   BB.splice(I, getParent(), getIterator());
121 }
122 
123 bool Instruction::comesBefore(const Instruction *Other) const {
124   assert(Parent && Other->Parent &&
125          "instructions without BB parents have no order");
126   assert(Parent == Other->Parent && "cross-BB instruction order comparison");
127   if (!Parent->isInstrOrderValid())
128     Parent->renumberInstructions();
129   return Order < Other->Order;
130 }
131 
132 Instruction *Instruction::getInsertionPointAfterDef() {
133   assert(!getType()->isVoidTy() && "Instruction must define result");
134   BasicBlock *InsertBB;
135   BasicBlock::iterator InsertPt;
136   if (auto *PN = dyn_cast<PHINode>(this)) {
137     InsertBB = PN->getParent();
138     InsertPt = InsertBB->getFirstInsertionPt();
139   } else if (auto *II = dyn_cast<InvokeInst>(this)) {
140     InsertBB = II->getNormalDest();
141     InsertPt = InsertBB->getFirstInsertionPt();
142   } else if (isa<CallBrInst>(this)) {
143     // Def is available in multiple successors, there's no single dominating
144     // insertion point.
145     return nullptr;
146   } else {
147     assert(!isTerminator() && "Only invoke/callbr terminators return value");
148     InsertBB = getParent();
149     InsertPt = std::next(getIterator());
150   }
151 
152   // catchswitch blocks don't have any legal insertion point (because they
153   // are both an exception pad and a terminator).
154   if (InsertPt == InsertBB->end())
155     return nullptr;
156   return &*InsertPt;
157 }
158 
159 bool Instruction::isOnlyUserOfAnyOperand() {
160   return any_of(operands(), [](Value *V) { return V->hasOneUser(); });
161 }
162 
163 void Instruction::setHasNoUnsignedWrap(bool b) {
164   cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(b);
165 }
166 
167 void Instruction::setHasNoSignedWrap(bool b) {
168   cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(b);
169 }
170 
171 void Instruction::setIsExact(bool b) {
172   cast<PossiblyExactOperator>(this)->setIsExact(b);
173 }
174 
175 bool Instruction::hasNoUnsignedWrap() const {
176   return cast<OverflowingBinaryOperator>(this)->hasNoUnsignedWrap();
177 }
178 
179 bool Instruction::hasNoSignedWrap() const {
180   return cast<OverflowingBinaryOperator>(this)->hasNoSignedWrap();
181 }
182 
183 bool Instruction::hasPoisonGeneratingFlags() const {
184   return cast<Operator>(this)->hasPoisonGeneratingFlags();
185 }
186 
187 void Instruction::dropPoisonGeneratingFlags() {
188   switch (getOpcode()) {
189   case Instruction::Add:
190   case Instruction::Sub:
191   case Instruction::Mul:
192   case Instruction::Shl:
193     cast<OverflowingBinaryOperator>(this)->setHasNoUnsignedWrap(false);
194     cast<OverflowingBinaryOperator>(this)->setHasNoSignedWrap(false);
195     break;
196 
197   case Instruction::UDiv:
198   case Instruction::SDiv:
199   case Instruction::AShr:
200   case Instruction::LShr:
201     cast<PossiblyExactOperator>(this)->setIsExact(false);
202     break;
203 
204   case Instruction::GetElementPtr:
205     cast<GetElementPtrInst>(this)->setIsInBounds(false);
206     break;
207   }
208   if (isa<FPMathOperator>(this)) {
209     setHasNoNaNs(false);
210     setHasNoInfs(false);
211   }
212 
213   assert(!hasPoisonGeneratingFlags() && "must be kept in sync");
214 }
215 
216 bool Instruction::hasPoisonGeneratingMetadata() const {
217   return hasMetadata(LLVMContext::MD_range) ||
218          hasMetadata(LLVMContext::MD_nonnull) ||
219          hasMetadata(LLVMContext::MD_align);
220 }
221 
222 void Instruction::dropPoisonGeneratingMetadata() {
223   eraseMetadata(LLVMContext::MD_range);
224   eraseMetadata(LLVMContext::MD_nonnull);
225   eraseMetadata(LLVMContext::MD_align);
226 }
227 
228 void Instruction::dropUBImplyingAttrsAndUnknownMetadata(
229     ArrayRef<unsigned> KnownIDs) {
230   dropUnknownNonDebugMetadata(KnownIDs);
231   auto *CB = dyn_cast<CallBase>(this);
232   if (!CB)
233     return;
234   // For call instructions, we also need to drop parameter and return attributes
235   // that are can cause UB if the call is moved to a location where the
236   // attribute is not valid.
237   AttributeList AL = CB->getAttributes();
238   if (AL.isEmpty())
239     return;
240   AttributeMask UBImplyingAttributes =
241       AttributeFuncs::getUBImplyingAttributes();
242   for (unsigned ArgNo = 0; ArgNo < CB->arg_size(); ArgNo++)
243     CB->removeParamAttrs(ArgNo, UBImplyingAttributes);
244   CB->removeRetAttrs(UBImplyingAttributes);
245 }
246 
247 void Instruction::dropUBImplyingAttrsAndMetadata() {
248   // !annotation metadata does not impact semantics.
249   // !range, !nonnull and !align produce poison, so they are safe to speculate.
250   // !noundef and various AA metadata must be dropped, as it generally produces
251   // immediate undefined behavior.
252   unsigned KnownIDs[] = {LLVMContext::MD_annotation, LLVMContext::MD_range,
253                          LLVMContext::MD_nonnull, LLVMContext::MD_align};
254   dropUBImplyingAttrsAndUnknownMetadata(KnownIDs);
255 }
256 
257 bool Instruction::isExact() const {
258   return cast<PossiblyExactOperator>(this)->isExact();
259 }
260 
261 void Instruction::setFast(bool B) {
262   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
263   cast<FPMathOperator>(this)->setFast(B);
264 }
265 
266 void Instruction::setHasAllowReassoc(bool B) {
267   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
268   cast<FPMathOperator>(this)->setHasAllowReassoc(B);
269 }
270 
271 void Instruction::setHasNoNaNs(bool B) {
272   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
273   cast<FPMathOperator>(this)->setHasNoNaNs(B);
274 }
275 
276 void Instruction::setHasNoInfs(bool B) {
277   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
278   cast<FPMathOperator>(this)->setHasNoInfs(B);
279 }
280 
281 void Instruction::setHasNoSignedZeros(bool B) {
282   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
283   cast<FPMathOperator>(this)->setHasNoSignedZeros(B);
284 }
285 
286 void Instruction::setHasAllowReciprocal(bool B) {
287   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
288   cast<FPMathOperator>(this)->setHasAllowReciprocal(B);
289 }
290 
291 void Instruction::setHasAllowContract(bool B) {
292   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
293   cast<FPMathOperator>(this)->setHasAllowContract(B);
294 }
295 
296 void Instruction::setHasApproxFunc(bool B) {
297   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
298   cast<FPMathOperator>(this)->setHasApproxFunc(B);
299 }
300 
301 void Instruction::setFastMathFlags(FastMathFlags FMF) {
302   assert(isa<FPMathOperator>(this) && "setting fast-math flag on invalid op");
303   cast<FPMathOperator>(this)->setFastMathFlags(FMF);
304 }
305 
306 void Instruction::copyFastMathFlags(FastMathFlags FMF) {
307   assert(isa<FPMathOperator>(this) && "copying fast-math flag on invalid op");
308   cast<FPMathOperator>(this)->copyFastMathFlags(FMF);
309 }
310 
311 bool Instruction::isFast() const {
312   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
313   return cast<FPMathOperator>(this)->isFast();
314 }
315 
316 bool Instruction::hasAllowReassoc() const {
317   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
318   return cast<FPMathOperator>(this)->hasAllowReassoc();
319 }
320 
321 bool Instruction::hasNoNaNs() const {
322   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
323   return cast<FPMathOperator>(this)->hasNoNaNs();
324 }
325 
326 bool Instruction::hasNoInfs() const {
327   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
328   return cast<FPMathOperator>(this)->hasNoInfs();
329 }
330 
331 bool Instruction::hasNoSignedZeros() const {
332   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
333   return cast<FPMathOperator>(this)->hasNoSignedZeros();
334 }
335 
336 bool Instruction::hasAllowReciprocal() const {
337   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
338   return cast<FPMathOperator>(this)->hasAllowReciprocal();
339 }
340 
341 bool Instruction::hasAllowContract() const {
342   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
343   return cast<FPMathOperator>(this)->hasAllowContract();
344 }
345 
346 bool Instruction::hasApproxFunc() const {
347   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
348   return cast<FPMathOperator>(this)->hasApproxFunc();
349 }
350 
351 FastMathFlags Instruction::getFastMathFlags() const {
352   assert(isa<FPMathOperator>(this) && "getting fast-math flag on invalid op");
353   return cast<FPMathOperator>(this)->getFastMathFlags();
354 }
355 
356 void Instruction::copyFastMathFlags(const Instruction *I) {
357   copyFastMathFlags(I->getFastMathFlags());
358 }
359 
360 void Instruction::copyIRFlags(const Value *V, bool IncludeWrapFlags) {
361   // Copy the wrapping flags.
362   if (IncludeWrapFlags && isa<OverflowingBinaryOperator>(this)) {
363     if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
364       setHasNoSignedWrap(OB->hasNoSignedWrap());
365       setHasNoUnsignedWrap(OB->hasNoUnsignedWrap());
366     }
367   }
368 
369   // Copy the exact flag.
370   if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
371     if (isa<PossiblyExactOperator>(this))
372       setIsExact(PE->isExact());
373 
374   // Copy the fast-math flags.
375   if (auto *FP = dyn_cast<FPMathOperator>(V))
376     if (isa<FPMathOperator>(this))
377       copyFastMathFlags(FP->getFastMathFlags());
378 
379   if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(V))
380     if (auto *DestGEP = dyn_cast<GetElementPtrInst>(this))
381       DestGEP->setIsInBounds(SrcGEP->isInBounds() || DestGEP->isInBounds());
382 }
383 
384 void Instruction::andIRFlags(const Value *V) {
385   if (auto *OB = dyn_cast<OverflowingBinaryOperator>(V)) {
386     if (isa<OverflowingBinaryOperator>(this)) {
387       setHasNoSignedWrap(hasNoSignedWrap() && OB->hasNoSignedWrap());
388       setHasNoUnsignedWrap(hasNoUnsignedWrap() && OB->hasNoUnsignedWrap());
389     }
390   }
391 
392   if (auto *PE = dyn_cast<PossiblyExactOperator>(V))
393     if (isa<PossiblyExactOperator>(this))
394       setIsExact(isExact() && PE->isExact());
395 
396   if (auto *FP = dyn_cast<FPMathOperator>(V)) {
397     if (isa<FPMathOperator>(this)) {
398       FastMathFlags FM = getFastMathFlags();
399       FM &= FP->getFastMathFlags();
400       copyFastMathFlags(FM);
401     }
402   }
403 
404   if (auto *SrcGEP = dyn_cast<GetElementPtrInst>(V))
405     if (auto *DestGEP = dyn_cast<GetElementPtrInst>(this))
406       DestGEP->setIsInBounds(SrcGEP->isInBounds() && DestGEP->isInBounds());
407 }
408 
409 const char *Instruction::getOpcodeName(unsigned OpCode) {
410   switch (OpCode) {
411   // Terminators
412   case Ret:    return "ret";
413   case Br:     return "br";
414   case Switch: return "switch";
415   case IndirectBr: return "indirectbr";
416   case Invoke: return "invoke";
417   case Resume: return "resume";
418   case Unreachable: return "unreachable";
419   case CleanupRet: return "cleanupret";
420   case CatchRet: return "catchret";
421   case CatchPad: return "catchpad";
422   case CatchSwitch: return "catchswitch";
423   case CallBr: return "callbr";
424 
425   // Standard unary operators...
426   case FNeg: return "fneg";
427 
428   // Standard binary operators...
429   case Add: return "add";
430   case FAdd: return "fadd";
431   case Sub: return "sub";
432   case FSub: return "fsub";
433   case Mul: return "mul";
434   case FMul: return "fmul";
435   case UDiv: return "udiv";
436   case SDiv: return "sdiv";
437   case FDiv: return "fdiv";
438   case URem: return "urem";
439   case SRem: return "srem";
440   case FRem: return "frem";
441 
442   // Logical operators...
443   case And: return "and";
444   case Or : return "or";
445   case Xor: return "xor";
446 
447   // Memory instructions...
448   case Alloca:        return "alloca";
449   case Load:          return "load";
450   case Store:         return "store";
451   case AtomicCmpXchg: return "cmpxchg";
452   case AtomicRMW:     return "atomicrmw";
453   case Fence:         return "fence";
454   case GetElementPtr: return "getelementptr";
455 
456   // Convert instructions...
457   case Trunc:         return "trunc";
458   case ZExt:          return "zext";
459   case SExt:          return "sext";
460   case FPTrunc:       return "fptrunc";
461   case FPExt:         return "fpext";
462   case FPToUI:        return "fptoui";
463   case FPToSI:        return "fptosi";
464   case UIToFP:        return "uitofp";
465   case SIToFP:        return "sitofp";
466   case IntToPtr:      return "inttoptr";
467   case PtrToInt:      return "ptrtoint";
468   case BitCast:       return "bitcast";
469   case AddrSpaceCast: return "addrspacecast";
470 
471   // Other instructions...
472   case ICmp:           return "icmp";
473   case FCmp:           return "fcmp";
474   case PHI:            return "phi";
475   case Select:         return "select";
476   case Call:           return "call";
477   case Shl:            return "shl";
478   case LShr:           return "lshr";
479   case AShr:           return "ashr";
480   case VAArg:          return "va_arg";
481   case ExtractElement: return "extractelement";
482   case InsertElement:  return "insertelement";
483   case ShuffleVector:  return "shufflevector";
484   case ExtractValue:   return "extractvalue";
485   case InsertValue:    return "insertvalue";
486   case LandingPad:     return "landingpad";
487   case CleanupPad:     return "cleanuppad";
488   case Freeze:         return "freeze";
489 
490   default: return "<Invalid operator> ";
491   }
492 }
493 
494 /// This must be kept in sync with FunctionComparator::cmpOperations in
495 /// lib/Transforms/IPO/MergeFunctions.cpp.
496 bool Instruction::hasSameSpecialState(const Instruction *I2,
497                                       bool IgnoreAlignment) const {
498   auto I1 = this;
499   assert(I1->getOpcode() == I2->getOpcode() &&
500          "Can not compare special state of different instructions");
501 
502   if (const AllocaInst *AI = dyn_cast<AllocaInst>(I1))
503     return AI->getAllocatedType() == cast<AllocaInst>(I2)->getAllocatedType() &&
504            (AI->getAlign() == cast<AllocaInst>(I2)->getAlign() ||
505             IgnoreAlignment);
506   if (const LoadInst *LI = dyn_cast<LoadInst>(I1))
507     return LI->isVolatile() == cast<LoadInst>(I2)->isVolatile() &&
508            (LI->getAlign() == cast<LoadInst>(I2)->getAlign() ||
509             IgnoreAlignment) &&
510            LI->getOrdering() == cast<LoadInst>(I2)->getOrdering() &&
511            LI->getSyncScopeID() == cast<LoadInst>(I2)->getSyncScopeID();
512   if (const StoreInst *SI = dyn_cast<StoreInst>(I1))
513     return SI->isVolatile() == cast<StoreInst>(I2)->isVolatile() &&
514            (SI->getAlign() == cast<StoreInst>(I2)->getAlign() ||
515             IgnoreAlignment) &&
516            SI->getOrdering() == cast<StoreInst>(I2)->getOrdering() &&
517            SI->getSyncScopeID() == cast<StoreInst>(I2)->getSyncScopeID();
518   if (const CmpInst *CI = dyn_cast<CmpInst>(I1))
519     return CI->getPredicate() == cast<CmpInst>(I2)->getPredicate();
520   if (const CallInst *CI = dyn_cast<CallInst>(I1))
521     return CI->isTailCall() == cast<CallInst>(I2)->isTailCall() &&
522            CI->getCallingConv() == cast<CallInst>(I2)->getCallingConv() &&
523            CI->getAttributes() == cast<CallInst>(I2)->getAttributes() &&
524            CI->hasIdenticalOperandBundleSchema(*cast<CallInst>(I2));
525   if (const InvokeInst *CI = dyn_cast<InvokeInst>(I1))
526     return CI->getCallingConv() == cast<InvokeInst>(I2)->getCallingConv() &&
527            CI->getAttributes() == cast<InvokeInst>(I2)->getAttributes() &&
528            CI->hasIdenticalOperandBundleSchema(*cast<InvokeInst>(I2));
529   if (const CallBrInst *CI = dyn_cast<CallBrInst>(I1))
530     return CI->getCallingConv() == cast<CallBrInst>(I2)->getCallingConv() &&
531            CI->getAttributes() == cast<CallBrInst>(I2)->getAttributes() &&
532            CI->hasIdenticalOperandBundleSchema(*cast<CallBrInst>(I2));
533   if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(I1))
534     return IVI->getIndices() == cast<InsertValueInst>(I2)->getIndices();
535   if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(I1))
536     return EVI->getIndices() == cast<ExtractValueInst>(I2)->getIndices();
537   if (const FenceInst *FI = dyn_cast<FenceInst>(I1))
538     return FI->getOrdering() == cast<FenceInst>(I2)->getOrdering() &&
539            FI->getSyncScopeID() == cast<FenceInst>(I2)->getSyncScopeID();
540   if (const AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(I1))
541     return CXI->isVolatile() == cast<AtomicCmpXchgInst>(I2)->isVolatile() &&
542            CXI->isWeak() == cast<AtomicCmpXchgInst>(I2)->isWeak() &&
543            CXI->getSuccessOrdering() ==
544                cast<AtomicCmpXchgInst>(I2)->getSuccessOrdering() &&
545            CXI->getFailureOrdering() ==
546                cast<AtomicCmpXchgInst>(I2)->getFailureOrdering() &&
547            CXI->getSyncScopeID() ==
548                cast<AtomicCmpXchgInst>(I2)->getSyncScopeID();
549   if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(I1))
550     return RMWI->getOperation() == cast<AtomicRMWInst>(I2)->getOperation() &&
551            RMWI->isVolatile() == cast<AtomicRMWInst>(I2)->isVolatile() &&
552            RMWI->getOrdering() == cast<AtomicRMWInst>(I2)->getOrdering() &&
553            RMWI->getSyncScopeID() == cast<AtomicRMWInst>(I2)->getSyncScopeID();
554   if (const ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I1))
555     return SVI->getShuffleMask() ==
556            cast<ShuffleVectorInst>(I2)->getShuffleMask();
557   if (const GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(I1))
558     return GEP->getSourceElementType() ==
559            cast<GetElementPtrInst>(I2)->getSourceElementType();
560 
561   return true;
562 }
563 
564 bool Instruction::isIdenticalTo(const Instruction *I) const {
565   return isIdenticalToWhenDefined(I) &&
566          SubclassOptionalData == I->SubclassOptionalData;
567 }
568 
569 bool Instruction::isIdenticalToWhenDefined(const Instruction *I) const {
570   if (getOpcode() != I->getOpcode() ||
571       getNumOperands() != I->getNumOperands() ||
572       getType() != I->getType())
573     return false;
574 
575   // If both instructions have no operands, they are identical.
576   if (getNumOperands() == 0 && I->getNumOperands() == 0)
577     return this->hasSameSpecialState(I);
578 
579   // We have two instructions of identical opcode and #operands.  Check to see
580   // if all operands are the same.
581   if (!std::equal(op_begin(), op_end(), I->op_begin()))
582     return false;
583 
584   // WARNING: this logic must be kept in sync with EliminateDuplicatePHINodes()!
585   if (const PHINode *thisPHI = dyn_cast<PHINode>(this)) {
586     const PHINode *otherPHI = cast<PHINode>(I);
587     return std::equal(thisPHI->block_begin(), thisPHI->block_end(),
588                       otherPHI->block_begin());
589   }
590 
591   return this->hasSameSpecialState(I);
592 }
593 
594 // Keep this in sync with FunctionComparator::cmpOperations in
595 // lib/Transforms/IPO/MergeFunctions.cpp.
596 bool Instruction::isSameOperationAs(const Instruction *I,
597                                     unsigned flags) const {
598   bool IgnoreAlignment = flags & CompareIgnoringAlignment;
599   bool UseScalarTypes  = flags & CompareUsingScalarTypes;
600 
601   if (getOpcode() != I->getOpcode() ||
602       getNumOperands() != I->getNumOperands() ||
603       (UseScalarTypes ?
604        getType()->getScalarType() != I->getType()->getScalarType() :
605        getType() != I->getType()))
606     return false;
607 
608   // We have two instructions of identical opcode and #operands.  Check to see
609   // if all operands are the same type
610   for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
611     if (UseScalarTypes ?
612         getOperand(i)->getType()->getScalarType() !=
613           I->getOperand(i)->getType()->getScalarType() :
614         getOperand(i)->getType() != I->getOperand(i)->getType())
615       return false;
616 
617   return this->hasSameSpecialState(I, IgnoreAlignment);
618 }
619 
620 bool Instruction::isUsedOutsideOfBlock(const BasicBlock *BB) const {
621   for (const Use &U : uses()) {
622     // PHI nodes uses values in the corresponding predecessor block.  For other
623     // instructions, just check to see whether the parent of the use matches up.
624     const Instruction *I = cast<Instruction>(U.getUser());
625     const PHINode *PN = dyn_cast<PHINode>(I);
626     if (!PN) {
627       if (I->getParent() != BB)
628         return true;
629       continue;
630     }
631 
632     if (PN->getIncomingBlock(U) != BB)
633       return true;
634   }
635   return false;
636 }
637 
638 bool Instruction::mayReadFromMemory() const {
639   switch (getOpcode()) {
640   default: return false;
641   case Instruction::VAArg:
642   case Instruction::Load:
643   case Instruction::Fence: // FIXME: refine definition of mayReadFromMemory
644   case Instruction::AtomicCmpXchg:
645   case Instruction::AtomicRMW:
646   case Instruction::CatchPad:
647   case Instruction::CatchRet:
648     return true;
649   case Instruction::Call:
650   case Instruction::Invoke:
651   case Instruction::CallBr:
652     return !cast<CallBase>(this)->onlyWritesMemory();
653   case Instruction::Store:
654     return !cast<StoreInst>(this)->isUnordered();
655   }
656 }
657 
658 bool Instruction::mayWriteToMemory() const {
659   switch (getOpcode()) {
660   default: return false;
661   case Instruction::Fence: // FIXME: refine definition of mayWriteToMemory
662   case Instruction::Store:
663   case Instruction::VAArg:
664   case Instruction::AtomicCmpXchg:
665   case Instruction::AtomicRMW:
666   case Instruction::CatchPad:
667   case Instruction::CatchRet:
668     return true;
669   case Instruction::Call:
670   case Instruction::Invoke:
671   case Instruction::CallBr:
672     return !cast<CallBase>(this)->onlyReadsMemory();
673   case Instruction::Load:
674     return !cast<LoadInst>(this)->isUnordered();
675   }
676 }
677 
678 bool Instruction::isAtomic() const {
679   switch (getOpcode()) {
680   default:
681     return false;
682   case Instruction::AtomicCmpXchg:
683   case Instruction::AtomicRMW:
684   case Instruction::Fence:
685     return true;
686   case Instruction::Load:
687     return cast<LoadInst>(this)->getOrdering() != AtomicOrdering::NotAtomic;
688   case Instruction::Store:
689     return cast<StoreInst>(this)->getOrdering() != AtomicOrdering::NotAtomic;
690   }
691 }
692 
693 bool Instruction::hasAtomicLoad() const {
694   assert(isAtomic());
695   switch (getOpcode()) {
696   default:
697     return false;
698   case Instruction::AtomicCmpXchg:
699   case Instruction::AtomicRMW:
700   case Instruction::Load:
701     return true;
702   }
703 }
704 
705 bool Instruction::hasAtomicStore() const {
706   assert(isAtomic());
707   switch (getOpcode()) {
708   default:
709     return false;
710   case Instruction::AtomicCmpXchg:
711   case Instruction::AtomicRMW:
712   case Instruction::Store:
713     return true;
714   }
715 }
716 
717 bool Instruction::isVolatile() const {
718   switch (getOpcode()) {
719   default:
720     return false;
721   case Instruction::AtomicRMW:
722     return cast<AtomicRMWInst>(this)->isVolatile();
723   case Instruction::Store:
724     return cast<StoreInst>(this)->isVolatile();
725   case Instruction::Load:
726     return cast<LoadInst>(this)->isVolatile();
727   case Instruction::AtomicCmpXchg:
728     return cast<AtomicCmpXchgInst>(this)->isVolatile();
729   case Instruction::Call:
730   case Instruction::Invoke:
731     // There are a very limited number of intrinsics with volatile flags.
732     if (auto *II = dyn_cast<IntrinsicInst>(this)) {
733       if (auto *MI = dyn_cast<MemIntrinsic>(II))
734         return MI->isVolatile();
735       switch (II->getIntrinsicID()) {
736       default: break;
737       case Intrinsic::matrix_column_major_load:
738         return cast<ConstantInt>(II->getArgOperand(2))->isOne();
739       case Intrinsic::matrix_column_major_store:
740         return cast<ConstantInt>(II->getArgOperand(3))->isOne();
741       }
742     }
743     return false;
744   }
745 }
746 
747 Type *Instruction::getAccessType() const {
748   switch (getOpcode()) {
749   case Instruction::Store:
750     return cast<StoreInst>(this)->getValueOperand()->getType();
751   case Instruction::Load:
752   case Instruction::AtomicRMW:
753     return getType();
754   case Instruction::AtomicCmpXchg:
755     return cast<AtomicCmpXchgInst>(this)->getNewValOperand()->getType();
756   case Instruction::Call:
757   case Instruction::Invoke:
758     if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(this)) {
759       switch (II->getIntrinsicID()) {
760       case Intrinsic::masked_load:
761       case Intrinsic::masked_gather:
762       case Intrinsic::masked_expandload:
763       case Intrinsic::vp_load:
764       case Intrinsic::vp_gather:
765       case Intrinsic::experimental_vp_strided_load:
766         return II->getType();
767       case Intrinsic::masked_store:
768       case Intrinsic::masked_scatter:
769       case Intrinsic::masked_compressstore:
770       case Intrinsic::vp_store:
771       case Intrinsic::vp_scatter:
772       case Intrinsic::experimental_vp_strided_store:
773         return II->getOperand(0)->getType();
774       default:
775         break;
776       }
777     }
778   }
779 
780   return nullptr;
781 }
782 
783 static bool canUnwindPastLandingPad(const LandingPadInst *LP,
784                                     bool IncludePhaseOneUnwind) {
785   // Because phase one unwinding skips cleanup landingpads, we effectively
786   // unwind past this frame, and callers need to have valid unwind info.
787   if (LP->isCleanup())
788     return IncludePhaseOneUnwind;
789 
790   for (unsigned I = 0; I < LP->getNumClauses(); ++I) {
791     Constant *Clause = LP->getClause(I);
792     // catch ptr null catches all exceptions.
793     if (LP->isCatch(I) && isa<ConstantPointerNull>(Clause))
794       return false;
795     // filter [0 x ptr] catches all exceptions.
796     if (LP->isFilter(I) && Clause->getType()->getArrayNumElements() == 0)
797       return false;
798   }
799 
800   // May catch only some subset of exceptions, in which case other exceptions
801   // will continue unwinding.
802   return true;
803 }
804 
805 bool Instruction::mayThrow(bool IncludePhaseOneUnwind) const {
806   switch (getOpcode()) {
807   case Instruction::Call:
808     return !cast<CallInst>(this)->doesNotThrow();
809   case Instruction::CleanupRet:
810     return cast<CleanupReturnInst>(this)->unwindsToCaller();
811   case Instruction::CatchSwitch:
812     return cast<CatchSwitchInst>(this)->unwindsToCaller();
813   case Instruction::Resume:
814     return true;
815   case Instruction::Invoke: {
816     // Landingpads themselves don't unwind -- however, an invoke of a skipped
817     // landingpad may continue unwinding.
818     BasicBlock *UnwindDest = cast<InvokeInst>(this)->getUnwindDest();
819     Instruction *Pad = UnwindDest->getFirstNonPHI();
820     if (auto *LP = dyn_cast<LandingPadInst>(Pad))
821       return canUnwindPastLandingPad(LP, IncludePhaseOneUnwind);
822     return false;
823   }
824   case Instruction::CleanupPad:
825     // Treat the same as cleanup landingpad.
826     return IncludePhaseOneUnwind;
827   default:
828     return false;
829   }
830 }
831 
832 bool Instruction::mayHaveSideEffects() const {
833   return mayWriteToMemory() || mayThrow() || !willReturn();
834 }
835 
836 bool Instruction::isSafeToRemove() const {
837   return (!isa<CallInst>(this) || !this->mayHaveSideEffects()) &&
838          !this->isTerminator() && !this->isEHPad();
839 }
840 
841 bool Instruction::willReturn() const {
842   // Volatile store isn't guaranteed to return; see LangRef.
843   if (auto *SI = dyn_cast<StoreInst>(this))
844     return !SI->isVolatile();
845 
846   if (const auto *CB = dyn_cast<CallBase>(this))
847     return CB->hasFnAttr(Attribute::WillReturn);
848   return true;
849 }
850 
851 bool Instruction::isLifetimeStartOrEnd() const {
852   auto *II = dyn_cast<IntrinsicInst>(this);
853   if (!II)
854     return false;
855   Intrinsic::ID ID = II->getIntrinsicID();
856   return ID == Intrinsic::lifetime_start || ID == Intrinsic::lifetime_end;
857 }
858 
859 bool Instruction::isLaunderOrStripInvariantGroup() const {
860   auto *II = dyn_cast<IntrinsicInst>(this);
861   if (!II)
862     return false;
863   Intrinsic::ID ID = II->getIntrinsicID();
864   return ID == Intrinsic::launder_invariant_group ||
865          ID == Intrinsic::strip_invariant_group;
866 }
867 
868 bool Instruction::isDebugOrPseudoInst() const {
869   return isa<DbgInfoIntrinsic>(this) || isa<PseudoProbeInst>(this);
870 }
871 
872 const Instruction *
873 Instruction::getNextNonDebugInstruction(bool SkipPseudoOp) const {
874   for (const Instruction *I = getNextNode(); I; I = I->getNextNode())
875     if (!isa<DbgInfoIntrinsic>(I) && !(SkipPseudoOp && isa<PseudoProbeInst>(I)))
876       return I;
877   return nullptr;
878 }
879 
880 const Instruction *
881 Instruction::getPrevNonDebugInstruction(bool SkipPseudoOp) const {
882   for (const Instruction *I = getPrevNode(); I; I = I->getPrevNode())
883     if (!isa<DbgInfoIntrinsic>(I) && !(SkipPseudoOp && isa<PseudoProbeInst>(I)))
884       return I;
885   return nullptr;
886 }
887 
888 bool Instruction::isAssociative() const {
889   unsigned Opcode = getOpcode();
890   if (isAssociative(Opcode))
891     return true;
892 
893   switch (Opcode) {
894   case FMul:
895   case FAdd:
896     return cast<FPMathOperator>(this)->hasAllowReassoc() &&
897            cast<FPMathOperator>(this)->hasNoSignedZeros();
898   default:
899     return false;
900   }
901 }
902 
903 bool Instruction::isCommutative() const {
904   if (auto *II = dyn_cast<IntrinsicInst>(this))
905     return II->isCommutative();
906   // TODO: Should allow icmp/fcmp?
907   return isCommutative(getOpcode());
908 }
909 
910 unsigned Instruction::getNumSuccessors() const {
911   switch (getOpcode()) {
912 #define HANDLE_TERM_INST(N, OPC, CLASS)                                        \
913   case Instruction::OPC:                                                       \
914     return static_cast<const CLASS *>(this)->getNumSuccessors();
915 #include "llvm/IR/Instruction.def"
916   default:
917     break;
918   }
919   llvm_unreachable("not a terminator");
920 }
921 
922 BasicBlock *Instruction::getSuccessor(unsigned idx) const {
923   switch (getOpcode()) {
924 #define HANDLE_TERM_INST(N, OPC, CLASS)                                        \
925   case Instruction::OPC:                                                       \
926     return static_cast<const CLASS *>(this)->getSuccessor(idx);
927 #include "llvm/IR/Instruction.def"
928   default:
929     break;
930   }
931   llvm_unreachable("not a terminator");
932 }
933 
934 void Instruction::setSuccessor(unsigned idx, BasicBlock *B) {
935   switch (getOpcode()) {
936 #define HANDLE_TERM_INST(N, OPC, CLASS)                                        \
937   case Instruction::OPC:                                                       \
938     return static_cast<CLASS *>(this)->setSuccessor(idx, B);
939 #include "llvm/IR/Instruction.def"
940   default:
941     break;
942   }
943   llvm_unreachable("not a terminator");
944 }
945 
946 void Instruction::replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB) {
947   for (unsigned Idx = 0, NumSuccessors = Instruction::getNumSuccessors();
948        Idx != NumSuccessors; ++Idx)
949     if (getSuccessor(Idx) == OldBB)
950       setSuccessor(Idx, NewBB);
951 }
952 
953 Instruction *Instruction::cloneImpl() const {
954   llvm_unreachable("Subclass of Instruction failed to implement cloneImpl");
955 }
956 
957 void Instruction::swapProfMetadata() {
958   MDNode *ProfileData = getBranchWeightMDNode(*this);
959   if (!ProfileData || ProfileData->getNumOperands() != 3)
960     return;
961 
962   // The first operand is the name. Fetch them backwards and build a new one.
963   Metadata *Ops[] = {ProfileData->getOperand(0), ProfileData->getOperand(2),
964                      ProfileData->getOperand(1)};
965   setMetadata(LLVMContext::MD_prof,
966               MDNode::get(ProfileData->getContext(), Ops));
967 }
968 
969 void Instruction::copyMetadata(const Instruction &SrcInst,
970                                ArrayRef<unsigned> WL) {
971   if (!SrcInst.hasMetadata())
972     return;
973 
974   DenseSet<unsigned> WLS;
975   for (unsigned M : WL)
976     WLS.insert(M);
977 
978   // Otherwise, enumerate and copy over metadata from the old instruction to the
979   // new one.
980   SmallVector<std::pair<unsigned, MDNode *>, 4> TheMDs;
981   SrcInst.getAllMetadataOtherThanDebugLoc(TheMDs);
982   for (const auto &MD : TheMDs) {
983     if (WL.empty() || WLS.count(MD.first))
984       setMetadata(MD.first, MD.second);
985   }
986   if (WL.empty() || WLS.count(LLVMContext::MD_dbg))
987     setDebugLoc(SrcInst.getDebugLoc());
988 }
989 
990 Instruction *Instruction::clone() const {
991   Instruction *New = nullptr;
992   switch (getOpcode()) {
993   default:
994     llvm_unreachable("Unhandled Opcode.");
995 #define HANDLE_INST(num, opc, clas)                                            \
996   case Instruction::opc:                                                       \
997     New = cast<clas>(this)->cloneImpl();                                       \
998     break;
999 #include "llvm/IR/Instruction.def"
1000 #undef HANDLE_INST
1001   }
1002 
1003   New->SubclassOptionalData = SubclassOptionalData;
1004   New->copyMetadata(*this);
1005   return New;
1006 }
1007