Branch data Line data Source code
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.
55 : 0 : Intrinsic::ID getIntrinsicID() const {
56 : 0 : return getCalledFunction()->getIntrinsicID();
57 : : }
58 : :
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.
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.
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:
130 : 0 : static bool classof(const CallInst *I) {
131 [ # # ]: 0 : if (const Function *CF = I->getCalledFunction())
132 : 0 : return CF->isIntrinsic();
133 : 0 : return false;
134 : : }
135 : 0 : static bool classof(const Value *V) {
136 [ # # # # ]: 0 : return isa<CallInst>(V) && classof(cast<CallInst>(V));
137 : : }
138 : : };
139 : :
140 : : /// Check if \p ID corresponds to a lifetime intrinsic.
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 : : /// @{
156 : : static bool classof(const IntrinsicInst *I) {
157 : : return isLifetimeIntrinsic(I->getIntrinsicID());
158 : : }
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.
166 : 0 : static inline bool isDbgInfoIntrinsic(Intrinsic::ID ID) {
167 [ # # ]: 0 : switch (ID) {
168 : 0 : case Intrinsic::dbg_declare:
169 : : case Intrinsic::dbg_value:
170 : : case Intrinsic::dbg_label:
171 : : case Intrinsic::dbg_assign:
172 : 0 : return true;
173 : 0 : default:
174 : 0 : 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 : : /// @{
183 : 0 : static bool classof(const IntrinsicInst *I) {
184 : 0 : return isDbgInfoIntrinsic(I->getIntrinsicID());
185 : : }
186 : 0 : static bool classof(const Value *V) {
187 [ # # # # ]: 0 : 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:
201 : : location_op_iterator(ValueAsMetadata *SingleIter) : I(SingleIter) {}
202 : : location_op_iterator(ValueAsMetadata **MultiIter) : I(MultiIter) {}
203 : :
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;
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 : : }
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;
260 : : unsigned getNumVariableLocationOps() const {
261 : : if (hasArgList())
262 : : return cast<DIArgList>(getRawLocation())->getArgs().size();
263 : : return 1;
264 : : }
265 : : bool hasArgList() const { return isa<DIArgList>(getRawLocation()); }
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 : :
324 : : void setVariable(DILocalVariable *NewVar) {
325 : : setArgOperand(1, MetadataAsValue::get(NewVar->getContext(), NewVar));
326 : : }
327 : :
328 : : void setExpression(DIExpression *NewExpr) {
329 : : setArgOperand(2, MetadataAsValue::get(NewExpr->getContext(), NewExpr));
330 : : }
331 : :
332 : : unsigned getNumVariableLocationOps() const {
333 : : return getWrappedLocation().getNumVariableLocationOps();
334 : : }
335 : :
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.
341 : : bool isAddressOfVariable() const {
342 : : return getIntrinsicID() == Intrinsic::dbg_declare;
343 : : }
344 : :
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 : :
357 : : bool isKillLocation() const {
358 : : return getWrappedLocation().isKillLocation(getExpression());
359 : : }
360 : :
361 : : DILocalVariable *getVariable() const {
362 : : return cast<DILocalVariable>(getRawVariable());
363 : : }
364 : :
365 : : DIExpression *getExpression() const {
366 : : return cast<DIExpression>(getRawExpression());
367 : : }
368 : :
369 : : Metadata *getRawLocation() const {
370 : : return cast<MetadataAsValue>(getArgOperand(0))->getMetadata();
371 : : }
372 : :
373 : : RawLocationWrapper getWrappedLocation() const {
374 : : return RawLocationWrapper(getRawLocation());
375 : : }
376 : :
377 : : Metadata *getRawVariable() const {
378 : : return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
379 : : }
380 : :
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.
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.
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.
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 : : /// @{
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 : : }
426 : : static bool classof(const Value *V) {
427 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
428 : : }
429 : : /// @}
430 : : protected:
431 : : void setArgOperand(unsigned i, Value *v) {
432 : : DbgInfoIntrinsic::setArgOperand(i, v);
433 : : }
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:
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 : : /// @{
448 : : static bool classof(const IntrinsicInst *I) {
449 : : return I->getIntrinsicID() == Intrinsic::dbg_declare;
450 : : }
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 : : }
465 : : iterator_range<location_op_iterator> getValues() const {
466 : : return location_ops();
467 : : }
468 : :
469 : : /// \name Casting methods
470 : : /// @{
471 : : static bool classof(const IntrinsicInst *I) {
472 : : return I->getIntrinsicID() == Intrinsic::dbg_value ||
473 : : I->getIntrinsicID() == Intrinsic::dbg_assign;
474 : : }
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;
494 : : Metadata *getRawAddress() const {
495 : : return cast<MetadataAsValue>(getArgOperand(OpAddress))->getMetadata();
496 : : }
497 : : Metadata *getRawAssignID() const {
498 : : return cast<MetadataAsValue>(getArgOperand(OpAssignID))->getMetadata();
499 : : }
500 : : DIAssignID *getAssignID() const { return cast<DIAssignID>(getRawAssignID()); }
501 : : Metadata *getRawAddressExpression() const {
502 : : return cast<MetadataAsValue>(getArgOperand(OpAddressExpr))->getMetadata();
503 : : }
504 : : DIExpression *getAddressExpression() const {
505 : : return cast<DIExpression>(getRawAddressExpression());
506 : : }
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 : : /// @{
523 : : static bool classof(const IntrinsicInst *I) {
524 : : return I->getIntrinsicID() == Intrinsic::dbg_assign;
525 : : }
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:
535 : : DILabel *getLabel() const { return cast<DILabel>(getRawLabel()); }
536 : : void setLabel(DILabel *NewLabel) {
537 : : setArgOperand(0, MetadataAsValue::get(getContext(), NewLabel));
538 : : }
539 : :
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 : : /// @{
546 : : static bool classof(const IntrinsicInst *I) {
547 : : return I->getIntrinsicID() == Intrinsic::dbg_label;
548 : : }
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:
608 : : static bool classof(const IntrinsicInst *I) {
609 : : return isVPIntrinsic(I->getIntrinsicID());
610 : : }
611 : : static bool classof(const Value *V) {
612 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
613 : : }
614 : :
615 : : // Equivalent non-predicated opcode
616 : : std::optional<unsigned> getFunctionalOpcode() const {
617 : : return getFunctionalOpcodeForVP(getIntrinsicID());
618 : : }
619 : :
620 : : // Equivalent non-predicated intrinsic ID
621 : : std::optional<unsigned> getFunctionalIntrinsicID() const {
622 : : return getFunctionalIntrinsicIDForVP(getIntrinsicID());
623 : : }
624 : :
625 : : // Equivalent non-predicated constrained ID
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 : : /// @{
655 : : static bool classof(const IntrinsicInst *I) {
656 : : return VPReductionIntrinsic::isVPReduction(I->getIntrinsicID());
657 : : }
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 : : /// @{
670 : : static bool classof(const IntrinsicInst *I) {
671 : : return VPCastIntrinsic::isVPCast(I->getIntrinsicID());
672 : : }
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 : : /// @{
687 : : static bool classof(const IntrinsicInst *I) {
688 : : return VPCmpIntrinsic::isVPCmp(I->getIntrinsicID());
689 : : }
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 : : /// @{
702 : : static bool classof(const IntrinsicInst *I) {
703 : : return VPBinOpIntrinsic::isVPBinOp(I->getIntrinsicID());
704 : : }
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);
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;
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:
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 : : }
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:
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 : : }
764 : : static bool classof(const Value *V) {
765 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
766 : : }
767 : :
768 : : Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
769 : : Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
770 : :
771 : : /// Returns the comparison predicate underlying the intrinsic.
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.
788 : : ICmpInst::Predicate getPredicate() const {
789 : : return getPredicate(getIntrinsicID());
790 : : }
791 : :
792 : : /// Whether the intrinsic is signed or unsigned.
793 : : static bool isSigned(Intrinsic::ID ID) {
794 : : return ICmpInst::isSigned(getPredicate(ID));
795 : : };
796 : :
797 : : /// Whether the intrinsic is signed or unsigned.
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.
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.
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.
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.
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:
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 : : }
853 : : static bool classof(const Value *V) {
854 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
855 : : }
856 : :
857 : : Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
858 : : Value *getRHS() const { return const_cast<Value *>(getArgOperand(1)); }
859 : :
860 : : static bool isSigned(Intrinsic::ID ID) { return ID == Intrinsic::scmp; }
861 : : bool isSigned() const { return isSigned(getIntrinsicID()); }
862 : :
863 : : static CmpInst::Predicate getGTPredicate(Intrinsic::ID ID) {
864 : : return isSigned(ID) ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
865 : : }
866 : : CmpInst::Predicate getGTPredicate() const {
867 : : return getGTPredicate(getIntrinsicID());
868 : : }
869 : :
870 : : static CmpInst::Predicate getLTPredicate(Intrinsic::ID ID) {
871 : : return isSigned(ID) ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
872 : : }
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:
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 : : }
899 : : static bool classof(const Value *V) {
900 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
901 : : }
902 : :
903 : : Value *getLHS() const { return const_cast<Value *>(getArgOperand(0)); }
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:
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 : : }
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:
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 : : }
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:
965 : : Value *getRawDest() const {
966 : : return const_cast<Value *>(getArgOperand(ARG_DEST));
967 : : }
968 : : const Use &getRawDestUse() const { return getArgOperandUse(ARG_DEST); }
969 : : Use &getRawDestUse() { return getArgOperandUse(ARG_DEST); }
970 : :
971 : : Value *getLength() const {
972 : : return const_cast<Value *>(getArgOperand(ARG_LENGTH));
973 : : }
974 : : const Use &getLengthUse() const { return getArgOperandUse(ARG_LENGTH); }
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.
980 : : Value *getDest() const { return getRawDest()->stripPointerCasts(); }
981 : :
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")
989 : : unsigned getDestAlignment() const {
990 : : if (auto MA = getParamAlign(ARG_DEST))
991 : : return MA->value();
992 : : return 0;
993 : : }
994 : : MaybeAlign getDestAlign() const { return getParamAlign(ARG_DEST); }
995 : :
996 : : /// Set the specified arguments of the instruction.
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 : :
1003 : : void setDestAlignment(MaybeAlign Alignment) {
1004 : : removeParamAttr(ARG_DEST, Attribute::Alignment);
1005 : : if (Alignment)
1006 : : addParamAttr(ARG_DEST,
1007 : : Attribute::getWithAlignment(getContext(), *Alignment));
1008 : : }
1009 : : void setDestAlignment(Align Alignment) {
1010 : : removeParamAttr(ARG_DEST, Attribute::Alignment);
1011 : : addParamAttr(ARG_DEST,
1012 : : Attribute::getWithAlignment(getContext(), Alignment));
1013 : : }
1014 : :
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.
1030 : : Value *getRawSource() const {
1031 : : return const_cast<Value *>(BaseCL::getArgOperand(ARG_SOURCE));
1032 : : }
1033 : : const Use &getRawSourceUse() const {
1034 : : return BaseCL::getArgOperandUse(ARG_SOURCE);
1035 : : }
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.
1041 : : Value *getSource() const { return getRawSource()->stripPointerCasts(); }
1042 : :
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")
1050 : : unsigned getSourceAlignment() const {
1051 : : if (auto MA = BaseCL::getParamAlign(ARG_SOURCE))
1052 : : return MA->value();
1053 : : return 0;
1054 : : }
1055 : :
1056 : : MaybeAlign getSourceAlign() const {
1057 : : return BaseCL::getParamAlign(ARG_SOURCE);
1058 : : }
1059 : :
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 : :
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 : :
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:
1087 : : Value *getValue() const {
1088 : : return const_cast<Value *>(BaseCL::getArgOperand(ARG_VALUE));
1089 : : }
1090 : : const Use &getValueUse() const { return BaseCL::getArgOperandUse(ARG_VALUE); }
1091 : : Use &getValueUse() { return BaseCL::getArgOperandUse(ARG_VALUE); }
1092 : :
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:
1107 : : Value *getRawElementSizeInBytes() const {
1108 : : return const_cast<Value *>(getArgOperand(ARG_ELEMENTSIZE));
1109 : : }
1110 : :
1111 : : ConstantInt *getElementSizeInBytesCst() const {
1112 : : return cast<ConstantInt>(getRawElementSizeInBytes());
1113 : : }
1114 : :
1115 : : uint32_t getElementSizeInBytes() const {
1116 : : return getElementSizeInBytesCst()->getZExtValue();
1117 : : }
1118 : :
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 : :
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 : : }
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:
1144 : : static bool classof(const IntrinsicInst *I) {
1145 : : return I->getIntrinsicID() == Intrinsic::memset_element_unordered_atomic;
1146 : : }
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:
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 : : }
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:
1174 : : static bool classof(const IntrinsicInst *I) {
1175 : : return I->getIntrinsicID() == Intrinsic::memcpy_element_unordered_atomic;
1176 : : }
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:
1186 : : static bool classof(const IntrinsicInst *I) {
1187 : : return I->getIntrinsicID() == Intrinsic::memmove_element_unordered_atomic;
1188 : : }
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:
1200 : : ConstantInt *getVolatileCst() const {
1201 : : return cast<ConstantInt>(const_cast<Value *>(getArgOperand(ARG_VOLATILE)));
1202 : : }
1203 : :
1204 : : bool isVolatile() const { return !getVolatileCst()->isZero(); }
1205 : :
1206 : : void setVolatile(Constant *V) { setArgOperand(ARG_VOLATILE, V); }
1207 : :
1208 : : // Methods for support type inquiry through isa, cast, and dyn_cast:
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 : : }
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:
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 : : }
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:
1248 : : static bool classof(const IntrinsicInst *I) {
1249 : : return I->getIntrinsicID() == Intrinsic::memset_inline;
1250 : : }
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:
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 : : }
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:
1279 : : static bool classof(const IntrinsicInst *I) {
1280 : : return I->getIntrinsicID() == Intrinsic::memcpy ||
1281 : : I->getIntrinsicID() == Intrinsic::memcpy_inline;
1282 : : }
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:
1292 : : static bool classof(const IntrinsicInst *I) {
1293 : : return I->getIntrinsicID() == Intrinsic::memmove;
1294 : : }
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:
1304 : : static bool classof(const IntrinsicInst *I) {
1305 : : return I->getIntrinsicID() == Intrinsic::memcpy_inline;
1306 : : }
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:
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 : :
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 : : }
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:
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 : : }
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:
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 : : }
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:
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 : : }
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:
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 : : }
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:
1429 : : static bool classof(const IntrinsicInst *I) {
1430 : : return I->getIntrinsicID() == Intrinsic::vastart;
1431 : : }
1432 : : static bool classof(const Value *V) {
1433 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1434 : : }
1435 : :
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:
1442 : : static bool classof(const IntrinsicInst *I) {
1443 : : return I->getIntrinsicID() == Intrinsic::vaend;
1444 : : }
1445 : : static bool classof(const Value *V) {
1446 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1447 : : }
1448 : :
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:
1455 : : static bool classof(const IntrinsicInst *I) {
1456 : : return I->getIntrinsicID() == Intrinsic::vacopy;
1457 : : }
1458 : : static bool classof(const Value *V) {
1459 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1460 : : }
1461 : :
1462 : : Value *getDest() const { return const_cast<Value *>(getArgOperand(0)); }
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:
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 : : }
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:
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.
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.
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:
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:
1525 : : static bool classof(const IntrinsicInst *I) {
1526 : : return I->getIntrinsicID() == Intrinsic::instrprof_cover;
1527 : : }
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:
1536 : : static bool classof(const IntrinsicInst *I) {
1537 : : return I->getIntrinsicID() == Intrinsic::instrprof_increment ||
1538 : : I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1539 : : }
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:
1549 : : static bool classof(const IntrinsicInst *I) {
1550 : : return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
1551 : : }
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:
1563 : : static bool classof(const IntrinsicInst *I) {
1564 : : return I->getIntrinsicID() == Intrinsic::instrprof_callsite;
1565 : : }
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:
1575 : : static bool classof(const IntrinsicInst *I) {
1576 : : return I->getIntrinsicID() == Intrinsic::instrprof_timestamp;
1577 : : }
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:
1586 : : static bool classof(const IntrinsicInst *I) {
1587 : : return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
1588 : : }
1589 : : static bool classof(const Value *V) {
1590 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1591 : : }
1592 : :
1593 : : Value *getTargetValue() const {
1594 : : return cast<Value>(const_cast<Value *>(getArgOperand(2)));
1595 : : }
1596 : :
1597 : : ConstantInt *getValueKind() const {
1598 : : return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1599 : : }
1600 : :
1601 : : // Returns the value site index.
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:
1610 : : static bool classof(const IntrinsicInst *I) {
1611 : : return InstrProfInstBase::isMCDCBitmapBase(*I);
1612 : : }
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.
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.
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:
1633 : : static bool classof(const IntrinsicInst *I) {
1634 : : return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_parameters;
1635 : : }
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:
1644 : : static bool classof(const IntrinsicInst *I) {
1645 : : return I->getIntrinsicID() == Intrinsic::instrprof_mcdc_tvbitmap_update;
1646 : : }
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.
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.
1659 : : Value *getMCDCCondBitmapAddr() const {
1660 : : return cast<Value>(const_cast<Value *>(getArgOperand(3)));
1661 : : }
1662 : : };
1663 : :
1664 : : class PseudoProbeInst : public IntrinsicInst {
1665 : : public:
1666 : : static bool classof(const IntrinsicInst *I) {
1667 : : return I->getIntrinsicID() == Intrinsic::pseudoprobe;
1668 : : }
1669 : :
1670 : : static bool classof(const Value *V) {
1671 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1672 : : }
1673 : :
1674 : : ConstantInt *getFuncGuid() const {
1675 : : return cast<ConstantInt>(const_cast<Value *>(getArgOperand(0)));
1676 : : }
1677 : :
1678 : : ConstantInt *getIndex() const {
1679 : : return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
1680 : : }
1681 : :
1682 : : ConstantInt *getAttributes() const {
1683 : : return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
1684 : : }
1685 : :
1686 : : ConstantInt *getFactor() const {
1687 : : return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
1688 : : }
1689 : : };
1690 : :
1691 : : class NoAliasScopeDeclInst : public IntrinsicInst {
1692 : : public:
1693 : : static bool classof(const IntrinsicInst *I) {
1694 : : return I->getIntrinsicID() == Intrinsic::experimental_noalias_scope_decl;
1695 : : }
1696 : :
1697 : : static bool classof(const Value *V) {
1698 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1699 : : }
1700 : :
1701 : : MDNode *getScopeList() const {
1702 : : auto *MV =
1703 : : cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
1704 : : return cast<MDNode>(MV->getMetadata());
1705 : : }
1706 : :
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:
1717 : : static bool classof(const IntrinsicInst *I) {
1718 : : return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate ||
1719 : : I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1720 : : }
1721 : :
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.
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:
1741 : : static bool classof(const IntrinsicInst *I) {
1742 : : return I->getIntrinsicID() == Intrinsic::experimental_gc_relocate;
1743 : : }
1744 : :
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.
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.
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:
1769 : : static bool classof(const IntrinsicInst *I) {
1770 : : return I->getIntrinsicID() == Intrinsic::experimental_gc_result;
1771 : : }
1772 : :
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:
1782 : : static bool classof(const IntrinsicInst *I) {
1783 : : return I->getIntrinsicID() == Intrinsic::assume;
1784 : : }
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.
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:
1805 : : static bool classof(const IntrinsicInst *I) {
1806 : : return isConvergenceControlIntrinsic(I->getIntrinsicID());
1807 : : }
1808 : :
1809 : : static bool classof(const Value *V) {
1810 : : return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
1811 : : }
1812 : :
1813 : : bool isAnchor() {
1814 : : return getIntrinsicID() == Intrinsic::experimental_convergence_anchor;
1815 : : }
1816 : : bool isEntry() {
1817 : : return getIntrinsicID() == Intrinsic::experimental_convergence_entry;
1818 : : }
1819 : : bool isLoop() {
1820 : : return getIntrinsicID() == Intrinsic::experimental_convergence_loop;
1821 : : }
1822 : : };
1823 : :
1824 : : } // end namespace llvm
1825 : :
1826 : : #endif // LLVM_IR_INTRINSICINST_H
|