1 //===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===//
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 defines classes that make it really easy to deal with intrinsic
10 // functions with the isa/dyncast family of functions. In particular, this
11 // allows you to do things like:
12 //
13 // if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
14 // ... MCI->getDest() ... MCI->getSource() ...
15 //
16 // All intrinsic function calls are instances of the call instruction, so these
17 // are all subclasses of the CallInst class. Note that none of these classes
18 // has state or virtual methods, which is an important part of this gross/neat
19 // hack working.
20 //
21 //===----------------------------------------------------------------------===//
22
23 #ifndef LLVM_IR_INTRINSICINST_H
24 #define LLVM_IR_INTRINSICINST_H
25
26 #include "llvm/IR/Constants.h"
27 #include "llvm/IR/DebugInfoMetadata.h"
28 #include "llvm/IR/DerivedTypes.h"
29 #include "llvm/IR/FPEnv.h"
30 #include "llvm/IR/Function.h"
31 #include "llvm/IR/GlobalVariable.h"
32 #include "llvm/IR/Instructions.h"
33 #include "llvm/IR/Intrinsics.h"
34 #include "llvm/IR/Value.h"
35 #include "llvm/Support/Casting.h"
36 #include "llvm/Support/MathExtras.h"
37 #include <cassert>
38 #include <cstdint>
39 #include <optional>
40
41 namespace llvm {
42
43 class Metadata;
44
45 /// A wrapper class for inspecting calls to intrinsic functions.
46 /// This allows the standard isa/dyncast/cast functionality to work with calls
47 /// to intrinsic functions.
48 class IntrinsicInst : public CallInst {
49 public:
50 IntrinsicInst() = delete;
51 IntrinsicInst(const IntrinsicInst &) = delete;
52 IntrinsicInst &operator=(const IntrinsicInst &) = delete;
53
54 /// Return the intrinsic ID of this intrinsic.
getIntrinsicID()55 Intrinsic::ID getIntrinsicID() const {
56 return getCalledFunction()->getIntrinsicID();
57 }
58
isAssociative()59 bool isAssociative() const {
60 switch (getIntrinsicID()) {
61 case Intrinsic::smax:
62 case Intrinsic::smin:
63 case Intrinsic::umax:
64 case Intrinsic::umin:
65 return true;
66 default:
67 return false;
68 }
69 }
70
71 /// Return true if swapping the first two arguments to the intrinsic produces
72 /// the same result.
isCommutative()73 bool isCommutative() const {
74 switch (getIntrinsicID()) {
75 case Intrinsic::maxnum:
76 case Intrinsic::minnum:
77 case Intrinsic::maximum:
78 case Intrinsic::minimum:
79 case Intrinsic::smax:
80 case Intrinsic::smin:
81 case Intrinsic::umax:
82 case Intrinsic::umin:
83 case Intrinsic::sadd_sat:
84 case Intrinsic::uadd_sat:
85 case Intrinsic::sadd_with_overflow:
86 case Intrinsic::uadd_with_overflow:
87 case Intrinsic::smul_with_overflow:
88 case Intrinsic::umul_with_overflow:
89 case Intrinsic::smul_fix:
90 case Intrinsic::umul_fix:
91 case Intrinsic::smul_fix_sat:
92 case Intrinsic::umul_fix_sat:
93 case Intrinsic::fma:
94 case Intrinsic::fmuladd:
95 return true;
96 default:
97 return false;
98 }
99 }
100
101 /// Checks if the intrinsic is an annotation.
isAssumeLikeIntrinsic()102 bool isAssumeLikeIntrinsic() const {
103 switch (getIntrinsicID()) {
104 default: break;
105 case Intrinsic::assume:
106 case Intrinsic::sideeffect:
107 case Intrinsic::pseudoprobe:
108 case Intrinsic::dbg_assign:
109 case Intrinsic::dbg_declare:
110 case Intrinsic::dbg_value:
111 case Intrinsic::dbg_label:
112 case Intrinsic::invariant_start:
113 case Intrinsic::invariant_end:
114 case Intrinsic::lifetime_start:
115 case Intrinsic::lifetime_end:
116 case Intrinsic::experimental_noalias_scope_decl:
117 case Intrinsic::objectsize:
118 case Intrinsic::ptr_annotation:
119 case Intrinsic::var_annotation:
120 return true;
121 }
122 return false;
123 }
124
125 /// Check if the intrinsic might lower into a regular function call in the
126 /// course of IR transformations
127 static bool mayLowerToFunctionCall(Intrinsic::ID IID);
128
129 /// Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const CallInst * I)130 static bool classof(const CallInst *I) {
131 if (const Function *CF = I->getCalledFunction())
132 return CF->isIntrinsic();
133 return false;
134 }
classof(const Value * V)135 static bool classof(const Value *V) {
136 return isa<CallInst>(V) && classof(cast<CallInst>(V));
137 }
138 };
139
140 /// Check if \p ID corresponds to a lifetime intrinsic.
isLifetimeIntrinsic(Intrinsic::ID ID)141 static inline bool isLifetimeIntrinsic(Intrinsic::ID ID) {
142 switch (ID) {
143 case Intrinsic::lifetime_start:
144 case Intrinsic::lifetime_end:
145 return true;
146 default:
147 return false;
148 }
149 }
150
151 /// This is the common base class for lifetime intrinsics.
152 class LifetimeIntrinsic : public IntrinsicInst {
153 public:
154 /// \name Casting methods
155 /// @{
classof(const IntrinsicInst * I)156 static bool classof(const IntrinsicInst *I) {
157 return isLifetimeIntrinsic(I->getIntrinsicID());
158 }
classof(const Value * V)159 static bool classof(const Value *V) {
160 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
161 }
162 /// @}
163 };
164
165 /// Check if \p ID corresponds to a debug info intrinsic.
isDbgInfoIntrinsic(Intrinsic::ID ID)166 static inline bool isDbgInfoIntrinsic(Intrinsic::ID ID) {
167 switch (ID) {
168 case Intrinsic::dbg_declare:
169 case Intrinsic::dbg_value:
170 case Intrinsic::dbg_label:
171 case Intrinsic::dbg_assign:
172 return true;
173 default:
174 return false;
175 }
176 }
177
178 /// This is the common base class for debug info intrinsics.
179 class DbgInfoIntrinsic : public IntrinsicInst {
180 public:
181 /// \name Casting methods
182 /// @{
classof(const IntrinsicInst * I)183 static bool classof(const IntrinsicInst *I) {
184 return isDbgInfoIntrinsic(I->getIntrinsicID());
185 }
classof(const Value * V)186 static bool classof(const Value *V) {
187 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
188 }
189 /// @}
190 };
191
192 // Iterator for ValueAsMetadata that internally uses direct pointer iteration
193 // over either a ValueAsMetadata* or a ValueAsMetadata**, dereferencing to the
194 // ValueAsMetadata .
195 class location_op_iterator
196 : public iterator_facade_base<location_op_iterator,
197 std::bidirectional_iterator_tag, Value *> {
198 PointerUnion<ValueAsMetadata *, ValueAsMetadata **> I;
199
200 public:
location_op_iterator(ValueAsMetadata * SingleIter)201 location_op_iterator(ValueAsMetadata *SingleIter) : I(SingleIter) {}
location_op_iterator(ValueAsMetadata ** MultiIter)202 location_op_iterator(ValueAsMetadata **MultiIter) : I(MultiIter) {}
203
location_op_iterator(const location_op_iterator & R)204 location_op_iterator(const location_op_iterator &R) : I(R.I) {}
205 location_op_iterator &operator=(const location_op_iterator &R) {
206 I = R.I;
207 return *this;
208 }
209 bool operator==(const location_op_iterator &RHS) const { return I == RHS.I; }
210 const Value *operator*() const {
211 ValueAsMetadata *VAM = isa<ValueAsMetadata *>(I)
212 ? cast<ValueAsMetadata *>(I)
213 : *cast<ValueAsMetadata **>(I);
214 return VAM->getValue();
215 };
216 Value *operator*() {
217 ValueAsMetadata *VAM = isa<ValueAsMetadata *>(I)
218 ? cast<ValueAsMetadata *>(I)
219 : *cast<ValueAsMetadata **>(I);
220 return VAM->getValue();
221 }
222 location_op_iterator &operator++() {
223 if (isa<ValueAsMetadata *>(I))
224 I = cast<ValueAsMetadata *>(I) + 1;
225 else
226 I = cast<ValueAsMetadata **>(I) + 1;
227 return *this;
228 }
229 location_op_iterator &operator--() {
230 if (isa<ValueAsMetadata *>(I))
231 I = cast<ValueAsMetadata *>(I) - 1;
232 else
233 I = cast<ValueAsMetadata **>(I) - 1;
234 return *this;
235 }
236 };
237
238 /// Lightweight class that wraps the location operand metadata of a debug
239 /// intrinsic. The raw location may be a ValueAsMetadata, an empty MDTuple,
240 /// or a DIArgList.
241 class RawLocationWrapper {
242 Metadata *RawLocation = nullptr;
243
244 public:
245 RawLocationWrapper() = default;
RawLocationWrapper(Metadata * RawLocation)246 explicit RawLocationWrapper(Metadata *RawLocation)
247 : RawLocation(RawLocation) {
248 // Allow ValueAsMetadata, empty MDTuple, DIArgList.
249 assert(RawLocation && "unexpected null RawLocation");
250 assert(isa<ValueAsMetadata>(RawLocation) || isa<DIArgList>(RawLocation) ||
251 (isa<MDNode>(RawLocation) &&
252 !cast<MDNode>(RawLocation)->getNumOperands()));
253 }
getRawLocation()254 Metadata *getRawLocation() const { return RawLocation; }
255 /// Get the locations corresponding to the variable referenced by the debug
256 /// info intrinsic. Depending on the intrinsic, this could be the
257 /// variable's value or its address.
258 iterator_range<location_op_iterator> location_ops() const;
259 Value *getVariableLocationOp(unsigned OpIdx) const;
getNumVariableLocationOps()260 unsigned getNumVariableLocationOps() const {
261 if (hasArgList())
262 return cast<DIArgList>(getRawLocation())->getArgs().size();
263 return 1;
264 }
hasArgList()265 bool hasArgList() const { return isa<DIArgList>(getRawLocation()); }
isKillLocation(const DIExpression * Expression)266 bool isKillLocation(const DIExpression *Expression) const {
267 // Check for "kill" sentinel values.
268 // Non-variadic: empty metadata.
269 if (!hasArgList() && isa<MDNode>(getRawLocation()))
270 return true;
271 // Variadic: empty DIArgList with empty expression.
272 if (getNumVariableLocationOps() == 0 && !Expression->isComplex())
273 return true;
274 // Variadic and non-variadic: Interpret expressions using undef or poison
275 // values as kills.
276 return any_of(location_ops(), [](Value *V) { return isa<UndefValue>(V); });
277 }
278
279 friend bool operator==(const RawLocationWrapper &A,
280 const RawLocationWrapper &B) {
281 return A.RawLocation == B.RawLocation;
282 }
283 friend bool operator!=(const RawLocationWrapper &A,
284 const RawLocationWrapper &B) {
285 return !(A == B);
286 }
287 friend bool operator>(const RawLocationWrapper &A,
288 const RawLocationWrapper &B) {
289 return A.RawLocation > B.RawLocation;
290 }
291 friend bool operator>=(const RawLocationWrapper &A,
292 const RawLocationWrapper &B) {
293 return A.RawLocation >= B.RawLocation;
294 }
295 friend bool operator<(const RawLocationWrapper &A,
296 const RawLocationWrapper &B) {
297 return A.RawLocation < B.RawLocation;
298 }
299 friend bool operator<=(const RawLocationWrapper &A,
300 const RawLocationWrapper &B) {
301 return A.RawLocation <= B.RawLocation;
302 }
303 };
304
305 /// This is the common base class for debug info intrinsics for variables.
306 class DbgVariableIntrinsic : public DbgInfoIntrinsic {
307 public:
308 /// Get the locations corresponding to the variable referenced by the debug
309 /// info intrinsic. Depending on the intrinsic, this could be the
310 /// variable's value or its address.
311 iterator_range<location_op_iterator> location_ops() const;
312
313 Value *getVariableLocationOp(unsigned OpIdx) const;
314
315 void replaceVariableLocationOp(Value *OldValue, Value *NewValue,
316 bool AllowEmpty = false);
317 void replaceVariableLocationOp(unsigned OpIdx, Value *NewValue);
318 /// Adding a new location operand will always result in this intrinsic using
319 /// an ArgList, and must always be accompanied by a new expression that uses
320 /// the new operand.
321 void addVariableLocationOps(ArrayRef<Value *> NewValues,
322 DIExpression *NewExpr);
323
setVariable(DILocalVariable * NewVar)324 void setVariable(DILocalVariable *NewVar) {
325 setArgOperand(1, MetadataAsValue::get(NewVar->getContext(), NewVar));
326 }
327
setExpression(DIExpression * NewExpr)328 void setExpression(DIExpression *NewExpr) {
329 setArgOperand(2, MetadataAsValue::get(NewExpr->getContext(), NewExpr));
330 }
331
getNumVariableLocationOps()332 unsigned getNumVariableLocationOps() const {
333 return getWrappedLocation().getNumVariableLocationOps();
334 }
335
hasArgList()336 bool hasArgList() const { return getWrappedLocation().hasArgList(); }
337
338 /// Does this describe the address of a local variable. True for dbg.declare,
339 /// but not dbg.value, which describes its value, or dbg.assign, which
340 /// describes a combination of the variable's value and address.
isAddressOfVariable()341 bool isAddressOfVariable() const {
342 return getIntrinsicID() == Intrinsic::dbg_declare;
343 }
344
setKillLocation()345 void setKillLocation() {
346 // TODO: When/if we remove duplicate values from DIArgLists, we don't need
347 // this set anymore.
348 SmallPtrSet<Value *, 4> RemovedValues;
349 for (Value *OldValue : location_ops()) {
350 if (!RemovedValues.insert(OldValue).second)
351 continue;
352 Value *Poison = PoisonValue::get(OldValue->getType());
353 replaceVariableLocationOp(OldValue, Poison);
354 }
355 }
356
isKillLocation()357 bool isKillLocation() const {
358 return getWrappedLocation().isKillLocation(getExpression());
359 }
360
getVariable()361 DILocalVariable *getVariable() const {
362 return cast<DILocalVariable>(getRawVariable());
363 }
364
getExpression()365 DIExpression *getExpression() const {
366 return cast<DIExpression>(getRawExpression());
367 }
368
getRawLocation()369 Metadata *getRawLocation() const {
370 return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
371 }
372
getWrappedLocation()373 RawLocationWrapper getWrappedLocation() const {
374 return RawLocationWrapper(getRawLocation());
375 }
376
getRawVariable()377 Metadata *getRawVariable() const {
378 return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
379 }
380
getRawExpression()381 Metadata *getRawExpression() const {
382 return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
383 }
384
385 /// Use of this should generally be avoided; instead,
386 /// replaceVariableLocationOp and addVariableLocationOps should be used where
387 /// possible to avoid creating invalid state.
setRawLocation(Metadata * Location)388 void setRawLocation(Metadata *Location) {
389 return setArgOperand(0, MetadataAsValue::get(getContext(), Location));
390 }
391
392 /// Get the size (in bits) of the variable, or fragment of the variable that
393 /// is described.
394 std::optional<uint64_t> getFragmentSizeInBits() const;
395
396 /// Get the FragmentInfo for the variable.
getFragment()397 std::optional<DIExpression::FragmentInfo> getFragment() const {
398 return getExpression()->getFragmentInfo();
399 }
400
401 /// Get the FragmentInfo for the variable if it exists, otherwise return a
402 /// FragmentInfo that covers the entire variable if the variable size is
403 /// known, otherwise return a zero-sized fragment.
getFragmentOrEntireVariable()404 DIExpression::FragmentInfo getFragmentOrEntireVariable() const {
405 DIExpression::FragmentInfo VariableSlice(0, 0);
406 // Get the fragment or variable size, or zero.
407 if (auto Sz = getFragmentSizeInBits())
408 VariableSlice.SizeInBits = *Sz;
409 if (auto Frag = getExpression()->getFragmentInfo())
410 VariableSlice.OffsetInBits = Frag->OffsetInBits;
411 return VariableSlice;
412 }
413
414 /// \name Casting methods
415 /// @{
classof(const IntrinsicInst * I)416 static bool classof(const IntrinsicInst *I) {
417 switch (I->getIntrinsicID()) {
418 case Intrinsic::dbg_declare:
419 case Intrinsic::dbg_value:
420 case Intrinsic::dbg_assign:
421 return true;
422 default:
423 return false;
424 }
425 }
classof(const Value * V)426 static bool classof(const Value *V) {
427 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
428 }
429 /// @}
430 protected:
setArgOperand(unsigned i,Value * v)431 void setArgOperand(unsigned i, Value *v) {
432 DbgInfoIntrinsic::setArgOperand(i, v);
433 }
setOperand(unsigned i,Value * v)434 void setOperand(unsigned i, Value *v) { DbgInfoIntrinsic::setOperand(i, v); }
435 };
436
437 /// This represents the llvm.dbg.declare instruction.
438 class DbgDeclareInst : public DbgVariableIntrinsic {
439 public:
getAddress()440 Value *getAddress() const {
441 assert(getNumVariableLocationOps() == 1 &&
442 "dbg.declare must have exactly 1 location operand.");
443 return getVariableLocationOp(0);
444 }
445
446 /// \name Casting methods
447 /// @{
classof(const IntrinsicInst * I)448 static bool classof(const IntrinsicInst *I) {
449 return I->getIntrinsicID() == Intrinsic::dbg_declare;
450 }
classof(const Value * V)451 static bool classof(const Value *V) {
452 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
453 }
454 /// @}
455 };
456
457 /// This represents the llvm.dbg.value instruction.
458 class DbgValueInst : public DbgVariableIntrinsic {
459 public:
460 // The default argument should only be used in ISel, and the default option
461 // should be removed once ISel support for multiple location ops is complete.
462 Value *getValue(unsigned OpIdx = 0) const {
463 return getVariableLocationOp(OpIdx);
464 }
getValues()465 iterator_range<location_op_iterator> getValues() const {
466 return location_ops();
467 }
468
469 /// \name Casting methods
470 /// @{
classof(const IntrinsicInst * I)471 static bool classof(const IntrinsicInst *I) {
472 return I->getIntrinsicID() == Intrinsic::dbg_value ||
473 I->getIntrinsicID() == Intrinsic::dbg_assign;
474 }
classof(const Value * V)475 static bool classof(const Value *V) {
476 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
477 }
478 /// @}
479 };
480
481 /// This represents the llvm.dbg.assign instruction.
482 class DbgAssignIntrinsic : public DbgValueInst {
483 enum Operands {
484 OpValue,
485 OpVar,
486 OpExpr,
487 OpAssignID,
488 OpAddress,
489 OpAddressExpr,
490 };
491
492 public:
493 Value *getAddress() const;
getRawAddress()494 Metadata *getRawAddress() const {
495 return cast<MetadataAsValue>(getArgOperand(OpAddress))->getMetadata();
496 }
getRawAssignID()497 Metadata *getRawAssignID() const {
498 return cast<MetadataAsValue>(getArgOperand(OpAssignID))->getMetadata();
499 }
getAssignID()500 DIAssignID *getAssignID() const { return cast<DIAssignID>(getRawAssignID()); }
getRawAddressExpression()501 Metadata *getRawAddressExpression() const {
502 return cast<MetadataAsValue>(getArgOperand(OpAddressExpr))->getMetadata();
503 }
getAddressExpression()504 DIExpression *getAddressExpression() const {
505 return cast<DIExpression>(getRawAddressExpression());
506 }
setAddressExpression(DIExpression * NewExpr)507 void setAddressExpression(DIExpression *NewExpr) {
508 setArgOperand(OpAddressExpr,
509 MetadataAsValue::get(NewExpr->getContext(), NewExpr));
510 }
511 void setAssignId(DIAssignID *New);
512 void setAddress(Value *V);
513 /// Kill the address component.
514 void setKillAddress();
515 /// Check whether this kills the address component. This doesn't take into
516 /// account the position of the intrinsic, therefore a returned value of false
517 /// does not guarentee the address is a valid location for the variable at the
518 /// intrinsic's position in IR.
519 bool isKillAddress() const;
520 void setValue(Value *V);
521 /// \name Casting methods
522 /// @{
classof(const IntrinsicInst * I)523 static bool classof(const IntrinsicInst *I) {
524 return I->getIntrinsicID() == Intrinsic::dbg_assign;
525 }
classof(const Value * V)526 static bool classof(const Value *V) {
527 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
528 }
529 /// @}
530 };
531
532 /// This represents the llvm.dbg.label instruction.
533 class DbgLabelInst : public DbgInfoIntrinsic {
534 public:
getLabel()535 DILabel *getLabel() const { return cast<DILabel>(getRawLabel()); }
setLabel(DILabel * NewLabel)536 void setLabel(DILabel *NewLabel) {
537 setArgOperand(0, MetadataAsValue::get(getContext(), NewLabel));
538 }
539
getRawLabel()540 Metadata *getRawLabel() const {
541 return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
542 }
543
544 /// Methods for support type inquiry through isa, cast, and dyn_cast:
545 /// @{
classof(const IntrinsicInst * I)546 static bool classof(const IntrinsicInst *I) {
547 return I->getIntrinsicID() == Intrinsic::dbg_label;
548 }
classof(const Value * V)549 static bool classof(const Value *V) {
550 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
551 }
552 /// @}
553 };
554
555 /// This is the common base class for vector predication intrinsics.
556 class VPIntrinsic : public IntrinsicInst {
557 public:
558 /// \brief Declares a llvm.vp.* intrinsic in \p M that matches the parameters
559 /// \p Params. Additionally, the load and gather intrinsics require
560 /// \p ReturnType to be specified.
561 static Function *getDeclarationForParams(Module *M, Intrinsic::ID,
562 Type *ReturnType,
563 ArrayRef<Value *> Params);
564
565 static std::optional<unsigned> getMaskParamPos(Intrinsic::ID IntrinsicID);
566 static std::optional<unsigned> getVectorLengthParamPos(
567 Intrinsic::ID IntrinsicID);
568
569 /// The llvm.vp.* intrinsics for this instruction Opcode
570 static Intrinsic::ID getForOpcode(unsigned OC);
571
572 /// The llvm.vp.* intrinsics for this intrinsic ID \p Id. Return \p Id if it
573 /// is already a VP intrinsic.
574 static Intrinsic::ID getForIntrinsic(Intrinsic::ID Id);
575
576 // Whether \p ID is a VP intrinsic ID.
577 static bool isVPIntrinsic(Intrinsic::ID);
578
579 /// \return The mask parameter or nullptr.
580 Value *getMaskParam() const;
581 void setMaskParam(Value *);
582
583 /// \return The vector length parameter or nullptr.
584 Value *getVectorLengthParam() const;
585 void setVectorLengthParam(Value *);
586
587 /// \return Whether the vector length param can be ignored.
588 bool canIgnoreVectorLengthParam() const;
589
590 /// \return The static element count (vector number of elements) the vector
591 /// length parameter applies to.
592 ElementCount getStaticVectorLength() const;
593
594 /// \return The alignment of the pointer used by this load/store/gather or
595 /// scatter.
596 MaybeAlign getPointerAlignment() const;
597 // MaybeAlign setPointerAlignment(Align NewAlign); // TODO
598
599 /// \return The pointer operand of this load,store, gather or scatter.
600 Value *getMemoryPointerParam() const;
601 static std::optional<unsigned> getMemoryPointerParamPos(Intrinsic::ID);
602
603 /// \return The data (payload) operand of this store or scatter.
604 Value *getMemoryDataParam() const;
605 static std::optional<unsigned> getMemoryDataParamPos(Intrinsic::ID);
606
607 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)608 static bool classof(const IntrinsicInst *I) {
609 return isVPIntrinsic(I->getIntrinsicID());
610 }
classof(const Value * V)611 static bool classof(const Value *V) {
612 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
613 }
614
615 // Equivalent non-predicated opcode
getFunctionalOpcode()616 std::optional<unsigned> getFunctionalOpcode() const {
617 return getFunctionalOpcodeForVP(getIntrinsicID());
618 }
619
620 // Equivalent non-predicated intrinsic ID
getFunctionalIntrinsicID()621 std::optional<unsigned> getFunctionalIntrinsicID() const {
622 return getFunctionalIntrinsicIDForVP(getIntrinsicID());
623 }
624
625 // Equivalent non-predicated constrained ID
getConstrainedIntrinsicID()626 std::optional<unsigned> getConstrainedIntrinsicID() const {
627 return getConstrainedIntrinsicIDForVP(getIntrinsicID());
628 }
629
630 // Equivalent non-predicated opcode
631 static std::optional<unsigned> getFunctionalOpcodeForVP(Intrinsic::ID ID);
632
633 // Equivalent non-predicated intrinsic ID
634 static std::optional<Intrinsic::ID>
635 getFunctionalIntrinsicIDForVP(Intrinsic::ID ID);
636
637 // Equivalent non-predicated constrained ID
638 static std::optional<Intrinsic::ID>
639 getConstrainedIntrinsicIDForVP(Intrinsic::ID ID);
640 };
641
642 /// This represents vector predication reduction intrinsics.
643 class VPReductionIntrinsic : public VPIntrinsic {
644 public:
645 static bool isVPReduction(Intrinsic::ID ID);
646
647 unsigned getStartParamPos() const;
648 unsigned getVectorParamPos() const;
649
650 static std::optional<unsigned> getStartParamPos(Intrinsic::ID ID);
651 static std::optional<unsigned> getVectorParamPos(Intrinsic::ID ID);
652
653 /// Methods for support type inquiry through isa, cast, and dyn_cast:
654 /// @{
classof(const IntrinsicInst * I)655 static bool classof(const IntrinsicInst *I) {
656 return VPReductionIntrinsic::isVPReduction(I->getIntrinsicID());
657 }
classof(const Value * V)658 static bool classof(const Value *V) {
659 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
660 }
661 /// @}
662 };
663
664 class VPCastIntrinsic : public VPIntrinsic {
665 public:
666 static bool isVPCast(Intrinsic::ID ID);
667
668 /// Methods for support type inquiry through isa, cast, and dyn_cast:
669 /// @{
classof(const IntrinsicInst * I)670 static bool classof(const IntrinsicInst *I) {
671 return VPCastIntrinsic::isVPCast(I->getIntrinsicID());
672 }
classof(const Value * V)673 static bool classof(const Value *V) {
674 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
675 }
676 /// @}
677 };
678
679 class VPCmpIntrinsic : public VPIntrinsic {
680 public:
681 static bool isVPCmp(Intrinsic::ID ID);
682
683 CmpInst::Predicate getPredicate() const;
684
685 /// Methods for support type inquiry through isa, cast, and dyn_cast:
686 /// @{
classof(const IntrinsicInst * I)687 static bool classof(const IntrinsicInst *I) {
688 return VPCmpIntrinsic::isVPCmp(I->getIntrinsicID());
689 }
classof(const Value * V)690 static bool classof(const Value *V) {
691 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
692 }
693 /// @}
694 };
695
696 class VPBinOpIntrinsic : public VPIntrinsic {
697 public:
698 static bool isVPBinOp(Intrinsic::ID ID);
699
700 /// Methods for support type inquiry through isa, cast, and dyn_cast:
701 /// @{
classof(const IntrinsicInst * I)702 static bool classof(const IntrinsicInst *I) {
703 return VPBinOpIntrinsic::isVPBinOp(I->getIntrinsicID());
704 }
classof(const Value * V)705 static bool classof(const Value *V) {
706 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
707 }
708 /// @}
709 };
710
711
712 /// This is the common base class for constrained floating point intrinsics.
713 class ConstrainedFPIntrinsic : public IntrinsicInst {
714 public:
715 unsigned getNonMetadataArgCount() const;
716 std::optional<RoundingMode> getRoundingMode() const;
717 std::optional<fp::ExceptionBehavior> getExceptionBehavior() const;
718 bool isDefaultFPEnvironment() const;
719
720 // Methods for support type inquiry through isa, cast, and dyn_cast:
721 static bool classof(const IntrinsicInst *I);
classof(const Value * V)722 static bool classof(const Value *V) {
723 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
724 }
725 };
726
727 /// Constrained floating point compare intrinsics.
728 class ConstrainedFPCmpIntrinsic : public ConstrainedFPIntrinsic {
729 public:
730 FCmpInst::Predicate getPredicate() const;
isSignaling()731 bool isSignaling() const {
732 return getIntrinsicID() == Intrinsic::experimental_constrained_fcmps;
733 }
734
735 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)736 static bool classof(const IntrinsicInst *I) {
737 switch (I->getIntrinsicID()) {
738 case Intrinsic::experimental_constrained_fcmp:
739 case Intrinsic::experimental_constrained_fcmps:
740 return true;
741 default:
742 return false;
743 }
744 }
classof(const Value * V)745 static bool classof(const Value *V) {
746 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
747 }
748 };
749
750 /// This class represents min/max intrinsics.
751 class MinMaxIntrinsic : public IntrinsicInst {
752 public:
classof(const IntrinsicInst * I)753 static bool classof(const IntrinsicInst *I) {
754 switch (I->getIntrinsicID()) {
755 case Intrinsic::umin:
756 case Intrinsic::umax:
757 case Intrinsic::smin:
758 case Intrinsic::smax:
759 return true;
760 default:
761 return false;
762 }
763 }
classof(const Value * V)764 static bool classof(const Value *V) {
765 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
766 }
767
getLHS()768 Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
getRHS()769 Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
770
771 /// Returns the comparison predicate underlying the intrinsic.
getPredicate(Intrinsic::ID ID)772 static ICmpInst::Predicate getPredicate(Intrinsic::ID ID) {
773 switch (ID) {
774 case Intrinsic::umin:
775 return ICmpInst::Predicate::ICMP_ULT;
776 case Intrinsic::umax:
777 return ICmpInst::Predicate::ICMP_UGT;
778 case Intrinsic::smin:
779 return ICmpInst::Predicate::ICMP_SLT;
780 case Intrinsic::smax:
781 return ICmpInst::Predicate::ICMP_SGT;
782 default:
783 llvm_unreachable("Invalid intrinsic");
784 }
785 }
786
787 /// Returns the comparison predicate underlying the intrinsic.
getPredicate()788 ICmpInst::Predicate getPredicate() const {
789 return getPredicate(getIntrinsicID());
790 }
791
792 /// Whether the intrinsic is signed or unsigned.
isSigned(Intrinsic::ID ID)793 static bool isSigned(Intrinsic::ID ID) {
794 return ICmpInst::isSigned(getPredicate(ID));
795 };
796
797 /// Whether the intrinsic is signed or unsigned.
isSigned()798 bool isSigned() const { return isSigned(getIntrinsicID()); };
799
800 /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
801 /// so there is a certain threshold value, upon reaching which,
802 /// their value can no longer change. Return said threshold.
getSaturationPoint(Intrinsic::ID ID,unsigned numBits)803 static APInt getSaturationPoint(Intrinsic::ID ID, unsigned numBits) {
804 switch (ID) {
805 case Intrinsic::umin:
806 return APInt::getMinValue(numBits);
807 case Intrinsic::umax:
808 return APInt::getMaxValue(numBits);
809 case Intrinsic::smin:
810 return APInt::getSignedMinValue(numBits);
811 case Intrinsic::smax:
812 return APInt::getSignedMaxValue(numBits);
813 default:
814 llvm_unreachable("Invalid intrinsic");
815 }
816 }
817
818 /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
819 /// so there is a certain threshold value, upon reaching which,
820 /// their value can no longer change. Return said threshold.
getSaturationPoint(unsigned numBits)821 APInt getSaturationPoint(unsigned numBits) const {
822 return getSaturationPoint(getIntrinsicID(), numBits);
823 }
824
825 /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
826 /// so there is a certain threshold value, upon reaching which,
827 /// their value can no longer change. Return said threshold.
getSaturationPoint(Intrinsic::ID ID,Type * Ty)828 static Constant *getSaturationPoint(Intrinsic::ID ID, Type *Ty) {
829 return Constant::getIntegerValue(
830 Ty, getSaturationPoint(ID, Ty->getScalarSizeInBits()));
831 }
832
833 /// Min/max intrinsics are monotonic, they operate on a fixed-bitwidth values,
834 /// so there is a certain threshold value, upon reaching which,
835 /// their value can no longer change. Return said threshold.
getSaturationPoint(Type * Ty)836 Constant *getSaturationPoint(Type *Ty) const {
837 return getSaturationPoint(getIntrinsicID(), Ty);
838 }
839 };
840
841 /// This class represents a ucmp/scmp intrinsic
842 class CmpIntrinsic : public IntrinsicInst {
843 public:
classof(const IntrinsicInst * I)844 static bool classof(const IntrinsicInst *I) {
845 switch (I->getIntrinsicID()) {
846 case Intrinsic::scmp:
847 case Intrinsic::ucmp:
848 return true;
849 default:
850 return false;
851 }
852 }
classof(const Value * V)853 static bool classof(const Value *V) {
854 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
855 }
856
getLHS()857 Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
getRHS()858 Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
859
isSigned(Intrinsic::ID ID)860 static bool isSigned(Intrinsic::ID ID) { return ID == Intrinsic::scmp; }
isSigned()861 bool isSigned() const { return isSigned(getIntrinsicID()); }
862
getGTPredicate(Intrinsic::ID ID)863 static CmpInst::Predicate getGTPredicate(Intrinsic::ID ID) {
864 return isSigned(ID) ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
865 }
getGTPredicate()866 CmpInst::Predicate getGTPredicate() const {
867 return getGTPredicate(getIntrinsicID());
868 }
869
getLTPredicate(Intrinsic::ID ID)870 static CmpInst::Predicate getLTPredicate(Intrinsic::ID ID) {
871 return isSigned(ID) ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
872 }
getLTPredicate()873 CmpInst::Predicate getLTPredicate() const {
874 return getLTPredicate(getIntrinsicID());
875 }
876 };
877
878 /// This class represents an intrinsic that is based on a binary operation.
879 /// This includes op.with.overflow and saturating add/sub intrinsics.
880 class BinaryOpIntrinsic : public IntrinsicInst {
881 public:
classof(const IntrinsicInst * I)882 static bool classof(const IntrinsicInst *I) {
883 switch (I->getIntrinsicID()) {
884 case Intrinsic::uadd_with_overflow:
885 case Intrinsic::sadd_with_overflow:
886 case Intrinsic::usub_with_overflow:
887 case Intrinsic::ssub_with_overflow:
888 case Intrinsic::umul_with_overflow:
889 case Intrinsic::smul_with_overflow:
890 case Intrinsic::uadd_sat:
891 case Intrinsic::sadd_sat:
892 case Intrinsic::usub_sat:
893 case Intrinsic::ssub_sat:
894 return true;
895 default:
896 return false;
897 }
898 }
classof(const Value * V)899 static bool classof(const Value *V) {
900 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
901 }
902
getLHS()903 Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
getRHS()904 Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
905
906 /// Returns the binary operation underlying the intrinsic.
907 Instruction::BinaryOps getBinaryOp() const;
908
909 /// Whether the intrinsic is signed or unsigned.
910 bool isSigned() const;
911
912 /// Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
913 unsigned getNoWrapKind() const;
914 };
915
916 /// Represents an op.with.overflow intrinsic.
917 class WithOverflowInst : public BinaryOpIntrinsic {
918 public:
classof(const IntrinsicInst * I)919 static bool classof(const IntrinsicInst *I) {
920 switch (I->getIntrinsicID()) {
921 case Intrinsic::uadd_with_overflow:
922 case Intrinsic::sadd_with_overflow:
923 case Intrinsic::usub_with_overflow:
924 case Intrinsic::ssub_with_overflow:
925 case Intrinsic::umul_with_overflow:
926 case Intrinsic::smul_with_overflow:
927 return true;
928 default:
929 return false;
930 }
931 }
classof(const Value * V)932 static bool classof(const Value *V) {
933 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
934 }
935 };
936
937 /// Represents a saturating add/sub intrinsic.
938 class SaturatingInst : public BinaryOpIntrinsic {
939 public:
classof(const IntrinsicInst * I)940 static bool classof(const IntrinsicInst *I) {
941 switch (I->getIntrinsicID()) {
942 case Intrinsic::uadd_sat:
943 case Intrinsic::sadd_sat:
944 case Intrinsic::usub_sat:
945 case Intrinsic::ssub_sat:
946 return true;
947 default:
948 return false;
949 }
950 }
classof(const Value * V)951 static bool classof(const Value *V) {
952 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
953 }
954 };
955
956 /// Common base class for all memory intrinsics. Simply provides
957 /// common methods.
958 /// Written as CRTP to avoid a common base class amongst the
959 /// three atomicity hierarchies.
960 template <typename Derived> class MemIntrinsicBase : public IntrinsicInst {
961 private:
962 enum { ARG_DEST = 0, ARG_LENGTH = 2 };
963
964 public:
getRawDest()965 Value *getRawDest() const {
966 return const_cast<Value *>(getArgOperand(ARG_DEST));
967 }
getRawDestUse()968 const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
getRawDestUse()969 Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
970
getLength()971 Value *getLength() const {
972 return const_cast<Value *>(getArgOperand(ARG_LENGTH));
973 }
getLengthUse()974 const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
getLengthUse()975 Use &getLengthUse() { return getArgOperandUse(ARG_LENGTH); }
976
977 /// This is just like getRawDest, but it strips off any cast
978 /// instructions (including addrspacecast) that feed it, giving the
979 /// original input. The returned value is guaranteed to be a pointer.
getDest()980 Value *getDest() const { return getRawDest()->stripPointerCasts(); }
981
getDestAddressSpace()982 unsigned getDestAddressSpace() const {
983 return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
984 }
985
986 /// FIXME: Remove this function once transition to Align is over.
987 /// Use getDestAlign() instead.
988 LLVM_DEPRECATED("Use getDestAlign() instead", "getDestAlign")
getDestAlignment()989 unsigned getDestAlignment() const {
990 if (auto MA = getParamAlign(ARG_DEST))
991 return MA->value();
992 return 0;
993 }
getDestAlign()994 MaybeAlign getDestAlign() const { return getParamAlign(ARG_DEST); }
995
996 /// Set the specified arguments of the instruction.
setDest(Value * Ptr)997 void setDest(Value *Ptr) {
998 assert(getRawDest()->getType() == Ptr->getType() &&
999 "setDest called with pointer of wrong type!");
1000 setArgOperand(ARG_DEST, Ptr);
1001 }
1002
setDestAlignment(MaybeAlign Alignment)1003 void setDestAlignment(MaybeAlign Alignment) {
1004 removeParamAttr(ARG_DEST, Attribute::Alignment);
1005 if (Alignment)
1006 addParamAttr(ARG_DEST,
1007 Attribute::getWithAlignment(getContext(), *Alignment));
1008 }
setDestAlignment(Align Alignment)1009 void setDestAlignment(Align Alignment) {
1010 removeParamAttr(ARG_DEST, Attribute::Alignment);
1011 addParamAttr(ARG_DEST,
1012 Attribute::getWithAlignment(getContext(), Alignment));
1013 }
1014
setLength(Value * L)1015 void setLength(Value *L) {
1016 assert(getLength()->getType() == L->getType() &&
1017 "setLength called with value of wrong type!");
1018 setArgOperand(ARG_LENGTH, L);
1019 }
1020 };
1021
1022 /// Common base class for all memory transfer intrinsics. Simply provides
1023 /// common methods.
1024 template <class BaseCL> class MemTransferBase : public BaseCL {
1025 private:
1026 enum { ARG_SOURCE = 1 };
1027
1028 public:
1029 /// Return the arguments to the instruction.
getRawSource()1030 Value *getRawSource() const {
1031 return const_cast<Value *>(BaseCL::getArgOperand(ARG_SOURCE));
1032 }
getRawSourceUse()1033 const Use &getRawSourceUse() const {
1034 return BaseCL::getArgOperandUse(ARG_SOURCE);
1035 }
getRawSourceUse()1036 Use &getRawSourceUse() { return BaseCL::getArgOperandUse(ARG_SOURCE); }
1037
1038 /// This is just like getRawSource, but it strips off any cast
1039 /// instructions that feed it, giving the original input. The returned
1040 /// value is guaranteed to be a pointer.
getSource()1041 Value *getSource() const { return getRawSource()->stripPointerCasts(); }
1042
getSourceAddressSpace()1043 unsigned getSourceAddressSpace() const {
1044 return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
1045 }
1046
1047 /// FIXME: Remove this function once transition to Align is over.
1048 /// Use getSourceAlign() instead.
1049 LLVM_DEPRECATED("Use getSourceAlign() instead", "getSourceAlign")
getSourceAlignment()1050 unsigned getSourceAlignment() const {
1051 if (auto MA = BaseCL::getParamAlign(ARG_SOURCE))
1052 return MA->value();
1053 return 0;
1054 }
1055
getSourceAlign()1056 MaybeAlign getSourceAlign() const {
1057 return BaseCL::getParamAlign(ARG_SOURCE);
1058 }
1059
setSource(Value * Ptr)1060 void setSource(Value *Ptr) {
1061 assert(getRawSource()->getType() == Ptr->getType() &&
1062 "setSource called with pointer of wrong type!");
1063 BaseCL::setArgOperand(ARG_SOURCE, Ptr);
1064 }
1065
setSourceAlignment(MaybeAlign Alignment)1066 void setSourceAlignment(MaybeAlign Alignment) {
1067 BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
1068 if (Alignment)
1069 BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
1070 BaseCL::getContext(), *Alignment));
1071 }
1072
setSourceAlignment(Align Alignment)1073 void setSourceAlignment(Align Alignment) {
1074 BaseCL::removeParamAttr(ARG_SOURCE, Attribute::Alignment);
1075 BaseCL::addParamAttr(ARG_SOURCE, Attribute::getWithAlignment(
1076 BaseCL::getContext(), Alignment));
1077 }
1078 };
1079
1080 /// Common base class for all memset intrinsics. Simply provides
1081 /// common methods.
1082 template <class BaseCL> class MemSetBase : public BaseCL {
1083 private:
1084 enum { ARG_VALUE = 1 };
1085
1086 public:
getValue()1087 Value *getValue() const {
1088 return const_cast<Value *>(BaseCL::getArgOperand(ARG_VALUE));
1089 }
getValueUse()1090 const Use &getValueUse() const { return BaseCL::getArgOperandUse(ARG_VALUE); }
getValueUse()1091 Use &getValueUse() { return BaseCL::getArgOperandUse(ARG_VALUE); }
1092
setValue(Value * Val)1093 void setValue(Value *Val) {
1094 assert(getValue()->getType() == Val->getType() &&
1095 "setValue called with value of wrong type!");
1096 BaseCL::setArgOperand(ARG_VALUE, Val);
1097 }
1098 };
1099
1100 // The common base class for the atomic memset/memmove/memcpy intrinsics
1101 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
1102 class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> {
1103 private:
1104 enum { ARG_ELEMENTSIZE = 3 };
1105
1106 public:
getRawElementSizeInBytes()1107 Value *getRawElementSizeInBytes() const {
1108 return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
1109 }
1110
getElementSizeInBytesCst()1111 ConstantInt *getElementSizeInBytesCst() const {
1112 return cast<ConstantInt>(getRawElementSizeInBytes());
1113 }
1114
getElementSizeInBytes()1115 uint32_t getElementSizeInBytes() const {
1116 return getElementSizeInBytesCst()->getZExtValue();
1117 }
1118
setElementSizeInBytes(Constant * V)1119 void setElementSizeInBytes(Constant *V) {
1120 assert(V->getType() == Type::getInt8Ty(getContext()) &&
1121 "setElementSizeInBytes called with value of wrong type!");
1122 setArgOperand(ARG_ELEMENTSIZE, V);
1123 }
1124
classof(const IntrinsicInst * I)1125 static bool classof(const IntrinsicInst *I) {
1126 switch (I->getIntrinsicID()) {
1127 case Intrinsic::memcpy_element_unordered_atomic:
1128 case Intrinsic::memmove_element_unordered_atomic:
1129 case Intrinsic::memset_element_unordered_atomic:
1130 return true;
1131 default:
1132 return false;
1133 }
1134 }
classof(const Value * V)1135 static bool classof(const Value *V) {
1136 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1137 }
1138 };
1139
1140 /// This class represents atomic memset intrinsic
1141 // i.e. llvm.element.unordered.atomic.memset
1142 class AtomicMemSetInst : public MemSetBase<AtomicMemIntrinsic> {
1143 public:
classof(const IntrinsicInst * I)1144 static bool classof(const IntrinsicInst *I) {
1145 return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
1146 }
classof(const Value * V)1147 static bool classof(const Value *V) {
1148 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1149 }
1150 };
1151
1152 // This class wraps the atomic memcpy/memmove intrinsics
1153 // i.e. llvm.element.unordered.atomic.memcpy/memmove
1154 class AtomicMemTransferInst : public MemTransferBase<AtomicMemIntrinsic> {
1155 public:
classof(const IntrinsicInst * I)1156 static bool classof(const IntrinsicInst *I) {
1157 switch (I->getIntrinsicID()) {
1158 case Intrinsic::memcpy_element_unordered_atomic:
1159 case Intrinsic::memmove_element_unordered_atomic:
1160 return true;
1161 default:
1162 return false;
1163 }
1164 }
classof(const Value * V)1165 static bool classof(const Value *V) {
1166 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1167 }
1168 };
1169
1170 /// This class represents the atomic memcpy intrinsic
1171 /// i.e. llvm.element.unordered.atomic.memcpy
1172 class AtomicMemCpyInst : public AtomicMemTransferInst {
1173 public:
classof(const IntrinsicInst * I)1174 static bool classof(const IntrinsicInst *I) {
1175 return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
1176 }
classof(const Value * V)1177 static bool classof(const Value *V) {
1178 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1179 }
1180 };
1181
1182 /// This class represents the atomic memmove intrinsic
1183 /// i.e. llvm.element.unordered.atomic.memmove
1184 class AtomicMemMoveInst : public AtomicMemTransferInst {
1185 public:
classof(const IntrinsicInst * I)1186 static bool classof(const IntrinsicInst *I) {
1187 return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
1188 }
classof(const Value * V)1189 static bool classof(const Value *V) {
1190 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1191 }
1192 };
1193
1194 /// This is the common base class for memset/memcpy/memmove.
1195 class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> {
1196 private:
1197 enum { ARG_VOLATILE = 3 };
1198
1199 public:
getVolatileCst()1200 ConstantInt *getVolatileCst() const {
1201 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
1202 }
1203
isVolatile()1204 bool isVolatile() const { return !getVolatileCst()->isZero(); }
1205
setVolatile(Constant * V)1206 void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
1207
1208 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1209 static bool classof(const IntrinsicInst *I) {
1210 switch (I->getIntrinsicID()) {
1211 case Intrinsic::memcpy:
1212 case Intrinsic::memmove:
1213 case Intrinsic::memset:
1214 case Intrinsic::memset_inline:
1215 case Intrinsic::memcpy_inline:
1216 return true;
1217 default:
1218 return false;
1219 }
1220 }
classof(const Value * V)1221 static bool classof(const Value *V) {
1222 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1223 }
1224 };
1225
1226 /// This class wraps the llvm.memset and llvm.memset.inline intrinsics.
1227 class MemSetInst : public MemSetBase<MemIntrinsic> {
1228 public:
1229 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1230 static bool classof(const IntrinsicInst *I) {
1231 switch (I->getIntrinsicID()) {
1232 case Intrinsic::memset:
1233 case Intrinsic::memset_inline:
1234 return true;
1235 default:
1236 return false;
1237 }
1238 }
classof(const Value * V)1239 static bool classof(const Value *V) {
1240 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1241 }
1242 };
1243
1244 /// This class wraps the llvm.memset.inline intrinsic.
1245 class MemSetInlineInst : public MemSetInst {
1246 public:
1247 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1248 static bool classof(const IntrinsicInst *I) {
1249 return I->getIntrinsicID() == Intrinsic::memset_inline;
1250 }
classof(const Value * V)1251 static bool classof(const Value *V) {
1252 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1253 }
1254 };
1255
1256 /// This class wraps the llvm.memcpy/memmove intrinsics.
1257 class MemTransferInst : public MemTransferBase<MemIntrinsic> {
1258 public:
1259 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1260 static bool classof(const IntrinsicInst *I) {
1261 switch (I->getIntrinsicID()) {
1262 case Intrinsic::memcpy:
1263 case Intrinsic::memmove:
1264 case Intrinsic::memcpy_inline:
1265 return true;
1266 default:
1267 return false;
1268 }
1269 }
classof(const Value * V)1270 static bool classof(const Value *V) {
1271 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1272 }
1273 };
1274
1275 /// This class wraps the llvm.memcpy intrinsic.
1276 class MemCpyInst : public MemTransferInst {
1277 public:
1278 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1279 static bool classof(const IntrinsicInst *I) {
1280 return I->getIntrinsicID() == Intrinsic::memcpy ||
1281 I->getIntrinsicID() == Intrinsic::memcpy_inline;
1282 }
classof(const Value * V)1283 static bool classof(const Value *V) {
1284 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1285 }
1286 };
1287
1288 /// This class wraps the llvm.memmove intrinsic.
1289 class MemMoveInst : public MemTransferInst {
1290 public:
1291 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1292 static bool classof(const IntrinsicInst *I) {
1293 return I->getIntrinsicID() == Intrinsic::memmove;
1294 }
classof(const Value * V)1295 static bool classof(const Value *V) {
1296 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1297 }
1298 };
1299
1300 /// This class wraps the llvm.memcpy.inline intrinsic.
1301 class MemCpyInlineInst : public MemCpyInst {
1302 public:
1303 // Methods for support type inquiry through isa, cast, and dyn_cast:
classof(const IntrinsicInst * I)1304 static bool classof(const IntrinsicInst *I) {
1305 return I->getIntrinsicID() == Intrinsic::memcpy_inline;
1306 }
classof(const Value * V)1307 static bool classof(const Value *V) {
1308 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1309 }
1310 };
1311
1312 // The common base class for any memset/memmove/memcpy intrinsics;
1313 // whether they be atomic or non-atomic.
1314 // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove
1315 // and llvm.memset/memcpy/memmove
1316 class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> {
1317 public:
isVolatile()1318 bool isVolatile() const {
1319 // Only the non-atomic intrinsics can be volatile
1320 if (auto *MI = dyn_cast<MemIntrinsic>(this))
1321 return MI->isVolatile();
1322 return false;
1323 }
1324
classof(const IntrinsicInst * I)1325 static bool classof(const IntrinsicInst *I) {
1326 switch (I->getIntrinsicID()) {
1327 case Intrinsic::memcpy:
1328 case Intrinsic::memcpy_inline:
1329 case Intrinsic::memmove:
1330 case Intrinsic::memset:
1331 case Intrinsic::memset_inline:
1332 case Intrinsic::memcpy_element_unordered_atomic:
1333 case Intrinsic::memmove_element_unordered_atomic:
1334 case Intrinsic::memset_element_unordered_atomic:
1335 return true;
1336 default:
1337 return false;
1338 }
1339 }
classof(const Value * V)1340 static bool classof(const Value *V) {
1341 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1342 }
1343 };
1344
1345 /// This class represents any memset intrinsic
1346 // i.e. llvm.element.unordered.atomic.memset
1347 // and llvm.memset
1348 class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> {
1349 public:
classof(const IntrinsicInst * I)1350 static bool classof(const IntrinsicInst *I) {
1351 switch (I->getIntrinsicID()) {
1352 case Intrinsic::memset:
1353 case Intrinsic::memset_inline:
1354 case Intrinsic::memset_element_unordered_atomic:
1355 return true;
1356 default:
1357 return false;
1358 }
1359 }
classof(const Value * V)1360 static bool classof(const Value *V) {
1361 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1362 }
1363 };
1364
1365 // This class wraps any memcpy/memmove intrinsics
1366 // i.e. llvm.element.unordered.atomic.memcpy/memmove
1367 // and llvm.memcpy/memmove
1368 class AnyMemTransferInst : public MemTransferBase<AnyMemIntrinsic> {
1369 public:
classof(const IntrinsicInst * I)1370 static bool classof(const IntrinsicInst *I) {
1371 switch (I->getIntrinsicID()) {
1372 case Intrinsic::memcpy:
1373 case Intrinsic::memcpy_inline:
1374 case Intrinsic::memmove:
1375 case Intrinsic::memcpy_element_unordered_atomic:
1376 case Intrinsic::memmove_element_unordered_atomic:
1377 return true;
1378 default:
1379 return false;
1380 }
1381 }
classof(const Value * V)1382 static bool classof(const Value *V) {
1383 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1384 }
1385 };
1386
1387 /// This class represents any memcpy intrinsic
1388 /// i.e. llvm.element.unordered.atomic.memcpy
1389 /// and llvm.memcpy
1390 class AnyMemCpyInst : public AnyMemTransferInst {
1391 public:
classof(const IntrinsicInst * I)1392 static bool classof(const IntrinsicInst *I) {
1393 switch (I->getIntrinsicID()) {
1394 case Intrinsic::memcpy:
1395 case Intrinsic::memcpy_inline:
1396 case Intrinsic::memcpy_element_unordered_atomic:
1397 return true;
1398 default:
1399 return false;
1400 }
1401 }
classof(const Value * V)1402 static bool classof(const Value *V) {
1403 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1404 }
1405 };
1406
1407 /// This class represents any memmove intrinsic
1408 /// i.e. llvm.element.unordered.atomic.memmove
1409 /// and llvm.memmove
1410 class AnyMemMoveInst : public AnyMemTransferInst {
1411 public:
classof(const IntrinsicInst * I)1412 static bool classof(const IntrinsicInst *I) {
1413 switch (I->getIntrinsicID()) {
1414 case Intrinsic::memmove:
1415 case Intrinsic::memmove_element_unordered_atomic:
1416 return true;
1417 default:
1418 return false;
1419 }
1420 }
classof(const Value * V)1421 static bool classof(const Value *V) {
1422 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1423 }
1424 };
1425
1426 /// This represents the llvm.va_start intrinsic.
1427 class VAStartInst : public IntrinsicInst {
1428 public:
classof(const IntrinsicInst * I)1429 static bool classof(const IntrinsicInst *I) {
1430 return I->getIntrinsicID() == Intrinsic::vastart;
1431 }
classof(const Value * V)1432 static bool classof(const Value *V) {
1433 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1434 }
1435
getArgList()1436 Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
1437 };
1438
1439 /// This represents the llvm.va_end intrinsic.
1440 class VAEndInst : public IntrinsicInst {
1441 public:
classof(const IntrinsicInst * I)1442 static bool classof(const IntrinsicInst *I) {
1443 return I->getIntrinsicID() == Intrinsic::vaend;
1444 }
classof(const Value * V)1445 static bool classof(const Value *V) {
1446 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1447 }
1448
getArgList()1449 Value *getArgList() const { return const_cast<Value *>(getArgOperand(0)); }
1450 };
1451
1452 /// This represents the llvm.va_copy intrinsic.
1453 class VACopyInst : public IntrinsicInst {
1454 public:
classof(const IntrinsicInst * I)1455 static bool classof(const IntrinsicInst *I) {
1456 return I->getIntrinsicID() == Intrinsic::vacopy;
1457 }
classof(const Value * V)1458 static bool classof(const Value *V) {
1459 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1460 }
1461
getDest()1462 Value *getDest() const { return const_cast<Value *>(getArgOperand(0)); }
getSrc()1463 Value *getSrc() const { return const_cast<Value *>(getArgOperand(1)); }
1464 };
1465
1466 /// A base class for all instrprof intrinsics.
1467 class InstrProfInstBase : public IntrinsicInst {
1468 protected:
isCounterBase(const IntrinsicInst & I)1469 static bool isCounterBase(const IntrinsicInst &I) {
1470 switch (I.getIntrinsicID()) {
1471 case Intrinsic::instrprof_cover:
1472 case Intrinsic::instrprof_increment:
1473 case Intrinsic::instrprof_increment_step:
1474 case Intrinsic::instrprof_callsite:
1475 case Intrinsic::instrprof_timestamp:
1476 case Intrinsic::instrprof_value_profile:
1477 return true;
1478 }
1479 return false;
1480 }
isMCDCBitmapBase(const IntrinsicInst & I)1481 static bool isMCDCBitmapBase(const IntrinsicInst &I) {
1482 switch (I.getIntrinsicID()) {
1483 case Intrinsic::instrprof_mcdc_parameters:
1484 case Intrinsic::instrprof_mcdc_tvbitmap_update:
1485 return true;
1486 }
1487 return false;
1488 }
1489
1490 public:
classof(const Value * V)1491 static bool classof(const Value *V) {
1492 if (const auto *Instr = dyn_cast<IntrinsicInst>(V))
1493 return isCounterBase(*Instr) || isMCDCBitmapBase(*Instr);
1494 return false;
1495 }
1496 // The name of the instrumented function.
getName()1497 GlobalVariable *getName() const {
1498 return cast<GlobalVariable>(
1499 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
1500 }
1501 // The hash of the CFG for the instrumented function.
getHash()1502 ConstantInt *getHash() const {
1503 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1504 }
1505 };
1506
1507 /// A base class for all instrprof counter intrinsics.
1508 class InstrProfCntrInstBase : public InstrProfInstBase {
1509 public:
classof(const Value * V)1510 static bool classof(const Value *V) {
1511 if (const auto *Instr = dyn_cast<IntrinsicInst>(V))
1512 return InstrProfInstBase::isCounterBase(*Instr);
1513 return false;
1514 }
1515
1516 // The number of counters for the instrumented function.
1517 ConstantInt *getNumCounters() const;
1518 // The index of the counter that this instruction acts on.
1519 ConstantInt *getIndex() const;
1520 };
1521
1522 /// This represents the llvm.instrprof.cover intrinsic.
1523 class InstrProfCoverInst : public InstrProfCntrInstBase {
1524 public:
classof(const IntrinsicInst * I)1525 static bool classof(const IntrinsicInst *I) {
1526 return I->getIntrinsicID() == Intrinsic::instrprof_cover;
1527 }
classof(const Value * V)1528 static bool classof(const Value *V) {
1529 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1530 }
1531 };
1532
1533 /// This represents the llvm.instrprof.increment intrinsic.
1534 class InstrProfIncrementInst : public InstrProfCntrInstBase {
1535 public:
classof(const IntrinsicInst * I)1536 static bool classof(const IntrinsicInst *I) {
1537 return I->getIntrinsicID() == Intrinsic::instrprof_increment ||
1538 I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1539 }
classof(const Value * V)1540 static bool classof(const Value *V) {
1541 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1542 }
1543 Value *getStep() const;
1544 };
1545
1546 /// This represents the llvm.instrprof.increment.step intrinsic.
1547 class InstrProfIncrementInstStep : public InstrProfIncrementInst {
1548 public:
classof(const IntrinsicInst * I)1549 static bool classof(const IntrinsicInst *I) {
1550 return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1551 }
classof(const Value * V)1552 static bool classof(const Value *V) {
1553 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1554 }
1555 };
1556
1557 /// This represents the llvm.instrprof.callsite intrinsic.
1558 /// It is structurally like the increment or step counters, hence the
1559 /// inheritance relationship, albeit somewhat tenuous (it's not 'counting' per
1560 /// se)
1561 class InstrProfCallsite : public InstrProfCntrInstBase {
1562 public:
classof(const IntrinsicInst * I)1563 static bool classof(const IntrinsicInst *I) {
1564 return I->getIntrinsicID() == Intrinsic::instrprof_callsite;
1565 }
classof(const Value * V)1566 static bool classof(const Value *V) {
1567 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1568 }
1569 Value *getCallee() const;
1570 };
1571
1572 /// This represents the llvm.instrprof.timestamp intrinsic.
1573 class InstrProfTimestampInst : public InstrProfCntrInstBase {
1574 public:
classof(const IntrinsicInst * I)1575 static bool classof(const IntrinsicInst *I) {
1576 return I->getIntrinsicID() == Intrinsic::instrprof_timestamp;
1577 }
classof(const Value * V)1578 static bool classof(const Value *V) {
1579 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1580 }
1581 };
1582
1583 /// This represents the llvm.instrprof.value.profile intrinsic.
1584 class InstrProfValueProfileInst : public InstrProfCntrInstBase {
1585 public:
classof(const IntrinsicInst * I)1586 static bool classof(const IntrinsicInst *I) {
1587 return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
1588 }
classof(const Value * V)1589 static bool classof(const Value *V) {
1590 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1591 }
1592
getTargetValue()1593 Value *getTargetValue() const {
1594 return cast<Value>(const_cast<Value *>(getArgOperand(2)));
1595 }
1596
getValueKind()1597 ConstantInt *getValueKind() const {
1598 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1599 }
1600
1601 // Returns the value site index.
getIndex()1602 ConstantInt *getIndex() const {
1603 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
1604 }
1605 };
1606
1607 /// A base class for instrprof mcdc intrinsics that require global bitmap bytes.
1608 class InstrProfMCDCBitmapInstBase : public InstrProfInstBase {
1609 public:
classof(const IntrinsicInst * I)1610 static bool classof(const IntrinsicInst *I) {
1611 return InstrProfInstBase::isMCDCBitmapBase(*I);
1612 }
classof(const Value * V)1613 static bool classof(const Value *V) {
1614 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1615 }
1616
1617 /// \return The number of bits used for the MCDC bitmaps for the instrumented
1618 /// function.
getNumBitmapBits()1619 ConstantInt *getNumBitmapBits() const {
1620 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
1621 }
1622
1623 /// \return The number of bytes used for the MCDC bitmaps for the instrumented
1624 /// function.
getNumBitmapBytes()1625 auto getNumBitmapBytes() const {
1626 return alignTo(getNumBitmapBits()->getZExtValue(), CHAR_BIT) / CHAR_BIT;
1627 }
1628 };
1629
1630 /// This represents the llvm.instrprof.mcdc.parameters intrinsic.
1631 class InstrProfMCDCBitmapParameters : public InstrProfMCDCBitmapInstBase {
1632 public:
classof(const IntrinsicInst * I)1633 static bool classof(const IntrinsicInst *I) {
1634 return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_parameters;
1635 }
classof(const Value * V)1636 static bool classof(const Value *V) {
1637 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1638 }
1639 };
1640
1641 /// This represents the llvm.instrprof.mcdc.tvbitmap.update intrinsic.
1642 class InstrProfMCDCTVBitmapUpdate : public InstrProfMCDCBitmapInstBase {
1643 public:
classof(const IntrinsicInst * I)1644 static bool classof(const IntrinsicInst *I) {
1645 return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_tvbitmap_update;
1646 }
classof(const Value * V)1647 static bool classof(const Value *V) {
1648 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1649 }
1650
1651 /// \return The index of the TestVector Bitmap upon which this intrinsic
1652 /// acts.
getBitmapIndex()1653 ConstantInt *getBitmapIndex() const {
1654 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
1655 }
1656
1657 /// \return The address of the corresponding condition bitmap containing
1658 /// the index of the TestVector to update within the TestVector Bitmap.
getMCDCCondBitmapAddr()1659 Value *getMCDCCondBitmapAddr() const {
1660 return cast<Value>(const_cast<Value *>(getArgOperand(3)));
1661 }
1662 };
1663
1664 class PseudoProbeInst : public IntrinsicInst {
1665 public:
classof(const IntrinsicInst * I)1666 static bool classof(const IntrinsicInst *I) {
1667 return I->getIntrinsicID() == Intrinsic::pseudoprobe;
1668 }
1669
classof(const Value * V)1670 static bool classof(const Value *V) {
1671 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1672 }
1673
getFuncGuid()1674 ConstantInt *getFuncGuid() const {
1675 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(0)));
1676 }
1677
getIndex()1678 ConstantInt *getIndex() const {
1679 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1680 }
1681
getAttributes()1682 ConstantInt *getAttributes() const {
1683 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
1684 }
1685
getFactor()1686 ConstantInt *getFactor() const {
1687 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1688 }
1689 };
1690
1691 class NoAliasScopeDeclInst : public IntrinsicInst {
1692 public:
classof(const IntrinsicInst * I)1693 static bool classof(const IntrinsicInst *I) {
1694 return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl;
1695 }
1696
classof(const Value * V)1697 static bool classof(const Value *V) {
1698 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1699 }
1700
getScopeList()1701 MDNode *getScopeList() const {
1702 auto *MV =
1703 cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
1704 return cast<MDNode>(MV->getMetadata());
1705 }
1706
setScopeList(MDNode * ScopeList)1707 void setScopeList(MDNode *ScopeList) {
1708 setOperand(Intrinsic::NoAliasScopeDeclScopeArg,
1709 MetadataAsValue::get(getContext(), ScopeList));
1710 }
1711 };
1712
1713 /// Common base class for representing values projected from a statepoint.
1714 /// Currently, the only projections available are gc.result and gc.relocate.
1715 class GCProjectionInst : public IntrinsicInst {
1716 public:
classof(const IntrinsicInst * I)1717 static bool classof(const IntrinsicInst *I) {
1718 return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate ||
1719 I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1720 }
1721
classof(const Value * V)1722 static bool classof(const Value *V) {
1723 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1724 }
1725
1726 /// Return true if this relocate is tied to the invoke statepoint.
1727 /// This includes relocates which are on the unwinding path.
isTiedToInvoke()1728 bool isTiedToInvoke() const {
1729 const Value *Token = getArgOperand(0);
1730
1731 return isa<LandingPadInst>(Token) || isa<InvokeInst>(Token);
1732 }
1733
1734 /// The statepoint with which this gc.relocate is associated.
1735 const Value *getStatepoint() const;
1736 };
1737
1738 /// Represents calls to the gc.relocate intrinsic.
1739 class GCRelocateInst : public GCProjectionInst {
1740 public:
classof(const IntrinsicInst * I)1741 static bool classof(const IntrinsicInst *I) {
1742 return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
1743 }
1744
classof(const Value * V)1745 static bool classof(const Value *V) {
1746 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1747 }
1748
1749 /// The index into the associate statepoint's argument list
1750 /// which contains the base pointer of the pointer whose
1751 /// relocation this gc.relocate describes.
getBasePtrIndex()1752 unsigned getBasePtrIndex() const {
1753 return cast<ConstantInt>(getArgOperand(1))->getZExtValue();
1754 }
1755
1756 /// The index into the associate statepoint's argument list which
1757 /// contains the pointer whose relocation this gc.relocate describes.
getDerivedPtrIndex()1758 unsigned getDerivedPtrIndex() const {
1759 return cast<ConstantInt>(getArgOperand(2))->getZExtValue();
1760 }
1761
1762 Value *getBasePtr() const;
1763 Value *getDerivedPtr() const;
1764 };
1765
1766 /// Represents calls to the gc.result intrinsic.
1767 class GCResultInst : public GCProjectionInst {
1768 public:
classof(const IntrinsicInst * I)1769 static bool classof(const IntrinsicInst *I) {
1770 return I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1771 }
1772
classof(const Value * V)1773 static bool classof(const Value *V) {
1774 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1775 }
1776 };
1777
1778
1779 /// This represents the llvm.assume intrinsic.
1780 class AssumeInst : public IntrinsicInst {
1781 public:
classof(const IntrinsicInst * I)1782 static bool classof(const IntrinsicInst *I) {
1783 return I->getIntrinsicID() == Intrinsic::assume;
1784 }
classof(const Value * V)1785 static bool classof(const Value *V) {
1786 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1787 }
1788 };
1789
1790 /// Check if \p ID corresponds to a convergence control intrinsic.
isConvergenceControlIntrinsic(unsigned IntrinsicID)1791 static inline bool isConvergenceControlIntrinsic(unsigned IntrinsicID) {
1792 switch (IntrinsicID) {
1793 default:
1794 return false;
1795 case Intrinsic::experimental_convergence_anchor:
1796 case Intrinsic::experimental_convergence_entry:
1797 case Intrinsic::experimental_convergence_loop:
1798 return true;
1799 }
1800 }
1801
1802 /// Represents calls to the llvm.experimintal.convergence.* intrinsics.
1803 class ConvergenceControlInst : public IntrinsicInst {
1804 public:
classof(const IntrinsicInst * I)1805 static bool classof(const IntrinsicInst *I) {
1806 return isConvergenceControlIntrinsic(I->getIntrinsicID());
1807 }
1808
classof(const Value * V)1809 static bool classof(const Value *V) {
1810 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1811 }
1812
isAnchor()1813 bool isAnchor() {
1814 return getIntrinsicID() == Intrinsic::experimental_convergence_anchor;
1815 }
isEntry()1816 bool isEntry() {
1817 return getIntrinsicID() == Intrinsic::experimental_convergence_entry;
1818 }
isLoop()1819 bool isLoop() {
1820 return getIntrinsicID() == Intrinsic::experimental_convergence_loop;
1821 }
1822 };
1823
1824 } // end namespace llvm
1825
1826 #endif // LLVM_IR_INTRINSICINST_H
1827