LLVM 24.0.0git
Instructions.cpp
Go to the documentation of this file.
1//===- Instructions.cpp - Implement the LLVM instructions -----------------===//
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 all of the non-inline methods for the LLVM instruction
10// classes.
11//
12//===----------------------------------------------------------------------===//
13
15#include "LLVMContextImpl.h"
18#include "llvm/ADT/Twine.h"
19#include "llvm/IR/Attributes.h"
20#include "llvm/IR/BasicBlock.h"
21#include "llvm/IR/Constant.h"
23#include "llvm/IR/Constants.h"
24#include "llvm/IR/DataLayout.h"
26#include "llvm/IR/Function.h"
27#include "llvm/IR/InstrTypes.h"
28#include "llvm/IR/Instruction.h"
29#include "llvm/IR/Intrinsics.h"
30#include "llvm/IR/LLVMContext.h"
31#include "llvm/IR/MDBuilder.h"
32#include "llvm/IR/Metadata.h"
33#include "llvm/IR/Module.h"
34#include "llvm/IR/Operator.h"
37#include "llvm/IR/Type.h"
38#include "llvm/IR/Value.h"
46#include "llvm/Support/ModRef.h"
48#include <algorithm>
49#include <cassert>
50#include <cstdint>
51#include <optional>
52#include <vector>
53
54using namespace llvm;
55
57 "disable-i2p-p2i-opt", cl::init(false),
58 cl::desc("Disables inttoptr/ptrtoint roundtrip optimization"));
59
60//===----------------------------------------------------------------------===//
61// AllocaInst Class
62//===----------------------------------------------------------------------===//
63
65 return DL.getTypeAllocSize(getAllocatedType());
66}
67
68std::optional<TypeSize>
71 // Zero-sized types can return early since 0 * N = 0 for any array size N.
72 if (Size.isZero())
73 return Size;
74 if (isArrayAllocation()) {
76 if (!C)
77 return std::nullopt;
78 std::optional<uint64_t> NumElements = C->getValue().tryZExtValue();
79 if (!NumElements)
80 return std::nullopt;
81 assert(!Size.isScalable() && "Array elements cannot have a scalable size");
82 auto CheckedProd =
83 checkedMulUnsigned(Size.getKnownMinValue(), *NumElements);
84 if (!CheckedProd)
85 return std::nullopt;
86 return TypeSize::getFixed(*CheckedProd);
87 }
88 return Size;
89}
90
91std::optional<TypeSize>
93 std::optional<TypeSize> Size = getAllocationSize(DL);
94 if (!Size)
95 return std::nullopt;
96 auto CheckedProd = checkedMulUnsigned(Size->getKnownMinValue(),
97 static_cast<TypeSize::ScalarTy>(8));
98 if (!CheckedProd)
99 return std::nullopt;
100 return TypeSize::get(*CheckedProd, Size->isScalable());
101}
102
103//===----------------------------------------------------------------------===//
104// SelectInst Class
105//===----------------------------------------------------------------------===//
106
107/// areInvalidOperands - Return a string if the specified operands are invalid
108/// for a select operation, otherwise return null.
109const char *SelectInst::areInvalidOperands(Value *Op0, Value *Op1, Value *Op2) {
110 if (Op1->getType() != Op2->getType())
111 return "both values to select must have same type";
112
113 if (Op1->getType()->isTokenTy())
114 return "select values cannot have token type";
115
116 if (VectorType *VT = dyn_cast<VectorType>(Op0->getType())) {
117 // Vector select.
118 if (VT->getElementType() != Type::getInt1Ty(Op0->getContext()))
119 return "vector select condition element type must be i1";
121 if (!ET)
122 return "selected values for vector select must be vectors";
123 if (ET->getElementCount() != VT->getElementCount())
124 return "vector select requires selected vectors to have "
125 "the same vector length as select condition";
126 } else if (Op0->getType() != Type::getInt1Ty(Op0->getContext())) {
127 return "select condition must be i1 or <n x i1>";
128 }
129 return nullptr;
130}
131
132//===----------------------------------------------------------------------===//
133// PHINode Class
134//===----------------------------------------------------------------------===//
135
136PHINode::PHINode(const PHINode &PN)
137 : Instruction(PN.getType(), Instruction::PHI, AllocMarker),
138 ReservedSpace(PN.getNumOperands()) {
141 std::copy(PN.op_begin(), PN.op_end(), op_begin());
142 copyIncomingBlocks(make_range(PN.block_begin(), PN.block_end()));
143 FMF = PN.FMF;
144}
145
146// removeIncomingValue - Remove an incoming value. This is useful if a
147// predecessor basic block is deleted.
148Value *PHINode::removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty) {
149 Value *Removed = getIncomingValue(Idx);
150 // Swap with the end of the list.
151 unsigned Last = getNumOperands() - 1;
152 if (Idx != Last) {
155 }
156
157 // Nuke the last value.
158 Op<-1>().set(nullptr);
160
161 // If the PHI node is dead, because it has zero entries, nuke it now.
162 if (getNumOperands() == 0 && DeletePHIIfEmpty) {
163 // If anyone is using this PHI, make them use a dummy value instead...
166 }
167 return Removed;
168}
169
170void PHINode::removeIncomingValueIf(function_ref<bool(unsigned)> Predicate,
171 bool DeletePHIIfEmpty) {
172 unsigned NumOps = getNumIncomingValues();
173
174 // Loop backwards in case the predicate is purely index based.
175 for (unsigned Idx = NumOps; Idx-- > 0;) {
176 if (Predicate(Idx)) {
177 unsigned LastIdx = NumOps - 1;
178 if (Idx != LastIdx) {
179 setIncomingValue(Idx, getIncomingValue(LastIdx));
180 setIncomingBlock(Idx, getIncomingBlock(LastIdx));
181 }
182 getOperandUse(LastIdx).set(nullptr);
183 NumOps--;
184 }
185 }
186
188
189 // If the PHI node is dead, because it has zero entries, nuke it now.
190 if (getNumOperands() == 0 && DeletePHIIfEmpty) {
191 // If anyone is using this PHI, make them use a dummy value instead...
194 }
195}
196
197/// growOperands - grow operands - This grows the operand list in response
198/// to a push_back style of operation. This grows the number of ops by 1.5
199/// times.
200///
201void PHINode::growOperands() {
202 unsigned e = getNumOperands();
203 unsigned NumOps = e + e / 2;
204 if (NumOps < 2) NumOps = 2; // 2 op PHI nodes are VERY common.
205
206 ReservedSpace = NumOps;
207 growHungoffUses(ReservedSpace, /*WithExtraValues=*/true);
208}
209
210/// hasConstantValue - If the specified PHI node always merges together the same
211/// value, return the value, otherwise return null.
213 // Exploit the fact that phi nodes always have at least one entry.
214 Value *ConstantValue = getIncomingValue(0);
215 for (unsigned i = 1, e = getNumIncomingValues(); i != e; ++i)
216 if (getIncomingValue(i) != ConstantValue && getIncomingValue(i) != this) {
217 if (ConstantValue != this)
218 return nullptr; // Incoming values not all the same.
219 // The case where the first value is this PHI.
220 ConstantValue = getIncomingValue(i);
221 }
222 if (ConstantValue == this)
223 return PoisonValue::get(getType());
224 return ConstantValue;
225}
226
227/// hasConstantOrUndefValue - Whether the specified PHI node always merges
228/// together the same value, assuming that undefs result in the same value as
229/// non-undefs.
230/// Unlike \ref hasConstantValue, this does not return a value because the
231/// unique non-undef incoming value need not dominate the PHI node.
233 Value *ConstantValue = nullptr;
234 for (unsigned i = 0, e = getNumIncomingValues(); i != e; ++i) {
235 Value *Incoming = getIncomingValue(i);
236 if (Incoming != this && !isa<UndefValue>(Incoming)) {
237 if (ConstantValue && ConstantValue != Incoming)
238 return false;
239 ConstantValue = Incoming;
240 }
241 }
242 return true;
243}
244
245//===----------------------------------------------------------------------===//
246// LandingPadInst Implementation
247//===----------------------------------------------------------------------===//
248
249LandingPadInst::LandingPadInst(Type *RetTy, unsigned NumReservedValues,
250 const Twine &NameStr,
251 InsertPosition InsertBefore)
252 : Instruction(RetTy, Instruction::LandingPad, AllocMarker, InsertBefore) {
253 init(NumReservedValues, NameStr);
254}
255
256LandingPadInst::LandingPadInst(const LandingPadInst &LP)
257 : Instruction(LP.getType(), Instruction::LandingPad, AllocMarker),
258 ReservedSpace(LP.getNumOperands()) {
261 Use *OL = getOperandList();
262 const Use *InOL = LP.getOperandList();
263 for (unsigned I = 0, E = ReservedSpace; I != E; ++I)
264 OL[I] = InOL[I];
265
266 setCleanup(LP.isCleanup());
267}
268
269LandingPadInst *LandingPadInst::Create(Type *RetTy, unsigned NumReservedClauses,
270 const Twine &NameStr,
271 InsertPosition InsertBefore) {
272 return new LandingPadInst(RetTy, NumReservedClauses, NameStr, InsertBefore);
273}
274
275void LandingPadInst::init(unsigned NumReservedValues, const Twine &NameStr) {
276 ReservedSpace = NumReservedValues;
277 allocHungoffUses(ReservedSpace);
279 setName(NameStr);
280 setCleanup(false);
281}
282
283/// growOperands - grow operands - This grows the operand list in response to a
284/// push_back style of operation. This grows the number of ops by 2 times.
285void LandingPadInst::growOperands(unsigned Size) {
286 unsigned e = getNumOperands();
287 if (ReservedSpace >= e + Size) return;
288 ReservedSpace = (std::max(e, 1U) + Size / 2) * 2;
289 growHungoffUses(ReservedSpace);
290}
291
293 unsigned OpNo = getNumOperands();
294 growOperands(1);
295 assert(OpNo < ReservedSpace && "Growing didn't work!");
297 getOperandList()[OpNo] = Val;
298}
299
300//===----------------------------------------------------------------------===//
301// CallBase Implementation
302//===----------------------------------------------------------------------===//
303
305 InsertPosition InsertPt) {
306 switch (CB->getOpcode()) {
307 case Instruction::Call:
308 return CallInst::Create(cast<CallInst>(CB), Bundles, InsertPt);
309 case Instruction::Invoke:
310 return InvokeInst::Create(cast<InvokeInst>(CB), Bundles, InsertPt);
311 case Instruction::CallBr:
312 return CallBrInst::Create(cast<CallBrInst>(CB), Bundles, InsertPt);
313 default:
314 llvm_unreachable("Unknown CallBase sub-class!");
315 }
316}
317
319 InsertPosition InsertPt) {
321 for (unsigned i = 0, e = CI->getNumOperandBundles(); i < e; ++i) {
322 auto ChildOB = CI->getOperandBundleAt(i);
323 if (ChildOB.getTagName() != OpB.getTag())
324 OpDefs.emplace_back(ChildOB);
325 }
326 OpDefs.emplace_back(OpB);
327 return CallBase::Create(CI, OpDefs, InsertPt);
328}
329
331
333 assert(getOpcode() == Instruction::CallBr && "Unexpected opcode!");
334 return cast<CallBrInst>(this)->getNumIndirectDests() + 1;
335}
336
338 const Value *V = getCalledOperand();
339 if (isa<Function>(V) || isa<Constant>(V))
340 return false;
341 return !isInlineAsm();
342}
343
344/// Tests if this call site must be tail call optimized. Only a CallInst can
345/// be tail call optimized.
347 if (auto *CI = dyn_cast<CallInst>(this))
348 return CI->isMustTailCall();
349 return false;
350}
351
352/// Tests if this call site is marked as a tail call.
354 if (auto *CI = dyn_cast<CallInst>(this))
355 return CI->isTailCall();
356 return false;
357}
358
361 return F->getIntrinsicID();
363}
364
366 FPClassTest Mask = Attrs.getRetNoFPClass();
367
368 if (const Function *F = getCalledFunction())
369 Mask |= F->getAttributes().getRetNoFPClass();
370 return Mask;
371}
372
374 FPClassTest Mask = Attrs.getParamNoFPClass(i);
375
376 if (const Function *F = getCalledFunction())
377 Mask |= F->getAttributes().getParamNoFPClass(i);
378 return Mask;
379}
380
381std::optional<ConstantRange> CallBase::getRange() const {
382 Attribute CallAttr = Attrs.getRetAttr(Attribute::Range);
384 if (const Function *F = getCalledFunction())
385 FnAttr = F->getRetAttribute(Attribute::Range);
386
387 if (CallAttr.isValid() && FnAttr.isValid())
388 return CallAttr.getRange().intersectWith(FnAttr.getRange());
389 if (CallAttr.isValid())
390 return CallAttr.getRange();
391 if (FnAttr.isValid())
392 return FnAttr.getRange();
393 return std::nullopt;
394}
395
397 if (hasRetAttr(Attribute::NonNull))
398 return true;
399
400 if (getRetDereferenceableBytes() > 0 &&
402 return true;
403
404 return false;
405}
406
408 unsigned Index;
409
410 if (Attrs.hasAttrSomewhere(Kind, &Index))
411 return getArgOperand(Index - AttributeList::FirstArgIndex);
412 if (const Function *F = getCalledFunction())
413 if (F->getAttributes().hasAttrSomewhere(Kind, &Index))
414 return getArgOperand(Index - AttributeList::FirstArgIndex);
415
416 return nullptr;
417}
418
419/// Determine whether the argument or parameter has the given attribute.
420bool CallBase::paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
421 assert(ArgNo < arg_size() && "Param index out of bounds!");
422
423 if (Attrs.hasParamAttr(ArgNo, Kind))
424 return true;
425
426 const Function *F = getCalledFunction();
427 if (!F)
428 return false;
429
430 if (!F->getAttributes().hasParamAttr(ArgNo, Kind))
431 return false;
432
433 // Take into account mod/ref by operand bundles.
434 switch (Kind) {
435 case Attribute::ReadNone:
437 case Attribute::ReadOnly:
439 case Attribute::WriteOnly:
440 return !hasReadingOperandBundles();
441 default:
442 return true;
443 }
444}
445
447 bool AllowUndefOrPoison) const {
449 "Argument must be a pointer");
450 if (paramHasAttr(ArgNo, Attribute::NonNull) &&
451 (AllowUndefOrPoison || paramHasAttr(ArgNo, Attribute::NoUndef)))
452 return true;
453
454 if (paramHasAttr(ArgNo, Attribute::Dereferenceable) &&
456 getCaller(),
458 return true;
459
460 return false;
461}
462
463bool CallBase::hasFnAttrOnCalledFunction(Attribute::AttrKind Kind) const {
465 return F->getAttributes().hasFnAttr(Kind);
466
467 return false;
468}
469
470bool CallBase::hasFnAttrOnCalledFunction(StringRef Kind) const {
472 return F->getAttributes().hasFnAttr(Kind);
473
474 return false;
475}
476
477template <typename AK>
478Attribute CallBase::getFnAttrOnCalledFunction(AK Kind) const {
479 if constexpr (std::is_same_v<AK, Attribute::AttrKind>) {
480 // getMemoryEffects() correctly combines memory effects from the call-site,
481 // operand bundles and function.
482 assert(Kind != Attribute::Memory && "Use getMemoryEffects() instead");
483 }
484
486 return F->getAttributes().getFnAttr(Kind);
487
488 return Attribute();
489}
490
491template LLVM_ABI Attribute
492CallBase::getFnAttrOnCalledFunction(Attribute::AttrKind Kind) const;
493template LLVM_ABI Attribute
494CallBase::getFnAttrOnCalledFunction(StringRef Kind) const;
495
496template <typename AK>
497Attribute CallBase::getParamAttrOnCalledFunction(unsigned ArgNo,
498 AK Kind) const {
500
501 if (auto *F = dyn_cast<Function>(V))
502 return F->getAttributes().getParamAttr(ArgNo, Kind);
503
504 return Attribute();
505}
506template LLVM_ABI Attribute CallBase::getParamAttrOnCalledFunction(
507 unsigned ArgNo, Attribute::AttrKind Kind) const;
508template LLVM_ABI Attribute
509CallBase::getParamAttrOnCalledFunction(unsigned ArgNo, StringRef Kind) const;
510
513 for (unsigned i = 0, e = getNumOperandBundles(); i != e; ++i)
515}
516
519 const unsigned BeginIndex) {
520 auto It = op_begin() + BeginIndex;
521 for (auto &B : Bundles)
522 It = std::copy(B.input_begin(), B.input_end(), It);
523
524 auto *ContextImpl = getContext().pImpl;
525 auto BI = Bundles.begin();
526 unsigned CurrentIndex = BeginIndex;
527
528 for (auto &BOI : bundle_op_infos()) {
529 assert(BI != Bundles.end() && "Incorrect allocation?");
530
531 BOI.Tag = ContextImpl->getOrInsertBundleTag(BI->getTag());
532 BOI.Begin = CurrentIndex;
533 BOI.End = CurrentIndex + BI->input_size();
534 CurrentIndex = BOI.End;
535 BI++;
536 }
537
538 assert(BI == Bundles.end() && "Incorrect allocation?");
539
540 return It;
541}
542
544 /// When there isn't many bundles, we do a simple linear search.
545 /// Else fallback to a binary-search that use the fact that bundles usually
546 /// have similar number of argument to get faster convergence.
548 for (auto &BOI : bundle_op_infos())
549 if (BOI.Begin <= OpIdx && OpIdx < BOI.End)
550 return BOI;
551
552 llvm_unreachable("Did not find operand bundle for operand!");
553 }
554
555 assert(OpIdx >= arg_size() && "the Idx is not in the operand bundles");
557 OpIdx < std::prev(bundle_op_info_end())->End &&
558 "The Idx isn't in the operand bundle");
559
560 /// We need a decimal number below and to prevent using floating point numbers
561 /// we use an intergal value multiplied by this constant.
562 constexpr unsigned NumberScaling = 1024;
563
566 bundle_op_iterator Current = Begin;
567
568 while (Begin != End) {
569 unsigned ScaledOperandPerBundle =
570 NumberScaling * (std::prev(End)->End - Begin->Begin) / (End - Begin);
571 Current = Begin + (((OpIdx - Begin->Begin) * NumberScaling) /
572 ScaledOperandPerBundle);
573 if (Current >= End)
574 Current = std::prev(End);
575 assert(Current < End && Current >= Begin &&
576 "the operand bundle doesn't cover every value in the range");
577 if (OpIdx >= Current->Begin && OpIdx < Current->End)
578 break;
579 if (OpIdx >= Current->End)
580 Begin = Current + 1;
581 else
582 End = Current;
583 }
584
585 assert(OpIdx >= Current->Begin && OpIdx < Current->End &&
586 "the operand bundle doesn't cover every value in the range");
587 return *Current;
588}
589
592 InsertPosition InsertPt) {
593 if (CB->getOperandBundle(ID))
594 return CB;
595
597 CB->getOperandBundlesAsDefs(Bundles);
598 Bundles.push_back(OB);
599 return Create(CB, Bundles, InsertPt);
600}
601
603 InsertPosition InsertPt) {
605 bool CreateNew = false;
606
607 for (unsigned I = 0, E = CB->getNumOperandBundles(); I != E; ++I) {
608 auto Bundle = CB->getOperandBundleAt(I);
609 if (Bundle.getTagID() == ID) {
610 CreateNew = true;
611 continue;
612 }
613 Bundles.emplace_back(Bundle);
614 }
615
616 return CreateNew ? Create(CB, Bundles, InsertPt) : CB;
617}
618
620 InsertPosition InsertPt) {
621 auto OpBundleCount = CB->getNumOperandBundles();
622 assert(Offset < OpBundleCount &&
623 "Trying to remove non-existant operand bundle");
625 Bundles.reserve(OpBundleCount - 1);
626 size_t I = 0;
627 for (; I != Offset; ++I)
628 Bundles.emplace_back(CB->getOperandBundleAt(I));
629 ++I;
630 for (; I != OpBundleCount; ++I)
631 Bundles.emplace_back(CB->getOperandBundleAt(I));
632 return Create(CB, Bundles, InsertPt);
633}
634
636 // Implementation note: this is a conservative implementation of operand
637 // bundle semantics, where *any* non-assume operand bundle (other than
638 // ptrauth) forces a callsite to be at least readonly.
643 getIntrinsicID() != Intrinsic::assume;
644}
645
654
656 MemoryEffects ME = getAttributes().getMemoryEffects();
657 if (auto *Fn = dyn_cast<Function>(getCalledOperand())) {
658 MemoryEffects FnME = Fn->getMemoryEffects();
659 if (hasOperandBundles()) {
660 // TODO: Add a method to get memory effects for operand bundles instead.
662 FnME |= MemoryEffects::readOnly();
664 FnME |= MemoryEffects::writeOnly();
665 }
666 if (isVolatile()) {
667 // Volatile operations also access inaccessible memory.
669 }
670 ME &= FnME;
671 }
672 return ME;
673}
677
678/// Determine if the function does not access memory.
685
686/// Determine if the function does not access or only reads memory.
693
694/// Determine if the function does not access or only writes memory.
701
702/// Determine if the call can access memmory only using pointers based
703/// on its arguments.
710
711/// Determine if the function may only access memory that is
712/// inaccessible from the IR.
719
720/// Determine if the function may only access memory that is
721/// either inaccessible from the IR or pointed to by its arguments.
729
731 if (OpNo < arg_size()) {
732 // If the argument is passed byval, the callee does not have access to the
733 // original pointer and thus cannot capture it.
734 if (isByValArgument(OpNo))
735 return CaptureInfo::none();
736
738 if (auto *Fn = dyn_cast<Function>(getCalledOperand()))
739 CI &= Fn->getAttributes().getParamAttrs(OpNo).getCaptureInfo();
740 return CI;
741 }
742
743 // Bundles on assumes are captures(none).
744 if (getIntrinsicID() == Intrinsic::assume)
745 return CaptureInfo::none();
746
747 // deopt operand bundles are captures(none)
748 auto &BOI = getBundleOpInfoForOperand(OpNo);
749 auto OBU = operandBundleFromBundleOpInfo(BOI);
750 return OBU.isDeoptOperandBundle() ? CaptureInfo::none() : CaptureInfo::all();
751}
752
754 for (unsigned I = 0, E = arg_size(); I < E; ++I) {
756 continue;
757
759 if (auto *Fn = dyn_cast<Function>(getCalledOperand()))
760 CI &= Fn->getAttributes().getParamAttrs(I).getCaptureInfo();
762 return true;
763 }
764 return false;
765}
766
767//===----------------------------------------------------------------------===//
768// CallInst Implementation
769//===----------------------------------------------------------------------===//
770
771void CallInst::init(FunctionType *FTy, Value *Func, ArrayRef<Value *> Args,
772 ArrayRef<OperandBundleDef> Bundles, const Twine &NameStr) {
773 this->FTy = FTy;
774 assert(getNumOperands() == Args.size() + CountBundleInputs(Bundles) + 1 &&
775 "NumOperands not set up?");
776
777#ifndef NDEBUG
778 assert((Args.size() == FTy->getNumParams() ||
779 (FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
780 "Calling a function with bad signature!");
781
782 for (unsigned i = 0; i != Args.size(); ++i)
783 assert((i >= FTy->getNumParams() ||
784 FTy->getParamType(i) == Args[i]->getType()) &&
785 "Calling a function with a bad signature!");
786#endif
787
788 // Set operands in order of their index to match use-list-order
789 // prediction.
790 llvm::copy(Args, op_begin());
791 setCalledOperand(Func);
792
793 auto It = populateBundleOperandInfos(Bundles, Args.size());
794 (void)It;
795 assert(It + 1 == op_end() && "Should add up!");
796
797 setName(NameStr);
798}
799
800void CallInst::init(FunctionType *FTy, Value *Func, const Twine &NameStr) {
801 this->FTy = FTy;
802 assert(getNumOperands() == 1 && "NumOperands not set up?");
803 setCalledOperand(Func);
804
805 assert(FTy->getNumParams() == 0 && "Calling a function with bad signature");
806
807 setName(NameStr);
808}
809
810CallInst::CallInst(FunctionType *Ty, Value *Func, const Twine &Name,
811 AllocInfo AllocInfo, InsertPosition InsertBefore)
812 : CallBase(Ty->getReturnType(), Instruction::Call, AllocInfo,
813 InsertBefore) {
814 init(Ty, Func, Name);
815}
816
817CallInst::CallInst(const CallInst &CI, AllocInfo AllocInfo)
818 : CallBase(CI.Attrs, CI.FTy, CI.getType(), Instruction::Call, AllocInfo) {
820 "Wrong number of operands allocated");
821 setTailCallKind(CI.getTailCallKind());
823
824 std::copy(CI.op_begin(), CI.op_end(), op_begin());
825 std::copy(CI.bundle_op_info_begin(), CI.bundle_op_info_end(),
827 FMF = CI.FMF;
828}
829
831 InsertPosition InsertPt) {
832 std::vector<Value *> Args(CI->arg_begin(), CI->arg_end());
833
834 auto *NewCI = CallInst::Create(CI->getFunctionType(), CI->getCalledOperand(),
835 Args, OpB, CI->getName(), InsertPt);
836 NewCI->setTailCallKind(CI->getTailCallKind());
837 NewCI->setCallingConv(CI->getCallingConv());
838 NewCI->FMF = CI->FMF;
839 NewCI->setAttributes(CI->getAttributes());
840 NewCI->setDebugLoc(CI->getDebugLoc());
841 return NewCI;
842}
843
844// Update profile weight for call instruction by scaling it using the ratio
845// of S/T. The meaning of "branch_weights" meta data for call instruction is
846// transfered to represent call count.
847void CallInst::updateProfWeight(uint64_t S, uint64_t T) {
848 if (T == 0) {
849 LLVM_DEBUG(dbgs() << "Attempting to update profile weights will result in "
850 "div by 0. Ignoring. Likely the function "
851 << getParent()->getParent()->getName()
852 << " has 0 entry count, and contains call instructions "
853 "with non-zero prof info.");
854 return;
855 }
856 scaleProfData(*this, S, T);
857}
858
859//===----------------------------------------------------------------------===//
860// InvokeInst Implementation
861//===----------------------------------------------------------------------===//
862
863void InvokeInst::init(FunctionType *FTy, Value *Fn, BasicBlock *IfNormal,
864 BasicBlock *IfException, ArrayRef<Value *> Args,
866 const Twine &NameStr) {
867 this->FTy = FTy;
868
870 ComputeNumOperands(Args.size(), CountBundleInputs(Bundles)) &&
871 "NumOperands not set up?");
872
873#ifndef NDEBUG
874 assert(((Args.size() == FTy->getNumParams()) ||
875 (FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
876 "Invoking a function with bad signature");
877
878 for (unsigned i = 0, e = Args.size(); i != e; i++)
879 assert((i >= FTy->getNumParams() ||
880 FTy->getParamType(i) == Args[i]->getType()) &&
881 "Invoking a function with a bad signature!");
882#endif
883
884 // Set operands in order of their index to match use-list-order
885 // prediction.
886 llvm::copy(Args, op_begin());
887 setNormalDest(IfNormal);
888 setUnwindDest(IfException);
890
891 auto It = populateBundleOperandInfos(Bundles, Args.size());
892 (void)It;
893 assert(It + 3 == op_end() && "Should add up!");
894
895 setName(NameStr);
896}
897
898InvokeInst::InvokeInst(const InvokeInst &II, AllocInfo AllocInfo)
899 : CallBase(II.Attrs, II.FTy, II.getType(), Instruction::Invoke, AllocInfo) {
900 assert(getNumOperands() == II.getNumOperands() &&
901 "Wrong number of operands allocated");
902 setCallingConv(II.getCallingConv());
903 std::copy(II.op_begin(), II.op_end(), op_begin());
904 std::copy(II.bundle_op_info_begin(), II.bundle_op_info_end(),
906 SubclassOptionalData = II.SubclassOptionalData;
907}
908
910 InsertPosition InsertPt) {
911 std::vector<Value *> Args(II->arg_begin(), II->arg_end());
912
913 auto *NewII = InvokeInst::Create(
914 II->getFunctionType(), II->getCalledOperand(), II->getNormalDest(),
915 II->getUnwindDest(), Args, OpB, II->getName(), InsertPt);
916 NewII->setCallingConv(II->getCallingConv());
917 NewII->SubclassOptionalData = II->SubclassOptionalData;
918 NewII->setAttributes(II->getAttributes());
919 NewII->setDebugLoc(II->getDebugLoc());
920 return NewII;
921}
922
924 return cast<LandingPadInst>(getUnwindDest()->getFirstNonPHIIt());
925}
926
927void InvokeInst::updateProfWeight(uint64_t S, uint64_t T) {
928 if (T == 0) {
929 LLVM_DEBUG(dbgs() << "Attempting to update profile weights will result in "
930 "div by 0. Ignoring. Likely the function "
931 << getParent()->getParent()->getName()
932 << " has 0 entry count, and contains call instructions "
933 "with non-zero prof info.");
934 return;
935 }
936 scaleProfData(*this, S, T);
937}
938
939//===----------------------------------------------------------------------===//
940// CallBrInst Implementation
941//===----------------------------------------------------------------------===//
942
943void CallBrInst::init(FunctionType *FTy, Value *Fn, BasicBlock *Fallthrough,
944 ArrayRef<BasicBlock *> IndirectDests,
947 const Twine &NameStr) {
948 this->FTy = FTy;
949
950 assert(getNumOperands() == ComputeNumOperands(Args.size(),
951 IndirectDests.size(),
952 CountBundleInputs(Bundles)) &&
953 "NumOperands not set up?");
954
955#ifndef NDEBUG
956 assert(((Args.size() == FTy->getNumParams()) ||
957 (FTy->isVarArg() && Args.size() > FTy->getNumParams())) &&
958 "Calling a function with bad signature");
959
960 for (unsigned i = 0, e = Args.size(); i != e; i++)
961 assert((i >= FTy->getNumParams() ||
962 FTy->getParamType(i) == Args[i]->getType()) &&
963 "Calling a function with a bad signature!");
964#endif
965
966 // Set operands in order of their index to match use-list-order
967 // prediction.
968 llvm::copy(Args, op_begin());
969 NumIndirectDests = IndirectDests.size();
970 setDefaultDest(Fallthrough);
971 for (unsigned i = 0; i != NumIndirectDests; ++i)
972 setIndirectDest(i, IndirectDests[i]);
974
975 auto It = populateBundleOperandInfos(Bundles, Args.size());
976 (void)It;
977 assert(It + 2 + IndirectDests.size() == op_end() && "Should add up!");
978
979 setName(NameStr);
980}
981
982CallBrInst::CallBrInst(const CallBrInst &CBI, AllocInfo AllocInfo)
983 : CallBase(CBI.Attrs, CBI.FTy, CBI.getType(), Instruction::CallBr,
984 AllocInfo) {
986 "Wrong number of operands allocated");
988 std::copy(CBI.op_begin(), CBI.op_end(), op_begin());
989 std::copy(CBI.bundle_op_info_begin(), CBI.bundle_op_info_end(),
992 NumIndirectDests = CBI.NumIndirectDests;
993}
994
995CallBrInst *CallBrInst::Create(CallBrInst *CBI, ArrayRef<OperandBundleDef> OpB,
996 InsertPosition InsertPt) {
997 std::vector<Value *> Args(CBI->arg_begin(), CBI->arg_end());
998
999 auto *NewCBI = CallBrInst::Create(
1000 CBI->getFunctionType(), CBI->getCalledOperand(), CBI->getDefaultDest(),
1001 CBI->getIndirectDests(), Args, OpB, CBI->getName(), InsertPt);
1002 NewCBI->setCallingConv(CBI->getCallingConv());
1003 NewCBI->SubclassOptionalData = CBI->SubclassOptionalData;
1004 NewCBI->setAttributes(CBI->getAttributes());
1005 NewCBI->setDebugLoc(CBI->getDebugLoc());
1006 NewCBI->NumIndirectDests = CBI->NumIndirectDests;
1007 return NewCBI;
1008}
1009
1010//===----------------------------------------------------------------------===//
1011// ReturnInst Implementation
1012//===----------------------------------------------------------------------===//
1013
1014ReturnInst::ReturnInst(const ReturnInst &RI, AllocInfo AllocInfo)
1015 : Instruction(Type::getVoidTy(RI.getContext()), Instruction::Ret,
1016 AllocInfo) {
1018 "Wrong number of operands allocated");
1019 if (RI.getNumOperands())
1020 Op<0>() = RI.Op<0>();
1022}
1023
1024ReturnInst::ReturnInst(LLVMContext &C, Value *retVal, AllocInfo AllocInfo,
1025 InsertPosition InsertBefore)
1026 : Instruction(Type::getVoidTy(C), Instruction::Ret, AllocInfo,
1027 InsertBefore) {
1028 if (retVal)
1029 Op<0>() = retVal;
1030}
1031
1032//===----------------------------------------------------------------------===//
1033// ResumeInst Implementation
1034//===----------------------------------------------------------------------===//
1035
1036ResumeInst::ResumeInst(const ResumeInst &RI)
1037 : Instruction(Type::getVoidTy(RI.getContext()), Instruction::Resume,
1038 AllocMarker) {
1039 Op<0>() = RI.Op<0>();
1040}
1041
1042ResumeInst::ResumeInst(Value *Exn, InsertPosition InsertBefore)
1043 : Instruction(Type::getVoidTy(Exn->getContext()), Instruction::Resume,
1044 AllocMarker, InsertBefore) {
1045 Op<0>() = Exn;
1046}
1047
1048//===----------------------------------------------------------------------===//
1049// CleanupReturnInst Implementation
1050//===----------------------------------------------------------------------===//
1051
1052CleanupReturnInst::CleanupReturnInst(const CleanupReturnInst &CRI,
1054 : Instruction(CRI.getType(), Instruction::CleanupRet, AllocInfo) {
1056 "Wrong number of operands allocated");
1057 setSubclassData<Instruction::OpaqueField>(
1059 Op<0>() = CRI.Op<0>();
1060 if (CRI.hasUnwindDest())
1061 Op<1>() = CRI.Op<1>();
1062}
1063
1064void CleanupReturnInst::init(Value *CleanupPad, BasicBlock *UnwindBB) {
1065 if (UnwindBB)
1066 setSubclassData<UnwindDestField>(true);
1067
1068 Op<0>() = CleanupPad;
1069 if (UnwindBB)
1070 Op<1>() = UnwindBB;
1071}
1072
1073CleanupReturnInst::CleanupReturnInst(Value *CleanupPad, BasicBlock *UnwindBB,
1075 InsertPosition InsertBefore)
1076 : Instruction(Type::getVoidTy(CleanupPad->getContext()),
1077 Instruction::CleanupRet, AllocInfo, InsertBefore) {
1078 init(CleanupPad, UnwindBB);
1079}
1080
1081//===----------------------------------------------------------------------===//
1082// CatchReturnInst Implementation
1083//===----------------------------------------------------------------------===//
1084void CatchReturnInst::init(Value *CatchPad, BasicBlock *BB) {
1085 Op<0>() = CatchPad;
1086 Op<1>() = BB;
1087}
1088
1089CatchReturnInst::CatchReturnInst(const CatchReturnInst &CRI)
1090 : Instruction(Type::getVoidTy(CRI.getContext()), Instruction::CatchRet,
1091 AllocMarker) {
1092 Op<0>() = CRI.Op<0>();
1093 Op<1>() = CRI.Op<1>();
1094}
1095
1096CatchReturnInst::CatchReturnInst(Value *CatchPad, BasicBlock *BB,
1097 InsertPosition InsertBefore)
1098 : Instruction(Type::getVoidTy(BB->getContext()), Instruction::CatchRet,
1099 AllocMarker, InsertBefore) {
1100 init(CatchPad, BB);
1101}
1102
1103//===----------------------------------------------------------------------===//
1104// CatchSwitchInst Implementation
1105//===----------------------------------------------------------------------===//
1106
1107CatchSwitchInst::CatchSwitchInst(Value *ParentPad, BasicBlock *UnwindDest,
1108 unsigned NumReservedValues,
1109 const Twine &NameStr,
1110 InsertPosition InsertBefore)
1111 : Instruction(ParentPad->getType(), Instruction::CatchSwitch, AllocMarker,
1112 InsertBefore) {
1113 if (UnwindDest)
1114 ++NumReservedValues;
1115 init(ParentPad, UnwindDest, NumReservedValues + 1);
1116 setName(NameStr);
1117}
1118
1119CatchSwitchInst::CatchSwitchInst(const CatchSwitchInst &CSI)
1120 : Instruction(CSI.getType(), Instruction::CatchSwitch, AllocMarker) {
1122 init(CSI.getParentPad(), CSI.getUnwindDest(), CSI.getNumOperands());
1123 setNumHungOffUseOperands(ReservedSpace);
1124 Use *OL = getOperandList();
1125 const Use *InOL = CSI.getOperandList();
1126 for (unsigned I = 1, E = ReservedSpace; I != E; ++I)
1127 OL[I] = InOL[I];
1128}
1129
1130void CatchSwitchInst::init(Value *ParentPad, BasicBlock *UnwindDest,
1131 unsigned NumReservedValues) {
1132 assert(ParentPad && NumReservedValues);
1133
1134 ReservedSpace = NumReservedValues;
1135 allocHungoffUses(ReservedSpace);
1136 setNumHungOffUseOperands(UnwindDest ? 2 : 1);
1137
1138 Op<0>() = ParentPad;
1139 if (UnwindDest) {
1141 setUnwindDest(UnwindDest);
1142 }
1143}
1144
1145/// growOperands - grow operands - This grows the operand list in response to a
1146/// push_back style of operation. This grows the number of ops by 2 times.
1147void CatchSwitchInst::growOperands(unsigned Size) {
1148 unsigned NumOperands = getNumOperands();
1149 assert(NumOperands >= 1);
1150 if (ReservedSpace >= NumOperands + Size)
1151 return;
1152 ReservedSpace = (NumOperands + Size / 2) * 2;
1153 growHungoffUses(ReservedSpace);
1154}
1155
1157 unsigned OpNo = getNumOperands();
1158 growOperands(1);
1159 assert(OpNo < ReservedSpace && "Growing didn't work!");
1161 getOperandList()[OpNo] = Handler;
1162}
1163
1165 // Move all subsequent handlers up one.
1166 Use *EndDst = op_end() - 1;
1167 for (Use *CurDst = HI.getCurrent(); CurDst != EndDst; ++CurDst)
1168 *CurDst = *(CurDst + 1);
1169 // Null out the last handler use.
1170 *EndDst = nullptr;
1171
1173}
1174
1175//===----------------------------------------------------------------------===//
1176// FuncletPadInst Implementation
1177//===----------------------------------------------------------------------===//
1178void FuncletPadInst::init(Value *ParentPad, ArrayRef<Value *> Args,
1179 const Twine &NameStr) {
1180 assert(getNumOperands() == 1 + Args.size() && "NumOperands not set up?");
1181 llvm::copy(Args, op_begin());
1182 setParentPad(ParentPad);
1183 setName(NameStr);
1184}
1185
1186FuncletPadInst::FuncletPadInst(const FuncletPadInst &FPI, AllocInfo AllocInfo)
1187 : Instruction(FPI.getType(), FPI.getOpcode(), AllocInfo) {
1189 "Wrong number of operands allocated");
1190 std::copy(FPI.op_begin(), FPI.op_end(), op_begin());
1192}
1193
1194FuncletPadInst::FuncletPadInst(Instruction::FuncletPadOps Op, Value *ParentPad,
1196 const Twine &NameStr,
1197 InsertPosition InsertBefore)
1198 : Instruction(ParentPad->getType(), Op, AllocInfo, InsertBefore) {
1199 init(ParentPad, Args, NameStr);
1200}
1201
1202//===----------------------------------------------------------------------===//
1203// UnreachableInst Implementation
1204//===----------------------------------------------------------------------===//
1205
1207 InsertPosition InsertBefore)
1208 : Instruction(Type::getVoidTy(Context), Instruction::Unreachable,
1209 AllocMarker, InsertBefore) {}
1210
1211//===----------------------------------------------------------------------===//
1212// UncondBrInst Implementation
1213//===----------------------------------------------------------------------===//
1214
1215UncondBrInst::UncondBrInst(BasicBlock *Target, InsertPosition InsertBefore)
1216 : Instruction(Type::getVoidTy(Target->getContext()), Instruction::UncondBr,
1217 AllocMarker, InsertBefore) {
1218 Op<-1>() = Target;
1219}
1220
1221UncondBrInst::UncondBrInst(const UncondBrInst &BI)
1222 : Instruction(Type::getVoidTy(BI.getContext()), Instruction::UncondBr,
1223 AllocMarker) {
1224 Op<-1>() = BI.Op<-1>();
1226}
1227
1228//===----------------------------------------------------------------------===//
1229// CondBrInst Implementation
1230//===----------------------------------------------------------------------===//
1231
1232void CondBrInst::AssertOK() {
1233 assert(getCondition()->getType()->isIntegerTy(1) &&
1234 "May only branch on boolean predicates!");
1235}
1236
1237CondBrInst::CondBrInst(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse,
1238 InsertPosition InsertBefore)
1239 : Instruction(Type::getVoidTy(IfTrue->getContext()), Instruction::CondBr,
1240 AllocMarker, InsertBefore) {
1241 // Assign in order of operand index to make use-list order predictable.
1242 Op<-3>() = Cond;
1243 Op<-2>() = IfTrue;
1244 Op<-1>() = IfFalse;
1245#ifndef NDEBUG
1246 AssertOK();
1247#endif
1248}
1249
1250CondBrInst::CondBrInst(const CondBrInst &BI)
1251 : Instruction(Type::getVoidTy(BI.getContext()), Instruction::CondBr,
1252 AllocMarker) {
1253 // Assign in order of operand index to make use-list order predictable.
1254 Op<-3>() = BI.Op<-3>();
1255 Op<-2>() = BI.Op<-2>();
1256 Op<-1>() = BI.Op<-1>();
1258}
1259
1261 Op<-1>().swap(Op<-2>());
1262
1263 // Update profile metadata if present and it matches our structural
1264 // expectations.
1266}
1267
1268//===----------------------------------------------------------------------===//
1269// AllocaInst Implementation
1270//===----------------------------------------------------------------------===//
1271
1272static Value *getAISize(LLVMContext &Context, Value *Amt) {
1273 if (!Amt)
1274 Amt = ConstantInt::get(Type::getInt32Ty(Context), 1);
1275 else {
1276 assert(!isa<BasicBlock>(Amt) &&
1277 "Passed basic block into allocation size parameter! Use other ctor");
1278 assert(Amt->getType()->isIntegerTy() &&
1279 "Allocation array size is not an integer!");
1280 }
1281 return Amt;
1282}
1283
1285 assert(Pos.isValid() &&
1286 "Insertion position cannot be null when alignment not provided!");
1287 BasicBlock *BB = Pos.getBasicBlock();
1288 assert(BB->getParent() &&
1289 "BB must be in a Function when alignment not provided!");
1290 const DataLayout &DL = BB->getDataLayout();
1291 return DL.getPrefTypeAlign(Ty);
1292}
1293
1294AllocaInst::AllocaInst(Type *Ty, unsigned AddrSpace, const Twine &Name,
1295 InsertPosition InsertBefore)
1296 : AllocaInst(Ty, AddrSpace, /*ArraySize=*/nullptr, Name, InsertBefore) {}
1297
1298AllocaInst::AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize,
1299 const Twine &Name, InsertPosition InsertBefore)
1300 : AllocaInst(Ty, AddrSpace, ArraySize,
1301 computeAllocaDefaultAlign(Ty, InsertBefore), Name,
1302 InsertBefore) {}
1303
1304AllocaInst::AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize,
1305 Align Align, const Twine &Name,
1306 InsertPosition InsertBefore)
1307 : UnaryInstruction(PointerType::get(Ty->getContext(), AddrSpace), Alloca,
1308 getAISize(Ty->getContext(), ArraySize), InsertBefore),
1309 AllocatedType(Ty) {
1311 assert(!Ty->isVoidTy() && "Cannot allocate void!");
1312 setName(Name);
1313}
1314
1317 return !CI->isOne();
1318 return true;
1319}
1320
1321/// isStaticAlloca - Return true if this alloca is in the entry block of the
1322/// function and is a constant size. If so, the code generator will fold it
1323/// into the prolog/epilog code, so it is basically free.
1325 // Must be constant size.
1326 if (!isa<ConstantInt>(getArraySize())) return false;
1327
1328 // Must be in the entry block.
1329 const BasicBlock *Parent = getParent();
1330 return Parent->isEntryBlock() && !isUsedWithInAlloca();
1331}
1332
1333//===----------------------------------------------------------------------===//
1334// LoadInst Implementation
1335//===----------------------------------------------------------------------===//
1336
1337void LoadInst::AssertOK() {
1339 "Ptr must have pointer type.");
1340}
1341
1343 assert(Pos.isValid() &&
1344 "Insertion position cannot be null when alignment not provided!");
1345 BasicBlock *BB = Pos.getBasicBlock();
1346 assert(BB->getParent() &&
1347 "BB must be in a Function when alignment not provided!");
1348 const DataLayout &DL = BB->getDataLayout();
1349 return DL.getABITypeAlign(Ty);
1350}
1351
1352LoadInst::LoadInst(Type *Ty, Value *Ptr, const Twine &Name,
1353 InsertPosition InsertBef)
1354 : LoadInst(Ty, Ptr, Name, /*isVolatile=*/false, InsertBef) {}
1355
1356LoadInst::LoadInst(Type *Ty, Value *Ptr, const Twine &Name, bool isVolatile,
1357 InsertPosition InsertBef)
1358 : LoadInst(Ty, Ptr, Name, isVolatile,
1359 computeLoadStoreDefaultAlign(Ty, InsertBef), InsertBef) {}
1360
1361LoadInst::LoadInst(Type *Ty, Value *Ptr, const Twine &Name, bool isVolatile,
1362 Align Align, InsertPosition InsertBef)
1363 : LoadInst(Ty, Ptr, Name, isVolatile, Align, AtomicOrdering::NotAtomic,
1364 SyncScope::System, InsertBef) {}
1365
1366LoadInst::LoadInst(Type *Ty, Value *Ptr, const Twine &Name,
1367 const LoadStoreInstProperties &Props,
1368 InsertPosition InsertBef)
1369 : LoadInst(Ty, Ptr, Name, Props.IsVolatile, Props.Alignment, Props.Ordering,
1370 Props.SSID, InsertBef) {
1372}
1373
1374LoadInst::LoadInst(Type *Ty, Value *Ptr, const Twine &Name, bool isVolatile,
1376 InsertPosition InsertBef)
1377 : UnaryInstruction(Ty, Load, Ptr, InsertBef) {
1380 setAtomic(Order, SSID);
1381 AssertOK();
1382 setName(Name);
1383}
1384
1385//===----------------------------------------------------------------------===//
1386// StoreInst Implementation
1387//===----------------------------------------------------------------------===//
1388
1389void StoreInst::AssertOK() {
1390 assert(getOperand(0) && getOperand(1) && "Both operands must be non-null!");
1392 "Ptr must have pointer type!");
1393}
1394
1396 : StoreInst(val, addr, /*isVolatile=*/false, InsertBefore) {}
1397
1399 InsertPosition InsertBefore)
1400 : StoreInst(val, addr, isVolatile,
1401 computeLoadStoreDefaultAlign(val->getType(), InsertBefore),
1402 InsertBefore) {}
1403
1405 InsertPosition InsertBefore)
1407 SyncScope::System, InsertBefore) {}
1408
1410 const LoadStoreInstProperties &Props,
1411 InsertPosition InsertBefore)
1412 : StoreInst(Val, Ptr, Props.IsVolatile, Props.Alignment, Props.Ordering,
1413 Props.SSID, InsertBefore) {
1415}
1416
1418 AtomicOrdering Order, SyncScope::ID SSID,
1419 InsertPosition InsertBefore)
1420 : Instruction(Type::getVoidTy(val->getContext()), Store, AllocMarker,
1421 InsertBefore) {
1422 Op<0>() = val;
1423 Op<1>() = addr;
1426 setAtomic(Order, SSID);
1427 AssertOK();
1428}
1429
1430//===----------------------------------------------------------------------===//
1431// AtomicCmpXchgInst Implementation
1432//===----------------------------------------------------------------------===//
1433
1434void AtomicCmpXchgInst::Init(Value *Ptr, Value *Cmp, Value *NewVal,
1435 Align Alignment, AtomicOrdering SuccessOrdering,
1436 AtomicOrdering FailureOrdering,
1437 SyncScope::ID SSID) {
1438 Op<0>() = Ptr;
1439 Op<1>() = Cmp;
1440 Op<2>() = NewVal;
1441 setSuccessOrdering(SuccessOrdering);
1442 setFailureOrdering(FailureOrdering);
1443 setSyncScopeID(SSID);
1444 setAlignment(Alignment);
1445
1446 assert(getOperand(0) && getOperand(1) && getOperand(2) &&
1447 "All operands must be non-null!");
1449 "Ptr must have pointer type!");
1450 assert(getOperand(1)->getType() == getOperand(2)->getType() &&
1451 "Cmp type and NewVal type must be same!");
1452}
1453
1455 Align Alignment,
1456 AtomicOrdering SuccessOrdering,
1457 AtomicOrdering FailureOrdering,
1458 SyncScope::ID SSID,
1459 InsertPosition InsertBefore)
1460 : Instruction(
1461 StructType::get(Cmp->getType(), Type::getInt1Ty(Cmp->getContext())),
1462 AtomicCmpXchg, AllocMarker, InsertBefore) {
1463 Init(Ptr, Cmp, NewVal, Alignment, SuccessOrdering, FailureOrdering, SSID);
1464}
1465
1466//===----------------------------------------------------------------------===//
1467// AtomicRMWInst Implementation
1468//===----------------------------------------------------------------------===//
1469
1470void AtomicRMWInst::Init(BinOp Operation, Value *Ptr, Value *Val,
1471 Align Alignment, AtomicOrdering Ordering,
1472 SyncScope::ID SSID, bool Elementwise) {
1473 assert(Ordering != AtomicOrdering::NotAtomic &&
1474 "atomicrmw instructions can only be atomic.");
1475 assert(Ordering != AtomicOrdering::Unordered &&
1476 "atomicrmw instructions cannot be unordered.");
1477 Op<0>() = Ptr;
1478 Op<1>() = Val;
1479 setOperation(Operation);
1480 setOrdering(Ordering);
1481 setSyncScopeID(SSID);
1482 setElementwise(Elementwise);
1483 setAlignment(Alignment);
1484
1485 assert(getOperand(0) && getOperand(1) && "All operands must be non-null!");
1487 "Ptr must have pointer type!");
1488 assert(Ordering != AtomicOrdering::NotAtomic &&
1489 "AtomicRMW instructions must be atomic!");
1490}
1491
1493 Align Alignment, AtomicOrdering Ordering,
1494 SyncScope::ID SSID, bool Elementwise,
1495 InsertPosition InsertBefore)
1496 : Instruction(Val->getType(), AtomicRMW, AllocMarker, InsertBefore) {
1497 Init(Operation, Ptr, Val, Alignment, Ordering, SSID, Elementwise);
1498}
1499
1501 switch (Op) {
1503 return "xchg";
1504 case AtomicRMWInst::Add:
1505 return "add";
1506 case AtomicRMWInst::Sub:
1507 return "sub";
1508 case AtomicRMWInst::And:
1509 return "and";
1511 return "nand";
1512 case AtomicRMWInst::Or:
1513 return "or";
1514 case AtomicRMWInst::Xor:
1515 return "xor";
1516 case AtomicRMWInst::Max:
1517 return "max";
1518 case AtomicRMWInst::Min:
1519 return "min";
1521 return "umax";
1523 return "umin";
1525 return "fadd";
1527 return "fsub";
1529 return "fmax";
1531 return "fmin";
1533 return "fmaximum";
1535 return "fminimum";
1537 return "fmaximumnum";
1539 return "fminimumnum";
1541 return "uinc_wrap";
1543 return "udec_wrap";
1545 return "usub_cond";
1547 return "usub_sat";
1549 return "<invalid operation>";
1550 }
1551
1552 llvm_unreachable("invalid atomicrmw operation");
1553}
1554
1555//===----------------------------------------------------------------------===//
1556// FenceInst Implementation
1557//===----------------------------------------------------------------------===//
1558
1560 SyncScope::ID SSID, InsertPosition InsertBefore)
1561 : Instruction(Type::getVoidTy(C), Fence, AllocMarker, InsertBefore) {
1562 setOrdering(Ordering);
1563 setSyncScopeID(SSID);
1564}
1565
1566//===----------------------------------------------------------------------===//
1567// GetElementPtrInst Implementation
1568//===----------------------------------------------------------------------===//
1569
1570void GetElementPtrInst::init(Value *Ptr, ArrayRef<Value *> IdxList,
1571 const Twine &Name) {
1572 assert(getNumOperands() == 1 + IdxList.size() &&
1573 "NumOperands not initialized?");
1574 Op<0>() = Ptr;
1575 llvm::copy(IdxList, op_begin() + 1);
1576 setName(Name);
1577}
1578
1579GetElementPtrInst::GetElementPtrInst(const GetElementPtrInst &GEPI,
1581 : Instruction(GEPI.getType(), GetElementPtr, AllocInfo),
1582 SourceElementType(GEPI.SourceElementType),
1583 ResultElementType(GEPI.ResultElementType) {
1584 assert(getNumOperands() == GEPI.getNumOperands() &&
1585 "Wrong number of operands allocated");
1586 std::copy(GEPI.op_begin(), GEPI.op_end(), op_begin());
1588}
1589
1591 if (auto *Struct = dyn_cast<StructType>(Ty)) {
1592 if (!Struct->indexValid(Idx))
1593 return nullptr;
1594 return Struct->getTypeAtIndex(Idx);
1595 }
1596 if (!Idx->getType()->isIntOrIntVectorTy())
1597 return nullptr;
1598 if (auto *Array = dyn_cast<ArrayType>(Ty))
1599 return Array->getElementType();
1600 if (auto *Vector = dyn_cast<VectorType>(Ty))
1601 return Vector->getElementType();
1602 return nullptr;
1603}
1604
1606 if (auto *Struct = dyn_cast<StructType>(Ty)) {
1607 if (Idx >= Struct->getNumElements())
1608 return nullptr;
1609 return Struct->getElementType(Idx);
1610 }
1611 if (auto *Array = dyn_cast<ArrayType>(Ty))
1612 return Array->getElementType();
1613 if (auto *Vector = dyn_cast<VectorType>(Ty))
1614 return Vector->getElementType();
1615 return nullptr;
1616}
1617
1618template <typename IndexTy>
1620 if (IdxList.empty())
1621 return Ty;
1622 for (IndexTy V : IdxList.slice(1)) {
1624 if (!Ty)
1625 return Ty;
1626 }
1627 return Ty;
1628}
1629
1633
1635 ArrayRef<Constant *> IdxList) {
1636 return getIndexedTypeInternal(Ty, IdxList);
1637}
1638
1642
1643/// hasAllZeroIndices - Return true if all of the indices of this GEP are
1644/// zeros. If so, the result pointer and the first operand have the same
1645/// value, just potentially different types.
1647 for (unsigned i = 1, e = getNumOperands(); i != e; ++i) {
1649 if (!CI->isZero()) return false;
1650 } else {
1651 return false;
1652 }
1653 }
1654 return true;
1655}
1656
1657/// hasAllConstantIndices - Return true if all of the indices of this GEP are
1658/// constant integers. If so, the result pointer and the first operand have
1659/// a constant offset between them.
1661 for (unsigned i = 1, e = getNumOperands(); i != e; ++i) {
1663 return false;
1664 }
1665 return true;
1666}
1667
1671
1673 GEPNoWrapFlags NW = cast<GEPOperator>(this)->getNoWrapFlags();
1674 if (B)
1676 else
1677 NW = NW.withoutInBounds();
1678 setNoWrapFlags(NW);
1679}
1680
1682 return cast<GEPOperator>(this)->getNoWrapFlags();
1683}
1684
1686 return cast<GEPOperator>(this)->isInBounds();
1687}
1688
1690 return cast<GEPOperator>(this)->hasNoUnsignedSignedWrap();
1691}
1692
1694 return cast<GEPOperator>(this)->hasNoUnsignedWrap();
1695}
1696
1698 APInt &Offset) const {
1699 // Delegate to the generic GEPOperator implementation.
1700 return cast<GEPOperator>(this)->accumulateConstantOffset(DL, Offset);
1701}
1702
1704 const DataLayout &DL, unsigned BitWidth,
1705 SmallMapVector<Value *, APInt, 4> &VariableOffsets,
1706 APInt &ConstantOffset) const {
1707 // Delegate to the generic GEPOperator implementation.
1708 return cast<GEPOperator>(this)->collectOffset(DL, BitWidth, VariableOffsets,
1709 ConstantOffset);
1710}
1711
1712//===----------------------------------------------------------------------===//
1713// ExtractElementInst Implementation
1714//===----------------------------------------------------------------------===//
1715
1716ExtractElementInst::ExtractElementInst(Value *Val, Value *Index,
1717 const Twine &Name,
1718 InsertPosition InsertBef)
1719 : Instruction(cast<VectorType>(Val->getType())->getElementType(),
1720 ExtractElement, AllocMarker, InsertBef) {
1721 assert(isValidOperands(Val, Index) &&
1722 "Invalid extractelement instruction operands!");
1723 Op<0>() = Val;
1724 Op<1>() = Index;
1725 setName(Name);
1726}
1727
1728bool ExtractElementInst::isValidOperands(const Value *Val, const Value *Index) {
1729 if (!Val->getType()->isVectorTy() || !Index->getType()->isIntegerTy())
1730 return false;
1731 return true;
1732}
1733
1734//===----------------------------------------------------------------------===//
1735// InsertElementInst Implementation
1736//===----------------------------------------------------------------------===//
1737
1738InsertElementInst::InsertElementInst(Value *Vec, Value *Elt, Value *Index,
1739 const Twine &Name,
1740 InsertPosition InsertBef)
1741 : Instruction(Vec->getType(), InsertElement, AllocMarker, InsertBef) {
1742 assert(isValidOperands(Vec, Elt, Index) &&
1743 "Invalid insertelement instruction operands!");
1744 Op<0>() = Vec;
1745 Op<1>() = Elt;
1746 Op<2>() = Index;
1747 setName(Name);
1748}
1749
1751 const Value *Index) {
1752 if (!Vec->getType()->isVectorTy())
1753 return false; // First operand of insertelement must be vector type.
1754
1755 if (Elt->getType() != cast<VectorType>(Vec->getType())->getElementType())
1756 return false;// Second operand of insertelement must be vector element type.
1757
1758 if (!Index->getType()->isIntegerTy())
1759 return false; // Third operand of insertelement must be an integer.
1760 return true;
1761}
1762
1763//===----------------------------------------------------------------------===//
1764// ShuffleVectorInst Implementation
1765//===----------------------------------------------------------------------===//
1766
1768 assert(V && "Cannot create placeholder of nullptr V");
1769 return PoisonValue::get(V->getType());
1770}
1771
1773 InsertPosition InsertBefore)
1775 InsertBefore) {}
1776
1778 const Twine &Name,
1779 InsertPosition InsertBefore)
1781 InsertBefore) {}
1782
1784 const Twine &Name,
1785 InsertPosition InsertBefore)
1786 : Instruction(
1787 VectorType::get(cast<VectorType>(V1->getType())->getElementType(),
1788 cast<VectorType>(Mask->getType())->getElementCount()),
1789 ShuffleVector, AllocMarker, InsertBefore) {
1790 assert(isValidOperands(V1, V2, Mask) &&
1791 "Invalid shuffle vector instruction operands!");
1792
1793 Op<0>() = V1;
1794 Op<1>() = V2;
1795 SmallVector<int, 16> MaskArr;
1796 getShuffleMask(cast<Constant>(Mask), MaskArr);
1797 setShuffleMask(MaskArr);
1798 setName(Name);
1799}
1800
1802 const Twine &Name,
1803 InsertPosition InsertBefore)
1804 : Instruction(
1805 VectorType::get(cast<VectorType>(V1->getType())->getElementType(),
1806 Mask.size(), isa<ScalableVectorType>(V1->getType())),
1807 ShuffleVector, AllocMarker, InsertBefore) {
1808 assert(isValidOperands(V1, V2, Mask) &&
1809 "Invalid shuffle vector instruction operands!");
1810 Op<0>() = V1;
1811 Op<1>() = V2;
1812 setShuffleMask(Mask);
1813 setName(Name);
1814}
1815
1817 int NumOpElts = cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
1818 int NumMaskElts = ShuffleMask.size();
1819 SmallVector<int, 16> NewMask(NumMaskElts);
1820 for (int i = 0; i != NumMaskElts; ++i) {
1821 int MaskElt = getMaskValue(i);
1822 if (MaskElt == PoisonMaskElem) {
1823 NewMask[i] = PoisonMaskElem;
1824 continue;
1825 }
1826 assert(MaskElt >= 0 && MaskElt < 2 * NumOpElts && "Out-of-range mask");
1827 MaskElt = (MaskElt < NumOpElts) ? MaskElt + NumOpElts : MaskElt - NumOpElts;
1828 NewMask[i] = MaskElt;
1829 }
1830 setShuffleMask(NewMask);
1831 Op<0>().swap(Op<1>());
1832}
1833
1835 ArrayRef<int> Mask) {
1836 // V1 and V2 must be vectors of the same type.
1837 if (!isa<VectorType>(V1->getType()) || V1->getType() != V2->getType())
1838 return false;
1839
1840 // Make sure the mask elements make sense.
1841 int V1Size =
1842 cast<VectorType>(V1->getType())->getElementCount().getKnownMinValue();
1843 for (int Elem : Mask)
1844 if (Elem != PoisonMaskElem && Elem >= V1Size * 2)
1845 return false;
1846
1847 if (isa<ScalableVectorType>(V1->getType()))
1848 if ((Mask[0] != 0 && Mask[0] != PoisonMaskElem) || !all_equal(Mask))
1849 return false;
1850
1851 return true;
1852}
1853
1855 const Value *Mask) {
1856 // V1 and V2 must be vectors of the same type.
1857 if (!V1->getType()->isVectorTy() || V1->getType() != V2->getType())
1858 return false;
1859
1860 // Mask must be vector of i32, and must be the same kind of vector as the
1861 // input vectors
1862 auto *MaskTy = dyn_cast<VectorType>(Mask->getType());
1863 if (!MaskTy || !MaskTy->getElementType()->isIntegerTy(32) ||
1864 isa<ScalableVectorType>(MaskTy) != isa<ScalableVectorType>(V1->getType()))
1865 return false;
1866
1867 // Check to see if Mask is valid.
1869 return true;
1870
1871 // NOTE: Through vector ConstantInt we have the potential to support more
1872 // than just zero splat masks but that requires a LangRef change.
1873 if (isa<ScalableVectorType>(MaskTy))
1874 return false;
1875
1876 unsigned V1Size = cast<FixedVectorType>(V1->getType())->getNumElements();
1877
1878 if (const auto *CI = dyn_cast<ConstantInt>(Mask))
1879 return !CI->uge(V1Size * 2);
1880
1881 if (const auto *MV = dyn_cast<ConstantVector>(Mask)) {
1882 for (Value *Op : MV->operands()) {
1883 if (auto *CI = dyn_cast<ConstantInt>(Op)) {
1884 if (CI->uge(V1Size*2))
1885 return false;
1886 } else if (!isa<UndefValue>(Op)) {
1887 return false;
1888 }
1889 }
1890 return true;
1891 }
1892
1893 if (const auto *CDS = dyn_cast<ConstantDataSequential>(Mask)) {
1894 for (unsigned i = 0, e = cast<FixedVectorType>(MaskTy)->getNumElements();
1895 i != e; ++i)
1896 if (CDS->getElementAsInteger(i) >= V1Size*2)
1897 return false;
1898 return true;
1899 }
1900
1901 return false;
1902}
1903
1905 SmallVectorImpl<int> &Result) {
1906 ElementCount EC = cast<VectorType>(Mask->getType())->getElementCount();
1907
1908 if (isa<ConstantAggregateZero>(Mask) || isa<UndefValue>(Mask)) {
1909 int MaskVal = isa<UndefValue>(Mask) ? -1 : 0;
1910 Result.append(EC.getKnownMinValue(), MaskVal);
1911 return;
1912 }
1913
1914 assert(!EC.isScalable() &&
1915 "Scalable vector shuffle mask must be undef or zeroinitializer");
1916
1917 unsigned NumElts = EC.getFixedValue();
1918
1919 Result.reserve(NumElts);
1920
1921 if (auto *CDS = dyn_cast<ConstantDataSequential>(Mask)) {
1922 for (unsigned i = 0; i != NumElts; ++i)
1923 Result.push_back(CDS->getElementAsInteger(i));
1924 return;
1925 }
1926 for (unsigned i = 0; i != NumElts; ++i) {
1927 Constant *C = Mask->getAggregateElement(i);
1928 Result.push_back(isa<UndefValue>(C) ? -1 :
1929 cast<ConstantInt>(C)->getZExtValue());
1930 }
1931}
1932
1934 ShuffleMask.assign(Mask.begin(), Mask.end());
1935 ShuffleMaskForBitcode = convertShuffleMaskForBitcode(Mask, getType());
1936}
1937
1939 Type *ResultTy) {
1940 Type *Int32Ty = Type::getInt32Ty(ResultTy->getContext());
1941 if (isa<ScalableVectorType>(ResultTy)) {
1942 assert(all_equal(Mask) && "Unexpected shuffle");
1943 Type *VecTy = VectorType::get(Int32Ty, Mask.size(), true);
1944 if (Mask[0] == 0)
1945 return Constant::getNullValue(VecTy);
1946 return PoisonValue::get(VecTy);
1947 }
1949 for (int Elem : Mask) {
1950 if (Elem == PoisonMaskElem)
1951 MaskConst.push_back(PoisonValue::get(Int32Ty));
1952 else
1953 MaskConst.push_back(ConstantInt::get(Int32Ty, Elem));
1954 }
1955 return ConstantVector::get(MaskConst);
1956}
1957
1958static bool isSingleSourceMaskImpl(ArrayRef<int> Mask, int NumOpElts) {
1959 assert(!Mask.empty() && "Shuffle mask must contain elements");
1960 bool UsesLHS = false;
1961 bool UsesRHS = false;
1962 for (int I : Mask) {
1963 if (I == -1)
1964 continue;
1965 assert(I >= 0 && I < (NumOpElts * 2) &&
1966 "Out-of-bounds shuffle mask element");
1967 UsesLHS |= (I < NumOpElts);
1968 UsesRHS |= (I >= NumOpElts);
1969 if (UsesLHS && UsesRHS)
1970 return false;
1971 }
1972 // Allow for degenerate case: completely undef mask means neither source is used.
1973 return UsesLHS || UsesRHS;
1974}
1975
1977 // We don't have vector operand size information, so assume operands are the
1978 // same size as the mask.
1979 return isSingleSourceMaskImpl(Mask, NumSrcElts);
1980}
1981
1982static bool isIdentityMaskImpl(ArrayRef<int> Mask, int NumOpElts) {
1983 if (!isSingleSourceMaskImpl(Mask, NumOpElts))
1984 return false;
1985 for (int i = 0, NumMaskElts = Mask.size(); i < NumMaskElts; ++i) {
1986 if (Mask[i] == -1)
1987 continue;
1988 if (Mask[i] != i && Mask[i] != (NumOpElts + i))
1989 return false;
1990 }
1991 return true;
1992}
1993
1995 if (Mask.size() != static_cast<unsigned>(NumSrcElts))
1996 return false;
1997 // We don't have vector operand size information, so assume operands are the
1998 // same size as the mask.
1999 return isIdentityMaskImpl(Mask, NumSrcElts);
2000}
2001
2003 if (Mask.size() != static_cast<unsigned>(NumSrcElts))
2004 return false;
2005 if (!isSingleSourceMask(Mask, NumSrcElts))
2006 return false;
2007
2008 // The number of elements in the mask must be at least 2.
2009 if (NumSrcElts < 2)
2010 return false;
2011
2012 for (int I = 0, E = Mask.size(); I < E; ++I) {
2013 if (Mask[I] == -1)
2014 continue;
2015 if (Mask[I] != (NumSrcElts - 1 - I) &&
2016 Mask[I] != (NumSrcElts + NumSrcElts - 1 - I))
2017 return false;
2018 }
2019 return true;
2020}
2021
2023 if (Mask.size() != static_cast<unsigned>(NumSrcElts))
2024 return false;
2025 if (!isSingleSourceMask(Mask, NumSrcElts))
2026 return false;
2027 for (int I = 0, E = Mask.size(); I < E; ++I) {
2028 if (Mask[I] == -1)
2029 continue;
2030 if (Mask[I] != 0 && Mask[I] != NumSrcElts)
2031 return false;
2032 }
2033 return true;
2034}
2035
2037 if (Mask.size() != static_cast<unsigned>(NumSrcElts))
2038 return false;
2039 // Select is differentiated from identity. It requires using both sources.
2040 if (isSingleSourceMask(Mask, NumSrcElts))
2041 return false;
2042 for (int I = 0, E = Mask.size(); I < E; ++I) {
2043 if (Mask[I] == -1)
2044 continue;
2045 if (Mask[I] != I && Mask[I] != (NumSrcElts + I))
2046 return false;
2047 }
2048 return true;
2049}
2050
2052 // Example masks that will return true:
2053 // v1 = <a, b, c, d>
2054 // v2 = <e, f, g, h>
2055 // trn1 = shufflevector v1, v2 <0, 4, 2, 6> = <a, e, c, g>
2056 // trn2 = shufflevector v1, v2 <1, 5, 3, 7> = <b, f, d, h>
2057
2058 if (Mask.size() != static_cast<unsigned>(NumSrcElts))
2059 return false;
2060 // 1. The number of elements in the mask must be a power-of-2 and at least 2.
2061 int Sz = Mask.size();
2062 if (Sz < 2 || !isPowerOf2_32(Sz))
2063 return false;
2064
2065 // 2. The first element of the mask must be either a 0 or a 1.
2066 if (Mask[0] != 0 && Mask[0] != 1)
2067 return false;
2068
2069 // 3. The difference between the first 2 elements must be equal to the
2070 // number of elements in the mask.
2071 if ((Mask[1] - Mask[0]) != NumSrcElts)
2072 return false;
2073
2074 // 4. The difference between consecutive even-numbered and odd-numbered
2075 // elements must be equal to 2.
2076 for (int I = 2; I < Sz; ++I) {
2077 int MaskEltVal = Mask[I];
2078 if (MaskEltVal == -1)
2079 return false;
2080 int MaskEltPrevVal = Mask[I - 2];
2081 if (MaskEltVal - MaskEltPrevVal != 2)
2082 return false;
2083 }
2084 return true;
2085}
2086
2088 int &Index) {
2089 if (Mask.size() != static_cast<unsigned>(NumSrcElts))
2090 return false;
2091 // Example: shufflevector <4 x n> A, <4 x n> B, <1,2,3,4>
2092 int StartIndex = -1;
2093 for (int I = 0, E = Mask.size(); I != E; ++I) {
2094 int MaskEltVal = Mask[I];
2095 if (MaskEltVal == -1)
2096 continue;
2097
2098 if (StartIndex == -1) {
2099 // Don't support a StartIndex that begins in the second input, or if the
2100 // first non-undef index would access below the StartIndex.
2101 if (MaskEltVal < I || NumSrcElts <= (MaskEltVal - I))
2102 return false;
2103
2104 StartIndex = MaskEltVal - I;
2105 continue;
2106 }
2107
2108 // Splice is sequential starting from StartIndex.
2109 if (MaskEltVal != (StartIndex + I))
2110 return false;
2111 }
2112
2113 if (StartIndex == -1)
2114 return false;
2115
2116 // NOTE: This accepts StartIndex == 0 (COPY).
2117 Index = StartIndex;
2118 return true;
2119}
2120
2122 int NumSrcElts, int &Index) {
2123 // Must extract from a single source.
2124 if (!isSingleSourceMaskImpl(Mask, NumSrcElts))
2125 return false;
2126
2127 // Must be smaller (else this is an Identity shuffle).
2128 if (NumSrcElts <= (int)Mask.size())
2129 return false;
2130
2131 // Find start of extraction, accounting that we may start with an UNDEF.
2132 int SubIndex = -1;
2133 for (int i = 0, e = Mask.size(); i != e; ++i) {
2134 int M = Mask[i];
2135 if (M < 0)
2136 continue;
2137 int Offset = (M % NumSrcElts) - i;
2138 if (0 <= SubIndex && SubIndex != Offset)
2139 return false;
2140 SubIndex = Offset;
2141 }
2142
2143 if (0 <= SubIndex && SubIndex + (int)Mask.size() <= NumSrcElts) {
2144 Index = SubIndex;
2145 return true;
2146 }
2147 return false;
2148}
2149
2151 int NumSrcElts, int &NumSubElts,
2152 int &Index) {
2153 int NumMaskElts = Mask.size();
2154
2155 // Don't try to match if we're shuffling to a smaller size.
2156 if (NumMaskElts < NumSrcElts)
2157 return false;
2158
2159 // TODO: We don't recognize self-insertion/widening.
2160 if (isSingleSourceMaskImpl(Mask, NumSrcElts))
2161 return false;
2162
2163 // Determine which mask elements are attributed to which source.
2164 APInt UndefElts = APInt::getZero(NumMaskElts);
2165 APInt Src0Elts = APInt::getZero(NumMaskElts);
2166 APInt Src1Elts = APInt::getZero(NumMaskElts);
2167 bool Src0Identity = true;
2168 bool Src1Identity = true;
2169
2170 for (int i = 0; i != NumMaskElts; ++i) {
2171 int M = Mask[i];
2172 if (M < 0) {
2173 UndefElts.setBit(i);
2174 continue;
2175 }
2176 if (M < NumSrcElts) {
2177 Src0Elts.setBit(i);
2178 Src0Identity &= (M == i);
2179 continue;
2180 }
2181 Src1Elts.setBit(i);
2182 Src1Identity &= (M == (i + NumSrcElts));
2183 }
2184 assert((Src0Elts | Src1Elts | UndefElts).isAllOnes() &&
2185 "unknown shuffle elements");
2186 assert(!Src0Elts.isZero() && !Src1Elts.isZero() &&
2187 "2-source shuffle not found");
2188
2189 // Determine lo/hi span ranges.
2190 // TODO: How should we handle undefs at the start of subvector insertions?
2191 int Src0Lo = Src0Elts.countr_zero();
2192 int Src1Lo = Src1Elts.countr_zero();
2193 int Src0Hi = NumMaskElts - Src0Elts.countl_zero();
2194 int Src1Hi = NumMaskElts - Src1Elts.countl_zero();
2195
2196 // If src0 is in place, see if the src1 elements is inplace within its own
2197 // span.
2198 if (Src0Identity) {
2199 int NumSub1Elts = Src1Hi - Src1Lo;
2200 ArrayRef<int> Sub1Mask = Mask.slice(Src1Lo, NumSub1Elts);
2201 if (isIdentityMaskImpl(Sub1Mask, NumSrcElts)) {
2202 NumSubElts = NumSub1Elts;
2203 Index = Src1Lo;
2204 return true;
2205 }
2206 }
2207
2208 // If src1 is in place, see if the src0 elements is inplace within its own
2209 // span.
2210 if (Src1Identity) {
2211 int NumSub0Elts = Src0Hi - Src0Lo;
2212 ArrayRef<int> Sub0Mask = Mask.slice(Src0Lo, NumSub0Elts);
2213 if (isIdentityMaskImpl(Sub0Mask, NumSrcElts)) {
2214 NumSubElts = NumSub0Elts;
2215 Index = Src0Lo;
2216 return true;
2217 }
2218 }
2219
2220 return false;
2221}
2222
2224 // FIXME: Not currently possible to express a shuffle mask for a scalable
2225 // vector for this case.
2227 return false;
2228
2229 int NumOpElts = cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
2230 int NumMaskElts = cast<FixedVectorType>(getType())->getNumElements();
2231 if (NumMaskElts <= NumOpElts)
2232 return false;
2233
2234 // The first part of the mask must choose elements from exactly 1 source op.
2236 if (!isIdentityMaskImpl(Mask, NumOpElts))
2237 return false;
2238
2239 // All extending must be with undef elements.
2240 for (int i = NumOpElts; i < NumMaskElts; ++i)
2241 if (Mask[i] != -1)
2242 return false;
2243
2244 return true;
2245}
2246
2248 // FIXME: Not currently possible to express a shuffle mask for a scalable
2249 // vector for this case.
2251 return false;
2252
2253 int NumOpElts = cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
2254 int NumMaskElts = cast<FixedVectorType>(getType())->getNumElements();
2255 if (NumMaskElts >= NumOpElts)
2256 return false;
2257
2258 return isIdentityMaskImpl(getShuffleMask(), NumOpElts);
2259}
2260
2262 // Vector concatenation is differentiated from identity with padding.
2264 return false;
2265
2266 // FIXME: Not currently possible to express a shuffle mask for a scalable
2267 // vector for this case.
2269 return false;
2270
2271 int NumOpElts = cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
2272 int NumMaskElts = cast<FixedVectorType>(getType())->getNumElements();
2273 if (NumMaskElts != NumOpElts * 2)
2274 return false;
2275
2276 // Use the mask length rather than the operands' vector lengths here. We
2277 // already know that the shuffle returns a vector twice as long as the inputs,
2278 // and neither of the inputs are undef vectors. If the mask picks consecutive
2279 // elements from both inputs, then this is a concatenation of the inputs.
2280 return isIdentityMaskImpl(getShuffleMask(), NumMaskElts);
2281}
2282
2284 int ReplicationFactor, int VF) {
2285 assert(Mask.size() == (unsigned)ReplicationFactor * VF &&
2286 "Unexpected mask size.");
2287
2288 for (int CurrElt : seq(VF)) {
2289 ArrayRef<int> CurrSubMask = Mask.take_front(ReplicationFactor);
2290 assert(CurrSubMask.size() == (unsigned)ReplicationFactor &&
2291 "Run out of mask?");
2292 Mask = Mask.drop_front(ReplicationFactor);
2293 if (!all_of(CurrSubMask, [CurrElt](int MaskElt) {
2294 return MaskElt == PoisonMaskElem || MaskElt == CurrElt;
2295 }))
2296 return false;
2297 }
2298 assert(Mask.empty() && "Did not consume the whole mask?");
2299
2300 return true;
2301}
2302
2304 int &ReplicationFactor, int &VF) {
2305 // undef-less case is trivial.
2306 if (!llvm::is_contained(Mask, PoisonMaskElem)) {
2307 ReplicationFactor =
2308 Mask.take_while([](int MaskElt) { return MaskElt == 0; }).size();
2309 if (ReplicationFactor == 0 || Mask.size() % ReplicationFactor != 0)
2310 return false;
2311 VF = Mask.size() / ReplicationFactor;
2312 return isReplicationMaskWithParams(Mask, ReplicationFactor, VF);
2313 }
2314
2315 // However, if the mask contains undef's, we have to enumerate possible tuples
2316 // and pick one. There are bounds on replication factor: [1, mask size]
2317 // (where RF=1 is an identity shuffle, RF=mask size is a broadcast shuffle)
2318 // Additionally, mask size is a replication factor multiplied by vector size,
2319 // which further significantly reduces the search space.
2320
2321 // Before doing that, let's perform basic correctness checking first.
2322 int Largest = -1;
2323 for (int MaskElt : Mask) {
2324 if (MaskElt == PoisonMaskElem)
2325 continue;
2326 // Elements must be in non-decreasing order.
2327 if (MaskElt < Largest)
2328 return false;
2329 Largest = std::max(Largest, MaskElt);
2330 }
2331
2332 // Prefer larger replication factor if all else equal.
2333 for (int PossibleReplicationFactor :
2334 reverse(seq_inclusive<unsigned>(1, Mask.size()))) {
2335 if (Mask.size() % PossibleReplicationFactor != 0)
2336 continue;
2337 int PossibleVF = Mask.size() / PossibleReplicationFactor;
2338 if (!isReplicationMaskWithParams(Mask, PossibleReplicationFactor,
2339 PossibleVF))
2340 continue;
2341 ReplicationFactor = PossibleReplicationFactor;
2342 VF = PossibleVF;
2343 return true;
2344 }
2345
2346 return false;
2347}
2348
2349bool ShuffleVectorInst::isReplicationMask(int &ReplicationFactor,
2350 int &VF) const {
2351 // Not possible to express a shuffle mask for a scalable vector for this
2352 // case.
2354 return false;
2355
2356 VF = cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
2357 if (ShuffleMask.size() % VF != 0)
2358 return false;
2359 ReplicationFactor = ShuffleMask.size() / VF;
2360
2361 return isReplicationMaskWithParams(ShuffleMask, ReplicationFactor, VF);
2362}
2363
2365 if (VF <= 0 || Mask.size() < static_cast<unsigned>(VF) ||
2366 Mask.size() % VF != 0)
2367 return false;
2368 for (unsigned K = 0, Sz = Mask.size(); K < Sz; K += VF) {
2369 ArrayRef<int> SubMask = Mask.slice(K, VF);
2370 if (all_of(SubMask, equal_to(PoisonMaskElem)))
2371 continue;
2372 SmallBitVector Used(VF, false);
2373 for (int Idx : SubMask) {
2374 if (Idx != PoisonMaskElem && Idx < VF)
2375 Used.set(Idx);
2376 }
2377 if (!Used.all())
2378 return false;
2379 }
2380 return true;
2381}
2382
2383/// Return true if this shuffle mask is a replication mask.
2385 // Not possible to express a shuffle mask for a scalable vector for this
2386 // case.
2388 return false;
2389 if (!isSingleSourceMask(ShuffleMask, VF))
2390 return false;
2391
2392 return isOneUseSingleSourceMask(ShuffleMask, VF);
2393}
2394
2395bool ShuffleVectorInst::isInterleave(unsigned Factor) {
2397 // shuffle_vector can only interleave fixed length vectors - for scalable
2398 // vectors, see the @llvm.vector.interleave2 intrinsic
2399 if (!OpTy)
2400 return false;
2401 unsigned OpNumElts = OpTy->getNumElements();
2402
2403 return isInterleaveMask(ShuffleMask, Factor, OpNumElts * 2);
2404}
2405
2407 ArrayRef<int> Mask, unsigned Factor, unsigned NumInputElts,
2408 SmallVectorImpl<unsigned> &StartIndexes) {
2409 unsigned NumElts = Mask.size();
2410 if (NumElts % Factor)
2411 return false;
2412
2413 unsigned LaneLen = NumElts / Factor;
2414 if (!isPowerOf2_32(LaneLen))
2415 return false;
2416
2417 StartIndexes.resize(Factor);
2418
2419 // Check whether each element matches the general interleaved rule.
2420 // Ignore undef elements, as long as the defined elements match the rule.
2421 // Outer loop processes all factors (x, y, z in the above example)
2422 unsigned I = 0, J;
2423 for (; I < Factor; I++) {
2424 unsigned SavedLaneValue;
2425 unsigned SavedNoUndefs = 0;
2426
2427 // Inner loop processes consecutive accesses (x, x+1... in the example)
2428 for (J = 0; J < LaneLen - 1; J++) {
2429 // Lane computes x's position in the Mask
2430 unsigned Lane = J * Factor + I;
2431 unsigned NextLane = Lane + Factor;
2432 int LaneValue = Mask[Lane];
2433 int NextLaneValue = Mask[NextLane];
2434
2435 // If both are defined, values must be sequential
2436 if (LaneValue >= 0 && NextLaneValue >= 0 &&
2437 LaneValue + 1 != NextLaneValue)
2438 break;
2439
2440 // If the next value is undef, save the current one as reference
2441 if (LaneValue >= 0 && NextLaneValue < 0) {
2442 SavedLaneValue = LaneValue;
2443 SavedNoUndefs = 1;
2444 }
2445
2446 // Undefs are allowed, but defined elements must still be consecutive:
2447 // i.e.: x,..., undef,..., x + 2,..., undef,..., undef,..., x + 5, ....
2448 // Verify this by storing the last non-undef followed by an undef
2449 // Check that following non-undef masks are incremented with the
2450 // corresponding distance.
2451 if (SavedNoUndefs > 0 && LaneValue < 0) {
2452 SavedNoUndefs++;
2453 if (NextLaneValue >= 0 &&
2454 SavedLaneValue + SavedNoUndefs != (unsigned)NextLaneValue)
2455 break;
2456 }
2457 }
2458
2459 if (J < LaneLen - 1)
2460 return false;
2461
2462 int StartMask = 0;
2463 if (Mask[I] >= 0) {
2464 // Check that the start of the I range (J=0) is greater than 0
2465 StartMask = Mask[I];
2466 } else if (Mask[(LaneLen - 1) * Factor + I] >= 0) {
2467 // StartMask defined by the last value in lane
2468 StartMask = Mask[(LaneLen - 1) * Factor + I] - J;
2469 } else if (SavedNoUndefs > 0) {
2470 // StartMask defined by some non-zero value in the j loop
2471 StartMask = SavedLaneValue - (LaneLen - 1 - SavedNoUndefs);
2472 }
2473 // else StartMask remains set to 0, i.e. all elements are undefs
2474
2475 if (StartMask < 0)
2476 return false;
2477 // We must stay within the vectors; This case can happen with undefs.
2478 if (StartMask + LaneLen > NumInputElts)
2479 return false;
2480
2481 StartIndexes[I] = StartMask;
2482 }
2483
2484 return true;
2485}
2486
2487/// Check if the mask is a DE-interleave mask of the given factor
2488/// \p Factor like:
2489/// <Index, Index+Factor, ..., Index+(NumElts-1)*Factor>
2491 unsigned Factor,
2492 unsigned &Index) {
2493 // Check all potential start indices from 0 to (Factor - 1).
2494 for (unsigned Idx = 0; Idx < Factor; Idx++) {
2495 unsigned I = 0;
2496
2497 // Check that elements are in ascending order by Factor. Ignore undef
2498 // elements.
2499 for (; I < Mask.size(); I++)
2500 if (Mask[I] >= 0 && static_cast<unsigned>(Mask[I]) != Idx + I * Factor)
2501 break;
2502
2503 if (I == Mask.size()) {
2504 Index = Idx;
2505 return true;
2506 }
2507 }
2508
2509 return false;
2510}
2511
2512/// Try to lower a vector shuffle as a bit rotation.
2513///
2514/// Look for a repeated rotation pattern in each sub group.
2515/// Returns an element-wise left bit rotation amount or -1 if failed.
2516static int matchShuffleAsBitRotate(ArrayRef<int> Mask, int NumSubElts) {
2517 int NumElts = Mask.size();
2518 assert((NumElts % NumSubElts) == 0 && "Illegal shuffle mask");
2519
2520 int RotateAmt = -1;
2521 for (int i = 0; i != NumElts; i += NumSubElts) {
2522 for (int j = 0; j != NumSubElts; ++j) {
2523 int M = Mask[i + j];
2524 if (M < 0)
2525 continue;
2526 if (M < i || M >= i + NumSubElts)
2527 return -1;
2528 int Offset = (NumSubElts - (M - (i + j))) % NumSubElts;
2529 if (0 <= RotateAmt && Offset != RotateAmt)
2530 return -1;
2531 RotateAmt = Offset;
2532 }
2533 }
2534 return RotateAmt;
2535}
2536
2538 ArrayRef<int> Mask, unsigned EltSizeInBits, unsigned MinSubElts,
2539 unsigned MaxSubElts, unsigned &NumSubElts, unsigned &RotateAmt) {
2540 for (NumSubElts = MinSubElts; NumSubElts <= MaxSubElts; NumSubElts *= 2) {
2541 int EltRotateAmt = matchShuffleAsBitRotate(Mask, NumSubElts);
2542 if (EltRotateAmt < 0)
2543 continue;
2544 RotateAmt = EltRotateAmt * EltSizeInBits;
2545 return true;
2546 }
2547
2548 return false;
2549}
2550
2551//===----------------------------------------------------------------------===//
2552// InsertValueInst Class
2553//===----------------------------------------------------------------------===//
2554
2555void InsertValueInst::init(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
2556 const Twine &Name) {
2557 assert(getNumOperands() == 2 && "NumOperands not initialized?");
2558
2559 // There's no fundamental reason why we require at least one index
2560 // (other than weirdness with &*IdxBegin being invalid; see
2561 // getelementptr's init routine for example). But there's no
2562 // present need to support it.
2563 assert(!Idxs.empty() && "InsertValueInst must have at least one index");
2564
2566 Val->getType() && "Inserted value must match indexed type!");
2567 Op<0>() = Agg;
2568 Op<1>() = Val;
2569
2570 Indices.append(Idxs.begin(), Idxs.end());
2571 setName(Name);
2572}
2573
2574InsertValueInst::InsertValueInst(const InsertValueInst &IVI)
2575 : Instruction(IVI.getType(), InsertValue, AllocMarker),
2576 Indices(IVI.Indices) {
2577 Op<0>() = IVI.getOperand(0);
2578 Op<1>() = IVI.getOperand(1);
2580}
2581
2582//===----------------------------------------------------------------------===//
2583// ExtractValueInst Class
2584//===----------------------------------------------------------------------===//
2585
2586void ExtractValueInst::init(ArrayRef<unsigned> Idxs, const Twine &Name) {
2587 assert(getNumOperands() == 1 && "NumOperands not initialized?");
2588
2589 // There's no fundamental reason why we require at least one index.
2590 // But there's no present need to support it.
2591 assert(!Idxs.empty() && "ExtractValueInst must have at least one index");
2592
2593 Indices.append(Idxs.begin(), Idxs.end());
2594 setName(Name);
2595}
2596
2597ExtractValueInst::ExtractValueInst(const ExtractValueInst &EVI)
2598 : UnaryInstruction(EVI.getType(), ExtractValue, EVI.getOperand(0),
2599 (BasicBlock *)nullptr),
2600 Indices(EVI.Indices) {
2602}
2603
2604// getIndexedType - Returns the type of the element that would be extracted
2605// with an extractvalue instruction with the specified parameters.
2606//
2607// A null type is returned if the indices are invalid for the specified
2608// pointer type.
2609//
2611 ArrayRef<unsigned> Idxs) {
2612 for (unsigned Index : Idxs) {
2613 // We can't use CompositeType::indexValid(Index) here.
2614 // indexValid() always returns true for arrays because getelementptr allows
2615 // out-of-bounds indices. Since we don't allow those for extractvalue and
2616 // insertvalue we need to check array indexing manually.
2617 // Since the only other types we can index into are struct types it's just
2618 // as easy to check those manually as well.
2619 if (ArrayType *AT = dyn_cast<ArrayType>(Agg)) {
2620 if (Index >= AT->getNumElements())
2621 return nullptr;
2622 Agg = AT->getElementType();
2623 } else if (StructType *ST = dyn_cast<StructType>(Agg)) {
2624 if (Index >= ST->getNumElements())
2625 return nullptr;
2626 Agg = ST->getElementType(Index);
2627 } else {
2628 // Not a valid type to index into.
2629 return nullptr;
2630 }
2631 }
2632 return Agg;
2633}
2634
2635//===----------------------------------------------------------------------===//
2636// BitInsert Class
2637//===----------------------------------------------------------------------===//
2638BitInsertInst::BitInsertInst(Value *Base, Value *Val, Value *Offset,
2639 const Twine &Name, InsertPosition InsertBef)
2640 : Instruction(Base->getType(), BitInsert, AllocMarker, InsertBef) {
2641 assert(!areInvalidOperands(Base, Val, Offset) &&
2642 "Invalid bitinsert instruction operands!");
2643 Op<0>() = Base;
2644 Op<1>() = Val;
2645 Op<2>() = Offset;
2646 setName(Name);
2647}
2648
2650 Value *Offset) {
2651 if (!Base->getType()->isByteTy())
2652 return "bitinsert base must be a byte type";
2653 if (!(Val->getType()->isFloatingPointTy() || Val->getType()->isIntegerTy() ||
2654 Val->getType()->isPointerTy() || Val->getType()->isByteTy()))
2655 return "bitinsert value must be an integer, floating-point, pointer, or "
2656 "byte type";
2657 if (!Offset->getType()->isIntegerTy(32))
2658 return "bitinsert offset must be i32";
2659 return nullptr;
2660}
2661
2662//===----------------------------------------------------------------------===//
2663// BitExtract Class
2664//===----------------------------------------------------------------------===//
2665BitExtractInst::BitExtractInst(Type *Ty, Value *Src, Value *Offset,
2666 const Twine &Name, InsertPosition InsertBef)
2667 : Instruction(Ty, BitExtract, AllocMarker, InsertBef) {
2668 assert(!areInvalidOperands(Ty, Src, Offset) &&
2669 "Invalid bitextract instruction operands!");
2670 Op<0>() = Src;
2671 Op<1>() = Offset;
2672 setName(Name);
2673}
2674
2676 Value *Offset) {
2677 if (!(Ty->isFloatingPointTy() || Ty->isIntegerTy() || Ty->isPointerTy() ||
2678 Ty->isByteTy()))
2679 return "bitextract result must be an integer, floating-point, pointer, or "
2680 "byte type";
2681 if (!Src->getType()->isByteTy())
2682 return "bitextract source must be a byte type";
2683 if (!Offset->getType()->isIntegerTy(32))
2684 return "bitextract offset must be i32";
2685 return nullptr;
2686}
2687
2688//===----------------------------------------------------------------------===//
2689// UnaryOperator Class
2690//===----------------------------------------------------------------------===//
2691
2693 const Twine &Name, InsertPosition InsertBefore)
2694 : UnaryInstruction(Ty, iType, S, InsertBefore) {
2695 Op<0>() = S;
2696 setName(Name);
2697 AssertOK();
2698}
2699
2701 InsertPosition InsertBefore) {
2702 switch (Op) {
2703 case UnaryOps::FNeg:
2704 return new FPUnaryOperator(Op, S, S->getType(), Name, InsertBefore);
2705 default:
2706 return new UnaryOperator(Op, S, S->getType(), Name, InsertBefore);
2707 }
2708}
2709
2710void UnaryOperator::AssertOK() {
2711 Value *LHS = getOperand(0);
2712 (void)LHS; // Silence warnings.
2713#ifndef NDEBUG
2714 switch (getOpcode()) {
2715 case FNeg:
2716 assert(getType() == LHS->getType() &&
2717 "Unary operation should return same type as operand!");
2718 assert(getType()->isFPOrFPVectorTy() &&
2719 "Tried to create a floating-point operation on a "
2720 "non-floating-point type!");
2721 break;
2722 default: llvm_unreachable("Invalid opcode provided");
2723 }
2724#endif
2725}
2726
2727//===----------------------------------------------------------------------===//
2728// BinaryOperator Class
2729//===----------------------------------------------------------------------===//
2730
2732 const Twine &Name, InsertPosition InsertBefore)
2733 : Instruction(Ty, iType, AllocMarker, InsertBefore) {
2734 Op<0>() = S1;
2735 Op<1>() = S2;
2736 setName(Name);
2737 AssertOK();
2738}
2739
2740void BinaryOperator::AssertOK() {
2741 Value *LHS = getOperand(0), *RHS = getOperand(1);
2742 (void)LHS; (void)RHS; // Silence warnings.
2743 assert(LHS->getType() == RHS->getType() &&
2744 "Binary operator operand types must match!");
2745#ifndef NDEBUG
2746 switch (getOpcode()) {
2747 case Add: case Sub:
2748 case Mul:
2749 assert(getType() == LHS->getType() &&
2750 "Arithmetic operation should return same type as operands!");
2751 assert(getType()->isIntOrIntVectorTy() &&
2752 "Tried to create an integer operation on a non-integer type!");
2753 break;
2754 case FAdd: case FSub:
2755 case FMul:
2756 assert(getType() == LHS->getType() &&
2757 "Arithmetic operation should return same type as operands!");
2758 assert(getType()->isFPOrFPVectorTy() &&
2759 "Tried to create a floating-point operation on a "
2760 "non-floating-point type!");
2761 break;
2762 case UDiv:
2763 case SDiv:
2764 assert(getType() == LHS->getType() &&
2765 "Arithmetic operation should return same type as operands!");
2766 assert(getType()->isIntOrIntVectorTy() &&
2767 "Incorrect operand type (not integer) for S/UDIV");
2768 break;
2769 case FDiv:
2770 assert(getType() == LHS->getType() &&
2771 "Arithmetic operation should return same type as operands!");
2772 assert(getType()->isFPOrFPVectorTy() &&
2773 "Incorrect operand type (not floating point) for FDIV");
2774 break;
2775 case URem:
2776 case SRem:
2777 assert(getType() == LHS->getType() &&
2778 "Arithmetic operation should return same type as operands!");
2779 assert(getType()->isIntOrIntVectorTy() &&
2780 "Incorrect operand type (not integer) for S/UREM");
2781 break;
2782 case FRem:
2783 assert(getType() == LHS->getType() &&
2784 "Arithmetic operation should return same type as operands!");
2785 assert(getType()->isFPOrFPVectorTy() &&
2786 "Incorrect operand type (not floating point) for FREM");
2787 break;
2788 case Shl:
2789 case LShr:
2790 case AShr:
2791 assert(getType() == LHS->getType() &&
2792 "Shift operation should return same type as operands!");
2793 assert(getType()->isIntOrIntVectorTy() &&
2794 "Tried to create a shift operation on a non-integral type!");
2795 break;
2796 case And: case Or:
2797 case Xor:
2798 assert(getType() == LHS->getType() &&
2799 "Logical operation should return same type as operands!");
2800 assert(getType()->isIntOrIntVectorTy() &&
2801 "Tried to create a logical operation on a non-integral type!");
2802 break;
2803 default: llvm_unreachable("Invalid opcode provided");
2804 }
2805#endif
2806}
2807
2809 const Twine &Name,
2810 InsertPosition InsertBefore) {
2811 assert(S1->getType() == S2->getType() &&
2812 "Cannot create binary operator with two operands of differing type!");
2813 switch (Op) {
2814 case BinaryOps::FAdd:
2815 case BinaryOps::FSub:
2816 case BinaryOps::FMul:
2817 case BinaryOps::FDiv:
2818 case BinaryOps::FRem:
2819 return new FPBinaryOperator(Op, S1, S2, S1->getType(), Name, InsertBefore);
2820 default:
2821 return new BinaryOperator(Op, S1, S2, S1->getType(), Name, InsertBefore);
2822 }
2823}
2824
2826 InsertPosition InsertBefore) {
2827 Value *Zero = ConstantInt::get(Op->getType(), 0);
2828 return new BinaryOperator(Instruction::Sub, Zero, Op, Op->getType(), Name,
2829 InsertBefore);
2830}
2831
2833 InsertPosition InsertBefore) {
2834 Value *Zero = ConstantInt::get(Op->getType(), 0);
2835 return BinaryOperator::CreateNSWSub(Zero, Op, Name, InsertBefore);
2836}
2837
2839 InsertPosition InsertBefore) {
2840 Constant *C = Constant::getAllOnesValue(Op->getType());
2841 return new BinaryOperator(Instruction::Xor, Op, C,
2842 Op->getType(), Name, InsertBefore);
2843}
2844
2845// Exchange the two operands to this instruction. This instruction is safe to
2846// use on any binary instruction and does not modify the semantics of the
2847// instruction.
2849 if (!isCommutative())
2850 return true; // Can't commute operands
2851 Op<0>().swap(Op<1>());
2852 return false;
2853}
2854
2855//===----------------------------------------------------------------------===//
2856// FPMathOperator Class
2857//===----------------------------------------------------------------------===//
2858
2860 const MDNode *MD =
2861 cast<Instruction>(this)->getMetadata(LLVMContext::MD_fpmath);
2862 if (!MD)
2863 return 0.0;
2865 return Accuracy->getValueAPF().convertToFloat();
2866}
2867
2868//===----------------------------------------------------------------------===//
2869// CastInst Class
2870//===----------------------------------------------------------------------===//
2871
2872// Just determine if this cast only deals with integral->integral conversion.
2874 switch (getOpcode()) {
2875 default: return false;
2876 case Instruction::ZExt:
2877 case Instruction::SExt:
2878 case Instruction::Trunc:
2879 return true;
2880 case Instruction::BitCast:
2881 return getOperand(0)->getType()->isIntegerTy() &&
2882 getType()->isIntegerTy();
2883 }
2884}
2885
2886/// This function determines if the CastInst does not require any bits to be
2887/// changed in order to effect the cast. Essentially, it identifies cases where
2888/// no code gen is necessary for the cast, hence the name no-op cast. For
2889/// example, the following are all no-op casts:
2890/// # bitcast i32* %x to i8*
2891/// # bitcast <2 x i32> %x to <4 x i16>
2892/// # ptrtoint i32* %x to i32 ; on 32-bit plaforms only
2893/// Determine if the described cast is a no-op.
2895 Type *SrcTy,
2896 Type *DestTy,
2897 const DataLayout &DL) {
2898 assert(castIsValid(Opcode, SrcTy, DestTy) && "method precondition");
2899 switch (Opcode) {
2900 default: llvm_unreachable("Invalid CastOp");
2901 case Instruction::Trunc:
2902 case Instruction::ZExt:
2903 case Instruction::SExt:
2904 case Instruction::FPTrunc:
2905 case Instruction::FPExt:
2906 case Instruction::UIToFP:
2907 case Instruction::SIToFP:
2908 case Instruction::FPToUI:
2909 case Instruction::FPToSI:
2910 case Instruction::AddrSpaceCast:
2911 // TODO: Target informations may give a more accurate answer here.
2912 return false;
2913 case Instruction::BitCast:
2914 return true; // BitCast never modifies bits.
2915 case Instruction::PtrToAddr:
2916 case Instruction::PtrToInt:
2917 return DL.getIntPtrType(SrcTy)->getScalarSizeInBits() ==
2918 DestTy->getScalarSizeInBits();
2919 case Instruction::IntToPtr:
2920 return DL.getIntPtrType(DestTy)->getScalarSizeInBits() ==
2921 SrcTy->getScalarSizeInBits();
2922 }
2923}
2924
2926 return isNoopCast(getOpcode(), getOperand(0)->getType(), getType(), DL);
2927}
2928
2929/// This function determines if a pair of casts can be eliminated and what
2930/// opcode should be used in the elimination. This assumes that there are two
2931/// instructions like this:
2932/// * %F = firstOpcode SrcTy %x to MidTy
2933/// * %S = secondOpcode MidTy %F to DstTy
2934/// The function returns a resultOpcode so these two casts can be replaced with:
2935/// * %Replacement = resultOpcode %SrcTy %x to DstTy
2936/// If no such cast is permitted, the function returns 0.
2938 Instruction::CastOps secondOp,
2939 Type *SrcTy, Type *MidTy, Type *DstTy,
2940 const DataLayout *DL) {
2941 // Define the 144 possibilities for these two cast instructions. The values
2942 // in this matrix determine what to do in a given situation and select the
2943 // case in the switch below. The rows correspond to firstOp, the columns
2944 // correspond to secondOp. In looking at the table below, keep in mind
2945 // the following cast properties:
2946 //
2947 // Size Compare Source Destination
2948 // Operator Src ? Size Type Sign Type Sign
2949 // -------- ------------ ------------------- ---------------------
2950 // TRUNC > Integer Any Integral Any
2951 // ZEXT < Integral Unsigned Integer Any
2952 // SEXT < Integral Signed Integer Any
2953 // FPTOUI n/a FloatPt n/a Integral Unsigned
2954 // FPTOSI n/a FloatPt n/a Integral Signed
2955 // UITOFP n/a Integral Unsigned FloatPt n/a
2956 // SITOFP n/a Integral Signed FloatPt n/a
2957 // FPTRUNC > FloatPt n/a FloatPt n/a
2958 // FPEXT < FloatPt n/a FloatPt n/a
2959 // PTRTOINT n/a Pointer n/a Integral Unsigned
2960 // PTRTOADDR n/a Pointer n/a Integral Unsigned
2961 // INTTOPTR n/a Integral Unsigned Pointer n/a
2962 // BITCAST = FirstClass n/a FirstClass n/a
2963 // ADDRSPCST n/a Pointer n/a Pointer n/a
2964 //
2965 // NOTE: some transforms are safe, but we consider them to be non-profitable.
2966 // For example, we could merge "fptoui double to i32" + "zext i32 to i64",
2967 // into "fptoui double to i64", but this loses information about the range
2968 // of the produced value (we no longer know the top-part is all zeros).
2969 // Further this conversion is often much more expensive for typical hardware,
2970 // and causes issues when building libgcc. We disallow fptosi+sext for the
2971 // same reason.
2972 const unsigned numCastOps =
2973 Instruction::CastOpsEnd - Instruction::CastOpsBegin;
2974 // clang-format off
2975 static const uint8_t CastResults[numCastOps][numCastOps] = {
2976 // T F F U S F F P P I B A -+
2977 // R Z S P P I I T P 2 2 N T S |
2978 // U E E 2 2 2 2 R E I A T C C +- secondOp
2979 // N X X U S F F N X N D 2 V V |
2980 // C T T I I P P C T T R P T T -+
2981 { 1, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // Trunc -+
2982 { 8, 1, 9,99,99, 2,17,99,99,99,99, 2, 3, 0}, // ZExt |
2983 { 8, 0, 1,99,99, 0, 2,99,99,99,99, 0, 3, 0}, // SExt |
2984 { 0, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // FPToUI |
2985 { 0, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // FPToSI |
2986 { 99,99,99, 0, 0,99,99, 0, 0,99,99,99, 4, 0}, // UIToFP +- firstOp
2987 { 99,99,99, 0, 0,99,99, 0, 0,99,99,99, 4, 0}, // SIToFP |
2988 { 99,99,99, 0, 0,99,99, 0, 0,99,99,99, 4, 0}, // FPTrunc |
2989 { 99,99,99, 2, 2,99,99, 8, 2,99,99,99, 4, 0}, // FPExt |
2990 { 1, 0, 0,99,99, 0, 0,99,99,99,99, 7, 3, 0}, // PtrToInt |
2991 { 0, 0, 0,99,99, 0, 0,99,99,99,99, 0, 3, 0}, // PtrToAddr |
2992 { 99,99,99,99,99,99,99,99,99,11,11,99,15, 0}, // IntToPtr |
2993 { 5, 5, 5, 0, 0, 5, 5, 0, 0,16,16, 5, 1,14}, // BitCast |
2994 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,13,12}, // AddrSpaceCast -+
2995 };
2996 // clang-format on
2997
2998 // TODO: This logic could be encoded into the table above and handled in the
2999 // switch below.
3000 // If either of the casts are a bitcast from scalar to vector, disallow the
3001 // merging. However, any pair of bitcasts are allowed.
3002 bool IsFirstBitcast = (firstOp == Instruction::BitCast);
3003 bool IsSecondBitcast = (secondOp == Instruction::BitCast);
3004 bool AreBothBitcasts = IsFirstBitcast && IsSecondBitcast;
3005
3006 // Check if any of the casts convert scalars <-> vectors.
3007 if ((IsFirstBitcast && isa<VectorType>(SrcTy) != isa<VectorType>(MidTy)) ||
3008 (IsSecondBitcast && isa<VectorType>(MidTy) != isa<VectorType>(DstTy)))
3009 if (!AreBothBitcasts)
3010 return 0;
3011
3012 int ElimCase = CastResults[firstOp-Instruction::CastOpsBegin]
3013 [secondOp-Instruction::CastOpsBegin];
3014 switch (ElimCase) {
3015 case 0:
3016 // Categorically disallowed.
3017 return 0;
3018 case 1:
3019 // Allowed, use first cast's opcode.
3020 return firstOp;
3021 case 2:
3022 // Allowed, use second cast's opcode.
3023 return secondOp;
3024 case 3:
3025 // No-op cast in second op implies firstOp as long as the DestTy
3026 // is integer and we are not converting between a vector and a
3027 // non-vector type.
3028 if (!SrcTy->isVectorTy() && DstTy->isIntegerTy())
3029 return firstOp;
3030 return 0;
3031 case 4:
3032 // No-op cast in second op implies firstOp as long as the DestTy
3033 // matches MidTy.
3034 if (DstTy == MidTy)
3035 return firstOp;
3036 return 0;
3037 case 5:
3038 // No-op cast in first op implies secondOp as long as the SrcTy
3039 // is an integer.
3040 if (SrcTy->isIntegerTy())
3041 return secondOp;
3042 return 0;
3043 case 7: {
3044 // Disable inttoptr/ptrtoint optimization if enabled.
3045 if (DisableI2pP2iOpt)
3046 return 0;
3047
3048 // Cannot simplify if address spaces are different!
3049 if (SrcTy != DstTy)
3050 return 0;
3051
3052 // Cannot simplify if the intermediate integer size is smaller than the
3053 // pointer size.
3054 unsigned MidSize = MidTy->getScalarSizeInBits();
3055 if (!DL || MidSize < DL->getPointerTypeSizeInBits(SrcTy))
3056 return 0;
3057
3058 return Instruction::BitCast;
3059 }
3060 case 8: {
3061 // ext, trunc -> bitcast, if the SrcTy and DstTy are the same
3062 // ext, trunc -> ext, if sizeof(SrcTy) < sizeof(DstTy)
3063 // ext, trunc -> trunc, if sizeof(SrcTy) > sizeof(DstTy)
3064 unsigned SrcSize = SrcTy->getScalarSizeInBits();
3065 unsigned DstSize = DstTy->getScalarSizeInBits();
3066 if (SrcTy == DstTy)
3067 return Instruction::BitCast;
3068 if (SrcSize < DstSize)
3069 return firstOp;
3070 if (SrcSize > DstSize)
3071 return secondOp;
3072 return 0;
3073 }
3074 case 9:
3075 // zext, sext -> zext, because sext can't sign extend after zext
3076 return Instruction::ZExt;
3077 case 11: {
3078 // inttoptr, ptrtoint/ptrtoaddr -> integer cast
3079 if (!DL)
3080 return 0;
3081 unsigned MidSize = secondOp == Instruction::PtrToAddr
3082 ? DL->getAddressSizeInBits(MidTy)
3083 : DL->getPointerTypeSizeInBits(MidTy);
3084 unsigned SrcSize = SrcTy->getScalarSizeInBits();
3085 unsigned DstSize = DstTy->getScalarSizeInBits();
3086 // If the middle size is smaller than both source and destination,
3087 // an additional masking operation would be required.
3088 if (MidSize < SrcSize && MidSize < DstSize)
3089 return 0;
3090 if (DstSize < SrcSize)
3091 return Instruction::Trunc;
3092 if (DstSize > SrcSize)
3093 return Instruction::ZExt;
3094 return Instruction::BitCast;
3095 }
3096 case 12:
3097 // addrspacecast, addrspacecast -> bitcast, if SrcAS == DstAS
3098 // addrspacecast, addrspacecast -> addrspacecast, if SrcAS != DstAS
3099 if (SrcTy->getPointerAddressSpace() != DstTy->getPointerAddressSpace())
3100 return Instruction::AddrSpaceCast;
3101 return Instruction::BitCast;
3102 case 13:
3103 // FIXME: this state can be merged with (1), but the following assert
3104 // is useful to check the correcteness of the sequence due to semantic
3105 // change of bitcast.
3106 // addrspacecast can only fold through a bitcast if the result remains a
3107 // pointer. A pointer-to-byte bitcast must stay as a separate bitcast.
3108 if (!DstTy->isPtrOrPtrVectorTy())
3109 return 0;
3110 assert(
3111 SrcTy->isPtrOrPtrVectorTy() &&
3112 MidTy->isPtrOrPtrVectorTy() &&
3113 DstTy->isPtrOrPtrVectorTy() &&
3114 SrcTy->getPointerAddressSpace() != MidTy->getPointerAddressSpace() &&
3115 MidTy->getPointerAddressSpace() == DstTy->getPointerAddressSpace() &&
3116 "Illegal addrspacecast, bitcast sequence!");
3117 // Allowed, use first cast's opcode
3118 return firstOp;
3119 case 14:
3120 // bitcast, addrspacecast -> addrspacecast
3121 // addrspacecast can only fold through a bitcast if the source was already
3122 // a pointer. A byte-to-pointer bitcast must stay as a separate bitcast.
3123 if (!SrcTy->isPtrOrPtrVectorTy())
3124 return 0;
3125 return Instruction::AddrSpaceCast;
3126 case 15:
3127 // FIXME: this state can be merged with (1), but the following assert
3128 // is useful to check the correcteness of the sequence due to semantic
3129 // change of bitcast.
3130 assert(
3131 SrcTy->isIntOrIntVectorTy() &&
3132 MidTy->isPtrOrPtrVectorTy() &&
3133 DstTy->isPtrOrPtrVectorTy() &&
3134 MidTy->getPointerAddressSpace() == DstTy->getPointerAddressSpace() &&
3135 "Illegal inttoptr, bitcast sequence!");
3136 // Allowed, use first cast's opcode
3137 return firstOp;
3138 case 16:
3139 // FIXME: this state can be merged with (2), but the following assert
3140 // is useful to check the correcteness of the sequence due to semantic
3141 // change of bitcast.
3142 assert(
3143 SrcTy->isPtrOrPtrVectorTy() &&
3144 MidTy->isPtrOrPtrVectorTy() &&
3145 DstTy->isIntOrIntVectorTy() &&
3146 SrcTy->getPointerAddressSpace() == MidTy->getPointerAddressSpace() &&
3147 "Illegal bitcast, ptrtoint sequence!");
3148 // Allowed, use second cast's opcode
3149 return secondOp;
3150 case 17:
3151 // (sitofp (zext x)) -> (uitofp x)
3152 return Instruction::UIToFP;
3153 case 99:
3154 // Cast combination can't happen (error in input). This is for all cases
3155 // where the MidTy is not the same for the two cast instructions.
3156 llvm_unreachable("Invalid Cast Combination");
3157 default:
3158 llvm_unreachable("Error in CastResults table!!!");
3159 }
3160}
3161
3163 const Twine &Name, InsertPosition InsertBefore) {
3164 assert(castIsValid(op, S, Ty) && "Invalid cast!");
3165 // Construct and return the appropriate CastInst subclass
3166 switch (op) {
3167 case Trunc: return new TruncInst (S, Ty, Name, InsertBefore);
3168 case ZExt: return new ZExtInst (S, Ty, Name, InsertBefore);
3169 case SExt: return new SExtInst (S, Ty, Name, InsertBefore);
3170 case FPTrunc: return new FPTruncInst (S, Ty, Name, InsertBefore);
3171 case FPExt: return new FPExtInst (S, Ty, Name, InsertBefore);
3172 case UIToFP: return new UIToFPInst (S, Ty, Name, InsertBefore);
3173 case SIToFP: return new SIToFPInst (S, Ty, Name, InsertBefore);
3174 case FPToUI: return new FPToUIInst (S, Ty, Name, InsertBefore);
3175 case FPToSI: return new FPToSIInst (S, Ty, Name, InsertBefore);
3176 case PtrToAddr: return new PtrToAddrInst (S, Ty, Name, InsertBefore);
3177 case PtrToInt: return new PtrToIntInst (S, Ty, Name, InsertBefore);
3178 case IntToPtr: return new IntToPtrInst (S, Ty, Name, InsertBefore);
3179 case BitCast:
3180 return new BitCastInst(S, Ty, Name, InsertBefore);
3181 case AddrSpaceCast:
3182 return new AddrSpaceCastInst(S, Ty, Name, InsertBefore);
3183 default:
3184 llvm_unreachable("Invalid opcode provided");
3185 }
3186}
3187
3189 InsertPosition InsertBefore) {
3190 if (S->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
3191 return Create(Instruction::BitCast, S, Ty, Name, InsertBefore);
3192 return Create(Instruction::ZExt, S, Ty, Name, InsertBefore);
3193}
3194
3196 InsertPosition InsertBefore) {
3197 if (S->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
3198 return Create(Instruction::BitCast, S, Ty, Name, InsertBefore);
3199 return Create(Instruction::SExt, S, Ty, Name, InsertBefore);
3200}
3201
3203 InsertPosition InsertBefore) {
3204 if (S->getType()->getScalarSizeInBits() == Ty->getScalarSizeInBits())
3205 return Create(Instruction::BitCast, S, Ty, Name, InsertBefore);
3206 return Create(Instruction::Trunc, S, Ty, Name, InsertBefore);
3207}
3208
3209/// Create a BitCast or a PtrToInt cast instruction
3211 InsertPosition InsertBefore) {
3212 assert(S->getType()->isPtrOrPtrVectorTy() && "Invalid cast");
3213 assert((Ty->isIntOrIntVectorTy() || Ty->isPtrOrPtrVectorTy()) &&
3214 "Invalid cast");
3215 assert(Ty->isVectorTy() == S->getType()->isVectorTy() && "Invalid cast");
3216 assert((!Ty->isVectorTy() ||
3217 cast<VectorType>(Ty)->getElementCount() ==
3218 cast<VectorType>(S->getType())->getElementCount()) &&
3219 "Invalid cast");
3220
3221 if (Ty->isIntOrIntVectorTy())
3222 return Create(Instruction::PtrToInt, S, Ty, Name, InsertBefore);
3223
3224 return CreatePointerBitCastOrAddrSpaceCast(S, Ty, Name, InsertBefore);
3225}
3226
3228 Value *S, Type *Ty, const Twine &Name, InsertPosition InsertBefore) {
3229 assert(S->getType()->isPtrOrPtrVectorTy() && "Invalid cast");
3230 assert(Ty->isPtrOrPtrVectorTy() && "Invalid cast");
3231
3232 if (S->getType()->getPointerAddressSpace() != Ty->getPointerAddressSpace())
3233 return Create(Instruction::AddrSpaceCast, S, Ty, Name, InsertBefore);
3234
3235 return Create(Instruction::BitCast, S, Ty, Name, InsertBefore);
3236}
3237
3239 const Twine &Name,
3240 InsertPosition InsertBefore) {
3241 if (S->getType()->isPointerTy() && Ty->isIntegerTy())
3242 return Create(Instruction::PtrToInt, S, Ty, Name, InsertBefore);
3243 if (S->getType()->isIntegerTy() && Ty->isPointerTy())
3244 return Create(Instruction::IntToPtr, S, Ty, Name, InsertBefore);
3245
3246 return Create(Instruction::BitCast, S, Ty, Name, InsertBefore);
3247}
3248
3250 const Twine &Name,
3251 InsertPosition InsertBefore) {
3252 assert(C->getType()->isIntOrIntVectorTy() && Ty->isIntOrIntVectorTy() &&
3253 "Invalid integer cast");
3254 unsigned SrcBits = C->getType()->getScalarSizeInBits();
3255 unsigned DstBits = Ty->getScalarSizeInBits();
3256 Instruction::CastOps opcode =
3257 (SrcBits == DstBits ? Instruction::BitCast :
3258 (SrcBits > DstBits ? Instruction::Trunc :
3259 (isSigned ? Instruction::SExt : Instruction::ZExt)));
3260 return Create(opcode, C, Ty, Name, InsertBefore);
3261}
3262
3264 InsertPosition InsertBefore) {
3265 assert(C->getType()->isFPOrFPVectorTy() && Ty->isFPOrFPVectorTy() &&
3266 "Invalid cast");
3267 unsigned SrcBits = C->getType()->getScalarSizeInBits();
3268 unsigned DstBits = Ty->getScalarSizeInBits();
3269 assert((C->getType() == Ty || SrcBits != DstBits) && "Invalid cast");
3270 Instruction::CastOps opcode =
3271 (SrcBits == DstBits ? Instruction::BitCast :
3272 (SrcBits > DstBits ? Instruction::FPTrunc : Instruction::FPExt));
3273 return Create(opcode, C, Ty, Name, InsertBefore);
3274}
3275
3276bool CastInst::isBitCastable(Type *SrcTy, Type *DestTy) {
3277 if (!SrcTy->isFirstClassType() || !DestTy->isFirstClassType())
3278 return false;
3279
3280 if (SrcTy == DestTy)
3281 return true;
3282
3283 if (VectorType *SrcVecTy = dyn_cast<VectorType>(SrcTy)) {
3284 if (VectorType *DestVecTy = dyn_cast<VectorType>(DestTy)) {
3285 if (SrcVecTy->getElementCount() == DestVecTy->getElementCount()) {
3286 // An element by element cast. Valid if casting the elements is valid.
3287 SrcTy = SrcVecTy->getElementType();
3288 DestTy = DestVecTy->getElementType();
3289 }
3290 }
3291 }
3292
3293 if (PointerType *DestPtrTy = dyn_cast<PointerType>(DestTy)) {
3294 if (PointerType *SrcPtrTy = dyn_cast<PointerType>(SrcTy)) {
3295 return SrcPtrTy->getAddressSpace() == DestPtrTy->getAddressSpace();
3296 }
3297 }
3298
3299 TypeSize SrcBits = SrcTy->getPrimitiveSizeInBits(); // 0 for ptr
3300 TypeSize DestBits = DestTy->getPrimitiveSizeInBits(); // 0 for ptr
3301
3302 // Could still have vectors of pointers if the number of elements doesn't
3303 // match
3304 if (SrcBits.getKnownMinValue() == 0 || DestBits.getKnownMinValue() == 0)
3305 return false;
3306
3307 if (SrcBits != DestBits)
3308 return false;
3309
3310 return true;
3311}
3312
3314 const DataLayout &DL) {
3315 // ptrtoint and inttoptr are not allowed on non-integral pointers
3316 if (auto *PtrTy = dyn_cast<PointerType>(SrcTy))
3317 if (auto *IntTy = dyn_cast<IntegerType>(DestTy))
3318 return (IntTy->getBitWidth() == DL.getPointerTypeSizeInBits(PtrTy) &&
3319 !DL.isNonIntegralPointerType(PtrTy));
3320 if (auto *PtrTy = dyn_cast<PointerType>(DestTy))
3321 if (auto *IntTy = dyn_cast<IntegerType>(SrcTy))
3322 return (IntTy->getBitWidth() == DL.getPointerTypeSizeInBits(PtrTy) &&
3323 !DL.isNonIntegralPointerType(PtrTy));
3324
3325 return isBitCastable(SrcTy, DestTy);
3326}
3327
3328// Provide a way to get a "cast" where the cast opcode is inferred from the
3329// types and size of the operand. This, basically, is a parallel of the
3330// logic in the castIsValid function below. This axiom should hold:
3331// castIsValid( getCastOpcode(Val, Ty), Val, Ty)
3332// should not assert in castIsValid. In other words, this produces a "correct"
3333// casting opcode for the arguments passed to it.
3336 const Value *Src, bool SrcIsSigned, Type *DestTy, bool DestIsSigned) {
3337 Type *SrcTy = Src->getType();
3338
3339 assert(SrcTy->isFirstClassType() && DestTy->isFirstClassType() &&
3340 "Only first class types are castable!");
3341
3342 if (SrcTy == DestTy)
3343 return BitCast;
3344
3345 // FIXME: Check address space sizes here
3346 if (VectorType *SrcVecTy = dyn_cast<VectorType>(SrcTy))
3347 if (VectorType *DestVecTy = dyn_cast<VectorType>(DestTy))
3348 if (SrcVecTy->getElementCount() == DestVecTy->getElementCount()) {
3349 // An element by element cast. Find the appropriate opcode based on the
3350 // element types.
3351 SrcTy = SrcVecTy->getElementType();
3352 DestTy = DestVecTy->getElementType();
3353 }
3354
3355 // Get the bit sizes, we'll need these
3356 // FIXME: This doesn't work for scalable vector types with different element
3357 // counts that don't call getElementType above.
3358 unsigned SrcBits =
3359 SrcTy->getPrimitiveSizeInBits().getFixedValue(); // 0 for ptr
3360 unsigned DestBits =
3361 DestTy->getPrimitiveSizeInBits().getFixedValue(); // 0 for ptr
3362
3363 // Run through the possibilities ...
3364 if (DestTy->isByteTy()) { // Casting to byte
3365 if (SrcTy->isIntegerTy()) { // Casting from integral
3366 assert(DestBits == SrcBits && "Illegal cast from integer to byte type");
3367 return BitCast;
3368 } else if (SrcTy->isPointerTy()) { // Casting from pointer
3369 assert(DestBits == SrcBits && "Illegal cast from pointer to byte type");
3370 return BitCast;
3371 }
3372 llvm_unreachable("Illegal cast to byte type");
3373 } else if (DestTy->isIntegerTy()) { // Casting to integral
3374 if (SrcTy->isIntegerTy()) { // Casting from integral
3375 if (DestBits < SrcBits)
3376 return Trunc; // int -> smaller int
3377 else if (DestBits > SrcBits) { // its an extension
3378 if (SrcIsSigned)
3379 return SExt; // signed -> SEXT
3380 else
3381 return ZExt; // unsigned -> ZEXT
3382 } else {
3383 return BitCast; // Same size, No-op cast
3384 }
3385 } else if (SrcTy->isFloatingPointTy()) { // Casting from floating pt
3386 if (DestIsSigned)
3387 return FPToSI; // FP -> sint
3388 else
3389 return FPToUI; // FP -> uint
3390 } else if (SrcTy->isVectorTy()) {
3391 assert(DestBits == SrcBits &&
3392 "Casting vector to integer of different width");
3393 return BitCast; // Same size, no-op cast
3394 } else {
3395 assert(SrcTy->isPointerTy() &&
3396 "Casting from a value that is not first-class type");
3397 return PtrToInt; // ptr -> int
3398 }
3399 } else if (DestTy->isFloatingPointTy()) { // Casting to floating pt
3400 if (SrcTy->isIntegerTy()) { // Casting from integral
3401 if (SrcIsSigned)
3402 return SIToFP; // sint -> FP
3403 else
3404 return UIToFP; // uint -> FP
3405 } else if (SrcTy->isFloatingPointTy()) { // Casting from floating pt
3406 if (DestBits < SrcBits) {
3407 return FPTrunc; // FP -> smaller FP
3408 } else if (DestBits > SrcBits) {
3409 return FPExt; // FP -> larger FP
3410 } else {
3411 return BitCast; // same size, no-op cast
3412 }
3413 } else if (SrcTy->isVectorTy()) {
3414 assert(DestBits == SrcBits &&
3415 "Casting vector to floating point of different width");
3416 return BitCast; // same size, no-op cast
3417 }
3418 llvm_unreachable("Casting pointer or non-first class to float");
3419 } else if (DestTy->isVectorTy()) {
3420 assert(DestBits == SrcBits &&
3421 "Illegal cast to vector (wrong type or size)");
3422 return BitCast;
3423 } else if (DestTy->isPointerTy()) {
3424 if (SrcTy->isPointerTy()) {
3425 if (DestTy->getPointerAddressSpace() != SrcTy->getPointerAddressSpace())
3426 return AddrSpaceCast;
3427 return BitCast; // ptr -> ptr
3428 } else if (SrcTy->isIntegerTy()) {
3429 return IntToPtr; // int -> ptr
3430 }
3431 llvm_unreachable("Casting pointer to other than pointer or int");
3432 }
3433 llvm_unreachable("Casting to type that is not first-class");
3434}
3435
3436//===----------------------------------------------------------------------===//
3437// CastInst SubClass Constructors
3438//===----------------------------------------------------------------------===//
3439
3440/// Check that the construction parameters for a CastInst are correct. This
3441/// could be broken out into the separate constructors but it is useful to have
3442/// it in one place and to eliminate the redundant code for getting the sizes
3443/// of the types involved.
3444bool
3446 if (!SrcTy->isFirstClassType() || !DstTy->isFirstClassType() ||
3447 SrcTy->isAggregateType() || DstTy->isAggregateType())
3448 return false;
3449
3450 // Get the size of the types in bits, and whether we are dealing
3451 // with vector types, we'll need this later.
3452 bool SrcIsVec = isa<VectorType>(SrcTy);
3453 bool DstIsVec = isa<VectorType>(DstTy);
3454 unsigned SrcScalarBitSize = SrcTy->getScalarSizeInBits();
3455 unsigned DstScalarBitSize = DstTy->getScalarSizeInBits();
3456
3457 // If these are vector types, get the lengths of the vectors (using zero for
3458 // scalar types means that checking that vector lengths match also checks that
3459 // scalars are not being converted to vectors or vectors to scalars).
3460 ElementCount SrcEC = SrcIsVec ? cast<VectorType>(SrcTy)->getElementCount()
3462 ElementCount DstEC = DstIsVec ? cast<VectorType>(DstTy)->getElementCount()
3464
3465 // Switch on the opcode provided
3466 switch (op) {
3467 default: return false; // This is an input error
3468 case Instruction::Trunc:
3469 return SrcTy->isIntOrIntVectorTy() && DstTy->isIntOrIntVectorTy() &&
3470 SrcEC == DstEC && SrcScalarBitSize > DstScalarBitSize;
3471 case Instruction::ZExt:
3472 return SrcTy->isIntOrIntVectorTy() && DstTy->isIntOrIntVectorTy() &&
3473 SrcEC == DstEC && SrcScalarBitSize < DstScalarBitSize;
3474 case Instruction::SExt:
3475 return SrcTy->isIntOrIntVectorTy() && DstTy->isIntOrIntVectorTy() &&
3476 SrcEC == DstEC && SrcScalarBitSize < DstScalarBitSize;
3477 case Instruction::FPTrunc:
3478 return SrcTy->isFPOrFPVectorTy() && DstTy->isFPOrFPVectorTy() &&
3479 SrcEC == DstEC && SrcScalarBitSize > DstScalarBitSize;
3480 case Instruction::FPExt:
3481 return SrcTy->isFPOrFPVectorTy() && DstTy->isFPOrFPVectorTy() &&
3482 SrcEC == DstEC && SrcScalarBitSize < DstScalarBitSize;
3483 case Instruction::UIToFP:
3484 case Instruction::SIToFP:
3485 return SrcTy->isIntOrIntVectorTy() && DstTy->isFPOrFPVectorTy() &&
3486 SrcEC == DstEC;
3487 case Instruction::FPToUI:
3488 case Instruction::FPToSI:
3489 return SrcTy->isFPOrFPVectorTy() && DstTy->isIntOrIntVectorTy() &&
3490 SrcEC == DstEC;
3491 case Instruction::PtrToAddr:
3492 case Instruction::PtrToInt:
3493 if (SrcEC != DstEC)
3494 return false;
3495 return SrcTy->isPtrOrPtrVectorTy() && DstTy->isIntOrIntVectorTy();
3496 case Instruction::IntToPtr:
3497 if (SrcEC != DstEC)
3498 return false;
3499 return SrcTy->isIntOrIntVectorTy() && DstTy->isPtrOrPtrVectorTy();
3500 case Instruction::BitCast: {
3501 PointerType *SrcPtrTy = dyn_cast<PointerType>(SrcTy->getScalarType());
3502 PointerType *DstPtrTy = dyn_cast<PointerType>(DstTy->getScalarType());
3503
3504 // BitCast implies a no-op cast of type only. No bits change.
3505 // However, you can't cast pointers to anything but pointers/bytes.
3506 if ((SrcPtrTy && DstTy->isByteOrByteVectorTy()) ||
3507 (SrcTy->isByteOrByteVectorTy() && DstPtrTy))
3508 return true;
3509 if (!SrcPtrTy != !DstPtrTy)
3510 return false;
3511
3512 // For non-pointer cases, the cast is okay if the source and destination bit
3513 // widths are identical.
3514 if (!SrcPtrTy)
3515 return SrcTy->getPrimitiveSizeInBits() == DstTy->getPrimitiveSizeInBits();
3516
3517 // If both are pointers then the address spaces must match.
3518 if (SrcPtrTy->getAddressSpace() != DstPtrTy->getAddressSpace())
3519 return false;
3520
3521 // A vector of pointers must have the same number of elements.
3522 if (SrcIsVec && DstIsVec)
3523 return SrcEC == DstEC;
3524 if (SrcIsVec)
3525 return SrcEC == ElementCount::getFixed(1);
3526 if (DstIsVec)
3527 return DstEC == ElementCount::getFixed(1);
3528
3529 return true;
3530 }
3531 case Instruction::AddrSpaceCast: {
3532 PointerType *SrcPtrTy = dyn_cast<PointerType>(SrcTy->getScalarType());
3533 if (!SrcPtrTy)
3534 return false;
3535
3536 PointerType *DstPtrTy = dyn_cast<PointerType>(DstTy->getScalarType());
3537 if (!DstPtrTy)
3538 return false;
3539
3540 if (SrcPtrTy->getAddressSpace() == DstPtrTy->getAddressSpace())
3541 return false;
3542
3543 return SrcEC == DstEC;
3544 }
3545 }
3546}
3547
3549 InsertPosition InsertBefore)
3550 : CastInst(Ty, Trunc, S, Name, InsertBefore) {
3551 assert(castIsValid(getOpcode(), S, Ty) && "Illegal Trunc");
3552}
3553
3554ZExtInst::ZExtInst(Value *S, Type *Ty, const Twine &Name,
3555 InsertPosition InsertBefore)
3556 : CastInst(Ty, ZExt, S, Name, InsertBefore) {
3557 assert(castIsValid(getOpcode(), S, Ty) && "Illegal ZExt");
3558}
3559
3560SExtInst::SExtInst(Value *S, Type *Ty, const Twine &Name,
3561 InsertPosition InsertBefore)
3562 : CastInst(Ty, SExt, S, Name, InsertBefore) {
3563 assert(castIsValid(getOpcode(), S, Ty) && "Illegal SExt");
3564}
3565
3567 InsertPosition InsertBefore)
3568 : CastInst(Ty, FPTrunc, S, Name, InsertBefore) {
3569 assert(castIsValid(getOpcode(), S, Ty) && "Illegal FPTrunc");
3570}
3571
3573 InsertPosition InsertBefore)
3574 : CastInst(Ty, FPExt, S, Name, InsertBefore) {
3575 assert(castIsValid(getOpcode(), S, Ty) && "Illegal FPExt");
3576}
3577
3579 InsertPosition InsertBefore)
3580 : CastInst(Ty, UIToFP, S, Name, InsertBefore) {
3581 assert(castIsValid(getOpcode(), S, Ty) && "Illegal UIToFP");
3582}
3583
3585 InsertPosition InsertBefore)
3586 : CastInst(Ty, SIToFP, S, Name, InsertBefore) {
3587 assert(castIsValid(getOpcode(), S, Ty) && "Illegal SIToFP");
3588}
3589
3591 InsertPosition InsertBefore)
3592 : CastInst(Ty, FPToUI, S, Name, InsertBefore) {
3593 assert(castIsValid(getOpcode(), S, Ty) && "Illegal FPToUI");
3594}
3595
3597 InsertPosition InsertBefore)
3598 : CastInst(Ty, FPToSI, S, Name, InsertBefore) {
3599 assert(castIsValid(getOpcode(), S, Ty) && "Illegal FPToSI");
3600}
3601
3603 InsertPosition InsertBefore)
3604 : CastInst(Ty, PtrToInt, S, Name, InsertBefore) {
3605 assert(castIsValid(getOpcode(), S, Ty) && "Illegal PtrToInt");
3606}
3607
3609 InsertPosition InsertBefore)
3610 : CastInst(Ty, PtrToAddr, S, Name, InsertBefore) {
3611 assert(castIsValid(getOpcode(), S, Ty) && "Illegal PtrToAddr");
3612}
3613
3615 InsertPosition InsertBefore)
3616 : CastInst(Ty, IntToPtr, S, Name, InsertBefore) {
3617 assert(castIsValid(getOpcode(), S, Ty) && "Illegal IntToPtr");
3618}
3619
3621 InsertPosition InsertBefore)
3622 : CastInst(Ty, BitCast, S, Name, InsertBefore) {
3623 assert(castIsValid(getOpcode(), S, Ty) && "Illegal BitCast");
3624}
3625
3627 InsertPosition InsertBefore)
3628 : CastInst(Ty, AddrSpaceCast, S, Name, InsertBefore) {
3629 assert(castIsValid(getOpcode(), S, Ty) && "Illegal AddrSpaceCast");
3630}
3631
3632//===----------------------------------------------------------------------===//
3633// CmpInst Classes
3634//===----------------------------------------------------------------------===//
3635
3637 Value *RHS, const Twine &Name, InsertPosition InsertBefore)
3638 : Instruction(ty, op, AllocMarker, InsertBefore) {
3639 Op<0>() = LHS;
3640 Op<1>() = RHS;
3641 setPredicate(predicate);
3642 setName(Name);
3643}
3644
3646 const Twine &Name, InsertPosition InsertBefore) {
3647 if (Op == Instruction::ICmp) {
3648 if (InsertBefore.isValid())
3649 return new ICmpInst(InsertBefore, CmpInst::Predicate(predicate),
3650 S1, S2, Name);
3651 else
3652 return new ICmpInst(CmpInst::Predicate(predicate),
3653 S1, S2, Name);
3654 }
3655
3656 if (InsertBefore.isValid())
3657 return new FCmpInst(InsertBefore, CmpInst::Predicate(predicate),
3658 S1, S2, Name);
3659 else
3660 return new FCmpInst(CmpInst::Predicate(predicate),
3661 S1, S2, Name);
3662}
3663
3665 Value *S2,
3666 const Instruction *FlagsSource,
3667 const Twine &Name,
3668 InsertPosition InsertBefore) {
3669 CmpInst *Inst = Create(Op, Pred, S1, S2, Name, InsertBefore);
3670 Inst->copyIRFlags(FlagsSource);
3671 return Inst;
3672}
3673
3675 if (ICmpInst *IC = dyn_cast<ICmpInst>(this))
3676 IC->swapOperands();
3677 else
3678 cast<FCmpInst>(this)->swapOperands();
3679}
3680
3682 if (const ICmpInst *IC = dyn_cast<ICmpInst>(this))
3683 return IC->isCommutative();
3684 return cast<FCmpInst>(this)->isCommutative();
3685}
3686
3689 return ICmpInst::isEquality(P);
3691 return FCmpInst::isEquality(P);
3692 llvm_unreachable("Unsupported predicate kind");
3693}
3694
3695// Returns true if either operand of CmpInst is a provably non-zero
3696// floating-point constant.
3697static bool hasNonZeroFPOperands(const CmpInst *Cmp) {
3698 auto *LHS = dyn_cast<Constant>(Cmp->getOperand(0));
3699 auto *RHS = dyn_cast<Constant>(Cmp->getOperand(1));
3700 if (auto *Const = LHS ? LHS : RHS) {
3701 using namespace llvm::PatternMatch;
3702 return match(Const, m_NonZeroNotDenormalFP());
3703 }
3704 return false;
3705}
3706
3707// Floating-point equality is not an equivalence when comparing +0.0 with
3708// -0.0, when comparing NaN with another value, or when flushing
3709// denormals-to-zero.
3710bool CmpInst::isEquivalence(bool Invert) const {
3711 switch (Invert ? getInversePredicate() : getPredicate()) {
3713 return true;
3715 if (!hasNoNaNs())
3716 return false;
3717 [[fallthrough]];
3719 return hasNonZeroFPOperands(this);
3720 default:
3721 return false;
3722 }
3723}
3724
3726 switch (pred) {
3727 default: llvm_unreachable("Unknown cmp predicate!");
3728 case ICMP_EQ: return ICMP_NE;
3729 case ICMP_NE: return ICMP_EQ;
3730 case ICMP_UGT: return ICMP_ULE;
3731 case ICMP_ULT: return ICMP_UGE;
3732 case ICMP_UGE: return ICMP_ULT;
3733 case ICMP_ULE: return ICMP_UGT;
3734 case ICMP_SGT: return ICMP_SLE;
3735 case ICMP_SLT: return ICMP_SGE;
3736 case ICMP_SGE: return ICMP_SLT;
3737 case ICMP_SLE: return ICMP_SGT;
3738
3739 case FCMP_OEQ: return FCMP_UNE;
3740 case FCMP_ONE: return FCMP_UEQ;
3741 case FCMP_OGT: return FCMP_ULE;
3742 case FCMP_OLT: return FCMP_UGE;
3743 case FCMP_OGE: return FCMP_ULT;
3744 case FCMP_OLE: return FCMP_UGT;
3745 case FCMP_UEQ: return FCMP_ONE;
3746 case FCMP_UNE: return FCMP_OEQ;
3747 case FCMP_UGT: return FCMP_OLE;
3748 case FCMP_ULT: return FCMP_OGE;
3749 case FCMP_UGE: return FCMP_OLT;
3750 case FCMP_ULE: return FCMP_OGT;
3751 case FCMP_ORD: return FCMP_UNO;
3752 case FCMP_UNO: return FCMP_ORD;
3753 case FCMP_TRUE: return FCMP_FALSE;
3754 case FCMP_FALSE: return FCMP_TRUE;
3755 }
3756}
3757
3759 switch (Pred) {
3760 default: return "unknown";
3761 case FCmpInst::FCMP_FALSE: return "false";
3762 case FCmpInst::FCMP_OEQ: return "oeq";
3763 case FCmpInst::FCMP_OGT: return "ogt";
3764 case FCmpInst::FCMP_OGE: return "oge";
3765 case FCmpInst::FCMP_OLT: return "olt";
3766 case FCmpInst::FCMP_OLE: return "ole";
3767 case FCmpInst::FCMP_ONE: return "one";
3768 case FCmpInst::FCMP_ORD: return "ord";
3769 case FCmpInst::FCMP_UNO: return "uno";
3770 case FCmpInst::FCMP_UEQ: return "ueq";
3771 case FCmpInst::FCMP_UGT: return "ugt";
3772 case FCmpInst::FCMP_UGE: return "uge";
3773 case FCmpInst::FCMP_ULT: return "ult";
3774 case FCmpInst::FCMP_ULE: return "ule";
3775 case FCmpInst::FCMP_UNE: return "une";
3776 case FCmpInst::FCMP_TRUE: return "true";
3777 case ICmpInst::ICMP_EQ: return "eq";
3778 case ICmpInst::ICMP_NE: return "ne";
3779 case ICmpInst::ICMP_SGT: return "sgt";
3780 case ICmpInst::ICMP_SGE: return "sge";
3781 case ICmpInst::ICMP_SLT: return "slt";
3782 case ICmpInst::ICMP_SLE: return "sle";
3783 case ICmpInst::ICMP_UGT: return "ugt";
3784 case ICmpInst::ICMP_UGE: return "uge";
3785 case ICmpInst::ICMP_ULT: return "ult";
3786 case ICmpInst::ICMP_ULE: return "ule";
3787 }
3788}
3789
3791 OS << CmpInst::getPredicateName(Pred);
3792 return OS;
3793}
3794
3796 switch (pred) {
3797 default: llvm_unreachable("Unknown icmp predicate!");
3798 case ICMP_EQ: case ICMP_NE:
3799 case ICMP_SGT: case ICMP_SLT: case ICMP_SGE: case ICMP_SLE:
3800 return pred;
3801 case ICMP_UGT: return ICMP_SGT;
3802 case ICMP_ULT: return ICMP_SLT;
3803 case ICMP_UGE: return ICMP_SGE;
3804 case ICMP_ULE: return ICMP_SLE;
3805 }
3806}
3807
3809 switch (pred) {
3810 default: llvm_unreachable("Unknown icmp predicate!");
3811 case ICMP_EQ: case ICMP_NE:
3812 case ICMP_UGT: case ICMP_ULT: case ICMP_UGE: case ICMP_ULE:
3813 return pred;
3814 case ICMP_SGT: return ICMP_UGT;
3815 case ICMP_SLT: return ICMP_ULT;
3816 case ICMP_SGE: return ICMP_UGE;
3817 case ICMP_SLE: return ICMP_ULE;
3818 }
3819}
3820
3822 switch (pred) {
3823 default: llvm_unreachable("Unknown cmp predicate!");
3824 case ICMP_EQ: case ICMP_NE:
3825 return pred;
3826 case ICMP_SGT: return ICMP_SLT;
3827 case ICMP_SLT: return ICMP_SGT;
3828 case ICMP_SGE: return ICMP_SLE;
3829 case ICMP_SLE: return ICMP_SGE;
3830 case ICMP_UGT: return ICMP_ULT;
3831 case ICMP_ULT: return ICMP_UGT;
3832 case ICMP_UGE: return ICMP_ULE;
3833 case ICMP_ULE: return ICMP_UGE;
3834
3835 case FCMP_FALSE: case FCMP_TRUE:
3836 case FCMP_OEQ: case FCMP_ONE:
3837 case FCMP_UEQ: case FCMP_UNE:
3838 case FCMP_ORD: case FCMP_UNO:
3839 return pred;
3840 case FCMP_OGT: return FCMP_OLT;
3841 case FCMP_OLT: return FCMP_OGT;
3842 case FCMP_OGE: return FCMP_OLE;
3843 case FCMP_OLE: return FCMP_OGE;
3844 case FCMP_UGT: return FCMP_ULT;
3845 case FCMP_ULT: return FCMP_UGT;
3846 case FCMP_UGE: return FCMP_ULE;
3847 case FCMP_ULE: return FCMP_UGE;
3848 }
3849}
3850
3852 switch (pred) {
3853 case ICMP_SGE:
3854 case ICMP_SLE:
3855 case ICMP_UGE:
3856 case ICMP_ULE:
3857 case FCMP_OGE:
3858 case FCMP_OLE:
3859 case FCMP_UGE:
3860 case FCMP_ULE:
3861 return true;
3862 default:
3863 return false;
3864 }
3865}
3866
3868 switch (pred) {
3869 case ICMP_SGT:
3870 case ICMP_SLT:
3871 case ICMP_UGT:
3872 case ICMP_ULT:
3873 case FCMP_OGT:
3874 case FCMP_OLT:
3875 case FCMP_UGT:
3876 case FCMP_ULT:
3877 return true;
3878 default:
3879 return false;
3880 }
3881}
3882
3884 switch (pred) {
3885 case ICMP_SGE:
3886 return ICMP_SGT;
3887 case ICMP_SLE:
3888 return ICMP_SLT;
3889 case ICMP_UGE:
3890 return ICMP_UGT;
3891 case ICMP_ULE:
3892 return ICMP_ULT;
3893 case FCMP_OGE:
3894 return FCMP_OGT;
3895 case FCMP_OLE:
3896 return FCMP_OLT;
3897 case FCMP_UGE:
3898 return FCMP_UGT;
3899 case FCMP_ULE:
3900 return FCMP_ULT;
3901 default:
3902 return pred;
3903 }
3904}
3905
3907 switch (pred) {
3908 case ICMP_SGT:
3909 return ICMP_SGE;
3910 case ICMP_SLT:
3911 return ICMP_SLE;
3912 case ICMP_UGT:
3913 return ICMP_UGE;
3914 case ICMP_ULT:
3915 return ICMP_ULE;
3916 case FCMP_OGT:
3917 return FCMP_OGE;
3918 case FCMP_OLT:
3919 return FCMP_OLE;
3920 case FCMP_UGT:
3921 return FCMP_UGE;
3922 case FCMP_ULT:
3923 return FCMP_ULE;
3924 default:
3925 return pred;
3926 }
3927}
3928
3930 assert(CmpInst::isRelational(pred) && "Call only with relational predicate!");
3931
3932 if (isStrictPredicate(pred))
3933 return getNonStrictPredicate(pred);
3934 if (isNonStrictPredicate(pred))
3935 return getStrictPredicate(pred);
3936
3937 llvm_unreachable("Unknown predicate!");
3938}
3939
3940bool ICmpInst::compare(const APInt &LHS, const APInt &RHS,
3941 ICmpInst::Predicate Pred) {
3942 assert(ICmpInst::isIntPredicate(Pred) && "Only for integer predicates!");
3943 switch (Pred) {
3945 return LHS.eq(RHS);
3947 return LHS.ne(RHS);
3949 return LHS.ugt(RHS);
3951 return LHS.uge(RHS);
3953 return LHS.ult(RHS);
3955 return LHS.ule(RHS);
3957 return LHS.sgt(RHS);
3959 return LHS.sge(RHS);
3961 return LHS.slt(RHS);
3963 return LHS.sle(RHS);
3964 default:
3965 llvm_unreachable("Unexpected non-integer predicate.");
3966 };
3967}
3968
3969bool FCmpInst::compare(const APFloat &LHS, const APFloat &RHS,
3970 FCmpInst::Predicate Pred) {
3971 APFloat::cmpResult R = LHS.compare(RHS);
3972 switch (Pred) {
3973 default:
3974 llvm_unreachable("Invalid FCmp Predicate");
3976 return false;
3978 return true;
3979 case FCmpInst::FCMP_UNO:
3980 return R == APFloat::cmpUnordered;
3981 case FCmpInst::FCMP_ORD:
3982 return R != APFloat::cmpUnordered;
3983 case FCmpInst::FCMP_UEQ:
3984 return R == APFloat::cmpUnordered || R == APFloat::cmpEqual;
3985 case FCmpInst::FCMP_OEQ:
3986 return R == APFloat::cmpEqual;
3987 case FCmpInst::FCMP_UNE:
3988 return R != APFloat::cmpEqual;
3989 case FCmpInst::FCMP_ONE:
3991 case FCmpInst::FCMP_ULT:
3992 return R == APFloat::cmpUnordered || R == APFloat::cmpLessThan;
3993 case FCmpInst::FCMP_OLT:
3994 return R == APFloat::cmpLessThan;
3995 case FCmpInst::FCMP_UGT:
3997 case FCmpInst::FCMP_OGT:
3998 return R == APFloat::cmpGreaterThan;
3999 case FCmpInst::FCMP_ULE:
4000 return R != APFloat::cmpGreaterThan;
4001 case FCmpInst::FCMP_OLE:
4002 return R == APFloat::cmpLessThan || R == APFloat::cmpEqual;
4003 case FCmpInst::FCMP_UGE:
4004 return R != APFloat::cmpLessThan;
4005 case FCmpInst::FCMP_OGE:
4006 return R == APFloat::cmpGreaterThan || R == APFloat::cmpEqual;
4007 }
4008}
4009
4010std::optional<bool> ICmpInst::compare(const KnownBits &LHS,
4011 const KnownBits &RHS,
4012 ICmpInst::Predicate Pred) {
4013 switch (Pred) {
4014 case ICmpInst::ICMP_EQ:
4015 return KnownBits::eq(LHS, RHS);
4016 case ICmpInst::ICMP_NE:
4017 return KnownBits::ne(LHS, RHS);
4018 case ICmpInst::ICMP_UGE:
4019 return KnownBits::uge(LHS, RHS);
4020 case ICmpInst::ICMP_UGT:
4021 return KnownBits::ugt(LHS, RHS);
4022 case ICmpInst::ICMP_ULE:
4023 return KnownBits::ule(LHS, RHS);
4024 case ICmpInst::ICMP_ULT:
4025 return KnownBits::ult(LHS, RHS);
4026 case ICmpInst::ICMP_SGE:
4027 return KnownBits::sge(LHS, RHS);
4028 case ICmpInst::ICMP_SGT:
4029 return KnownBits::sgt(LHS, RHS);
4030 case ICmpInst::ICMP_SLE:
4031 return KnownBits::sle(LHS, RHS);
4032 case ICmpInst::ICMP_SLT:
4033 return KnownBits::slt(LHS, RHS);
4034 default:
4035 llvm_unreachable("Unexpected non-integer predicate.");
4036 }
4037}
4038
4040 if (CmpInst::isEquality(pred))
4041 return pred;
4042 if (isSigned(pred))
4043 return getUnsignedPredicate(pred);
4044 if (isUnsigned(pred))
4045 return getSignedPredicate(pred);
4046
4047 llvm_unreachable("Unknown predicate!");
4048}
4049
4051 switch (predicate) {
4052 default: return false;
4055 case FCmpInst::FCMP_ORD: return true;
4056 }
4057}
4058
4060 switch (predicate) {
4061 default: return false;
4064 case FCmpInst::FCMP_UNO: return true;
4065 }
4066}
4067
4069 switch(predicate) {
4070 default: return false;
4071 case ICMP_EQ: case ICMP_UGE: case ICMP_ULE: case ICMP_SGE: case ICMP_SLE:
4072 case FCMP_TRUE: case FCMP_UEQ: case FCMP_UGE: case FCMP_ULE: return true;
4073 }
4074}
4075
4077 switch(predicate) {
4078 case ICMP_NE: case ICMP_UGT: case ICMP_ULT: case ICMP_SGT: case ICMP_SLT:
4079 case FCMP_FALSE: case FCMP_ONE: case FCMP_OGT: case FCMP_OLT: return true;
4080 default: return false;
4081 }
4082}
4083
4085 // If the predicates match, then we know the first condition implies the
4086 // second is true.
4087 if (CmpPredicate::getMatching(Pred1, Pred2))
4088 return true;
4089
4090 if (Pred1.hasSameSign() && CmpInst::isSigned(Pred2))
4092 else if (Pred2.hasSameSign() && CmpInst::isSigned(Pred1))
4094
4095 switch (Pred1) {
4096 default:
4097 break;
4098 case CmpInst::ICMP_EQ:
4099 // A == B implies A >=u B, A <=u B, A >=s B, and A <=s B are true.
4100 return Pred2 == CmpInst::ICMP_UGE || Pred2 == CmpInst::ICMP_ULE ||
4101 Pred2 == CmpInst::ICMP_SGE || Pred2 == CmpInst::ICMP_SLE;
4102 case CmpInst::ICMP_UGT: // A >u B implies A != B and A >=u B are true.
4103 return Pred2 == CmpInst::ICMP_NE || Pred2 == CmpInst::ICMP_UGE;
4104 case CmpInst::ICMP_ULT: // A <u B implies A != B and A <=u B are true.
4105 return Pred2 == CmpInst::ICMP_NE || Pred2 == CmpInst::ICMP_ULE;
4106 case CmpInst::ICMP_SGT: // A >s B implies A != B and A >=s B are true.
4107 return Pred2 == CmpInst::ICMP_NE || Pred2 == CmpInst::ICMP_SGE;
4108 case CmpInst::ICMP_SLT: // A <s B implies A != B and A <=s B are true.
4109 return Pred2 == CmpInst::ICMP_NE || Pred2 == CmpInst::ICMP_SLE;
4110 }
4111 return false;
4112}
4113
4115 CmpPredicate Pred2) {
4116 return isImpliedTrueByMatchingCmp(Pred1,
4118}
4119
4121 CmpPredicate Pred2) {
4122 if (isImpliedTrueByMatchingCmp(Pred1, Pred2))
4123 return true;
4124 if (isImpliedFalseByMatchingCmp(Pred1, Pred2))
4125 return false;
4126 return std::nullopt;
4127}
4128
4129//===----------------------------------------------------------------------===//
4130// CmpPredicate Implementation
4131//===----------------------------------------------------------------------===//
4132
4133std::optional<CmpPredicate> CmpPredicate::getMatching(CmpPredicate A,
4134 CmpPredicate B) {
4135 if (A.Pred == B.Pred)
4136 return A.HasSameSign == B.HasSameSign ? A : CmpPredicate(A.Pred);
4138 return {};
4139 if (A.HasSameSign &&
4141 return B.Pred;
4142 if (B.HasSameSign &&
4144 return A.Pred;
4145 return {};
4146}
4147
4151
4153 if (auto *ICI = dyn_cast<ICmpInst>(Cmp))
4154 return ICI->getCmpPredicate();
4155 return Cmp->getPredicate();
4156}
4157
4161
4165
4167 return getSwapped(get(Cmp));
4168}
4169
4170//===----------------------------------------------------------------------===//
4171// SwitchInst Implementation
4172//===----------------------------------------------------------------------===//
4173
4174void SwitchInst::init(Value *Value, BasicBlock *Default, unsigned NumReserved) {
4175 assert(Value && Default && NumReserved);
4176 ReservedSpace = NumReserved;
4177 allocHungoffUses(ReservedSpace);
4179
4180 Op<0>() = Value;
4181 Op<1>() = Default;
4182}
4183
4184/// SwitchInst ctor - Create a new switch instruction, specifying a value to
4185/// switch on and a default destination. The number of additional cases can
4186/// be specified here to make memory allocation more efficient. This
4187/// constructor can also autoinsert before another instruction.
4188SwitchInst::SwitchInst(Value *Value, BasicBlock *Default, unsigned NumCases,
4189 InsertPosition InsertBefore)
4190 : Instruction(Type::getVoidTy(Value->getContext()), Instruction::Switch,
4191 AllocMarker, InsertBefore) {
4192 init(Value, Default, 2 + NumCases);
4193}
4194
4195SwitchInst::SwitchInst(const SwitchInst &SI)
4196 : Instruction(SI.getType(), Instruction::Switch, AllocMarker) {
4197 init(SI.getCondition(), SI.getDefaultDest(), SI.getNumOperands());
4198 setNumHungOffUseOperands(SI.getNumOperands());
4199 Use *OL = getOperandList();
4200 ConstantInt **VL = case_values();
4201 const Use *InOL = SI.getOperandList();
4202 ConstantInt *const *InVL = SI.case_values();
4203 for (unsigned i = 2, E = SI.getNumOperands(); i != E; ++i) {
4204 OL[i] = InOL[i];
4205 VL[i - 2] = InVL[i - 2];
4206 }
4207 SubclassOptionalData = SI.SubclassOptionalData;
4208}
4209
4210/// addCase - Add an entry to the switch instruction...
4211///
4213 unsigned NewCaseIdx = getNumCases();
4214 unsigned OpNo = getNumOperands();
4215 if (OpNo + 1 > ReservedSpace)
4216 growOperands(); // Get more space!
4217 // Initialize some new operands.
4218 assert(OpNo < ReservedSpace && "Growing didn't work!");
4219 setNumHungOffUseOperands(OpNo + 1);
4220 CaseHandle Case(this, NewCaseIdx);
4221 Case.setValue(OnVal);
4222 Case.setSuccessor(Dest);
4223}
4224
4225/// removeCase - This method removes the specified case and its successor
4226/// from the switch instruction.
4228 unsigned idx = I->getCaseIndex();
4229
4230 assert(2 + idx < getNumOperands() && "Case index out of range!!!");
4231
4232 unsigned NumOps = getNumOperands();
4233 Use *OL = getOperandList();
4234 ConstantInt **VL = case_values();
4235
4236 // Overwrite this case with the end of the list.
4237 if (2 + idx + 1 != NumOps) {
4238 OL[2 + idx] = OL[NumOps - 1];
4239 VL[idx] = VL[NumOps - 2 - 1];
4240 }
4241
4242 // Nuke the last value.
4243 OL[NumOps - 1].set(nullptr);
4244 VL[NumOps - 2 - 1] = nullptr;
4246
4247 return CaseIt(this, idx);
4248}
4249
4250/// growOperands - grow operands - This grows the operand list in response
4251/// to a push_back style of operation. This grows the number of ops by 3 times.
4252///
4253void SwitchInst::growOperands() {
4254 unsigned e = getNumOperands();
4255 unsigned NumOps = e*3;
4256
4257 ReservedSpace = NumOps;
4258 growHungoffUses(ReservedSpace, /*WithExtraValues=*/true);
4259}
4260
4262 MDNode *ProfileData = getBranchWeightMDNode(SI);
4263 if (!ProfileData)
4264 return;
4265
4266 if (getNumBranchWeights(*ProfileData) != SI.getNumSuccessors()) {
4267 llvm_unreachable("number of prof branch_weights metadata operands does "
4268 "not correspond to number of succesors");
4269 }
4270
4272 if (!extractBranchWeights(ProfileData, Weights))
4273 return;
4274 this->Weights = std::move(Weights);
4275}
4276
4279 if (Weights) {
4280 assert(SI.getNumSuccessors() == Weights->size() &&
4281 "num of prof branch_weights must accord with num of successors");
4282 Changed = true;
4283 // Copy the last case to the place of the removed one and shrink.
4284 // This is tightly coupled with the way SwitchInst::removeCase() removes
4285 // the cases in SwitchInst::removeCase(CaseIt).
4286 (*Weights)[I->getCaseIndex() + 1] = Weights->back();
4287 Weights->pop_back();
4288 }
4289 return SI.removeCase(I);
4290}
4291
4293 auto *DestBlock = I->getCaseSuccessor();
4294 if (Weights) {
4295 auto Weight = getSuccessorWeight(I->getCaseIndex() + 1);
4296 (*Weights)[0] = Weight.value();
4297 }
4298
4299 SI.setDefaultDest(DestBlock);
4300}
4301
4303 ConstantInt *OnVal, BasicBlock *Dest,
4305 SI.addCase(OnVal, Dest);
4306
4307 if (!Weights && W && *W) {
4308 Changed = true;
4309 Weights = SmallVector<uint32_t, 8>(SI.getNumSuccessors(), 0);
4310 (*Weights)[SI.getNumSuccessors() - 1] = *W;
4311 } else if (Weights) {
4312 Changed = true;
4313 Weights->push_back(W.value_or(0));
4314 }
4315 if (Weights)
4316 assert(SI.getNumSuccessors() == Weights->size() &&
4317 "num of prof branch_weights must accord with num of successors");
4318}
4319
4322 // Instruction is erased. Mark as unchanged to not touch it in the destructor.
4323 Changed = false;
4324 if (Weights)
4325 Weights->resize(0);
4326 return SI.eraseFromParent();
4327}
4328
4331 if (!Weights)
4332 return std::nullopt;
4333 return (*Weights)[idx];
4334}
4335
4338 if (!W)
4339 return;
4340
4341 if (!Weights && *W)
4342 Weights = SmallVector<uint32_t, 8>(SI.getNumSuccessors(), 0);
4343
4344 if (Weights) {
4345 auto &OldW = (*Weights)[idx];
4346 if (*W != OldW) {
4347 Changed = true;
4348 OldW = *W;
4349 }
4350 }
4351}
4352
4355 unsigned idx) {
4356 if (MDNode *ProfileData = getValidBranchWeightMDNode(SI)) {
4357 SmallVector<uint32_t> Weights;
4358 extractFromBranchWeightMD32(ProfileData, Weights);
4359 return Weights[idx];
4360 }
4361
4362 return std::nullopt;
4363}
4364
4365//===----------------------------------------------------------------------===//
4366// IndirectBrInst Implementation
4367//===----------------------------------------------------------------------===//
4368
4369void IndirectBrInst::init(Value *Address, unsigned NumDests) {
4370 assert(Address && Address->getType()->isPointerTy() &&
4371 "Address of indirectbr must be a pointer");
4372 ReservedSpace = 1 + NumDests;
4373 allocHungoffUses(ReservedSpace);
4375
4376 Op<0>() = Address;
4377}
4378
4379
4380/// growOperands - grow operands - This grows the operand list in response
4381/// to a push_back style of operation. This grows the number of ops by 2 times.
4382///
4383void IndirectBrInst::growOperands() {
4384 unsigned e = getNumOperands();
4385 unsigned NumOps = e*2;
4386
4387 ReservedSpace = NumOps;
4388 growHungoffUses(ReservedSpace);
4389}
4390
4391IndirectBrInst::IndirectBrInst(Value *Address, unsigned NumCases,
4392 InsertPosition InsertBefore)
4393 : Instruction(Type::getVoidTy(Address->getContext()),
4394 Instruction::IndirectBr, AllocMarker, InsertBefore) {
4395 init(Address, NumCases);
4396}
4397
4398IndirectBrInst::IndirectBrInst(const IndirectBrInst &IBI)
4399 : Instruction(Type::getVoidTy(IBI.getContext()), Instruction::IndirectBr,
4400 AllocMarker) {
4401 allocHungoffUses(IBI.getNumOperands());
4402 setNumHungOffUseOperands(IBI.NumUserOperands);
4403 Use *OL = getOperandList();
4404 const Use *InOL = IBI.getOperandList();
4405 for (unsigned i = 0, E = IBI.getNumOperands(); i != E; ++i)
4406 OL[i] = InOL[i];
4407 SubclassOptionalData = IBI.SubclassOptionalData;
4408}
4409
4410/// addDestination - Add a destination.
4411///
4413 unsigned OpNo = getNumOperands();
4414 if (OpNo+1 > ReservedSpace)
4415 growOperands(); // Get more space!
4416 // Initialize some new operands.
4417 assert(OpNo < ReservedSpace && "Growing didn't work!");
4419 getOperandList()[OpNo] = DestBB;
4420}
4421
4422/// removeDestination - This method removes the specified successor from the
4423/// indirectbr instruction.
4425 assert(idx < getNumOperands()-1 && "Successor index out of range!");
4426
4427 unsigned NumOps = getNumOperands();
4428 Use *OL = getOperandList();
4429
4430 // Replace this value with the last one.
4431 OL[idx+1] = OL[NumOps-1];
4432
4433 // Nuke the last value.
4434 OL[NumOps-1].set(nullptr);
4436}
4437
4438//===----------------------------------------------------------------------===//
4439// FreezeInst Implementation
4440//===----------------------------------------------------------------------===//
4441
4442FreezeInst::FreezeInst(Value *S, const Twine &Name, InsertPosition InsertBefore)
4443 : UnaryInstruction(S->getType(), Freeze, S, InsertBefore) {
4444 setName(Name);
4445}
4446
4447//===----------------------------------------------------------------------===//
4448// cloneImpl() implementations
4449//===----------------------------------------------------------------------===//
4450
4451// Define these methods here so vtables don't get emitted into every translation
4452// unit that uses these classes.
4453
4454GetElementPtrInst *GetElementPtrInst::cloneImpl() const {
4456 return new (AllocMarker) GetElementPtrInst(*this, AllocMarker);
4457}
4458
4462
4464 auto *I = static_cast<FPUnaryOperator *>(Create(getOpcode(), Op<0>()));
4465 I->FMF = FMF;
4466 return I;
4467}
4468
4471 "Should call FPBinaryOperator::cloneImpl!");
4472 return Create(getOpcode(), Op<0>(), Op<1>());
4473}
4474
4476 auto *I =
4477 static_cast<FPBinaryOperator *>(Create(getOpcode(), Op<0>(), Op<1>()));
4478 I->FMF = FMF;
4479 return I;
4480}
4481
4483 auto *I = new FCmpInst(getPredicate(), Op<0>(), Op<1>());
4484 I->FMF = FMF;
4485 return I;
4486}
4487
4489 auto *Result = new ICmpInst(getPredicate(), Op<0>(), Op<1>());
4490 Result->setSameSign(hasSameSign());
4491 return Result;
4492}
4493
4494ExtractValueInst *ExtractValueInst::cloneImpl() const {
4495 return new ExtractValueInst(*this);
4496}
4497
4498InsertValueInst *InsertValueInst::cloneImpl() const {
4499 return new InsertValueInst(*this);
4500}
4501
4504 getOperand(0), getAlign());
4505 Result->setUsedWithInAlloca(isUsedWithInAlloca());
4506 Result->setSwiftError(isSwiftError());
4507 return Result;
4508}
4509
4511 return new LoadInst(getType(), getOperand(0), Twine(), getProperties(),
4512 /*InsertBefore=*/nullptr);
4513}
4514
4516 return new StoreInst(getOperand(0), getOperand(1), getProperties(),
4517 /*InsertBefore=*/nullptr);
4518}
4519
4524 Result->setVolatile(isVolatile());
4525 Result->setWeak(isWeak());
4526 return Result;
4527}
4528
4530 AtomicRMWInst *Result = new AtomicRMWInst(
4533 Result->setVolatile(isVolatile());
4534 return Result;
4535}
4536
4540
4542 return new TruncInst(getOperand(0), getType());
4543}
4544
4546 return new ZExtInst(getOperand(0), getType());
4547}
4548
4550 return new SExtInst(getOperand(0), getType());
4551}
4552
4554 auto *I = new FPTruncInst(getOperand(0), getType());
4555 I->FMF = FMF;
4556 return I;
4557}
4558
4560 auto *I = new FPExtInst(getOperand(0), getType());
4561 I->FMF = FMF;
4562 return I;
4563}
4564
4566 auto *Result = new UIToFPInst(getOperand(0), getType());
4567 Result->FMF = FMF;
4568 return Result;
4569}
4570
4572 auto *Result = new SIToFPInst(getOperand(0), getType());
4573 Result->FMF = FMF;
4574 return Result;
4575}
4576
4578 return new FPToUIInst(getOperand(0), getType());
4579}
4580
4582 return new FPToSIInst(getOperand(0), getType());
4583}
4584
4586 return new PtrToIntInst(getOperand(0), getType());
4587}
4588
4592
4594 return new IntToPtrInst(getOperand(0), getType());
4595}
4596
4598 return new BitCastInst(getOperand(0), getType());
4599}
4600
4604
4605CallInst *CallInst::cloneImpl() const {
4606 if (hasOperandBundles()) {
4610 return new (AllocMarker) CallInst(*this, AllocMarker);
4611 }
4613 return new (AllocMarker) CallInst(*this, AllocMarker);
4614}
4615
4616SelectInst *SelectInst::cloneImpl() const {
4618 I->FMF = FMF;
4619 return I;
4620}
4621
4623 return new VAArgInst(getOperand(0), getType());
4624}
4625
4626ExtractElementInst *ExtractElementInst::cloneImpl() const {
4628}
4629
4630InsertElementInst *InsertElementInst::cloneImpl() const {
4632}
4633
4634BitInsertInst *BitInsertInst::cloneImpl() const {
4636}
4637
4638BitExtractInst *BitExtractInst::cloneImpl() const {
4640}
4641
4645
4646PHINode *PHINode::cloneImpl() const { return new (AllocMarker) PHINode(*this); }
4647
4648LandingPadInst *LandingPadInst::cloneImpl() const {
4649 return new LandingPadInst(*this);
4650}
4651
4652ReturnInst *ReturnInst::cloneImpl() const {
4654 return new (AllocMarker) ReturnInst(*this, AllocMarker);
4655}
4656
4657UncondBrInst *UncondBrInst::cloneImpl() const {
4658 return new (AllocMarker) UncondBrInst(*this);
4659}
4660
4661CondBrInst *CondBrInst::cloneImpl() const {
4662 return new (AllocMarker) CondBrInst(*this);
4663}
4664
4665SwitchInst *SwitchInst::cloneImpl() const { return new SwitchInst(*this); }
4666
4667IndirectBrInst *IndirectBrInst::cloneImpl() const {
4668 return new IndirectBrInst(*this);
4669}
4670
4671InvokeInst *InvokeInst::cloneImpl() const {
4672 if (hasOperandBundles()) {
4676 return new (AllocMarker) InvokeInst(*this, AllocMarker);
4677 }
4679 return new (AllocMarker) InvokeInst(*this, AllocMarker);
4680}
4681
4682CallBrInst *CallBrInst::cloneImpl() const {
4683 if (hasOperandBundles()) {
4687 return new (AllocMarker) CallBrInst(*this, AllocMarker);
4688 }
4690 return new (AllocMarker) CallBrInst(*this, AllocMarker);
4691}
4692
4693ResumeInst *ResumeInst::cloneImpl() const {
4694 return new (AllocMarker) ResumeInst(*this);
4695}
4696
4697CleanupReturnInst *CleanupReturnInst::cloneImpl() const {
4699 return new (AllocMarker) CleanupReturnInst(*this, AllocMarker);
4700}
4701
4702CatchReturnInst *CatchReturnInst::cloneImpl() const {
4703 return new (AllocMarker) CatchReturnInst(*this);
4704}
4705
4706CatchSwitchInst *CatchSwitchInst::cloneImpl() const {
4707 return new CatchSwitchInst(*this);
4708}
4709
4710FuncletPadInst *FuncletPadInst::cloneImpl() const {
4712 return new (AllocMarker) FuncletPadInst(*this, AllocMarker);
4713}
4714
4716 LLVMContext &Context = getContext();
4717 return new UnreachableInst(Context);
4718}
4719
4720bool UnreachableInst::shouldLowerToTrap(bool TrapUnreachable,
4721 bool NoTrapAfterNoreturn) const {
4722 if (!TrapUnreachable)
4723 return false;
4724
4725 // We may be able to ignore unreachable behind a noreturn call.
4727 Call && Call->doesNotReturn()) {
4728 if (NoTrapAfterNoreturn)
4729 return false;
4730 // Do not emit an additional trap instruction.
4731 if (Call->isNonContinuableTrap())
4732 return false;
4733 }
4734
4735 if (getFunction()->hasFnAttribute(Attribute::Naked))
4736 return false;
4737
4738 return true;
4739}
4740
4742 return new FreezeInst(getOperand(0));
4743}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT S1
Rewrite undef for PHI
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Atomic ordering constants.
@ FnAttr
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:215
This file contains the declarations for the subclasses of Constant, which represent the different fla...
@ Default
static bool isSigned(unsigned Opcode)
#define op(i)
Module.h This file contains the declarations for the Module class.
static Align computeLoadStoreDefaultAlign(Type *Ty, InsertPosition Pos)
static bool isImpliedFalseByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
static Value * createPlaceholderForShuffleVector(Value *V)
static Align computeAllocaDefaultAlign(Type *Ty, InsertPosition Pos)
static cl::opt< bool > DisableI2pP2iOpt("disable-i2p-p2i-opt", cl::init(false), cl::desc("Disables inttoptr/ptrtoint roundtrip optimization"))
static bool hasNonZeroFPOperands(const CmpInst *Cmp)
static int matchShuffleAsBitRotate(ArrayRef< int > Mask, int NumSubElts)
Try to lower a vector shuffle as a bit rotation.
static Type * getIndexedTypeInternal(Type *Ty, ArrayRef< IndexTy > IdxList)
static bool isReplicationMaskWithParams(ArrayRef< int > Mask, int ReplicationFactor, int VF)
static bool isIdentityMaskImpl(ArrayRef< int > Mask, int NumOpElts)
static bool isSingleSourceMaskImpl(ArrayRef< int > Mask, int NumOpElts)
static Value * getAISize(LLVMContext &Context, Value *Amt)
static bool isImpliedTrueByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file contains the declarations for metadata subclasses.
#define T
uint64_t IntrinsicInst * II
#define P(N)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file implements the SmallBitVector class.
This file defines the SmallVector class.
#define LLVM_DEBUG(...)
Definition Debug.h:119
static SymbolRef::Type getType(const Symbol *Sym)
Definition TapiFile.cpp:39
Value * RHS
Value * LHS
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
Definition APFloat.h:351
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
Definition APFloat.cpp:6121
Class for arbitrary precision integers.
Definition APInt.h:78
void setBit(unsigned BitPosition)
Set the given bit to 1 whose position is given as "bitPosition".
Definition APInt.h:1350
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
Definition APInt.h:376
unsigned countr_zero() const
Count the number of trailing zero bits.
Definition APInt.h:1659
unsigned countl_zero() const
The APInt version of std::countl_zero.
Definition APInt.h:1618
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
This class represents a conversion between pointers from one address space to another.
LLVM_ABI AddrSpaceCastInst * cloneImpl() const
Clone an identical AddrSpaceCastInst.
LLVM_ABI AddrSpaceCastInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI std::optional< TypeSize > getAllocationSizeInBits(const DataLayout &DL) const
Get allocation size in bits.
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
LLVM_ABI bool isStaticAlloca() const
Return true if this alloca is in the entry block of the function and is a constant size.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI TypeSize getAllocationBaseSize(const DataLayout &DL) const
Get the size of the allocated type.
LLVM_ABI AllocaInst * cloneImpl() const
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
unsigned getAddressSpace() const
Return the address space for the allocation.
LLVM_ABI std::optional< TypeSize > getAllocationSize(const DataLayout &DL) const
Get allocation size in bytes.
LLVM_ABI bool isArrayAllocation() const
Return true if there is an allocation size parameter to the allocation instruction that is not 1.
void setAlignment(Align Align)
const Value * getArraySize() const
Get the number of elements allocated.
LLVM_ABI AllocaInst(Type *Ty, unsigned AddrSpace, Value *ArraySize, const Twine &Name, InsertPosition InsertBefore)
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
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition ArrayRef.h:185
Class to represent array types.
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this cmpxchg instruction.
bool isVolatile() const
Return true if this is a cmpxchg from a volatile memory location.
void setFailureOrdering(AtomicOrdering Ordering)
Sets the failure ordering constraint of this cmpxchg instruction.
AtomicOrdering getFailureOrdering() const
Returns the failure ordering constraint of this cmpxchg instruction.
void setSuccessOrdering(AtomicOrdering Ordering)
Sets the success ordering constraint of this cmpxchg instruction.
LLVM_ABI AtomicCmpXchgInst * cloneImpl() const
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
bool isWeak() const
Return true if this cmpxchg may spuriously fail.
void setAlignment(Align Align)
AtomicOrdering getSuccessOrdering() const
Returns the success ordering constraint of this cmpxchg instruction.
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this cmpxchg instruction.
LLVM_ABI AtomicCmpXchgInst(Value *Ptr, Value *Cmp, Value *NewVal, Align Alignment, AtomicOrdering SuccessOrdering, AtomicOrdering FailureOrdering, SyncScope::ID SSID, InsertPosition InsertBefore=nullptr)
bool isElementwise() const
Return true if this RMW has elementwise vector semantics.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
LLVM_ABI AtomicRMWInst * cloneImpl() const
bool isVolatile() const
Return true if this is a RMW on a volatile memory location.
LLVM_ABI AtomicRMWInst(BinOp Operation, Value *Ptr, Value *Val, Align Alignment, AtomicOrdering Ordering, SyncScope::ID SSID, bool Elementwise=false, InsertPosition InsertBefore=nullptr)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
@ Nand
*p = ~(old & v)
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this rmw instruction.
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this rmw instruction.
void setOperation(BinOp Operation)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
BinOp getOperation() const
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this rmw instruction.
void setAlignment(Align Align)
void setElementwise(bool V)
Specify whether this RMW has elementwise vector semantics.
static LLVM_ABI StringRef getOperationName(BinOp Op)
AtomicOrdering getOrdering() const
Returns the ordering constraint of this rmw instruction.
LLVM_ABI CaptureInfo getCaptureInfo() const
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:125
static LLVM_ABI Attribute getWithMemoryEffects(LLVMContext &Context, MemoryEffects ME)
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:266
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
LLVM_ABI const DataLayout & getDataLayout() const
Get the data layout of the module this basic block belongs to.
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
Definition InstrTypes.h:409
LLVM_ABI bool swapOperands()
Exchange the two operands to this instruction.
static LLVM_ABI BinaryOperator * CreateNot(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition InstrTypes.h:216
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
LLVM_ABI BinaryOperator(BinaryOps iType, Value *S1, Value *S2, Type *Ty, const Twine &Name, InsertPosition InsertBefore)
static LLVM_ABI BinaryOperator * CreateNSWNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
LLVM_ABI BinaryOperator * cloneImpl() const
This class represents a no-op cast from one type to another.
LLVM_ABI BitCastInst * cloneImpl() const
Clone an identical BitCastInst.
LLVM_ABI BitCastInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI BitExtractInst * cloneImpl() const
Clone an identical BitExtractInst.
static LLVM_ABI const char * areInvalidOperands(const Type *Ty, Value *Val, Value *Offset)
Return a string if the specified operands are invalid for a bitextract operation, otherwise return nu...
static BitExtractInst * Create(Type *Ty, Value *Src, Value *Offset, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI const char * areInvalidOperands(Value *Base, Value *Val, Value *Offset)
Return a string if the specified operands are invalid for a bitinsert operation, otherwise return nul...
static BitInsertInst * Create(Value *Base, Value *Val, Value *Offset, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI BitInsertInst * cloneImpl() const
Clone an identical BitInsertInst.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
LLVM_ABI FPClassTest getParamNoFPClass(unsigned i) const
Extract a test mask for disallowed floating-point value classes for the parameter.
bool isInlineAsm() const
Check if this call is an inline asm statement.
LLVM_ABI BundleOpInfo & getBundleOpInfoForOperand(unsigned OpIdx)
Return the BundleOpInfo for the operand at index OpIdx.
void setCallingConv(CallingConv::ID CC)
LLVM_ABI FPClassTest getRetNoFPClass() const
Extract a test mask for disallowed floating-point value classes for the return value.
bundle_op_iterator bundle_op_info_begin()
Return the start of the list of BundleOpInfo instances associated with this OperandBundleUser.
LLVM_ABI bool paramHasNonNullAttr(unsigned ArgNo, bool AllowUndefOrPoison) const
Return true if this argument has the nonnull attribute on either the CallBase instruction or the call...
LLVM_ABI MemoryEffects getMemoryEffects() const
void addFnAttr(Attribute::AttrKind Kind)
Adds the attribute to the function.
LLVM_ABI bool doesNotAccessMemory() const
Determine if the call does not access memory.
LLVM_ABI void getOperandBundlesAsDefs(SmallVectorImpl< OperandBundleDef > &Defs) const
Return the list of operand bundles attached to this instruction as a vector of OperandBundleDefs.
LLVM_ABI void setOnlyAccessesArgMemory()
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
OperandBundleUse operandBundleFromBundleOpInfo(const BundleOpInfo &BOI) const
Simple helper function to map a BundleOpInfo to an OperandBundleUse.
LLVM_ABI void setOnlyAccessesInaccessibleMemOrArgMem()
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
LLVM_ABI void setDoesNotAccessMemory()
AttributeSet getParamAttributes(unsigned ArgNo) const
Return the param attributes for this call.
bool hasRetAttr(Attribute::AttrKind Kind) const
Determine whether the return value has the given attribute.
LLVM_ABI bool onlyAccessesInaccessibleMemory() const
Determine if the function may only access memory that is inaccessible from the IR.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
CallingConv::ID getCallingConv() const
bundle_op_iterator bundle_op_info_end()
Return the end of the list of BundleOpInfo instances associated with this OperandBundleUser.
LLVM_ABI unsigned getNumSubclassExtraOperandsDynamic() const
Get the number of extra operands for instructions that don't have a fixed number of extra operands.
BundleOpInfo * bundle_op_iterator
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
User::op_iterator arg_begin()
Return the iterator pointing to the beginning of the argument list.
LLVM_ABI bool isMustTailCall() const
Tests if this call site must be tail call optimized.
LLVM_ABI bool isIndirectCall() const
Return true if the callsite is an indirect call.
LLVM_ABI bool onlyReadsMemory() const
Determine if the call does not access or only reads memory.
bool isByValArgument(unsigned ArgNo) const
Determine whether this argument is passed by value.
iterator_range< bundle_op_iterator > bundle_op_infos()
Return the range [bundle_op_info_begin, bundle_op_info_end).
LLVM_ABI void setOnlyReadsMemory()
static LLVM_ABI CallBase * addOperandBundle(CallBase *CB, uint32_t ID, OperandBundleDef OB, InsertPosition InsertPt=nullptr)
Create a clone of CB with operand bundle OB added.
LLVM_ABI bool onlyAccessesInaccessibleMemOrArgMem() const
Determine if the function may only access memory that is either inaccessible from the IR or pointed t...
static LLVM_ABI CallBase * removeOperandBundleAt(CallBase *CB, size_t Offset, InsertPosition InsertPtr=nullptr)
LLVM_ABI CaptureInfo getCaptureInfo(unsigned OpNo) const
Return which pointer components this operand may capture.
LLVM_ABI bool hasArgumentWithAdditionalReturnCaptureComponents() const
Returns whether the call has an argument that has an attribute like captures(ret: address,...
CallBase(AttributeList const &A, FunctionType *FT, ArgsTy &&... Args)
Value * getCalledOperand() const
LLVM_ABI void setOnlyWritesMemory()
LLVM_ABI op_iterator populateBundleOperandInfos(ArrayRef< OperandBundleDef > Bundles, const unsigned BeginIndex)
Populate the BundleOpInfo instances and the Use& vector from Bundles.
AttributeList Attrs
parameter attributes for callable
bool hasOperandBundlesOtherThan(ArrayRef< uint32_t > IDs) const
Return true if this operand bundle user contains operand bundles with tags other than those specified...
LLVM_ABI std::optional< ConstantRange > getRange() const
If this return value has a range attribute, return the value range of the argument.
LLVM_ABI bool isReturnNonNull() const
Return true if the return value is known to be not null.
Value * getArgOperand(unsigned i) const
FunctionType * FTy
uint64_t getRetDereferenceableBytes() const
Extract the number of dereferenceable bytes for a call or parameter (0=unknown).
User::op_iterator arg_end()
Return the iterator pointing to the end of the argument list.
FunctionType * getFunctionType() const
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
static unsigned CountBundleInputs(ArrayRef< OperandBundleDef > Bundles)
Return the total number of values used in Bundles.
LLVM_ABI Value * getArgOperandWithAttribute(Attribute::AttrKind Kind) const
If one of the arguments has the specified attribute, returns its operand value.
LLVM_ABI void setOnlyAccessesInaccessibleMemory()
static LLVM_ABI CallBase * Create(CallBase *CB, ArrayRef< OperandBundleDef > Bundles, InsertPosition InsertPt=nullptr)
Create a clone of CB with a different set of operand bundles and insert it before InsertPt.
LLVM_ABI bool onlyWritesMemory() const
Determine if the call does not access or only writes memory.
LLVM_ABI bool hasClobberingOperandBundles() const
Return true if this operand bundle user has operand bundles that may write to the heap.
void setCalledOperand(Value *V)
static LLVM_ABI CallBase * removeOperandBundle(CallBase *CB, uint32_t ID, InsertPosition InsertPt=nullptr)
Create a clone of CB with operand bundle ID removed.
LLVM_ABI bool hasReadingOperandBundles() const
Return true if this operand bundle user has operand bundles that may read from the heap.
LLVM_ABI bool onlyAccessesArgMemory() const
Determine if the call can access memmory only using pointers based on its arguments.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
LLVM_ABI void setMemoryEffects(MemoryEffects ME)
bool hasOperandBundles() const
Return true if this User has any operand bundles.
LLVM_ABI bool isTailCall() const
Tests if this call site is marked as a tail call.
LLVM_ABI Function * getCaller()
Helper to get the caller (the parent function).
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
SmallVector< BasicBlock *, 16 > getIndirectDests() const
void setDefaultDest(BasicBlock *B)
void setIndirectDest(unsigned i, BasicBlock *B)
BasicBlock * getDefaultDest() const
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
LLVM_ABI CallBrInst * cloneImpl() const
This class represents a function call, abstracting a target machine's calling convention.
LLVM_ABI void updateProfWeight(uint64_t S, uint64_t T)
Updates profile metadata by scaling it by S / T.
TailCallKind getTailCallKind() const
LLVM_ABI CallInst * cloneImpl() const
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Represents which components of the pointer may be captured in which location.
Definition ModRef.h:414
CaptureComponents getOtherComponents() const
Get components potentially captured through locations other than the return value.
Definition ModRef.h:446
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
Definition ModRef.h:427
static CaptureInfo all()
Create CaptureInfo that may capture all components of the pointer.
Definition ModRef.h:430
CaptureComponents getRetComponents() const
Get components potentially captured by the return value.
Definition ModRef.h:442
static LLVM_ABI Instruction::CastOps getCastOpcode(const Value *Val, bool SrcIsSigned, Type *Ty, bool DstIsSigned)
Returns the opcode necessary to cast Val into Ty using usual casting rules.
static LLVM_ABI CastInst * CreatePointerBitCastOrAddrSpaceCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast or an AddrSpaceCast cast instruction.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Definition InstrTypes.h:674
static LLVM_ABI unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, const DataLayout *DL)
Determine how a pair of casts can be eliminated, if they can be at all.
static LLVM_ABI CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static LLVM_ABI CastInst * CreateFPCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create an FPExt, BitCast, or FPTrunc for fp -> fp casts.
CastInst(Type *Ty, unsigned iType, Value *S, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics for subclasses.
Definition InstrTypes.h:515
static LLVM_ABI bool isBitOrNoopPointerCastable(Type *SrcTy, Type *DestTy, const DataLayout &DL)
Check whether a bitcast, inttoptr, or ptrtoint cast between these types is valid and a no-op.
static LLVM_ABI bool isBitCastable(Type *SrcTy, Type *DestTy)
Check whether a bitcast between these types is valid.
static LLVM_ABI CastInst * CreateTruncOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
static LLVM_ABI CastInst * CreatePointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, AddrSpaceCast or a PtrToInt cast instruction.
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static LLVM_ABI bool isNoopCast(Instruction::CastOps Opcode, Type *SrcTy, Type *DstTy, const DataLayout &DL)
A no-op cast is one that can be effected without changing any bits.
static LLVM_ABI CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
LLVM_ABI bool isIntegerCast() const
There are several places where we need to know if a cast instruction only deals with integer source a...
static LLVM_ABI CastInst * CreateSExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a SExt or BitCast cast instruction.
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
LLVM_ABI CatchReturnInst * cloneImpl() const
void setUnwindDest(BasicBlock *UnwindDest)
LLVM_ABI void addHandler(BasicBlock *Dest)
Add an entry to the switch instruction... Note: This action invalidates handler_end().
LLVM_ABI CatchSwitchInst * cloneImpl() const
mapped_iterator< op_iterator, DerefFnTy > handler_iterator
Value * getParentPad() const
void setParentPad(Value *ParentPad)
BasicBlock * getUnwindDest() const
LLVM_ABI void removeHandler(handler_iterator HI)
LLVM_ABI CleanupReturnInst * cloneImpl() const
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Predicate getStrictPredicate() const
For example, SGE -> SGT, SLE -> SLT, ULE -> ULT, UGE -> UGT.
Definition InstrTypes.h:921
bool isEquality() const
Determine if this is an equals/not equals predicate.
Definition InstrTypes.h:978
void setPredicate(Predicate P)
Set the predicate for this instruction to the specified value.
Definition InstrTypes.h:831
bool isFalseWhenEqual() const
This is just a convenience.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition InstrTypes.h:743
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition InstrTypes.h:757
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition InstrTypes.h:746
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition InstrTypes.h:755
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition InstrTypes.h:744
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition InstrTypes.h:754
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition InstrTypes.h:751
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition InstrTypes.h:752
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition InstrTypes.h:749
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition InstrTypes.h:756
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition InstrTypes.h:753
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition InstrTypes.h:742
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition InstrTypes.h:750
LLVM_ABI bool isEquivalence(bool Invert=false) const
Determine if one operand of this compare can always be replaced by the other operand,...
bool isSigned() const
Definition InstrTypes.h:993
static LLVM_ABI bool isEquality(Predicate pred)
Determine if this is an equals/not equals predicate.
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Definition InstrTypes.h:890
bool isTrueWhenEqual() const
This is just a convenience.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
static bool isFPPredicate(Predicate P)
Definition InstrTypes.h:833
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:934
static LLVM_ABI CmpInst * CreateWithCopiedFlags(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Instruction *FlagsSource, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate, the two operands and the instructio...
LLVM_ABI CmpInst(Type *ty, Instruction::OtherOps op, Predicate pred, Value *LHS, Value *RHS, const Twine &Name="", InsertPosition InsertBefore=nullptr)
bool isNonStrictPredicate() const
Definition InstrTypes.h:915
LLVM_ABI void swapOperands()
This is just a convenience that dispatches to the subclasses.
static bool isRelational(Predicate P)
Return true if the predicate is relational (not EQ or NE).
Definition InstrTypes.h:986
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
static LLVM_ABI StringRef getPredicateName(Predicate P)
Predicate getPredicate() const
Return the predicate for this instruction.
Definition InstrTypes.h:828
bool isStrictPredicate() const
Definition InstrTypes.h:906
static LLVM_ABI bool isUnordered(Predicate predicate)
Determine if the predicate is an unordered operation.
Predicate getFlippedStrictnessPredicate() const
For predicate of kind "is X or equal to 0" returns the predicate "is X".
Definition InstrTypes.h:956
static bool isIntPredicate(Predicate P)
Definition InstrTypes.h:839
static LLVM_ABI bool isOrdered(Predicate predicate)
Determine if the predicate is an ordered operation.
bool isUnsigned() const
Definition InstrTypes.h:999
LLVM_ABI bool isCommutative() const
This is just a convenience that dispatches to the subclasses.
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI std::optional< CmpPredicate > getMatching(CmpPredicate A, CmpPredicate B)
Compares two CmpPredicates taking samesign into account and returns the canonicalized CmpPredicate if...
static LLVM_ABI CmpPredicate getInverse(CmpPredicate P)
Get the inverse predicate of a CmpPredicate.
CmpPredicate()
Default constructor.
static LLVM_ABI CmpPredicate get(const CmpInst *Cmp)
Do a ICmpInst::getCmpPredicate() or CmpInst::getPredicate(), as appropriate.
LLVM_ABI CmpInst::Predicate getPreferredSignedPredicate() const
Attempts to return a signed CmpInst::Predicate from the CmpPredicate.
bool hasSameSign() const
Query samesign information, for optimizations.
static LLVM_ABI CmpPredicate getSwapped(CmpPredicate P)
Get the swapped predicate of a CmpPredicate.
Conditional Branch instruction.
LLVM_ABI void swapSuccessors()
Swap the successors of this branch instruction.
LLVM_ABI CondBrInst * cloneImpl() const
Value * getCondition() const
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:420
const APFloat & getValueAPF() const
Definition Constants.h:463
This is the shared class of boolean and integer constants.
Definition Constants.h:87
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:305
LLVM_ABI ExtractElementInst * cloneImpl() const
static ExtractElementInst * Create(Value *Vec, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI bool isValidOperands(const Value *Vec, const Value *Idx)
Return true if an extractelement instruction can be formed with the specified operands.
This instruction extracts a struct member or array element value from an aggregate value.
static LLVM_ABI Type * getIndexedType(Type *Agg, ArrayRef< unsigned > Idxs)
Returns the type of the element that would be extracted with an extractvalue instruction with the spe...
LLVM_ABI ExtractValueInst * cloneImpl() const
This instruction compares its operands according to the predicate given to the constructor.
bool isEquality() const
static LLVM_ABI bool compare(const APFloat &LHS, const APFloat &RHS, FCmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
LLVM_ABI FCmpInst * cloneImpl() const
Clone an identical FCmpInst.
FCmpInst(InsertPosition InsertBefore, Predicate pred, Value *LHS, Value *RHS, const Twine &NameStr="")
Constructor with insertion semantics.
Binary operators support fast-math flags, users should not use this class directly,...
Definition InstrTypes.h:476
This class represents an extension of floating point types.
LLVM_ABI FPExtInst * cloneImpl() const
Clone an identical FPExtInst.
LLVM_ABI FPExtInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI float getFPAccuracy() const
Get the maximum error permitted by this operation in ULPs.
This class represents a cast from floating point to signed integer.
LLVM_ABI FPToSIInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI FPToSIInst * cloneImpl() const
Clone an identical FPToSIInst.
This class represents a cast from floating point to unsigned integer.
LLVM_ABI FPToUIInst * cloneImpl() const
Clone an identical FPToUIInst.
LLVM_ABI FPToUIInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
This class represents a truncation of floating point types.
LLVM_ABI FPTruncInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI FPTruncInst * cloneImpl() const
Clone an identical FPTruncInst.
Unary operators support fast-math flags, users should not use this class directly,...
Definition InstrTypes.h:179
LLVM_ABI FenceInst(LLVMContext &C, AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System, InsertPosition InsertBefore=nullptr)
SyncScope::ID getSyncScopeID() const
Returns the synchronization scope ID of this fence instruction.
void setSyncScopeID(SyncScope::ID SSID)
Sets the synchronization scope ID of this fence instruction.
LLVM_ABI FenceInst * cloneImpl() const
friend class Instruction
Iterator for Instructions in a `BasicBlock.
void setOrdering(AtomicOrdering Ordering)
Sets the ordering constraint of this fence instruction.
AtomicOrdering getOrdering() const
Returns the ordering constraint of this fence instruction.
Class to represent fixed width SIMD vectors.
LLVM_ABI FreezeInst(Value *S, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI FreezeInst * cloneImpl() const
Clone an identical FreezeInst.
void setParentPad(Value *ParentPad)
Value * getParentPad() const
Convenience accessors.
LLVM_ABI FuncletPadInst * cloneImpl() const
Class to represent function types.
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type * getParamType(unsigned i) const
Parameter type accessors.
bool isVarArg() const
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
GEPNoWrapFlags withoutInBounds() const
unsigned getRaw() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
LLVM_ABI bool isInBounds() const
Determine whether the GEP has the inbounds flag.
LLVM_ABI bool hasNoUnsignedSignedWrap() const
Determine whether the GEP has the nusw flag.
static LLVM_ABI Type * getTypeAtIndex(Type *Ty, Value *Idx)
Return the type of the element at the given index of an indexable type.
LLVM_ABI bool hasAllZeroIndices() const
Return true if all of the indices of this GEP are zeros.
LLVM_ABI bool hasNoUnsignedWrap() const
Determine whether the GEP has the nuw flag.
LLVM_ABI bool hasAllConstantIndices() const
Return true if all of the indices of this GEP are constant integers.
LLVM_ABI void setIsInBounds(bool b=true)
Set or clear the inbounds flag on this GEP instruction.
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
LLVM_ABI bool accumulateConstantOffset(const DataLayout &DL, APInt &Offset) const
Accumulate the constant address offset of this GEP if possible.
LLVM_ABI GetElementPtrInst * cloneImpl() const
LLVM_ABI bool collectOffset(const DataLayout &DL, unsigned BitWidth, SmallMapVector< Value *, APInt, 4 > &VariableOffsets, APInt &ConstantOffset) const
LLVM_ABI void setNoWrapFlags(GEPNoWrapFlags NW)
Set nowrap flags for GEP instruction.
LLVM_ABI GEPNoWrapFlags getNoWrapFlags() const
Get the nowrap flags for the GEP instruction.
Module * getParent()
Get the module that this global value is contained inside of...
This instruction compares its operands according to the predicate given to the constructor.
bool hasSameSign() const
An icmp instruction, which can be marked as "samesign", indicating that the two operands have the sam...
ICmpInst(InsertPosition InsertBefore, Predicate pred, Value *LHS, Value *RHS, const Twine &NameStr="")
Constructor with insertion semantics.
static LLVM_ABI bool compare(const APInt &LHS, const APInt &RHS, ICmpInst::Predicate Pred)
Return result of LHS Pred RHS comparison.
LLVM_ABI ICmpInst * cloneImpl() const
Clone an identical ICmpInst.
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
Predicate getSignedPredicate() const
For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
static CmpPredicate getInverseCmpPredicate(CmpPredicate Pred)
bool isEquality() const
Return true if this predicate is either EQ or NE.
static LLVM_ABI Predicate getFlippedSignednessPredicate(Predicate Pred)
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
static LLVM_ABI std::optional< bool > isImpliedByMatchingCmp(CmpPredicate Pred1, CmpPredicate Pred2)
Determine if Pred1 implies Pred2 is true, false, or if nothing can be inferred about the implication,...
Predicate getUnsignedPredicate() const
For example, EQ->EQ, SLE->ULE, UGT->UGT, etc.
Indirect Branch Instruction.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
LLVM_ABI void removeDestination(unsigned i)
This method removes the specified successor from the indirectbr instruction.
LLVM_ABI IndirectBrInst * cloneImpl() const
LLVM_ABI InsertElementInst * cloneImpl() const
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI bool isValidOperands(const Value *Vec, const Value *NewElt, const Value *Idx)
Return true if an insertelement instruction can be formed with the specified operands.
bool isValid() const
Definition Instruction.h:59
BasicBlock * getBasicBlock()
Definition Instruction.h:60
This instruction inserts a struct field of array element value into an aggregate value.
LLVM_ABI InsertValueInst * cloneImpl() const
BitfieldElement::Type getSubclassData() const
LLVM_ABI bool hasNoNaNs() const LLVM_READONLY
Determine whether the no-NaNs flag is set.
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...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
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 bool isVolatile() const LLVM_READONLY
Return true if this instruction has a volatile memory access.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Bitfield::Element< uint16_t, 0, 16 > OpaqueField
Instruction(const Instruction &)=delete
friend class Value
friend class BasicBlock
Various leaf nodes.
void setSubclassData(typename BitfieldElement::Type Value)
This class represents a cast from an integer to a pointer.
LLVM_ABI IntToPtrInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI IntToPtrInst * cloneImpl() const
Clone an identical IntToPtrInst.
Invoke instruction.
BasicBlock * getUnwindDest() const
void setNormalDest(BasicBlock *B)
LLVM_ABI InvokeInst * cloneImpl() const
LLVM_ABI LandingPadInst * getLandingPadInst() const
Get the landingpad instruction from the landing pad block (the unwind destination).
void setUnwindDest(BasicBlock *B)
LLVM_ABI void updateProfWeight(uint64_t S, uint64_t T)
Updates profile metadata by scaling it by S / T.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVMContextImpl *const pImpl
Definition LLVMContext.h:70
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.
LLVM_ABI LandingPadInst * cloneImpl() const
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
void setElementwise(bool V)
Specify whether this is an elementwise atomic load or not.
void setAlignment(Align Align)
bool isVolatile() const
Return true if this is a load from a volatile memory location.
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this load instruction.
LLVM_ABI LoadInst * cloneImpl() const
void setVolatile(bool V)
Specify whether this is a volatile load or not.
LoadStoreInstProperties getProperties() const
Returns the properties of this load instruction.
LLVM_ABI LoadInst(Type *Ty, Value *Ptr, const Twine &NameStr, InsertPosition InsertBefore)
Metadata node.
Definition Metadata.h:1081
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1437
static MemoryEffectsBase readOnly()
Definition ModRef.h:133
bool onlyWritesMemory() const
Whether this function only (at most) writes memory.
Definition ModRef.h:252
bool doesNotAccessMemory() const
Whether this function accesses no memory.
Definition ModRef.h:246
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:143
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:149
bool onlyAccessesInaccessibleMem() const
Whether this function only (at most) accesses inaccessible memory.
Definition ModRef.h:265
bool onlyAccessesArgPointees() const
Whether this function only (at most) accesses argument memory.
Definition ModRef.h:255
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
Definition ModRef.h:249
static MemoryEffectsBase writeOnly()
Definition ModRef.h:138
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Definition ModRef.h:166
static MemoryEffectsBase none()
Definition ModRef.h:128
bool onlyAccessesInaccessibleOrArgMem() const
Whether this function only (at most) accesses argument and inaccessible memory.
Definition ModRef.h:305
StringRef getTag() const
void allocHungoffUses(unsigned N)
const_block_iterator block_begin() const
LLVM_ABI void removeIncomingValueIf(function_ref< bool(unsigned)> Predicate, bool DeletePHIIfEmpty=true)
Remove all incoming values for which the predicate returns true.
void setIncomingBlock(unsigned i, BasicBlock *BB)
LLVM_ABI Value * removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty=true)
Remove an incoming value.
LLVM_ABI bool hasConstantOrUndefValue() const
Whether the specified PHI node always merges together the same value, assuming undefs are equal to a ...
void setIncomingValue(unsigned i, Value *V)
const_block_iterator block_end() const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
LLVM_ABI Value * hasConstantValue() const
If the specified PHI node always merges together the same value, return the value,...
LLVM_ABI PHINode * cloneImpl() const
unsigned getNumIncomingValues() const
Return the number of incoming edges.
Class to represent pointers.
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents a cast from a pointer to an address (non-capturing ptrtoint).
LLVM_ABI PtrToAddrInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI PtrToAddrInst * cloneImpl() const
Clone an identical PtrToAddrInst.
This class represents a cast from a pointer to an integer.
LLVM_ABI PtrToIntInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI PtrToIntInst * cloneImpl() const
Clone an identical PtrToIntInst.
Resume the propagation of an exception.
LLVM_ABI ResumeInst * cloneImpl() const
Return a value (possibly void), from a function.
LLVM_ABI ReturnInst * cloneImpl() const
This class represents a sign extension of integer types.
LLVM_ABI SExtInst * cloneImpl() const
Clone an identical SExtInst.
LLVM_ABI SExtInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
This class represents a cast from signed integer to floating point.
LLVM_ABI SIToFPInst * cloneImpl() const
Clone an identical SIToFPInst.
LLVM_ABI SIToFPInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
Class to represent scalable SIMD vectors.
LLVM_ABI SelectInst * cloneImpl() const
static LLVM_ABI const char * areInvalidOperands(Value *Cond, Value *True, Value *False)
Return a string if the specified operands are invalid for a select operation, otherwise return null.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
static LLVM_ABI bool isZeroEltSplatMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses all elements with the same value as the first element of exa...
ArrayRef< int > getShuffleMask() const
static LLVM_ABI bool isSpliceMask(ArrayRef< int > Mask, int NumSrcElts, int &Index)
Return true if this shuffle mask is a splice mask, concatenating the two inputs together and then ext...
int getMaskValue(unsigned Elt) const
Return the shuffle mask value of this instruction for the given element index.
LLVM_ABI ShuffleVectorInst(Value *V1, Value *Mask, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
static LLVM_ABI bool isSelectMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses elements from its source vectors without lane crossings.
static LLVM_ABI bool isBitRotateMask(ArrayRef< int > Mask, unsigned EltSizeInBits, unsigned MinSubElts, unsigned MaxSubElts, unsigned &NumSubElts, unsigned &RotateAmt)
Checks if the shuffle is a bit rotation of the first operand across multiple subelements,...
VectorType * getType() const
Overload to return most specific vector type.
LLVM_ABI bool isIdentityWithExtract() const
Return true if this shuffle extracts the first N elements of exactly one source vector.
static LLVM_ABI bool isOneUseSingleSourceMask(ArrayRef< int > Mask, int VF)
Return true if this shuffle mask represents "clustered" mask of size VF, i.e.
LLVM_ABI bool isIdentityWithPadding() const
Return true if this shuffle lengthens exactly one source vector with undefs in the high elements.
static LLVM_ABI bool isSingleSourceMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses elements from exactly one source vector.
LLVM_ABI bool isConcat() const
Return true if this shuffle concatenates its 2 source vectors.
static LLVM_ABI bool isDeInterleaveMaskOfFactor(ArrayRef< int > Mask, unsigned Factor, unsigned &Index)
Check if the mask is a DE-interleave mask of the given factor Factor like: <Index,...
LLVM_ABI ShuffleVectorInst * cloneImpl() const
static LLVM_ABI bool isIdentityMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses elements from exactly one source vector without lane crossin...
static LLVM_ABI bool isExtractSubvectorMask(ArrayRef< int > Mask, int NumSrcElts, int &Index)
Return true if this shuffle mask is an extract subvector mask.
LLVM_ABI void setShuffleMask(ArrayRef< int > Mask)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI bool isInterleave(unsigned Factor)
Return if this shuffle interleaves its two input vectors together.
static LLVM_ABI bool isReverseMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask swaps the order of elements from exactly one source vector.
static LLVM_ABI bool isTransposeMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask is a transpose mask.
LLVM_ABI void commute()
Swap the operands and adjust the mask to preserve the semantics of the instruction.
static LLVM_ABI bool isInsertSubvectorMask(ArrayRef< int > Mask, int NumSrcElts, int &NumSubElts, int &Index)
Return true if this shuffle mask is an insert subvector mask.
static LLVM_ABI Constant * convertShuffleMaskForBitcode(ArrayRef< int > Mask, Type *ResultTy)
static LLVM_ABI bool isReplicationMask(ArrayRef< int > Mask, int &ReplicationFactor, int &VF)
Return true if this shuffle mask replicates each of the VF elements in a vector ReplicationFactor tim...
static LLVM_ABI bool isInterleaveMask(ArrayRef< int > Mask, unsigned Factor, unsigned NumInputElts, SmallVectorImpl< unsigned > &StartIndexes)
Return true if the mask interleaves one or more input vectors together.
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
void setVolatile(bool V)
Specify whether this is a volatile store or not.
void setAlignment(Align Align)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LoadStoreInstProperties getProperties() const
Returns the properties of this store instruction.
LLVM_ABI StoreInst * cloneImpl() const
void setElementwise(bool V)
Specify whether this is an elementwise atomic store or not.
LLVM_ABI StoreInst(Value *Val, Value *Ptr, InsertPosition InsertBefore)
bool isVolatile() const
Return true if this is a store to a volatile memory location.
void setAtomic(AtomicOrdering Ordering, SyncScope::ID SSID=SyncScope::System)
Sets the ordering constraint and the synchronization scope ID of this store instruction.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Class to represent struct types.
LLVM_ABI void setSuccessorWeight(unsigned idx, CaseWeightOpt W)
LLVM_ABI Instruction::InstListType::iterator eraseFromParent()
Delegate the call to the underlying SwitchInst::eraseFromParent() and mark this object to not touch t...
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest, CaseWeightOpt W)
Delegate the call to the underlying SwitchInst::addCase() and set the specified branch weight for the...
LLVM_ABI CaseWeightOpt getSuccessorWeight(unsigned idx)
LLVM_ABI void replaceDefaultDest(SwitchInst::CaseIt I)
Replace the default destination by given case.
std::optional< uint32_t > CaseWeightOpt
LLVM_ABI SwitchInst::CaseIt removeCase(SwitchInst::CaseIt I)
Delegate the call to the underlying SwitchInst::removeCase() and remove correspondent branch weight.
void setValue(ConstantInt *V) const
Sets the new value for current case.
void setSuccessor(BasicBlock *S) const
Sets the new successor for current case.
Multiway switch.
void allocHungoffUses(unsigned N)
LLVM_ABI SwitchInst * cloneImpl() const
LLVM_ABI void addCase(ConstantInt *OnVal, BasicBlock *Dest)
Add an entry to the switch instruction.
CaseIteratorImpl< CaseHandle > CaseIt
ConstantInt *const * case_values() const
unsigned getNumCases() const
Return the number of 'cases' in this switch instruction, excluding the default case.
LLVM_ABI CaseIt removeCase(CaseIt I)
This method removes the specified case and its successor from the switch instruction.
Target - Wrapper for Target specific information.
This class represents a truncation of integer types.
LLVM_ABI TruncInst * cloneImpl() const
Clone an identical TruncInst.
LLVM_ABI TruncInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition TypeSize.h:339
static constexpr TypeSize get(ScalarTy Quantity, bool Scalable)
Definition TypeSize.h:336
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isByteTy() const
True if this is an instance of ByteType.
Definition Type.h:237
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:258
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
Definition Type.cpp:241
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:363
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:187
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
Definition Type.h:243
bool isAggregateType() const
Return true if the type is an aggregate type.
Definition Type.h:314
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:130
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
Definition Type.cpp:296
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:186
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition Type.h:280
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
bool isTokenTy() const
Return true if this is 'token'.
Definition Type.h:231
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition Type.h:222
This class represents a cast unsigned integer to floating point.
LLVM_ABI UIToFPInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI UIToFPInst * cloneImpl() const
Clone an identical UIToFPInst.
UnaryInstruction(Type *Ty, unsigned iType, Value *V, InsertPosition InsertBefore=nullptr)
Definition InstrTypes.h:71
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
LLVM_ABI UnaryOperator(UnaryOps iType, Value *S, Type *Ty, const Twine &Name, InsertPosition InsertBefore)
LLVM_ABI UnaryOperator * cloneImpl() const
UnaryOps getOpcode() const
Definition InstrTypes.h:163
Unconditional Branch instruction.
LLVM_ABI UncondBrInst * cloneImpl() const
LLVM_ABI UnreachableInst(LLVMContext &C, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool shouldLowerToTrap(bool TrapUnreachable, bool NoTrapAfterNoreturn) const
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI UnreachableInst * cloneImpl() const
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI void set(Value *Val)
Definition Value.h:876
Use * op_iterator
Definition User.h:254
const Use * getOperandList() const
Definition User.h:200
op_iterator op_begin()
Definition User.h:259
LLVM_ABI void allocHungoffUses(unsigned N, bool WithExtraValues=false)
Allocate the array of Uses, followed by a pointer (with bottom bit set) to the User.
Definition User.cpp:54
const Use & getOperandUse(unsigned i) const
Definition User.h:220
void setNumHungOffUseOperands(unsigned NumOps)
Subclasses with hung off uses need to manage the operand count themselves.
Definition User.h:240
Use & Op()
Definition User.h:171
LLVM_ABI void growHungoffUses(unsigned N, bool WithExtraValues=false)
Grow the number of hung off uses.
Definition User.cpp:71
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
op_iterator op_end()
Definition User.h:261
VAArgInst(Value *List, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI VAArgInst * cloneImpl() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
unsigned char SubclassOptionalData
Hold arbitary subclass data.
Definition Value.h:85
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:394
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
unsigned NumUserOperands
Definition Value.h:109
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
Base class of all SIMD vector types.
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
This class represents zero extension of integer types.
LLVM_ABI ZExtInst(Value *S, Type *Ty, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructor with insert-before-instruction semantics.
LLVM_ABI ZExtInst * cloneImpl() const
Clone an identical ZExtInst.
constexpr ScalarTy getFixedValue() const
Definition TypeSize.h:200
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
An efficient, type-erasing, non-owning reference to a callable.
typename base_list_type::iterator iterator
Definition ilist.h:121
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
bool match(Val *V, const Pattern &P)
cstfp_pred_ty< is_non_zero_not_denormal_fp > m_NonZeroNotDenormalFP()
Match a floating-point non-zero that is not a denormal.
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
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:679
NodeAddr< UseNode * > Use
Definition RDFGraph.h:385
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1685
unsigned getPointerAddressSpace(const Type *T)
Definition SPIRVUtils.h:395
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
constexpr auto seq_inclusive(T Begin, T End)
Iterate over an integral type from Begin to End inclusive.
Definition Sequence.h:361
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI MDNode * getBranchWeightMDNode(const Instruction &I)
Get the branch weights metadata node.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition ModRef.h:356
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
Definition STLExtras.h:2189
std::enable_if_t< std::is_unsigned_v< T >, std::optional< T > > checkedMulUnsigned(T LHS, T RHS)
Multiply two unsigned integers LHS and RHS.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI MDNode * getValidBranchWeightMDNode(const Instruction &I)
Get the valid branch weights metadata node.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
bool isPointerTy(const Type *T)
Definition SPIRVUtils.h:383
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
constexpr int PoisonMaskElem
LLVM_ABI unsigned getNumBranchWeights(const MDNode &ProfileData)
AtomicOrdering
Atomic ordering for LLVM's memory model.
LLVM_ABI void extractFromBranchWeightMD32(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Faster version of extractBranchWeights() that skips checks and must only be called with "branch_weigh...
OperandBundleDefT< Value * > OperandBundleDef
Definition AutoUpgrade.h:34
@ Mul
Product of integers.
@ 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
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1901
constexpr unsigned BitWidth
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
Definition Sequence.h:341
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
bool capturesAnything(CaptureComponents CC)
Definition ModRef.h:379
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition STLExtras.h:2182
LLVM_ABI void scaleProfData(Instruction &I, uint64_t S, uint64_t T)
Scaling the profile data attached to 'I' using the ratio of S/T.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Summary of memprof metadata on allocations.
Used to keep track of an operand bundle.
uint32_t End
The index in the Use& vector where operands for this operand bundle ends.
uint32_t Begin
The index in the Use& vector where operands for this operand bundle starts.
static LLVM_ABI std::optional< bool > eq(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_EQ result.
static LLVM_ABI std::optional< bool > ne(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_NE result.
static LLVM_ABI std::optional< bool > sge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGE result.
static LLVM_ABI std::optional< bool > ugt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGT result.
static LLVM_ABI std::optional< bool > slt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLT result.
static LLVM_ABI std::optional< bool > ult(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULT result.
static LLVM_ABI std::optional< bool > ule(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_ULE result.
static LLVM_ABI std::optional< bool > sle(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SLE result.
static LLVM_ABI std::optional< bool > sgt(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_SGT result.
static LLVM_ABI std::optional< bool > uge(const KnownBits &LHS, const KnownBits &RHS)
Determine if these known bits always give the same ICMP_UGE result.
A structure representing the properties of a load or store instruction.
Matching combinators.
A MapVector that performs no allocations if smaller than a certain size.
Definition MapVector.h:342
Indicates this User has operands co-allocated.
Definition User.h:60
Indicates this User has operands and a descriptor co-allocated .
Definition User.h:66