1 //===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines classes that make it really easy to deal with intrinsic
11 // functions with the isa/dyncast family of functions. In particular, this
12 // allows you to do things like:
14 // if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
15 // ... MCI->getDest() ... MCI->getSource() ...
17 // All intrinsic function calls are instances of the call instruction, so these
18 // are all subclasses of the CallInst class. Note that none of these classes
19 // has state or virtual methods, which is an important part of this gross/neat
22 //===----------------------------------------------------------------------===//
24 #ifndef LLVM_IR_INTRINSICINST_H
25 #define LLVM_IR_INTRINSICINST_H
27 #include "llvm/IR/Constants.h"
28 #include "llvm/IR/DerivedTypes.h"
29 #include "llvm/IR/Function.h"
30 #include "llvm/IR/GlobalVariable.h"
31 #include "llvm/IR/Instructions.h"
32 #include "llvm/IR/Intrinsics.h"
33 #include "llvm/IR/Metadata.h"
34 #include "llvm/IR/Value.h"
35 #include "llvm/Support/Casting.h"
41 /// A wrapper class for inspecting calls to intrinsic functions.
42 /// This allows the standard isa/dyncast/cast functionality to work with calls
43 /// to intrinsic functions.
44 class IntrinsicInst : public CallInst {
46 IntrinsicInst() = delete;
47 IntrinsicInst(const IntrinsicInst &) = delete;
48 IntrinsicInst &operator=(const IntrinsicInst &) = delete;
50 /// Return the intrinsic ID of this intrinsic.
51 Intrinsic::ID getIntrinsicID() const {
52 return getCalledFunction()->getIntrinsicID();
55 // Methods for support type inquiry through isa, cast, and dyn_cast:
56 static inline bool classof(const CallInst *I) {
57 if (const Function *CF = I->getCalledFunction())
58 return CF->isIntrinsic();
61 static inline bool classof(const Value *V) {
62 return isa<CallInst>(V) && classof(cast<CallInst>(V));
66 /// This is the common base class for debug info intrinsics.
67 class DbgInfoIntrinsic : public IntrinsicInst {
69 /// Get the location corresponding to the variable referenced by the debug
70 /// info intrinsic. Depending on the intrinsic, this could be the
71 /// variable's value or its address.
72 Value *getVariableLocation(bool AllowNullOp = true) const;
74 // Methods for support type inquiry through isa, cast, and dyn_cast:
75 static inline bool classof(const IntrinsicInst *I) {
76 switch (I->getIntrinsicID()) {
77 case Intrinsic::dbg_declare:
78 case Intrinsic::dbg_value:
80 default: return false;
83 static inline bool classof(const Value *V) {
84 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
88 /// This represents the llvm.dbg.declare instruction.
89 class DbgDeclareInst : public DbgInfoIntrinsic {
91 Value *getAddress() const { return getVariableLocation(); }
93 DILocalVariable *getVariable() const {
94 return cast<DILocalVariable>(getRawVariable());
97 DIExpression *getExpression() const {
98 return cast<DIExpression>(getRawExpression());
101 Metadata *getRawVariable() const {
102 return cast<MetadataAsValue>(getArgOperand(1))->getMetadata();
105 Metadata *getRawExpression() const {
106 return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
109 // Methods for support type inquiry through isa, cast, and dyn_cast:
110 static inline bool classof(const IntrinsicInst *I) {
111 return I->getIntrinsicID() == Intrinsic::dbg_declare;
113 static inline bool classof(const Value *V) {
114 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
118 /// This represents the llvm.dbg.value instruction.
119 class DbgValueInst : public DbgInfoIntrinsic {
121 Value *getValue() const {
122 return getVariableLocation(/* AllowNullOp = */ false);
125 uint64_t getOffset() const {
126 return cast<ConstantInt>(
127 const_cast<Value*>(getArgOperand(1)))->getZExtValue();
130 DILocalVariable *getVariable() const {
131 return cast<DILocalVariable>(getRawVariable());
134 DIExpression *getExpression() const {
135 return cast<DIExpression>(getRawExpression());
138 Metadata *getRawVariable() const {
139 return cast<MetadataAsValue>(getArgOperand(2))->getMetadata();
142 Metadata *getRawExpression() const {
143 return cast<MetadataAsValue>(getArgOperand(3))->getMetadata();
146 // Methods for support type inquiry through isa, cast, and dyn_cast:
147 static inline bool classof(const IntrinsicInst *I) {
148 return I->getIntrinsicID() == Intrinsic::dbg_value;
150 static inline bool classof(const Value *V) {
151 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
155 /// This is the common base class for constrained floating point intrinsics.
156 class ConstrainedFPIntrinsic : public IntrinsicInst {
167 enum ExceptionBehavior {
174 bool isUnaryOp() const;
175 RoundingMode getRoundingMode() const;
176 ExceptionBehavior getExceptionBehavior() const;
178 // Methods for support type inquiry through isa, cast, and dyn_cast:
179 static inline bool classof(const IntrinsicInst *I) {
180 switch (I->getIntrinsicID()) {
181 case Intrinsic::experimental_constrained_fadd:
182 case Intrinsic::experimental_constrained_fsub:
183 case Intrinsic::experimental_constrained_fmul:
184 case Intrinsic::experimental_constrained_fdiv:
185 case Intrinsic::experimental_constrained_frem:
186 case Intrinsic::experimental_constrained_sqrt:
187 case Intrinsic::experimental_constrained_pow:
188 case Intrinsic::experimental_constrained_powi:
189 case Intrinsic::experimental_constrained_sin:
190 case Intrinsic::experimental_constrained_cos:
191 case Intrinsic::experimental_constrained_exp:
192 case Intrinsic::experimental_constrained_exp2:
193 case Intrinsic::experimental_constrained_log:
194 case Intrinsic::experimental_constrained_log10:
195 case Intrinsic::experimental_constrained_log2:
196 case Intrinsic::experimental_constrained_rint:
197 case Intrinsic::experimental_constrained_nearbyint:
199 default: return false;
202 static inline bool classof(const Value *V) {
203 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
207 /// This class represents atomic memcpy intrinsic
208 /// TODO: Integrate this class into MemIntrinsic hierarchy.
209 class ElementAtomicMemCpyInst : public IntrinsicInst {
211 Value *getRawDest() const { return getArgOperand(0); }
212 Value *getRawSource() const { return getArgOperand(1); }
214 Value *getNumElements() const { return getArgOperand(2); }
215 void setNumElements(Value *V) { setArgOperand(2, V); }
217 uint64_t getSrcAlignment() const { return getParamAlignment(0); }
218 uint64_t getDstAlignment() const { return getParamAlignment(1); }
220 uint64_t getElementSizeInBytes() const {
221 Value *Arg = getArgOperand(3);
222 return cast<ConstantInt>(Arg)->getZExtValue();
225 static inline bool classof(const IntrinsicInst *I) {
226 return I->getIntrinsicID() == Intrinsic::memcpy_element_atomic;
228 static inline bool classof(const Value *V) {
229 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
233 /// This is the common base class for memset/memcpy/memmove.
234 class MemIntrinsic : public IntrinsicInst {
236 Value *getRawDest() const { return const_cast<Value*>(getArgOperand(0)); }
237 const Use &getRawDestUse() const { return getArgOperandUse(0); }
238 Use &getRawDestUse() { return getArgOperandUse(0); }
240 Value *getLength() const { return const_cast<Value*>(getArgOperand(2)); }
241 const Use &getLengthUse() const { return getArgOperandUse(2); }
242 Use &getLengthUse() { return getArgOperandUse(2); }
244 ConstantInt *getAlignmentCst() const {
245 return cast<ConstantInt>(const_cast<Value*>(getArgOperand(3)));
248 unsigned getAlignment() const {
249 return getAlignmentCst()->getZExtValue();
252 ConstantInt *getVolatileCst() const {
253 return cast<ConstantInt>(const_cast<Value*>(getArgOperand(4)));
256 bool isVolatile() const {
257 return !getVolatileCst()->isZero();
260 unsigned getDestAddressSpace() const {
261 return cast<PointerType>(getRawDest()->getType())->getAddressSpace();
264 /// This is just like getRawDest, but it strips off any cast
265 /// instructions that feed it, giving the original input. The returned
266 /// value is guaranteed to be a pointer.
267 Value *getDest() const { return getRawDest()->stripPointerCasts(); }
269 /// Set the specified arguments of the instruction.
270 void setDest(Value *Ptr) {
271 assert(getRawDest()->getType() == Ptr->getType() &&
272 "setDest called with pointer of wrong type!");
273 setArgOperand(0, Ptr);
276 void setLength(Value *L) {
277 assert(getLength()->getType() == L->getType() &&
278 "setLength called with value of wrong type!");
282 void setAlignment(Constant* A) {
286 void setVolatile(Constant* V) {
290 Type *getAlignmentType() const {
291 return getArgOperand(3)->getType();
294 // Methods for support type inquiry through isa, cast, and dyn_cast:
295 static inline bool classof(const IntrinsicInst *I) {
296 switch (I->getIntrinsicID()) {
297 case Intrinsic::memcpy:
298 case Intrinsic::memmove:
299 case Intrinsic::memset:
301 default: return false;
304 static inline bool classof(const Value *V) {
305 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
309 /// This class wraps the llvm.memset intrinsic.
310 class MemSetInst : public MemIntrinsic {
312 /// Return the arguments to the instruction.
313 Value *getValue() const { return const_cast<Value*>(getArgOperand(1)); }
314 const Use &getValueUse() const { return getArgOperandUse(1); }
315 Use &getValueUse() { return getArgOperandUse(1); }
317 void setValue(Value *Val) {
318 assert(getValue()->getType() == Val->getType() &&
319 "setValue called with value of wrong type!");
320 setArgOperand(1, Val);
323 // Methods for support type inquiry through isa, cast, and dyn_cast:
324 static inline bool classof(const IntrinsicInst *I) {
325 return I->getIntrinsicID() == Intrinsic::memset;
327 static inline bool classof(const Value *V) {
328 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
332 /// This class wraps the llvm.memcpy/memmove intrinsics.
333 class MemTransferInst : public MemIntrinsic {
335 /// Return the arguments to the instruction.
336 Value *getRawSource() const { return const_cast<Value*>(getArgOperand(1)); }
337 const Use &getRawSourceUse() const { return getArgOperandUse(1); }
338 Use &getRawSourceUse() { return getArgOperandUse(1); }
340 /// This is just like getRawSource, but it strips off any cast
341 /// instructions that feed it, giving the original input. The returned
342 /// value is guaranteed to be a pointer.
343 Value *getSource() const { return getRawSource()->stripPointerCasts(); }
345 unsigned getSourceAddressSpace() const {
346 return cast<PointerType>(getRawSource()->getType())->getAddressSpace();
349 void setSource(Value *Ptr) {
350 assert(getRawSource()->getType() == Ptr->getType() &&
351 "setSource called with pointer of wrong type!");
352 setArgOperand(1, Ptr);
355 // Methods for support type inquiry through isa, cast, and dyn_cast:
356 static inline bool classof(const IntrinsicInst *I) {
357 return I->getIntrinsicID() == Intrinsic::memcpy ||
358 I->getIntrinsicID() == Intrinsic::memmove;
360 static inline bool classof(const Value *V) {
361 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
365 /// This class wraps the llvm.memcpy intrinsic.
366 class MemCpyInst : public MemTransferInst {
368 // Methods for support type inquiry through isa, cast, and dyn_cast:
369 static inline bool classof(const IntrinsicInst *I) {
370 return I->getIntrinsicID() == Intrinsic::memcpy;
372 static inline bool classof(const Value *V) {
373 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
377 /// This class wraps the llvm.memmove intrinsic.
378 class MemMoveInst : public MemTransferInst {
380 // Methods for support type inquiry through isa, cast, and dyn_cast:
381 static inline bool classof(const IntrinsicInst *I) {
382 return I->getIntrinsicID() == Intrinsic::memmove;
384 static inline bool classof(const Value *V) {
385 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
389 /// This represents the llvm.va_start intrinsic.
390 class VAStartInst : public IntrinsicInst {
392 static inline bool classof(const IntrinsicInst *I) {
393 return I->getIntrinsicID() == Intrinsic::vastart;
395 static inline bool classof(const Value *V) {
396 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
399 Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
402 /// This represents the llvm.va_end intrinsic.
403 class VAEndInst : public IntrinsicInst {
405 static inline bool classof(const IntrinsicInst *I) {
406 return I->getIntrinsicID() == Intrinsic::vaend;
408 static inline bool classof(const Value *V) {
409 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
412 Value *getArgList() const { return const_cast<Value*>(getArgOperand(0)); }
415 /// This represents the llvm.va_copy intrinsic.
416 class VACopyInst : public IntrinsicInst {
418 static inline bool classof(const IntrinsicInst *I) {
419 return I->getIntrinsicID() == Intrinsic::vacopy;
421 static inline bool classof(const Value *V) {
422 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
425 Value *getDest() const { return const_cast<Value*>(getArgOperand(0)); }
426 Value *getSrc() const { return const_cast<Value*>(getArgOperand(1)); }
429 /// This represents the llvm.instrprof_increment intrinsic.
430 class InstrProfIncrementInst : public IntrinsicInst {
432 static inline bool classof(const IntrinsicInst *I) {
433 return I->getIntrinsicID() == Intrinsic::instrprof_increment;
435 static inline bool classof(const Value *V) {
436 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
439 GlobalVariable *getName() const {
440 return cast<GlobalVariable>(
441 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
444 ConstantInt *getHash() const {
445 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
448 ConstantInt *getNumCounters() const {
449 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(2)));
452 ConstantInt *getIndex() const {
453 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
456 Value *getStep() const;
459 class InstrProfIncrementInstStep : public InstrProfIncrementInst {
461 static inline bool classof(const IntrinsicInst *I) {
462 return I->getIntrinsicID() == Intrinsic::instrprof_increment_step;
464 static inline bool classof(const Value *V) {
465 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
469 /// This represents the llvm.instrprof_value_profile intrinsic.
470 class InstrProfValueProfileInst : public IntrinsicInst {
472 static inline bool classof(const IntrinsicInst *I) {
473 return I->getIntrinsicID() == Intrinsic::instrprof_value_profile;
475 static inline bool classof(const Value *V) {
476 return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V));
479 GlobalVariable *getName() const {
480 return cast<GlobalVariable>(
481 const_cast<Value *>(getArgOperand(0))->stripPointerCasts());
484 ConstantInt *getHash() const {
485 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(1)));
488 Value *getTargetValue() const {
489 return cast<Value>(const_cast<Value *>(getArgOperand(2)));
492 ConstantInt *getValueKind() const {
493 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(3)));
496 // Returns the value site index.
497 ConstantInt *getIndex() const {
498 return cast<ConstantInt>(const_cast<Value *>(getArgOperand(4)));
502 } // end namespace llvm
504 #endif // LLVM_IR_INTRINSICINST_H