//===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines classes that make it really easy to deal with intrinsic // functions with the isa/dyncast family of functions. In particular, this // allows you to do things like: // // if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst)) // ... MCI->getDest() ... MCI->getSource() ... // // All intrinsic function calls are instances of the call instruction, so these // are all subclasses of the CallInst class. Note that none of these classes // has state or virtual methods, which is an important part of this gross/neat // hack working. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_INTRINSICINST_H #define LLVM_IR_INTRINSICINST_H #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/FPEnv.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/Value.h" #include "llvm/Support/Casting.h" #include "llvm/Support/MathExtras.h" #include <cassert> #include <cstdint> #include <optional> namespace llvm { class Metadata; /// A wrapper class for inspecting calls to intrinsic functions. /// This allows the standard isa/dyncast/cast functionality to work with calls /// to intrinsic functions. class IntrinsicInst : public CallInst { … }; /// Check if \p ID corresponds to a lifetime intrinsic. static inline bool isLifetimeIntrinsic(Intrinsic::ID ID) { … } /// This is the common base class for lifetime intrinsics. class LifetimeIntrinsic : public IntrinsicInst { … }; /// Check if \p ID corresponds to a debug info intrinsic. static inline bool isDbgInfoIntrinsic(Intrinsic::ID ID) { … } /// This is the common base class for debug info intrinsics. class DbgInfoIntrinsic : public IntrinsicInst { … }; // Iterator for ValueAsMetadata that internally uses direct pointer iteration // over either a ValueAsMetadata* or a ValueAsMetadata**, dereferencing to the // ValueAsMetadata . class location_op_iterator : public iterator_facade_base<location_op_iterator, std::bidirectional_iterator_tag, Value *> { … }; /// Lightweight class that wraps the location operand metadata of a debug /// intrinsic. The raw location may be a ValueAsMetadata, an empty MDTuple, /// or a DIArgList. class RawLocationWrapper { … }; /// This is the common base class for debug info intrinsics for variables. class DbgVariableIntrinsic : public DbgInfoIntrinsic { … }; /// This represents the llvm.dbg.declare instruction. class DbgDeclareInst : public DbgVariableIntrinsic { … }; /// This represents the llvm.dbg.value instruction. class DbgValueInst : public DbgVariableIntrinsic { … }; /// This represents the llvm.dbg.assign instruction. class DbgAssignIntrinsic : public DbgValueInst { … }; /// This represents the llvm.dbg.label instruction. class DbgLabelInst : public DbgInfoIntrinsic { … }; /// This is the common base class for vector predication intrinsics. class VPIntrinsic : public IntrinsicInst { … }; /// This represents vector predication reduction intrinsics. class VPReductionIntrinsic : public VPIntrinsic { … }; class VPCastIntrinsic : public VPIntrinsic { … }; class VPCmpIntrinsic : public VPIntrinsic { … }; class VPBinOpIntrinsic : public VPIntrinsic { … }; /// This is the common base class for constrained floating point intrinsics. class ConstrainedFPIntrinsic : public IntrinsicInst { … }; /// Constrained floating point compare intrinsics. class ConstrainedFPCmpIntrinsic : public ConstrainedFPIntrinsic { … }; /// This class represents min/max intrinsics. class MinMaxIntrinsic : public IntrinsicInst { … }; /// This class represents a ucmp/scmp intrinsic class CmpIntrinsic : public IntrinsicInst { … }; /// This class represents an intrinsic that is based on a binary operation. /// This includes op.with.overflow and saturating add/sub intrinsics. class BinaryOpIntrinsic : public IntrinsicInst { … }; /// Represents an op.with.overflow intrinsic. class WithOverflowInst : public BinaryOpIntrinsic { … }; /// Represents a saturating add/sub intrinsic. class SaturatingInst : public BinaryOpIntrinsic { … }; /// Common base class for all memory intrinsics. Simply provides /// common methods. /// Written as CRTP to avoid a common base class amongst the /// three atomicity hierarchies. template <typename Derived> class MemIntrinsicBase : public IntrinsicInst { … }; /// Common base class for all memory transfer intrinsics. Simply provides /// common methods. template <class BaseCL> class MemTransferBase : public BaseCL { … }; /// Common base class for all memset intrinsics. Simply provides /// common methods. template <class BaseCL> class MemSetBase : public BaseCL { … }; // The common base class for the atomic memset/memmove/memcpy intrinsics // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove class AtomicMemIntrinsic : public MemIntrinsicBase<AtomicMemIntrinsic> { … }; /// This class represents atomic memset intrinsic // i.e. llvm.element.unordered.atomic.memset class AtomicMemSetInst : public MemSetBase<AtomicMemIntrinsic> { … }; // This class wraps the atomic memcpy/memmove intrinsics // i.e. llvm.element.unordered.atomic.memcpy/memmove class AtomicMemTransferInst : public MemTransferBase<AtomicMemIntrinsic> { … }; /// This class represents the atomic memcpy intrinsic /// i.e. llvm.element.unordered.atomic.memcpy class AtomicMemCpyInst : public AtomicMemTransferInst { … }; /// This class represents the atomic memmove intrinsic /// i.e. llvm.element.unordered.atomic.memmove class AtomicMemMoveInst : public AtomicMemTransferInst { … }; /// This is the common base class for memset/memcpy/memmove. class MemIntrinsic : public MemIntrinsicBase<MemIntrinsic> { … }; /// This class wraps the llvm.memset and llvm.memset.inline intrinsics. class MemSetInst : public MemSetBase<MemIntrinsic> { … }; /// This class wraps the llvm.memset.inline intrinsic. class MemSetInlineInst : public MemSetInst { … }; /// This class wraps the llvm.memcpy/memmove intrinsics. class MemTransferInst : public MemTransferBase<MemIntrinsic> { … }; /// This class wraps the llvm.memcpy intrinsic. class MemCpyInst : public MemTransferInst { … }; /// This class wraps the llvm.memmove intrinsic. class MemMoveInst : public MemTransferInst { … }; /// This class wraps the llvm.memcpy.inline intrinsic. class MemCpyInlineInst : public MemCpyInst { … }; // The common base class for any memset/memmove/memcpy intrinsics; // whether they be atomic or non-atomic. // i.e. llvm.element.unordered.atomic.memset/memcpy/memmove // and llvm.memset/memcpy/memmove class AnyMemIntrinsic : public MemIntrinsicBase<AnyMemIntrinsic> { … }; /// This class represents any memset intrinsic // i.e. llvm.element.unordered.atomic.memset // and llvm.memset class AnyMemSetInst : public MemSetBase<AnyMemIntrinsic> { … }; // This class wraps any memcpy/memmove intrinsics // i.e. llvm.element.unordered.atomic.memcpy/memmove // and llvm.memcpy/memmove class AnyMemTransferInst : public MemTransferBase<AnyMemIntrinsic> { … }; /// This class represents any memcpy intrinsic /// i.e. llvm.element.unordered.atomic.memcpy /// and llvm.memcpy class AnyMemCpyInst : public AnyMemTransferInst { … }; /// This class represents any memmove intrinsic /// i.e. llvm.element.unordered.atomic.memmove /// and llvm.memmove class AnyMemMoveInst : public AnyMemTransferInst { … }; /// This represents the llvm.va_start intrinsic. class VAStartInst : public IntrinsicInst { … }; /// This represents the llvm.va_end intrinsic. class VAEndInst : public IntrinsicInst { … }; /// This represents the llvm.va_copy intrinsic. class VACopyInst : public IntrinsicInst { … }; /// A base class for all instrprof intrinsics. class InstrProfInstBase : public IntrinsicInst { … }; /// A base class for all instrprof counter intrinsics. class InstrProfCntrInstBase : public InstrProfInstBase { … }; /// This represents the llvm.instrprof.cover intrinsic. class InstrProfCoverInst : public InstrProfCntrInstBase { … }; /// This represents the llvm.instrprof.increment intrinsic. class InstrProfIncrementInst : public InstrProfCntrInstBase { … }; /// This represents the llvm.instrprof.increment.step intrinsic. class InstrProfIncrementInstStep : public InstrProfIncrementInst { … }; /// This represents the llvm.instrprof.callsite intrinsic. /// It is structurally like the increment or step counters, hence the /// inheritance relationship, albeit somewhat tenuous (it's not 'counting' per /// se) class InstrProfCallsite : public InstrProfCntrInstBase { … }; /// This represents the llvm.instrprof.timestamp intrinsic. class InstrProfTimestampInst : public InstrProfCntrInstBase { … }; /// This represents the llvm.instrprof.value.profile intrinsic. class InstrProfValueProfileInst : public InstrProfCntrInstBase { … }; /// A base class for instrprof mcdc intrinsics that require global bitmap bytes. class InstrProfMCDCBitmapInstBase : public InstrProfInstBase { … }; /// This represents the llvm.instrprof.mcdc.parameters intrinsic. class InstrProfMCDCBitmapParameters : public InstrProfMCDCBitmapInstBase { … }; /// This represents the llvm.instrprof.mcdc.tvbitmap.update intrinsic. class InstrProfMCDCTVBitmapUpdate : public InstrProfMCDCBitmapInstBase { … }; class PseudoProbeInst : public IntrinsicInst { … }; class NoAliasScopeDeclInst : public IntrinsicInst { … }; /// Common base class for representing values projected from a statepoint. /// Currently, the only projections available are gc.result and gc.relocate. class GCProjectionInst : public IntrinsicInst { … }; /// Represents calls to the gc.relocate intrinsic. class GCRelocateInst : public GCProjectionInst { … }; /// Represents calls to the gc.result intrinsic. class GCResultInst : public GCProjectionInst { … }; /// This represents the llvm.assume intrinsic. class AssumeInst : public IntrinsicInst { … }; /// Check if \p ID corresponds to a convergence control intrinsic. static inline bool isConvergenceControlIntrinsic(unsigned IntrinsicID) { … } /// Represents calls to the llvm.experimintal.convergence.* intrinsics. class ConvergenceControlInst : public IntrinsicInst { … }; } // end namespace llvm #endif // LLVM_IR_INTRINSICINST_H