Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
numba
GitHub Repository: numba/llvmlite
Path: blob/main/docs/source/user-guide/ir/values.rst
1154 views
.. _ir-values:

======
Values
======

.. currentmodule:: llvmlite.ir


.. contents::
   :local:
   :depth: 1

A :ref:`module` consists mostly of values.

.. data:: Undefined

   An undefined value, mapping to LLVM's ``undef``.


.. class:: Value

   The base class for all IR values.


.. class:: _ConstOpMixin

   This is the base class for :class:`Constant` and :class:`GlobalValue`; do
   not instantiate it directly.

   Integer arithmetic operations:

   * .. method:: add(other)

      Integer add `self` and `other`.

   * .. method:: sub(other)

      Integer subtract `other` from `self`.

   * .. method:: mul(other)

      Integer multiply `self` with `other`.

   * .. method:: udiv(other)

      Unsigned integer divide `self` by `other`.

   * .. method:: sdiv(other)a

      Signed integer divide `self` by `other`.

   * .. method:: urem(other)

      Unsigned integer remainder of `self` divided by `other`.

   * .. method:: srem(other)

      Signed integer remainder of `self` divided by `other`.

   * .. method:: neg()

      Negate `self`.

   Integer logical operations:

   * .. method:: shl(other)

      Left-shift `self` by `other` bits.

   * .. method:: ashr(other)

      Arithmetic, signed, right-shift `self` by `other` bits.

   * .. method:: lshr(other)

      Logical right-shift `self` by `other` bits.

   * .. method:: or_(other)

      Bitwise OR `self` with `other`.

   * .. method:: and_(other)

      Bitwise AND `self` with `other`.

   * .. method:: xor(other)

      Bitwise XOR `self` with `other`.

   Floating point arithmetic:

   * .. method:: fadd(other)

      Floating-point add `self` and `other`.

   * .. method:: fsub(other)

      Floating-point subtract `other` from `self`.

   * .. method:: fmul(other)

      Floating-point multiply `self` by `other`.

   * .. method:: fdiv(other)

      Floating-point divide `self` by `other`.

   * .. method:: frem(other)

      Floating-point remainder of `self` divided by `other`.

   Comparisons:

   * .. method:: icmp_signed(cmpop, other)

      Signed integer compare `self` with `other`. The string `cmpop` can be one
      of ``<``, ``<=``, ``==``, ``!=``, ``>=`` or ``>``.

   * .. method:: icmp_unsigned(cmpop, other)

      Unsigned integer compare `self` with `other`. The string `cmpop` can be
      one of ``<``, ``<=``, ``==``, ``!=``, ``>=`` or ``>``.

   * .. method:: fcmp_ordered(cmpop, other)

      Floating-point ordered compare `self` with `other`. The string `cmpop`
      can be one of ``<``, ``<=``, ``==``, ``!=``, ``>=`` or ``>``.

   * .. method:: fcmp_unordered(cmpop, other)

      Floating-point unordered compare `self` with `other`. The string `cmpop`
      can be one of ``<``, ``<=``, ``==``, ``!=``, ``>=`` or ``>``.

   Integer casts:

   * .. method:: trunc(typ)

      Truncate `self` to integer type `typ`.

   * .. method:: zext(typ)

      Zero-extend `self` to integer type `typ`.

   * .. method:: sext(typ)

       Sign-extend `self` to integer type `typ`.

   * .. method:: bitcast(typ)

      Convert this pointer constant to a constant of the given pointer type
      `typ`.

   Floating-point casts:

   * .. method:: fptrunc(typ)

      Truncate (approximate) floating-point value `self` to floating-point
      type `typ`.

   * .. method:: fpext(typ)

      Extend floating-point value `self` to floating-point type `typ`.

   Integer / floating-point conversion:

   * .. method:: fptoui(typ)

      Convert floating-point value `self` to unsigned integer type `typ`.

   * .. method:: uitofp(typ)

      Convert unsigned integer value `self` to floating-point type `typ`.

   * .. method:: fptosi(typ)

      Convert floating-point value `self` to signed integer type `typ`.

   * .. method:: sitofp(typ)

      Convert signed integer value `self` to floating-point type `typ`.

   Integer / pointer conversions:

   * .. method:: inttoptr(typ)

      Convert this integer constant `self` to a constant of the given pointer
      type `typ`.

   * .. method:: ptrtoint(typ)

      Convert this pointer constant `self` to a constant of the given integer
      type `typ`.

.. class:: Constant(typ, constant)

   A literal value.

   * *typ* is the type of the represented value---a
     :class:`~llvmlite.ir.Type` instance.

   * *constant* is the Python value to be represented.

   Which Python types are allowed for *constant* depends on *typ*:

   * All types accept :data:`Undefined` and convert it to
     LLVM's ``undef``.

   * All types accept ``None`` and convert it to LLVM's
     ``zeroinitializer``.

   * :class:`IntType` accepts any Python integer or boolean.

   * :class:`FloatType` and :class:`DoubleType` accept any
     Python real number.

   * Aggregate types---array and structure types---accept a
     sequence of Python values corresponding to the type's
     element types.

   * :class:`ArrayType` accepts a single :class:`bytearray`
     instance to initialize the array from a string of bytes.
     This is useful for character constants.

   See also :class:`_ConstOpMixin`.

   .. classmethod:: literal_array(elements)

      An alternate constructor for constant arrays.

      * *elements* is a sequence of values, :class:`Constant` or
        otherwise.
      * All *elements* must have the same type.
      * Returns a constant array containing the *elements*, in
        order.

   .. classmethod:: literal_struct(elements, packed=False)

      An alternate constructor for constant structs.

      * *elements* is a sequence of values, :class:`Constant` or
        otherwise.
      * *packed* controls whether to use packed layout.
      * Returns a constant struct containing the
        *elements* in order.

   .. method:: gep(indices)

      Compute the address of the inner element given by the
      sequence of *indices*. The constant must have a pointer
      type.

   NOTE: You cannot define constant functions. Use a
   :ref:`function declaration` instead.

.. class:: Argument

   One of a function's arguments. Arguments have the
   :meth:`add_attribute` method.

   .. method:: add_attribute(attr)

      Add an argument attribute to this argument. *attr* is a
      Python string.

.. class:: Block

   A :ref:`basic block`.  Do not instantiate or mutate this type
   directly. Instead, call the helper methods on
   :class:`Function` and :class:`IRBuilder`.

   Basic blocks have the following methods and attributes:

   * .. method:: replace(old, new)

        Replace the instruction *old* with the other instruction
        *new* in this block's list of instructions. All uses of
        *old* in the whole function are also patched. *old* and *new*
        are :class:`Instruction` objects.

   * .. attribute:: function

        The function this block is defined in.

   * .. attribute:: is_terminated

        Whether this block ends with a
        :ref:`terminator instruction <terminator>`.

   * .. attribute:: terminator

        The block's :ref:`terminator instruction <terminator>`, if any.
        Otherwise ``None``.

.. class:: BlockAddress

   A constant representing an address of a basic block.

   Block address constants have the following attributes:

   * .. attribute:: function

        The function in which the basic block is defined.

   * .. attribute:: basic_block

        The basic block. Must be a part of :attr:`function`.


Metadata
========

There are several kinds of :ref:`metadata` values.


.. class:: MetaDataString(module, value)

   A string literal for use in metadata.

   * *module* is the module that the metadata belongs to.
   * *value* is a Python string.

.. class:: MDValue

   A metadata node. To create an instance, call
   :meth:`Module.add_metadata`.

.. class:: DIValue

   A debug information descriptor, containing key-value pairs.
   To create an instance, call :meth:`Module.add_debug_info`.

.. class:: DIToken(value)

   A debug information "token," representing a well-known
   enumeration value. *value* is the enumeration name.

   EXAMPLE: ``'DW_LANG_Python'``

.. class:: NamedMetaData

   A named metadata node. To create an instance, call
   :meth:`Module.add_named_metadata`. :class:`NamedMetaData` has
   the :meth:`add` method:

   .. method:: add(md)

      Append the given piece of metadata to the collection of
      operands referred to by the :class:`NamedMetaData`. *md* can
      be either a :class:`MetaDataString` or a :class:`MDValue`.

Global values
==============

Global values are values accessible using a module-wide name.

.. class:: GlobalValue

   The base class for global values. Global values have the
   following writable attributes:

   * .. attribute:: linkage

        A Python string describing the linkage behavior of the
        global value---for example, whether it is visible from
        other modules. The default is the empty string, meaning
        "external."

   * .. attribute:: storage_class

        A Python string describing the storage class of the
        global value.

        * The default is the empty string, meaning "default."
        * Other possible values include ``dllimport`` and
          ``dllexport``.

   * .. attribute:: section

        A Python string describing the section a global value
        should be in after translation. The default is the empty
        string, meaning no specific section.


   See also :class:`_ConstOpMixin`.

.. class:: GlobalVariable(module, typ, name, addrspace=0)

   A global variable.

   * *module* is where the variable is defined.

   * *typ* is the variable's type. It cannot be a function type.
     To declare a global function, use :class:`Function`.

     The type of the returned Value is a pointer to *typ*.
     To read the contents of the variable, you need to
     :meth:`~IRBuilder.load` from the returned Value.
     To write to the variable, you need to
     :meth:`~IRBuilder.store` to the returned Value.

   * *name* is the variable's name---a Python string.

   * *addrspace* is an optional address space to store the
     variable in.

   Global variables have the following writable attributes:

   * .. method:: set_metadata(name, node)

        Add metadata with the given *name*, pointing to the given
        metadata *node*---an instance of :class:`MDValue`.

   * .. attribute:: global_constant

        * If ``True``, the variable is declared a constant,
          meaning that its contents cannot be modified.
        * The default is ``False``.

   * .. attribute:: unnamed_addr

        * If ``True``, the address of the variable is deemed
          insignificant, meaning that it is merged with other
          variables that have the same initializer.
        * The default is ``False``.

   * .. attribute:: initializer

        The variable's initialization value---probably a
        :class:`Constant` of type *typ*. The default is ``None``,
        meaning that the variable is uninitialized.

   * .. attribute:: align

        An explicit alignment in bytes. The default is ``None``,
        meaning that the default alignment for the variable's
        type is used.

.. class:: Function(module, typ, name)

   A global function.

   * *module* is where the function is defined.
   * *typ* is the function's type---a :class:`FunctionType`
     instance.
   * *name* is the function's name---a Python string.

   If a global function has any basic blocks, it is a
   :ref:`function definition`. Otherwise, it is a
   :ref:`function declaration`.

   Functions have the following methods and attributes:

   * .. method:: append_basic_block(name='')

        Append a :ref:`basic block` to this function's body.

        * If *name* is not empty, it names the block's entry
          :ref:`label`.
        * Returns a new :class:`Block`.

   * .. method:: insert_basic_block(before, name='')

        Similar to :meth:`append_basic_block`, but inserts it
        before the basic block *before* in the function's list
        of basic blocks.

   * .. method:: set_metadata(name, node)

        Add a function-specific metadata named *name* pointing to the
        given metadata *node*---an :class:`MDValue`.

   * .. attribute:: args

        The function's arguments as a tuple of :class:`Argument`
        instances.

   * .. attribute:: attributes

        A set of function attributes. Each optional attribute is
        a Python string. By default this is empty. Use the
        `.add()` method to add an attribute::

         fnty = ir.FunctionType(ir.DoubleType(), (ir.DoubleType(),))
         fn = Function(module, fnty, "sqrt")
         fn.attributes.add("alwaysinline")

   * .. attribute:: calling_convention

        The function's calling convention---a Python string. The
        default is the empty string.

   * .. attribute:: is_declaration

        Indicates whether the global function is a declaration
        or a definition.

        * If ``True``, it is a declaration.
        * If ``False``, it is a definition.


Instructions
=============

Every :ref:`instruction` is also a value:

* It has a name---the recipient's name.
* It has a well-defined type.
* It can be used as an operand in other instructions or in
  literals.

Usually, you should not instantiate instruction types directly.
Use the helper methods on the :class:`IRBuilder` class.

.. class:: Instruction

   The base class for all instructions. Instructions have the
   following method and attributes:

   * .. method:: set_metadata(name, node)

        Add an instruction-specific metadata *name* pointing to the
        given metadata *node*---an :class:`MDValue`.

   * .. method:: replace_usage(old, new)

        Replace the operand *old* with the other instruction *new*.

   * .. attribute:: function

        The function that contains this instruction.

   * .. attribute:: module

        The module that defines this instruction's function.


.. class:: PredictableInstr

   The class of instructions for which we can specify the
   probabilities of different outcomes---for example, a switch or
   a conditional branch. Predictable instructions have the
   :meth:`set_weights` method.

   .. method:: set_weights(weights)

      Set the weights of the instruction's possible outcomes.
      *weights* is a sequence of positive integers, each
      corresponding to a different outcome and specifying its
      relative probability compared to other outcomes. The
      greater the number, the likelier the outcome.


.. class:: SwitchInstr

   A switch instruction. Switch instructions have the
   :meth:`add_case` method.

   .. method:: add_case(val, block)

      Add a case to the switch instruction.

      * *val* should be a :class:`Constant` or a Python value
        compatible with the switch instruction's operand type.
      * *block* is a :class:`Block` to jump to if val and the
        switch operand compare equal.

.. class:: IndirectBranch

   An indirect branch instruction. Indirect branch instructions
   have the :meth:`add_destination` method.

   .. method:: add_destination(value, block)

      Add an outgoing edge. The indirect branch instruction must
      refer to every basic block it can transfer control to.

.. class:: PhiInstr

   A phi instruction. Phi instructions have the
   :meth:`add_incoming` method.

   .. method:: add_incoming(value, block)

      Add an incoming edge. Whenever transfer is controlled
      from *block*---a :class:`Block`---the phi instruction
      takes the given *value*.

.. class:: LandingPad

   A landing pad. Landing pads have the :meth:`add_clause` method:

   .. method:: add_clause(value, block)

      Add a catch or filter clause. Create catch clauses using
      :class:`CatchClause` and filter clauses using
      :class:`FilterClause`.


Landing pad clauses
====================

Landing pads have the following classes associated with them.

.. class:: CatchClause(value)

   A catch clause. Instructs the personality function to compare
   the in-flight exception typeinfo with *value*, which should
   have type `IntType(8).as_pointer().as_pointer()`.

.. class:: FilterClause(value)

   A filter clause. Instructs the personality function to check
   inclusion of the the in-flight exception typeinfo in *value*,
   which should have type
   `ArrayType(IntType(8).as_pointer().as_pointer(), ...)`.