<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <title>LLVM Assembly Language Reference Manual</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="author" content="Chris Lattner">
  <meta name="description"
  content="LLVM Assembly Language Reference Manual.">
  <link rel="stylesheet" href="llvm.css" type="text/css">
</head>

<body>

<h1>LLVM Language Reference Manual</h1>
<ol>
  <li><a href="#abstract">Abstract</a></li>
  <li><a href="#introduction">Introduction</a></li>
  <li><a href="#identifiers">Identifiers</a></li>
  <li><a href="#highlevel">High Level Structure</a>
    <ol>
      <li><a href="#modulestructure">Module Structure</a></li>
      <li><a href="#linkage">Linkage Types</a>
        <ol>
          <li><a href="#linkage_private">'<tt>private</tt>' Linkage</a></li>
          <li><a href="#linkage_linker_private">'<tt>linker_private</tt>' Linkage</a></li>
          <li><a href="#linkage_linker_private_weak">'<tt>linker_private_weak</tt>' Linkage</a></li>
          <li><a href="#linkage_linker_private_weak_def_auto">'<tt>linker_private_weak_def_auto</tt>' Linkage</a></li>
          <li><a href="#linkage_internal">'<tt>internal</tt>' Linkage</a></li>
          <li><a href="#linkage_available_externally">'<tt>available_externally</tt>' Linkage</a></li>
          <li><a href="#linkage_linkonce">'<tt>linkonce</tt>' Linkage</a></li>
          <li><a href="#linkage_common">'<tt>common</tt>' Linkage</a></li>
          <li><a href="#linkage_weak">'<tt>weak</tt>' Linkage</a></li>
          <li><a href="#linkage_appending">'<tt>appending</tt>' Linkage</a></li>
          <li><a href="#linkage_externweak">'<tt>extern_weak</tt>' Linkage</a></li>
          <li><a href="#linkage_linkonce_odr">'<tt>linkonce_odr</tt>' Linkage</a></li>
          <li><a href="#linkage_weak">'<tt>weak_odr</tt>' Linkage</a></li>
          <li><a href="#linkage_external">'<tt>external</tt>' Linkage</a></li>
          <li><a href="#linkage_dllimport">'<tt>dllimport</tt>' Linkage</a></li>
          <li><a href="#linkage_dllexport">'<tt>dllexport</tt>' Linkage</a></li>
        </ol>
      </li>
      <li><a href="#callingconv">Calling Conventions</a></li>
      <li><a href="#namedtypes">Named Types</a></li>
      <li><a href="#globalvars">Global Variables</a></li>
      <li><a href="#functionstructure">Functions</a></li>
      <li><a href="#aliasstructure">Aliases</a></li>
      <li><a href="#namedmetadatastructure">Named Metadata</a></li>
      <li><a href="#paramattrs">Parameter Attributes</a></li>
      <li><a href="#fnattrs">Function Attributes</a></li>
      <li><a href="#gc">Garbage Collector Names</a></li>
      <li><a href="#moduleasm">Module-Level Inline Assembly</a></li>
      <li><a href="#datalayout">Data Layout</a></li>
      <li><a href="#pointeraliasing">Pointer Aliasing Rules</a></li>
      <li><a href="#volatile">Volatile Memory Accesses</a></li>
      <li><a href="#memmodel">Memory Model for Concurrent Operations</a></li>
      <li><a href="#ordering">Atomic Memory Ordering Constraints</a></li>
    </ol>
  </li>
  <li><a href="#typesystem">Type System</a>
    <ol>
      <li><a href="#t_classifications">Type Classifications</a></li>
      <li><a href="#t_primitive">Primitive Types</a>
        <ol>
          <li><a href="#t_integer">Integer Type</a></li>
          <li><a href="#t_floating">Floating Point Types</a></li>
          <li><a href="#t_x86mmx">X86mmx Type</a></li>
          <li><a href="#t_void">Void Type</a></li>
          <li><a href="#t_label">Label Type</a></li>
          <li><a href="#t_metadata">Metadata Type</a></li>
        </ol>
      </li>
      <li><a href="#t_derived">Derived Types</a>
        <ol>
          <li><a href="#t_aggregate">Aggregate Types</a>
            <ol>
              <li><a href="#t_array">Array Type</a></li>
              <li><a href="#t_struct">Structure Type</a></li>
              <li><a href="#t_opaque">Opaque Structure Types</a></li>
              <li><a href="#t_vector">Vector Type</a></li>
            </ol>
          </li>
          <li><a href="#t_function">Function Type</a></li>
          <li><a href="#t_pointer">Pointer Type</a></li>
        </ol>
      </li>
    </ol>
  </li>
  <li><a href="#constants">Constants</a>
    <ol>
      <li><a href="#simpleconstants">Simple Constants</a></li>
      <li><a href="#complexconstants">Complex Constants</a></li>
      <li><a href="#globalconstants">Global Variable and Function Addresses</a></li>
      <li><a href="#undefvalues">Undefined Values</a></li>
      <li><a href="#trapvalues">Trap Values</a></li>
      <li><a href="#blockaddress">Addresses of Basic Blocks</a></li>
      <li><a href="#constantexprs">Constant Expressions</a></li>
    </ol>
  </li>
  <li><a href="#othervalues">Other Values</a>
    <ol>
      <li><a href="#inlineasm">Inline Assembler Expressions</a></li>
      <li><a href="#metadata">Metadata Nodes and Metadata Strings</a></li>
    </ol>
  </li>
  <li><a href="#intrinsic_globals">Intrinsic Global Variables</a>
    <ol>
      <li><a href="#intg_used">The '<tt>llvm.used</tt>' Global Variable</a></li>
      <li><a href="#intg_compiler_used">The '<tt>llvm.compiler.used</tt>'
          Global Variable</a></li>
      <li><a href="#intg_global_ctors">The '<tt>llvm.global_ctors</tt>'
         Global Variable</a></li>
      <li><a href="#intg_global_dtors">The '<tt>llvm.global_dtors</tt>'
         Global Variable</a></li>
    </ol>
  </li>
  <li><a href="#instref">Instruction Reference</a>
    <ol>
      <li><a href="#terminators">Terminator Instructions</a>
        <ol>
          <li><a href="#i_ret">'<tt>ret</tt>' Instruction</a></li>
          <li><a href="#i_br">'<tt>br</tt>' Instruction</a></li>
          <li><a href="#i_switch">'<tt>switch</tt>' Instruction</a></li>
          <li><a href="#i_indirectbr">'<tt>indirectbr</tt>' Instruction</a></li>
          <li><a href="#i_invoke">'<tt>invoke</tt>' Instruction</a></li>
          <li><a href="#i_unwind">'<tt>unwind</tt>'  Instruction</a></li>
          <li><a href="#i_resume">'<tt>resume</tt>'  Instruction</a></li>
          <li><a href="#i_unreachable">'<tt>unreachable</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#binaryops">Binary Operations</a>
        <ol>
          <li><a href="#i_add">'<tt>add</tt>' Instruction</a></li>
          <li><a href="#i_fadd">'<tt>fadd</tt>' Instruction</a></li>
          <li><a href="#i_sub">'<tt>sub</tt>' Instruction</a></li>
          <li><a href="#i_fsub">'<tt>fsub</tt>' Instruction</a></li>
          <li><a href="#i_mul">'<tt>mul</tt>' Instruction</a></li>
          <li><a href="#i_fmul">'<tt>fmul</tt>' Instruction</a></li>
          <li><a href="#i_udiv">'<tt>udiv</tt>' Instruction</a></li>
          <li><a href="#i_sdiv">'<tt>sdiv</tt>' Instruction</a></li>
          <li><a href="#i_fdiv">'<tt>fdiv</tt>' Instruction</a></li>
          <li><a href="#i_urem">'<tt>urem</tt>' Instruction</a></li>
          <li><a href="#i_srem">'<tt>srem</tt>' Instruction</a></li>
          <li><a href="#i_frem">'<tt>frem</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#bitwiseops">Bitwise Binary Operations</a>
        <ol>
          <li><a href="#i_shl">'<tt>shl</tt>' Instruction</a></li>
          <li><a href="#i_lshr">'<tt>lshr</tt>' Instruction</a></li>
          <li><a href="#i_ashr">'<tt>ashr</tt>' Instruction</a></li>
          <li><a href="#i_and">'<tt>and</tt>' Instruction</a></li>
          <li><a href="#i_or">'<tt>or</tt>'  Instruction</a></li>
          <li><a href="#i_xor">'<tt>xor</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#vectorops">Vector Operations</a>
        <ol>
          <li><a href="#i_extractelement">'<tt>extractelement</tt>' Instruction</a></li>
          <li><a href="#i_insertelement">'<tt>insertelement</tt>' Instruction</a></li>
          <li><a href="#i_shufflevector">'<tt>shufflevector</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#aggregateops">Aggregate Operations</a>
        <ol>
          <li><a href="#i_extractvalue">'<tt>extractvalue</tt>' Instruction</a></li>
          <li><a href="#i_insertvalue">'<tt>insertvalue</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#memoryops">Memory Access and Addressing Operations</a>
        <ol>
          <li><a href="#i_alloca">'<tt>alloca</tt>' Instruction</a></li>
         <li><a href="#i_load">'<tt>load</tt>' Instruction</a></li>
         <li><a href="#i_store">'<tt>store</tt>' Instruction</a></li>
         <li><a href="#i_fence">'<tt>fence</tt>' Instruction</a></li>
         <li><a href="#i_cmpxchg">'<tt>cmpxchg</tt>' Instruction</a></li>
         <li><a href="#i_atomicrmw">'<tt>atomicrmw</tt>' Instruction</a></li>
         <li><a href="#i_getelementptr">'<tt>getelementptr</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#convertops">Conversion Operations</a>
        <ol>
          <li><a href="#i_trunc">'<tt>trunc .. to</tt>' Instruction</a></li>
          <li><a href="#i_zext">'<tt>zext .. to</tt>' Instruction</a></li>
          <li><a href="#i_sext">'<tt>sext .. to</tt>' Instruction</a></li>
          <li><a href="#i_fptrunc">'<tt>fptrunc .. to</tt>' Instruction</a></li>
          <li><a href="#i_fpext">'<tt>fpext .. to</tt>' Instruction</a></li>
          <li><a href="#i_fptoui">'<tt>fptoui .. to</tt>' Instruction</a></li>
          <li><a href="#i_fptosi">'<tt>fptosi .. to</tt>' Instruction</a></li>
          <li><a href="#i_uitofp">'<tt>uitofp .. to</tt>' Instruction</a></li>
          <li><a href="#i_sitofp">'<tt>sitofp .. to</tt>' Instruction</a></li>
          <li><a href="#i_ptrtoint">'<tt>ptrtoint .. to</tt>' Instruction</a></li>
          <li><a href="#i_inttoptr">'<tt>inttoptr .. to</tt>' Instruction</a></li>
          <li><a href="#i_bitcast">'<tt>bitcast .. to</tt>' Instruction</a></li>
        </ol>
      </li>
      <li><a href="#otherops">Other Operations</a>
        <ol>
          <li><a href="#i_icmp">'<tt>icmp</tt>' Instruction</a></li>
          <li><a href="#i_fcmp">'<tt>fcmp</tt>' Instruction</a></li>
          <li><a href="#i_phi">'<tt>phi</tt>'   Instruction</a></li>
          <li><a href="#i_select">'<tt>select</tt>' Instruction</a></li>
          <li><a href="#i_call">'<tt>call</tt>'  Instruction</a></li>
          <li><a href="#i_va_arg">'<tt>va_arg</tt>'  Instruction</a></li>
          <li><a href="#i_landingpad">'<tt>landingpad</tt>' Instruction</a></li>
        </ol>
      </li>
    </ol>
  </li>
  <li><a href="#intrinsics">Intrinsic Functions</a>
    <ol>
      <li><a href="#int_varargs">Variable Argument Handling Intrinsics</a>
        <ol>
          <li><a href="#int_va_start">'<tt>llvm.va_start</tt>' Intrinsic</a></li>
          <li><a href="#int_va_end">'<tt>llvm.va_end</tt>'   Intrinsic</a></li>
          <li><a href="#int_va_copy">'<tt>llvm.va_copy</tt>'  Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_gc">Accurate Garbage Collection Intrinsics</a>
        <ol>
          <li><a href="#int_gcroot">'<tt>llvm.gcroot</tt>' Intrinsic</a></li>
          <li><a href="#int_gcread">'<tt>llvm.gcread</tt>' Intrinsic</a></li>
          <li><a href="#int_gcwrite">'<tt>llvm.gcwrite</tt>' Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_codegen">Code Generator Intrinsics</a>
        <ol>
          <li><a href="#int_returnaddress">'<tt>llvm.returnaddress</tt>' Intrinsic</a></li>
          <li><a href="#int_frameaddress">'<tt>llvm.frameaddress</tt>'   Intrinsic</a></li>
          <li><a href="#int_stacksave">'<tt>llvm.stacksave</tt>' Intrinsic</a></li>
          <li><a href="#int_stackrestore">'<tt>llvm.stackrestore</tt>' Intrinsic</a></li>
          <li><a href="#int_prefetch">'<tt>llvm.prefetch</tt>' Intrinsic</a></li>
          <li><a href="#int_pcmarker">'<tt>llvm.pcmarker</tt>' Intrinsic</a></li>
          <li><a href="#int_readcyclecounter">'<tt>llvm.readcyclecounter</tt>' Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_libc">Standard C Library Intrinsics</a>
        <ol>
          <li><a href="#int_memcpy">'<tt>llvm.memcpy.*</tt>' Intrinsic</a></li>
          <li><a href="#int_memmove">'<tt>llvm.memmove.*</tt>' Intrinsic</a></li>
          <li><a href="#int_memset">'<tt>llvm.memset.*</tt>' Intrinsic</a></li>
          <li><a href="#int_sqrt">'<tt>llvm.sqrt.*</tt>' Intrinsic</a></li>
          <li><a href="#int_powi">'<tt>llvm.powi.*</tt>' Intrinsic</a></li>
          <li><a href="#int_sin">'<tt>llvm.sin.*</tt>' Intrinsic</a></li>
          <li><a href="#int_cos">'<tt>llvm.cos.*</tt>' Intrinsic</a></li>
          <li><a href="#int_pow">'<tt>llvm.pow.*</tt>' Intrinsic</a></li>
          <li><a href="#int_exp">'<tt>llvm.exp.*</tt>' Intrinsic</a></li>
          <li><a href="#int_log">'<tt>llvm.log.*</tt>' Intrinsic</a></li>
          <li><a href="#int_fma">'<tt>llvm.fma.*</tt>' Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_manip">Bit Manipulation Intrinsics</a>
        <ol>
          <li><a href="#int_bswap">'<tt>llvm.bswap.*</tt>' Intrinsics</a></li>
          <li><a href="#int_ctpop">'<tt>llvm.ctpop.*</tt>' Intrinsic </a></li>
          <li><a href="#int_ctlz">'<tt>llvm.ctlz.*</tt>' Intrinsic </a></li>
          <li><a href="#int_cttz">'<tt>llvm.cttz.*</tt>' Intrinsic </a></li>
        </ol>
      </li>
      <li><a href="#int_overflow">Arithmetic with Overflow Intrinsics</a>
        <ol>
          <li><a href="#int_sadd_overflow">'<tt>llvm.sadd.with.overflow.*</tt> Intrinsics</a></li>
          <li><a href="#int_uadd_overflow">'<tt>llvm.uadd.with.overflow.*</tt> Intrinsics</a></li>
          <li><a href="#int_ssub_overflow">'<tt>llvm.ssub.with.overflow.*</tt> Intrinsics</a></li>
          <li><a href="#int_usub_overflow">'<tt>llvm.usub.with.overflow.*</tt> Intrinsics</a></li>
          <li><a href="#int_smul_overflow">'<tt>llvm.smul.with.overflow.*</tt> Intrinsics</a></li>
          <li><a href="#int_umul_overflow">'<tt>llvm.umul.with.overflow.*</tt> Intrinsics</a></li>
        </ol>
      </li>
      <li><a href="#int_fp16">Half Precision Floating Point Intrinsics</a>
        <ol>
          <li><a href="#int_convert_to_fp16">'<tt>llvm.convert.to.fp16</tt>' Intrinsic</a></li>
          <li><a href="#int_convert_from_fp16">'<tt>llvm.convert.from.fp16</tt>' Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_debugger">Debugger intrinsics</a></li>
      <li><a href="#int_eh">Exception Handling intrinsics</a></li>
      <li><a href="#int_trampoline">Trampoline Intrinsics</a>
        <ol>
          <li><a href="#int_it">'<tt>llvm.init.trampoline</tt>' Intrinsic</a></li>
          <li><a href="#int_at">'<tt>llvm.adjust.trampoline</tt>' Intrinsic</a></li>
        </ol>
      </li>
      <li><a href="#int_atomics">Atomic intrinsics</a>
        <ol>
          <li><a href="#int_memory_barrier"><tt>llvm.memory_barrier</tt></a></li>
          <li><a href="#int_atomic_cmp_swap"><tt>llvm.atomic.cmp.swap</tt></a></li>
          <li><a href="#int_atomic_swap"><tt>llvm.atomic.swap</tt></a></li>
          <li><a href="#int_atomic_load_add"><tt>llvm.atomic.load.add</tt></a></li>
          <li><a href="#int_atomic_load_sub"><tt>llvm.atomic.load.sub</tt></a></li>
          <li><a href="#int_atomic_load_and"><tt>llvm.atomic.load.and</tt></a></li>
          <li><a href="#int_atomic_load_nand"><tt>llvm.atomic.load.nand</tt></a></li>
          <li><a href="#int_atomic_load_or"><tt>llvm.atomic.load.or</tt></a></li>
          <li><a href="#int_atomic_load_xor"><tt>llvm.atomic.load.xor</tt></a></li>
          <li><a href="#int_atomic_load_max"><tt>llvm.atomic.load.max</tt></a></li>
          <li><a href="#int_atomic_load_min"><tt>llvm.atomic.load.min</tt></a></li>
          <li><a href="#int_atomic_load_umax"><tt>llvm.atomic.load.umax</tt></a></li>
          <li><a href="#int_atomic_load_umin"><tt>llvm.atomic.load.umin</tt></a></li>
        </ol>
      </li>
      <li><a href="#int_memorymarkers">Memory Use Markers</a>
        <ol>
          <li><a href="#int_lifetime_start"><tt>llvm.lifetime.start</tt></a></li>
          <li><a href="#int_lifetime_end"><tt>llvm.lifetime.end</tt></a></li>
          <li><a href="#int_invariant_start"><tt>llvm.invariant.start</tt></a></li>
          <li><a href="#int_invariant_end"><tt>llvm.invariant.end</tt></a></li>
        </ol>
      </li>
      <li><a href="#int_general">General intrinsics</a>
        <ol>
          <li><a href="#int_var_annotation">
            '<tt>llvm.var.annotation</tt>' Intrinsic</a></li>
          <li><a href="#int_annotation">
            '<tt>llvm.annotation.*</tt>' Intrinsic</a></li>
          <li><a href="#int_trap">
            '<tt>llvm.trap</tt>' Intrinsic</a></li>
          <li><a href="#int_stackprotector">
            '<tt>llvm.stackprotector</tt>' Intrinsic</a></li>
	  <li><a href="#int_objectsize">
            '<tt>llvm.objectsize</tt>' Intrinsic</a></li>
        </ol>
      </li>
    </ol>
  </li>
</ol>

<div class="doc_author">
  <p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a>
            and <a href="mailto:vadve@cs.uiuc.edu">Vikram Adve</a></p>
</div>

<!-- *********************************************************************** -->
<h2><a name="abstract">Abstract</a></h2>
<!-- *********************************************************************** -->

<div>

<p>This document is a reference manual for the LLVM assembly language. LLVM is
   a Static Single Assignment (SSA) based representation that provides type
   safety, low-level operations, flexibility, and the capability of representing
   'all' high-level languages cleanly.  It is the common code representation
   used throughout all phases of the LLVM compilation strategy.</p>

</div>

<!-- *********************************************************************** -->
<h2><a name="introduction">Introduction</a></h2>
<!-- *********************************************************************** -->

<div>

<p>The LLVM code representation is designed to be used in three different forms:
   as an in-memory compiler IR, as an on-disk bitcode representation (suitable
   for fast loading by a Just-In-Time compiler), and as a human readable
   assembly language representation.  This allows LLVM to provide a powerful
   intermediate representation for efficient compiler transformations and
   analysis, while providing a natural means to debug and visualize the
   transformations.  The three different forms of LLVM are all equivalent.  This
   document describes the human readable representation and notation.</p>

<p>The LLVM representation aims to be light-weight and low-level while being
   expressive, typed, and extensible at the same time.  It aims to be a
   "universal IR" of sorts, by being at a low enough level that high-level ideas
   may be cleanly mapped to it (similar to how microprocessors are "universal
   IR's", allowing many source languages to be mapped to them).  By providing
   type information, LLVM can be used as the target of optimizations: for
   example, through pointer analysis, it can be proven that a C automatic
   variable is never accessed outside of the current function, allowing it to
   be promoted to a simple SSA value instead of a memory location.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="wellformed">Well-Formedness</a>
</h4>

<div>

<p>It is important to note that this document describes 'well formed' LLVM
   assembly language.  There is a difference between what the parser accepts and
   what is considered 'well formed'.  For example, the following instruction is
   syntactically okay, but not well formed:</p>

<pre class="doc_code">
%x = <a href="#i_add">add</a> i32 1, %x
</pre>

<p>because the definition of <tt>%x</tt> does not dominate all of its uses. The
   LLVM infrastructure provides a verification pass that may be used to verify
   that an LLVM module is well formed.  This pass is automatically run by the
   parser after parsing input assembly and by the optimizer before it outputs
   bitcode.  The violations pointed out by the verifier pass indicate bugs in
   transformation passes or input to the parser.</p>

</div>

</div>

<!-- Describe the typesetting conventions here. -->

<!-- *********************************************************************** -->
<h2><a name="identifiers">Identifiers</a></h2>
<!-- *********************************************************************** -->

<div>

<p>LLVM identifiers come in two basic types: global and local. Global
   identifiers (functions, global variables) begin with the <tt>'@'</tt>
   character. Local identifiers (register names, types) begin with
   the <tt>'%'</tt> character. Additionally, there are three different formats
   for identifiers, for different purposes:</p>

<ol>
  <li>Named values are represented as a string of characters with their prefix.
      For example, <tt>%foo</tt>, <tt>@DivisionByZero</tt>,
      <tt>%a.really.long.identifier</tt>. The actual regular expression used is
      '<tt>[%@][a-zA-Z$._][a-zA-Z$._0-9]*</tt>'.  Identifiers which require
      other characters in their names can be surrounded with quotes. Special
      characters may be escaped using <tt>"\xx"</tt> where <tt>xx</tt> is the
      ASCII code for the character in hexadecimal.  In this way, any character
      can be used in a name value, even quotes themselves.</li>

  <li>Unnamed values are represented as an unsigned numeric value with their
      prefix.  For example, <tt>%12</tt>, <tt>@2</tt>, <tt>%44</tt>.</li>

  <li>Constants, which are described in a <a href="#constants">section about
      constants</a>, below.</li>
</ol>

<p>LLVM requires that values start with a prefix for two reasons: Compilers
   don't need to worry about name clashes with reserved words, and the set of
   reserved words may be expanded in the future without penalty.  Additionally,
   unnamed identifiers allow a compiler to quickly come up with a temporary
   variable without having to avoid symbol table conflicts.</p>

<p>Reserved words in LLVM are very similar to reserved words in other
   languages. There are keywords for different opcodes
   ('<tt><a href="#i_add">add</a></tt>',
   '<tt><a href="#i_bitcast">bitcast</a></tt>',
   '<tt><a href="#i_ret">ret</a></tt>', etc...), for primitive type names
   ('<tt><a href="#t_void">void</a></tt>',
   '<tt><a href="#t_primitive">i32</a></tt>', etc...), and others.  These
   reserved words cannot conflict with variable names, because none of them
   start with a prefix character (<tt>'%'</tt> or <tt>'@'</tt>).</p>

<p>Here is an example of LLVM code to multiply the integer variable
   '<tt>%X</tt>' by 8:</p>

<p>The easy way:</p>

<pre class="doc_code">
%result = <a href="#i_mul">mul</a> i32 %X, 8
</pre>

<p>After strength reduction:</p>

<pre class="doc_code">
%result = <a href="#i_shl">shl</a> i32 %X, i8 3
</pre>

<p>And the hard way:</p>

<pre class="doc_code">
%0 = <a href="#i_add">add</a> i32 %X, %X           <i>; yields {i32}:%0</i>
%1 = <a href="#i_add">add</a> i32 %0, %0           <i>; yields {i32}:%1</i>
%result = <a href="#i_add">add</a> i32 %1, %1
</pre>

<p>This last way of multiplying <tt>%X</tt> by 8 illustrates several important
   lexical features of LLVM:</p>

<ol>
  <li>Comments are delimited with a '<tt>;</tt>' and go until the end of
      line.</li>

  <li>Unnamed temporaries are created when the result of a computation is not
      assigned to a named value.</li>

  <li>Unnamed temporaries are numbered sequentially</li>
</ol>

<p>It also shows a convention that we follow in this document.  When
   demonstrating instructions, we will follow an instruction with a comment that
   defines the type and name of value produced.  Comments are shown in italic
   text.</p>

</div>

<!-- *********************************************************************** -->
<h2><a name="highlevel">High Level Structure</a></h2>
<!-- *********************************************************************** -->
<div>
<!-- ======================================================================= -->
<h3>
  <a name="modulestructure">Module Structure</a>
</h3>

<div>

<p>LLVM programs are composed of "Module"s, each of which is a translation unit
   of the input programs.  Each module consists of functions, global variables,
   and symbol table entries.  Modules may be combined together with the LLVM
   linker, which merges function (and global variable) definitions, resolves
   forward declarations, and merges symbol table entries. Here is an example of
   the "hello world" module:</p>

<pre class="doc_code">
<i>; Declare the string constant as a global constant.</i>&nbsp;
<a href="#identifiers">@.LC0</a> = <a href="#linkage_internal">internal</a>&nbsp;<a href="#globalvars">constant</a>&nbsp;<a href="#t_array">[13 x i8]</a> c"hello world\0A\00"      <i>; [13 x i8]*</i>&nbsp;

<i>; External declaration of the puts function</i>&nbsp;
<a href="#functionstructure">declare</a> i32 @puts(i8*)                                      <i>; i32 (i8*)* </i>&nbsp;

<i>; Definition of main function</i>
define i32 @main() {   <i>; i32()* </i>&nbsp;
  <i>; Convert [13 x i8]* to i8  *...</i>&nbsp;
  %cast210 = <a href="#i_getelementptr">getelementptr</a> [13 x i8]* @.LC0, i64 0, i64 0   <i>; i8*</i>&nbsp;

  <i>; Call puts function to write out the string to stdout.</i>&nbsp;
  <a href="#i_call">call</a> i32 @puts(i8* %cast210)           <i>; i32</i>&nbsp;
  <a href="#i_ret">ret</a> i32 0&nbsp;
}

<i>; Named metadata</i>
!1 = metadata !{i32 41}
!foo = !{!1, null}
</pre>

<p>This example is made up of a <a href="#globalvars">global variable</a> named
   "<tt>.LC0</tt>", an external declaration of the "<tt>puts</tt>" function,
   a <a href="#functionstructure">function definition</a> for
   "<tt>main</tt>" and <a href="#namedmetadatastructure">named metadata</a> 
   "<tt>foo"</tt>.</p>

<p>In general, a module is made up of a list of global values, where both
   functions and global variables are global values.  Global values are
   represented by a pointer to a memory location (in this case, a pointer to an
   array of char, and a pointer to a function), and have one of the
   following <a href="#linkage">linkage types</a>.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="linkage">Linkage Types</a>
</h3>

<div>

<p>All Global Variables and Functions have one of the following types of
   linkage:</p>

<dl>
  <dt><tt><b><a name="linkage_private">private</a></b></tt></dt>
  <dd>Global values with "<tt>private</tt>" linkage are only directly accessible
      by objects in the current module. In particular, linking code into a
      module with an private global value may cause the private to be renamed as
      necessary to avoid collisions.  Because the symbol is private to the
      module, all references can be updated. This doesn't show up in any symbol
      table in the object file.</dd>

  <dt><tt><b><a name="linkage_linker_private">linker_private</a></b></tt></dt>
  <dd>Similar to <tt>private</tt>, but the symbol is passed through the
      assembler and evaluated by the linker. Unlike normal strong symbols, they
      are removed by the linker from the final linked image (executable or
      dynamic library).</dd>

  <dt><tt><b><a name="linkage_linker_private_weak">linker_private_weak</a></b></tt></dt>
  <dd>Similar to "<tt>linker_private</tt>", but the symbol is weak. Note that
      <tt>linker_private_weak</tt> symbols are subject to coalescing by the
      linker. The symbols are removed by the linker from the final linked image
      (executable or dynamic library).</dd>

  <dt><tt><b><a name="linkage_linker_private_weak_def_auto">linker_private_weak_def_auto</a></b></tt></dt>
  <dd>Similar to "<tt>linker_private_weak</tt>", but it's known that the address
      of the object is not taken. For instance, functions that had an inline
      definition, but the compiler decided not to inline it. Note,
      unlike <tt>linker_private</tt> and <tt>linker_private_weak</tt>,
      <tt>linker_private_weak_def_auto</tt> may have only <tt>default</tt>
      visibility.  The symbols are removed by the linker from the final linked
      image (executable or dynamic library).</dd>

  <dt><tt><b><a name="linkage_internal">internal</a></b></tt></dt>
  <dd>Similar to private, but the value shows as a local symbol
      (<tt>STB_LOCAL</tt> in the case of ELF) in the object file. This
      corresponds to the notion of the '<tt>static</tt>' keyword in C.</dd>

  <dt><tt><b><a name="linkage_available_externally">available_externally</a></b></tt></dt>
  <dd>Globals with "<tt>available_externally</tt>" linkage are never emitted
      into the object file corresponding to the LLVM module.  They exist to
      allow inlining and other optimizations to take place given knowledge of
      the definition of the global, which is known to be somewhere outside the
      module.  Globals with <tt>available_externally</tt> linkage are allowed to
      be discarded at will, and are otherwise the same as <tt>linkonce_odr</tt>.
      This linkage type is only allowed on definitions, not declarations.</dd>

  <dt><tt><b><a name="linkage_linkonce">linkonce</a></b></tt></dt>
  <dd>Globals with "<tt>linkonce</tt>" linkage are merged with other globals of
      the same name when linkage occurs.  This can be used to implement
      some forms of inline functions, templates, or other code which must be
      generated in each translation unit that uses it, but where the body may
      be overridden with a more definitive definition later.  Unreferenced
      <tt>linkonce</tt> globals are allowed to be discarded.  Note that
      <tt>linkonce</tt> linkage does not actually allow the optimizer to
      inline the body of this function into callers because it doesn't know if
      this definition of the function is the definitive definition within the
      program or whether it will be overridden by a stronger definition.
      To enable inlining and other optimizations, use "<tt>linkonce_odr</tt>"
      linkage.</dd>

  <dt><tt><b><a name="linkage_weak">weak</a></b></tt></dt>
  <dd>"<tt>weak</tt>" linkage has the same merging semantics as
      <tt>linkonce</tt> linkage, except that unreferenced globals with
      <tt>weak</tt> linkage may not be discarded.  This is used for globals that
      are declared "weak" in C source code.</dd>

  <dt><tt><b><a name="linkage_common">common</a></b></tt></dt>
  <dd>"<tt>common</tt>" linkage is most similar to "<tt>weak</tt>" linkage, but
      they are used for tentative definitions in C, such as "<tt>int X;</tt>" at
      global scope.
      Symbols with "<tt>common</tt>" linkage are merged in the same way as
      <tt>weak symbols</tt>, and they may not be deleted if unreferenced.
      <tt>common</tt> symbols may not have an explicit section,
      must have a zero initializer, and may not be marked '<a
      href="#globalvars"><tt>constant</tt></a>'.  Functions and aliases may not
      have common linkage.</dd>


  <dt><tt><b><a name="linkage_appending">appending</a></b></tt></dt>
  <dd>"<tt>appending</tt>" linkage may only be applied to global variables of
      pointer to array type.  When two global variables with appending linkage
      are linked together, the two global arrays are appended together.  This is
      the LLVM, typesafe, equivalent of having the system linker append together
      "sections" with identical names when .o files are linked.</dd>

  <dt><tt><b><a name="linkage_externweak">extern_weak</a></b></tt></dt>
  <dd>The semantics of this linkage follow the ELF object file model: the symbol
      is weak until linked, if not linked, the symbol becomes null instead of
      being an undefined reference.</dd>

  <dt><tt><b><a name="linkage_linkonce_odr">linkonce_odr</a></b></tt></dt>
  <dt><tt><b><a name="linkage_weak_odr">weak_odr</a></b></tt></dt>
  <dd>Some languages allow differing globals to be merged, such as two functions
      with different semantics.  Other languages, such as <tt>C++</tt>, ensure
      that only equivalent globals are ever merged (the "one definition rule"
      &mdash; "ODR").  Such languages can use the <tt>linkonce_odr</tt>
      and <tt>weak_odr</tt> linkage types to indicate that the global will only
      be merged with equivalent globals.  These linkage types are otherwise the
      same as their non-<tt>odr</tt> versions.</dd>

  <dt><tt><b><a name="linkage_external">external</a></b></tt>:</dt>
  <dd>If none of the above identifiers are used, the global is externally
      visible, meaning that it participates in linkage and can be used to
      resolve external symbol references.</dd>
</dl>

<p>The next two types of linkage are targeted for Microsoft Windows platform
   only. They are designed to support importing (exporting) symbols from (to)
   DLLs (Dynamic Link Libraries).</p>

<dl>
  <dt><tt><b><a name="linkage_dllimport">dllimport</a></b></tt></dt>
  <dd>"<tt>dllimport</tt>" linkage causes the compiler to reference a function
      or variable via a global pointer to a pointer that is set up by the DLL
      exporting the symbol. On Microsoft Windows targets, the pointer name is
      formed by combining <code>__imp_</code> and the function or variable
      name.</dd>

  <dt><tt><b><a name="linkage_dllexport">dllexport</a></b></tt></dt>
  <dd>"<tt>dllexport</tt>" linkage causes the compiler to provide a global
      pointer to a pointer in a DLL, so that it can be referenced with the
      <tt>dllimport</tt> attribute. On Microsoft Windows targets, the pointer
      name is formed by combining <code>__imp_</code> and the function or
      variable name.</dd>
</dl>

<p>For example, since the "<tt>.LC0</tt>" variable is defined to be internal, if
   another module defined a "<tt>.LC0</tt>" variable and was linked with this
   one, one of the two would be renamed, preventing a collision.  Since
   "<tt>main</tt>" and "<tt>puts</tt>" are external (i.e., lacking any linkage
   declarations), they are accessible outside of the current module.</p>

<p>It is illegal for a function <i>declaration</i> to have any linkage type
   other than <tt>external</tt>, <tt>dllimport</tt>
  or <tt>extern_weak</tt>.</p>

<p>Aliases can have only <tt>external</tt>, <tt>internal</tt>, <tt>weak</tt>
   or <tt>weak_odr</tt> linkages.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="callingconv">Calling Conventions</a>
</h3>

<div>

<p>LLVM <a href="#functionstructure">functions</a>, <a href="#i_call">calls</a>
   and <a href="#i_invoke">invokes</a> can all have an optional calling
   convention specified for the call.  The calling convention of any pair of
   dynamic caller/callee must match, or the behavior of the program is
   undefined.  The following calling conventions are supported by LLVM, and more
   may be added in the future:</p>

<dl>
  <dt><b>"<tt>ccc</tt>" - The C calling convention</b>:</dt>
  <dd>This calling convention (the default if no other calling convention is
      specified) matches the target C calling conventions.  This calling
      convention supports varargs function calls and tolerates some mismatch in
      the declared prototype and implemented declaration of the function (as
      does normal C).</dd>

  <dt><b>"<tt>fastcc</tt>" - The fast calling convention</b>:</dt>
  <dd>This calling convention attempts to make calls as fast as possible
      (e.g. by passing things in registers).  This calling convention allows the
      target to use whatever tricks it wants to produce fast code for the
      target, without having to conform to an externally specified ABI
      (Application Binary Interface).
      <a href="CodeGenerator.html#tailcallopt">Tail calls can only be optimized
      when this or the GHC convention is used.</a>  This calling convention
      does not support varargs and requires the prototype of all callees to
      exactly match the prototype of the function definition.</dd>

  <dt><b>"<tt>coldcc</tt>" - The cold calling convention</b>:</dt>
  <dd>This calling convention attempts to make code in the caller as efficient
      as possible under the assumption that the call is not commonly executed.
      As such, these calls often preserve all registers so that the call does
      not break any live ranges in the caller side.  This calling convention
      does not support varargs and requires the prototype of all callees to
      exactly match the prototype of the function definition.</dd>

  <dt><b>"<tt>cc <em>10</em></tt>" - GHC convention</b>:</dt>
  <dd>This calling convention has been implemented specifically for use by the
      <a href="http://www.haskell.org/ghc">Glasgow Haskell Compiler (GHC)</a>.
      It passes everything in registers, going to extremes to achieve this by
      disabling callee save registers. This calling convention should not be
      used lightly but only for specific situations such as an alternative to
      the <em>register pinning</em> performance technique often used when
      implementing functional programming languages.At the moment only X86
      supports this convention and it has the following limitations:
      <ul>
        <li>On <em>X86-32</em> only supports up to 4 bit type parameters. No
            floating point types are supported.</li>
        <li>On <em>X86-64</em> only supports up to 10 bit type parameters and
            6 floating point parameters.</li>
      </ul>
      This calling convention supports
      <a href="CodeGenerator.html#tailcallopt">tail call optimization</a> but
      requires both the caller and callee are using it.
  </dd>

  <dt><b>"<tt>cc &lt;<em>n</em>&gt;</tt>" - Numbered convention</b>:</dt>
  <dd>Any calling convention may be specified by number, allowing
      target-specific calling conventions to be used.  Target specific calling
      conventions start at 64.</dd>
</dl>

<p>More calling conventions can be added/defined on an as-needed basis, to
   support Pascal conventions or any other well-known target-independent
   convention.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="visibility">Visibility Styles</a>
</h3>

<div>

<p>All Global Variables and Functions have one of the following visibility
   styles:</p>

<dl>
  <dt><b>"<tt>default</tt>" - Default style</b>:</dt>
  <dd>On targets that use the ELF object file format, default visibility means
      that the declaration is visible to other modules and, in shared libraries,
      means that the declared entity may be overridden. On Darwin, default
      visibility means that the declaration is visible to other modules. Default
      visibility corresponds to "external linkage" in the language.</dd>

  <dt><b>"<tt>hidden</tt>" - Hidden style</b>:</dt>
  <dd>Two declarations of an object with hidden visibility refer to the same
      object if they are in the same shared object. Usually, hidden visibility
      indicates that the symbol will not be placed into the dynamic symbol
      table, so no other module (executable or shared library) can reference it
      directly.</dd>

  <dt><b>"<tt>protected</tt>" - Protected style</b>:</dt>
  <dd>On ELF, protected visibility indicates that the symbol will be placed in
      the dynamic symbol table, but that references within the defining module
      will bind to the local symbol. That is, the symbol cannot be overridden by
      another module.</dd>
</dl>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="namedtypes">Named Types</a>
</h3>

<div>

<p>LLVM IR allows you to specify name aliases for certain types.  This can make
   it easier to read the IR and make the IR more condensed (particularly when
   recursive types are involved).  An example of a name specification is:</p>

<pre class="doc_code">
%mytype = type { %mytype*, i32 }
</pre>

<p>You may give a name to any <a href="#typesystem">type</a> except
   "<a href="#t_void">void</a>".  Type name aliases may be used anywhere a type
   is expected with the syntax "%mytype".</p>

<p>Note that type names are aliases for the structural type that they indicate,
   and that you can therefore specify multiple names for the same type.  This
   often leads to confusing behavior when dumping out a .ll file.  Since LLVM IR
   uses structural typing, the name is not part of the type.  When printing out
   LLVM IR, the printer will pick <em>one name</em> to render all types of a
   particular shape.  This means that if you have code where two different
   source types end up having the same LLVM type, that the dumper will sometimes
   print the "wrong" or unexpected type.  This is an important design point and
   isn't going to change.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="globalvars">Global Variables</a>
</h3>

<div>

<p>Global variables define regions of memory allocated at compilation time
   instead of run-time.  Global variables may optionally be initialized, may
   have an explicit section to be placed in, and may have an optional explicit
   alignment specified.  A variable may be defined as "thread_local", which
   means that it will not be shared by threads (each thread will have a
   separated copy of the variable).  A variable may be defined as a global
   "constant," which indicates that the contents of the variable
   will <b>never</b> be modified (enabling better optimization, allowing the
   global data to be placed in the read-only section of an executable, etc).
   Note that variables that need runtime initialization cannot be marked
   "constant" as there is a store to the variable.</p>

<p>LLVM explicitly allows <em>declarations</em> of global variables to be marked
   constant, even if the final definition of the global is not.  This capability
   can be used to enable slightly better optimization of the program, but
   requires the language definition to guarantee that optimizations based on the
   'constantness' are valid for the translation units that do not include the
   definition.</p>

<p>As SSA values, global variables define pointer values that are in scope
   (i.e. they dominate) all basic blocks in the program.  Global variables
   always define a pointer to their "content" type because they describe a
   region of memory, and all memory objects in LLVM are accessed through
   pointers.</p>

<p>Global variables can be marked with <tt>unnamed_addr</tt> which indicates
  that the address is not significant, only the content. Constants marked
  like this can be merged with other constants if they have the same
  initializer. Note that a constant with significant address <em>can</em>
  be merged with a <tt>unnamed_addr</tt> constant, the result being a
  constant whose address is significant.</p>

<p>A global variable may be declared to reside in a target-specific numbered
   address space. For targets that support them, address spaces may affect how
   optimizations are performed and/or what target instructions are used to
   access the variable. The default address space is zero. The address space
   qualifier must precede any other attributes.</p>

<p>LLVM allows an explicit section to be specified for globals.  If the target
   supports it, it will emit globals to the section specified.</p>

<p>An explicit alignment may be specified for a global, which must be a power
   of 2.  If not present, or if the alignment is set to zero, the alignment of
   the global is set by the target to whatever it feels convenient.  If an
   explicit alignment is specified, the global is forced to have exactly that
   alignment.  Targets and optimizers are not allowed to over-align the global
   if the global has an assigned section.  In this case, the extra alignment
   could be observable: for example, code could assume that the globals are
   densely packed in their section and try to iterate over them as an array,
   alignment padding would break this iteration.</p>

<p>For example, the following defines a global in a numbered address space with
   an initializer, section, and alignment:</p>

<pre class="doc_code">
@G = addrspace(5) constant float 1.0, section "foo", align 4
</pre>

</div>


<!-- ======================================================================= -->
<h3>
  <a name="functionstructure">Functions</a>
</h3>

<div>

<p>LLVM function definitions consist of the "<tt>define</tt>" keyword, an
   optional <a href="#linkage">linkage type</a>, an optional
   <a href="#visibility">visibility style</a>, an optional
   <a href="#callingconv">calling convention</a>,
   an optional <tt>unnamed_addr</tt> attribute, a return type, an optional
   <a href="#paramattrs">parameter attribute</a> for the return type, a function
   name, a (possibly empty) argument list (each with optional
   <a href="#paramattrs">parameter attributes</a>), optional
   <a href="#fnattrs">function attributes</a>, an optional section, an optional
   alignment, an optional <a href="#gc">garbage collector name</a>, an opening
   curly brace, a list of basic blocks, and a closing curly brace.</p>

<p>LLVM function declarations consist of the "<tt>declare</tt>" keyword, an
   optional <a href="#linkage">linkage type</a>, an optional
   <a href="#visibility">visibility style</a>, an optional
   <a href="#callingconv">calling convention</a>,
   an optional <tt>unnamed_addr</tt> attribute, a return type, an optional
   <a href="#paramattrs">parameter attribute</a> for the return type, a function
   name, a possibly empty list of arguments, an optional alignment, and an
   optional <a href="#gc">garbage collector name</a>.</p>

<p>A function definition contains a list of basic blocks, forming the CFG
   (Control Flow Graph) for the function.  Each basic block may optionally start
   with a label (giving the basic block a symbol table entry), contains a list
   of instructions, and ends with a <a href="#terminators">terminator</a>
   instruction (such as a branch or function return).</p>

<p>The first basic block in a function is special in two ways: it is immediately
   executed on entrance to the function, and it is not allowed to have
   predecessor basic blocks (i.e. there can not be any branches to the entry
   block of a function).  Because the block can have no predecessors, it also
   cannot have any <a href="#i_phi">PHI nodes</a>.</p>

<p>LLVM allows an explicit section to be specified for functions.  If the target
   supports it, it will emit functions to the section specified.</p>

<p>An explicit alignment may be specified for a function.  If not present, or if
   the alignment is set to zero, the alignment of the function is set by the
   target to whatever it feels convenient.  If an explicit alignment is
   specified, the function is forced to have at least that much alignment.  All
   alignments must be a power of 2.</p>

<p>If the <tt>unnamed_addr</tt> attribute is given, the address is know to not
  be significant and two identical functions can be merged</p>.

<h5>Syntax:</h5>
<pre class="doc_code">
define [<a href="#linkage">linkage</a>] [<a href="#visibility">visibility</a>]
       [<a href="#callingconv">cconv</a>] [<a href="#paramattrs">ret attrs</a>]
       &lt;ResultType&gt; @&lt;FunctionName&gt; ([argument list])
       [<a href="#fnattrs">fn Attrs</a>] [section "name"] [align N]
       [<a href="#gc">gc</a>] { ... }
</pre>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="aliasstructure">Aliases</a>
</h3>

<div>

<p>Aliases act as "second name" for the aliasee value (which can be either
   function, global variable, another alias or bitcast of global value). Aliases
   may have an optional <a href="#linkage">linkage type</a>, and an
   optional <a href="#visibility">visibility style</a>.</p>

<h5>Syntax:</h5>
<pre class="doc_code">
@&lt;Name&gt; = alias [Linkage] [Visibility] &lt;AliaseeTy&gt; @&lt;Aliasee&gt;
</pre>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="namedmetadatastructure">Named Metadata</a>
</h3>

<div>

<p>Named metadata is a collection of metadata. <a href="#metadata">Metadata
   nodes</a> (but not metadata strings) are the only valid operands for
   a named metadata.</p>

<h5>Syntax:</h5>
<pre class="doc_code">
; Some unnamed metadata nodes, which are referenced by the named metadata.
!0 = metadata !{metadata !"zero"}
!1 = metadata !{metadata !"one"}
!2 = metadata !{metadata !"two"}
; A named metadata.
!name = !{!0, !1, !2}
</pre>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="paramattrs">Parameter Attributes</a>
</h3>

<div>

<p>The return type and each parameter of a function type may have a set of
   <i>parameter attributes</i> associated with them. Parameter attributes are
   used to communicate additional information about the result or parameters of
   a function. Parameter attributes are considered to be part of the function,
   not of the function type, so functions with different parameter attributes
   can have the same function type.</p>

<p>Parameter attributes are simple keywords that follow the type specified. If
   multiple parameter attributes are needed, they are space separated. For
   example:</p>

<pre class="doc_code">
declare i32 @printf(i8* noalias nocapture, ...)
declare i32 @atoi(i8 zeroext)
declare signext i8 @returns_signed_char()
</pre>

<p>Note that any attributes for the function result (<tt>nounwind</tt>,
   <tt>readonly</tt>) come immediately after the argument list.</p>

<p>Currently, only the following parameter attributes are defined:</p>

<dl>
  <dt><tt><b>zeroext</b></tt></dt>
  <dd>This indicates to the code generator that the parameter or return value
      should be zero-extended to the extent required by the target's ABI (which
      is usually 32-bits, but is 8-bits for a i1 on x86-64) by the caller (for a
      parameter) or the callee (for a return value).</dd>

  <dt><tt><b>signext</b></tt></dt>
  <dd>This indicates to the code generator that the parameter or return value
      should be sign-extended to the extent required by the target's ABI (which
      is usually 32-bits) by the caller (for a parameter) or the callee (for a
      return value).</dd>

  <dt><tt><b>inreg</b></tt></dt>
  <dd>This indicates that this parameter or return value should be treated in a
      special target-dependent fashion during while emitting code for a function
      call or return (usually, by putting it in a register as opposed to memory,
      though some targets use it to distinguish between two different kinds of
      registers).  Use of this attribute is target-specific.</dd>

  <dt><tt><b><a name="byval">byval</a></b></tt></dt>
  <dd><p>This indicates that the pointer parameter should really be passed by
      value to the function.  The attribute implies that a hidden copy of the
      pointee
      is made between the caller and the callee, so the callee is unable to
      modify the value in the callee.  This attribute is only valid on LLVM
      pointer arguments.  It is generally used to pass structs and arrays by
      value, but is also valid on pointers to scalars.  The copy is considered
      to belong to the caller not the callee (for example,
      <tt><a href="#readonly">readonly</a></tt> functions should not write to
      <tt>byval</tt> parameters). This is not a valid attribute for return
      values.</p>
      
      <p>The byval attribute also supports specifying an alignment with
      the align attribute.  It indicates the alignment of the stack slot to
      form and the known alignment of the pointer specified to the call site. If
      the alignment is not specified, then the code generator makes a
      target-specific assumption.</p></dd>

  <dt><tt><b><a name="sret">sret</a></b></tt></dt>
  <dd>This indicates that the pointer parameter specifies the address of a
      structure that is the return value of the function in the source program.
      This pointer must be guaranteed by the caller to be valid: loads and
      stores to the structure may be assumed by the callee to not to trap.  This
      may only be applied to the first parameter. This is not a valid attribute
      for return values. </dd>

  <dt><tt><b><a name="noalias">noalias</a></b></tt></dt>
  <dd>This indicates that pointer values
      <a href="#pointeraliasing"><i>based</i></a> on the argument or return
      value do not alias pointer values which are not <i>based</i> on it,
      ignoring certain "irrelevant" dependencies.
      For a call to the parent function, dependencies between memory
      references from before or after the call and from those during the call
      are "irrelevant" to the <tt>noalias</tt> keyword for the arguments and
      return value used in that call.
      The caller shares the responsibility with the callee for ensuring that
      these requirements are met.
      For further details, please see the discussion of the NoAlias response in
      <a href="AliasAnalysis.html#MustMayNo">alias analysis</a>.<br>
<br>
      Note that this definition of <tt>noalias</tt> is intentionally
      similar to the definition of <tt>restrict</tt> in C99 for function
      arguments, though it is slightly weaker.
<br>
      For function return values, C99's <tt>restrict</tt> is not meaningful,
      while LLVM's <tt>noalias</tt> is.
      </dd>

  <dt><tt><b><a name="nocapture">nocapture</a></b></tt></dt>
  <dd>This indicates that the callee does not make any copies of the pointer
      that outlive the callee itself. This is not a valid attribute for return
      values.</dd>

  <dt><tt><b><a name="nest">nest</a></b></tt></dt>
  <dd>This indicates that the pointer parameter can be excised using the
      <a href="#int_trampoline">trampoline intrinsics</a>. This is not a valid
      attribute for return values.</dd>
</dl>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="gc">Garbage Collector Names</a>
</h3>

<div>

<p>Each function may specify a garbage collector name, which is simply a
   string:</p>

<pre class="doc_code">
define void @f() gc "name" { ... }
</pre>

<p>The compiler declares the supported values of <i>name</i>. Specifying a
   collector which will cause the compiler to alter its output in order to
   support the named garbage collection algorithm.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="fnattrs">Function Attributes</a>
</h3>

<div>

<p>Function attributes are set to communicate additional information about a
   function. Function attributes are considered to be part of the function, not
   of the function type, so functions with different parameter attributes can
   have the same function type.</p>

<p>Function attributes are simple keywords that follow the type specified. If
   multiple attributes are needed, they are space separated. For example:</p>

<pre class="doc_code">
define void @f() noinline { ... }
define void @f() alwaysinline { ... }
define void @f() alwaysinline optsize { ... }
define void @f() optsize { ... }
</pre>

<dl>
  <dt><tt><b>alignstack(&lt;<em>n</em>&gt;)</b></tt></dt>
  <dd>This attribute indicates that, when emitting the prologue and epilogue,
      the backend should forcibly align the stack pointer. Specify the
      desired alignment, which must be a power of two, in parentheses.

  <dt><tt><b>alwaysinline</b></tt></dt>
  <dd>This attribute indicates that the inliner should attempt to inline this
      function into callers whenever possible, ignoring any active inlining size
      threshold for this caller.</dd>

  <dt><tt><b>nonlazybind</b></tt></dt>
  <dd>This attribute suppresses lazy symbol binding for the function. This
      may make calls to the function faster, at the cost of extra program
      startup time if the function is not called during program startup.</dd>

  <dt><tt><b>inlinehint</b></tt></dt>
  <dd>This attribute indicates that the source code contained a hint that inlining
      this function is desirable (such as the "inline" keyword in C/C++).  It
      is just a hint; it imposes no requirements on the inliner.</dd>

  <dt><tt><b>naked</b></tt></dt>
  <dd>This attribute disables prologue / epilogue emission for the function.
      This can have very system-specific consequences.</dd>

  <dt><tt><b>noimplicitfloat</b></tt></dt>
  <dd>This attributes disables implicit floating point instructions.</dd>

  <dt><tt><b>noinline</b></tt></dt>
  <dd>This attribute indicates that the inliner should never inline this
      function in any situation. This attribute may not be used together with
      the <tt>alwaysinline</tt> attribute.</dd>

  <dt><tt><b>noredzone</b></tt></dt>
  <dd>This attribute indicates that the code generator should not use a red
      zone, even if the target-specific ABI normally permits it.</dd>

  <dt><tt><b>noreturn</b></tt></dt>
  <dd>This function attribute indicates that the function never returns
      normally.  This produces undefined behavior at runtime if the function
      ever does dynamically return.</dd>

  <dt><tt><b>nounwind</b></tt></dt>
  <dd>This function attribute indicates that the function never returns with an
      unwind or exceptional control flow.  If the function does unwind, its
      runtime behavior is undefined.</dd>

  <dt><tt><b>optsize</b></tt></dt>
  <dd>This attribute suggests that optimization passes and code generator passes
      make choices that keep the code size of this function low, and otherwise
      do optimizations specifically to reduce code size.</dd>

  <dt><tt><b>readnone</b></tt></dt>
  <dd>This attribute indicates that the function computes its result (or decides
      to unwind an exception) based strictly on its arguments, without
      dereferencing any pointer arguments or otherwise accessing any mutable
      state (e.g. memory, control registers, etc) visible to caller functions.
      It does not write through any pointer arguments
      (including <tt><a href="#byval">byval</a></tt> arguments) and never
      changes any state visible to callers.  This means that it cannot unwind
      exceptions by calling the <tt>C++</tt> exception throwing methods, but
      could use the <tt>unwind</tt> instruction.</dd>

  <dt><tt><b><a name="readonly">readonly</a></b></tt></dt>
  <dd>This attribute indicates that the function does not write through any
      pointer arguments (including <tt><a href="#byval">byval</a></tt>
      arguments) or otherwise modify any state (e.g. memory, control registers,
      etc) visible to caller functions.  It may dereference pointer arguments
      and read state that may be set in the caller.  A readonly function always
      returns the same value (or unwinds an exception identically) when called
      with the same set of arguments and global state.  It cannot unwind an
      exception by calling the <tt>C++</tt> exception throwing methods, but may
      use the <tt>unwind</tt> instruction.</dd>

  <dt><tt><b><a name="ssp">ssp</a></b></tt></dt>
  <dd>This attribute indicates that the function should emit a stack smashing
      protector. It is in the form of a "canary"&mdash;a random value placed on
      the stack before the local variables that's checked upon return from the
      function to see if it has been overwritten. A heuristic is used to
      determine if a function needs stack protectors or not.<br>
<br>
      If a function that has an <tt>ssp</tt> attribute is inlined into a
      function that doesn't have an <tt>ssp</tt> attribute, then the resulting
      function will have an <tt>ssp</tt> attribute.</dd>

  <dt><tt><b>sspreq</b></tt></dt>
  <dd>This attribute indicates that the function should <em>always</em> emit a
      stack smashing protector. This overrides
      the <tt><a href="#ssp">ssp</a></tt> function attribute.<br>
<br>
      If a function that has an <tt>sspreq</tt> attribute is inlined into a
      function that doesn't have an <tt>sspreq</tt> attribute or which has
      an <tt>ssp</tt> attribute, then the resulting function will have
      an <tt>sspreq</tt> attribute.</dd>

  <dt><tt><b><a name="uwtable">uwtable</a></b></tt></dt>
  <dd>This attribute indicates that the ABI being targeted requires that
      an unwind table entry be produce for this function even if we can
      show that no exceptions passes by it. This is normally the case for
      the ELF x86-64 abi, but it can be disabled for some compilation
      units.</dd>

  <dt><tt><b><a name="returns_twice">returns_twice</a></b></tt></dt>
  <dd>This attribute indicates that this function can return
  twice. The C <code>setjmp</code> is an example of such a function.
  The compiler disables some optimizations (like tail calls) in the caller of
  these functions.</dd>
</dl>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="moduleasm">Module-Level Inline Assembly</a>
</h3>

<div>

<p>Modules may contain "module-level inline asm" blocks, which corresponds to
   the GCC "file scope inline asm" blocks.  These blocks are internally
   concatenated by LLVM and treated as a single unit, but may be separated in
   the <tt>.ll</tt> file if desired.  The syntax is very simple:</p>

<pre class="doc_code">
module asm "inline asm code goes here"
module asm "more can go here"
</pre>

<p>The strings can contain any character by escaping non-printable characters.
   The escape sequence used is simply "\xx" where "xx" is the two digit hex code
   for the number.</p>

<p>The inline asm code is simply printed to the machine code .s file when
   assembly code is generated.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="datalayout">Data Layout</a>
</h3>

<div>

<p>A module may specify a target specific data layout string that specifies how
   data is to be laid out in memory. The syntax for the data layout is
   simply:</p>

<pre class="doc_code">
target datalayout = "<i>layout specification</i>"
</pre>

<p>The <i>layout specification</i> consists of a list of specifications
   separated by the minus sign character ('-').  Each specification starts with
   a letter and may include other information after the letter to define some
   aspect of the data layout.  The specifications accepted are as follows:</p>

<dl>
  <dt><tt>E</tt></dt>
  <dd>Specifies that the target lays out data in big-endian form. That is, the
      bits with the most significance have the lowest address location.</dd>

  <dt><tt>e</tt></dt>
  <dd>Specifies that the target lays out data in little-endian form. That is,
      the bits with the least significance have the lowest address
      location.</dd>

  <dt><tt>S<i>size</i></tt></dt>
  <dd>Specifies the natural alignment of the stack in bits. Alignment promotion
      of stack variables is limited to the natural stack alignment to avoid
      dynamic stack realignment. The stack alignment must be a multiple of
      8-bits. If omitted, the natural stack alignment defaults to "unspecified",
      which does not prevent any alignment promotions.</dd>

  <dt><tt>p:<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
  <dd>This specifies the <i>size</i> of a pointer and its <i>abi</i> and
      <i>preferred</i> alignments. All sizes are in bits. Specifying
      the <i>pref</i> alignment is optional. If omitted, the
      preceding <tt>:</tt> should be omitted too.</dd>

  <dt><tt>i<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
  <dd>This specifies the alignment for an integer type of a given bit
      <i>size</i>. The value of <i>size</i> must be in the range [1,2^23).</dd>

  <dt><tt>v<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
  <dd>This specifies the alignment for a vector type of a given bit
      <i>size</i>.</dd>

  <dt><tt>f<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
  <dd>This specifies the alignment for a floating point type of a given bit
      <i>size</i>. Only values of <i>size</i> that are supported by the target
      will work.  32 (float) and 64 (double) are supported on all targets;
      80 or 128 (different flavors of long double) are also supported on some
      targets.

  <dt><tt>a<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
  <dd>This specifies the alignment for an aggregate type of a given bit
      <i>size</i>.</dd>

  <dt><tt>s<i>size</i>:<i>abi</i>:<i>pref</i></tt></dt>
  <dd>This specifies the alignment for a stack object of a given bit
      <i>size</i>.</dd>

  <dt><tt>n<i>size1</i>:<i>size2</i>:<i>size3</i>...</tt></dt>
  <dd>This specifies a set of native integer widths for the target CPU
      in bits.  For example, it might contain "n32" for 32-bit PowerPC,
      "n32:64" for PowerPC 64, or "n8:16:32:64" for X86-64.  Elements of
      this set are considered to support most general arithmetic
      operations efficiently.</dd>
</dl>

<p>When constructing the data layout for a given target, LLVM starts with a
   default set of specifications which are then (possibly) overridden by the
   specifications in the <tt>datalayout</tt> keyword. The default specifications
   are given in this list:</p>

<ul>
  <li><tt>E</tt> - big endian</li>
  <li><tt>p:64:64:64</tt> - 64-bit pointers with 64-bit alignment</li>
  <li><tt>i1:8:8</tt> - i1 is 8-bit (byte) aligned</li>
  <li><tt>i8:8:8</tt> - i8 is 8-bit (byte) aligned</li>
  <li><tt>i16:16:16</tt> - i16 is 16-bit aligned</li>
  <li><tt>i32:32:32</tt> - i32 is 32-bit aligned</li>
  <li><tt>i64:32:64</tt> - i64 has ABI alignment of 32-bits but preferred
  alignment of 64-bits</li>
  <li><tt>f32:32:32</tt> - float is 32-bit aligned</li>
  <li><tt>f64:64:64</tt> - double is 64-bit aligned</li>
  <li><tt>v64:64:64</tt> - 64-bit vector is 64-bit aligned</li>
  <li><tt>v128:128:128</tt> - 128-bit vector is 128-bit aligned</li>
  <li><tt>a0:0:1</tt> - aggregates are 8-bit aligned</li>
  <li><tt>s0:64:64</tt> - stack objects are 64-bit aligned</li>
</ul>

<p>When LLVM is determining the alignment for a given type, it uses the
   following rules:</p>

<ol>
  <li>If the type sought is an exact match for one of the specifications, that
      specification is used.</li>

  <li>If no match is found, and the type sought is an integer type, then the
      smallest integer type that is larger than the bitwidth of the sought type
      is used. If none of the specifications are larger than the bitwidth then
      the the largest integer type is used. For example, given the default
      specifications above, the i7 type will use the alignment of i8 (next
      largest) while both i65 and i256 will use the alignment of i64 (largest
      specified).</li>

  <li>If no match is found, and the type sought is a vector type, then the
      largest vector type that is smaller than the sought vector type will be
      used as a fall back.  This happens because &lt;128 x double&gt; can be
      implemented in terms of 64 &lt;2 x double&gt;, for example.</li>
</ol>

<p>The function of the data layout string may not be what you expect.  Notably,
   this is not a specification from the frontend of what alignment the code
   generator should use.</p>

<p>Instead, if specified, the target data layout is required to match what the 
   ultimate <em>code generator</em> expects.  This string is used by the 
   mid-level optimizers to
   improve code, and this only works if it matches what the ultimate code 
   generator uses.  If you would like to generate IR that does not embed this
   target-specific detail into the IR, then you don't have to specify the 
   string.  This will disable some optimizations that require precise layout
   information, but this also prevents those optimizations from introducing
   target specificity into the IR.</p>



</div>

<!-- ======================================================================= -->
<h3>
  <a name="pointeraliasing">Pointer Aliasing Rules</a>
</h3>

<div>

<p>Any memory access must be done through a pointer value associated
with an address range of the memory access, otherwise the behavior
is undefined. Pointer values are associated with address ranges
according to the following rules:</p>

<ul>
  <li>A pointer value is associated with the addresses associated with
      any value it is <i>based</i> on.
  <li>An address of a global variable is associated with the address
      range of the variable's storage.</li>
  <li>The result value of an allocation instruction is associated with
      the address range of the allocated storage.</li>
  <li>A null pointer in the default address-space is associated with
      no address.</li>
  <li>An integer constant other than zero or a pointer value returned
      from a function not defined within LLVM may be associated with address
      ranges allocated through mechanisms other than those provided by
      LLVM. Such ranges shall not overlap with any ranges of addresses
      allocated by mechanisms provided by LLVM.</li>
</ul>

<p>A pointer value is <i>based</i> on another pointer value according
   to the following rules:</p>

<ul>
  <li>A pointer value formed from a
      <tt><a href="#i_getelementptr">getelementptr</a></tt> operation
      is <i>based</i> on the first operand of the <tt>getelementptr</tt>.</li>
  <li>The result value of a
      <tt><a href="#i_bitcast">bitcast</a></tt> is <i>based</i> on the operand
      of the <tt>bitcast</tt>.</li>
  <li>A pointer value formed by an
      <tt><a href="#i_inttoptr">inttoptr</a></tt> is <i>based</i> on all
      pointer values that contribute (directly or indirectly) to the
      computation of the pointer's value.</li>
  <li>The "<i>based</i> on" relationship is transitive.</li>
</ul>

<p>Note that this definition of <i>"based"</i> is intentionally
   similar to the definition of <i>"based"</i> in C99, though it is
   slightly weaker.</p>

<p>LLVM IR does not associate types with memory. The result type of a
<tt><a href="#i_load">load</a></tt> merely indicates the size and
alignment of the memory from which to load, as well as the
interpretation of the value. The first operand type of a
<tt><a href="#i_store">store</a></tt> similarly only indicates the size
and alignment of the store.</p>

<p>Consequently, type-based alias analysis, aka TBAA, aka
<tt>-fstrict-aliasing</tt>, is not applicable to general unadorned
LLVM IR. <a href="#metadata">Metadata</a> may be used to encode
additional information which specialized optimization passes may use
to implement type-based alias analysis.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="volatile">Volatile Memory Accesses</a>
</h3>

<div>

<p>Certain memory accesses, such as <a href="#i_load"><tt>load</tt></a>s, <a
href="#i_store"><tt>store</tt></a>s, and <a
href="#int_memcpy"><tt>llvm.memcpy</tt></a>s may be marked <tt>volatile</tt>.
The optimizers must not change the number of volatile operations or change their
order of execution relative to other volatile operations.  The optimizers
<i>may</i> change the order of volatile operations relative to non-volatile
operations.  This is not Java's "volatile" and has no cross-thread
synchronization behavior.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="memmodel">Memory Model for Concurrent Operations</a>
</h3>

<div>

<p>The LLVM IR does not define any way to start parallel threads of execution
or to register signal handlers. Nonetheless, there are platform-specific
ways to create them, and we define LLVM IR's behavior in their presence. This
model is inspired by the C++0x memory model.</p>

<p>For a more informal introduction to this model, see the
<a href="Atomics.html">LLVM Atomic Instructions and Concurrency Guide</a>.

<p>We define a <i>happens-before</i> partial order as the least partial order
that</p>
<ul>
  <li>Is a superset of single-thread program order, and</li>
  <li>When a <i>synchronizes-with</i> <tt>b</tt>, includes an edge from
      <tt>a</tt> to <tt>b</tt>. <i>Synchronizes-with</i> pairs are introduced
      by platform-specific techniques, like pthread locks, thread
      creation, thread joining, etc., and by atomic instructions.
      (See also <a href="#ordering">Atomic Memory Ordering Constraints</a>).
      </li>
</ul>

<p>Note that program order does not introduce <i>happens-before</i> edges
between a thread and signals executing inside that thread.</p>

<p>Every (defined) read operation (load instructions, memcpy, atomic
loads/read-modify-writes, etc.) <var>R</var> reads a series of bytes written by
(defined) write operations (store instructions, atomic
stores/read-modify-writes, memcpy, etc.). For the purposes of this section,
initialized globals are considered to have a write of the initializer which is
atomic and happens before any other read or write of the memory in question.
For each byte of a read <var>R</var>, <var>R<sub>byte</sub></var> may see
any write to the same byte, except:</p>

<ul>
  <li>If <var>write<sub>1</sub></var> happens before
      <var>write<sub>2</sub></var>, and <var>write<sub>2</sub></var> happens
      before <var>R<sub>byte</sub></var>, then <var>R<sub>byte</sub></var>
      does not see <var>write<sub>1</sub></var>.
  <li>If <var>R<sub>byte</sub></var> happens before
      <var>write<sub>3</sub></var>, then <var>R<sub>byte</sub></var> does not
      see <var>write<sub>3</sub></var>.
</ul>

<p>Given that definition, <var>R<sub>byte</sub></var> is defined as follows:
<ul>
  <li>If <var>R</var> is volatile, the result is target-dependent. (Volatile
      is supposed to give guarantees which can support
      <code>sig_atomic_t</code> in C/C++, and may be used for accesses to
      addresses which do not behave like normal memory.  It does not generally
      provide cross-thread synchronization.)
  <li>Otherwise, if there is no write to the same byte that happens before
    <var>R<sub>byte</sub></var>, <var>R<sub>byte</sub></var> returns 
    <tt>undef</tt> for that byte.
  <li>Otherwise, if <var>R<sub>byte</sub></var> may see exactly one write,
      <var>R<sub>byte</sub></var> returns the value written by that
      write.</li>
  <li>Otherwise, if <var>R</var> is atomic, and all the writes
      <var>R<sub>byte</sub></var> may see are atomic, it chooses one of the
      values written.  See the <a href="#ordering">Atomic Memory Ordering
      Constraints</a> section for additional constraints on how the choice
      is made.
  <li>Otherwise <var>R<sub>byte</sub></var> returns <tt>undef</tt>.</li>
</ul>

<p><var>R</var> returns the value composed of the series of bytes it read.
This implies that some bytes within the value may be <tt>undef</tt>
<b>without</b> the entire value being <tt>undef</tt>. Note that this only
defines the semantics of the operation; it doesn't mean that targets will
emit more than one instruction to read the series of bytes.</p>

<p>Note that in cases where none of the atomic intrinsics are used, this model
places only one restriction on IR transformations on top of what is required
for single-threaded execution: introducing a store to a byte which might not
otherwise be stored is not allowed in general.  (Specifically, in the case
where another thread might write to and read from an address, introducing a
store can change a load that may see exactly one write into a load that may
see multiple writes.)</p>

<!-- FIXME: This model assumes all targets where concurrency is relevant have
a byte-size store which doesn't affect adjacent bytes.  As far as I can tell,
none of the backends currently in the tree fall into this category; however,
there might be targets which care.  If there are, we want a paragraph
like the following:

Targets may specify that stores narrower than a certain width are not
available; on such a target, for the purposes of this model, treat any
non-atomic write with an alignment or width less than the minimum width
as if it writes to the relevant surrounding bytes.
-->

</div>

<!-- ======================================================================= -->
<h3>
      <a name="ordering">Atomic Memory Ordering Constraints</a>
</h3>

<div>

<p>Atomic instructions (<a href="#i_cmpxchg"><code>cmpxchg</code></a>,
<a href="#i_atomicrmw"><code>atomicrmw</code></a>,
<a href="#i_fence"><code>fence</code></a>,
<a href="#i_load"><code>atomic load</code></a>, and
<a href="#i_store"><code>atomic store</code></a>) take an ordering parameter
that determines which other atomic instructions on the same address they
<i>synchronize with</i>.  These semantics are borrowed from Java and C++0x,
but are somewhat more colloquial. If these descriptions aren't precise enough,
check those specs (see spec references in the
<a href="Atomic.html#introduction">atomics guide</a>).
<a href="#i_fence"><code>fence</code></a> instructions
treat these orderings somewhat differently since they don't take an address.
See that instruction's documentation for details.</p>

<p>For a simpler introduction to the ordering constraints, see the
<a href="Atomics.html">LLVM Atomic Instructions and Concurrency Guide</a>.</p>

<dl>
<dt><code>unordered</code></dt>
<dd>The set of values that can be read is governed by the happens-before
partial order. A value cannot be read unless some operation wrote it.
This is intended to provide a guarantee strong enough to model Java's
non-volatile shared variables.  This ordering cannot be specified for
read-modify-write operations; it is not strong enough to make them atomic
in any interesting way.</dd>
<dt><code>monotonic</code></dt>
<dd>In addition to the guarantees of <code>unordered</code>, there is a single
total order for modifications by <code>monotonic</code> operations on each
address. All modification orders must be compatible with the happens-before
order. There is no guarantee that the modification orders can be combined to
a global total order for the whole program (and this often will not be
possible). The read in an atomic read-modify-write operation
(<a href="#i_cmpxchg"><code>cmpxchg</code></a> and
<a href="#i_atomicrmw"><code>atomicrmw</code></a>)
reads the value in the modification order immediately before the value it
writes. If one atomic read happens before another atomic read of the same
address, the later read must see the same value or a later value in the
address's modification order. This disallows reordering of
<code>monotonic</code> (or stronger) operations on the same address. If an
address is written <code>monotonic</code>ally by one thread, and other threads
<code>monotonic</code>ally read that address repeatedly, the other threads must
eventually see the write. This corresponds to the C++0x/C1x
<code>memory_order_relaxed</code>.</dd>
<dt><code>acquire</code></dt>
<dd>In addition to the guarantees of <code>monotonic</code>,
a <i>synchronizes-with</i> edge may be formed with a <code>release</code>
operation. This is intended to model C++'s <code>memory_order_acquire</code>.</dd>
<dt><code>release</code></dt>
<dd>In addition to the guarantees of <code>monotonic</code>, if this operation
writes a value which is subsequently read by an <code>acquire</code> operation,
it <i>synchronizes-with</i> that operation.  (This isn't a complete
description; see the C++0x definition of a release sequence.) This corresponds
to the C++0x/C1x <code>memory_order_release</code>.</dd>
<dt><code>acq_rel</code> (acquire+release)</dt><dd>Acts as both an
<code>acquire</code> and <code>release</code> operation on its address.
This corresponds to the C++0x/C1x <code>memory_order_acq_rel</code>.</dd>
<dt><code>seq_cst</code> (sequentially consistent)</dt><dd>
<dd>In addition to the guarantees of <code>acq_rel</code>
(<code>acquire</code> for an operation which only reads, <code>release</code>
for an operation which only writes), there is a global total order on all
sequentially-consistent operations on all addresses, which is consistent with
the <i>happens-before</i> partial order and with the modification orders of
all the affected addresses. Each sequentially-consistent read sees the last
preceding write to the same address in this global order. This corresponds
to the C++0x/C1x <code>memory_order_seq_cst</code> and Java volatile.</dd>
</dl>

<p id="singlethread">If an atomic operation is marked <code>singlethread</code>,
it only <i>synchronizes with</i> or participates in modification and seq_cst
total orderings with other operations running in the same thread (for example,
in signal handlers).</p>

</div>

</div>

<!-- *********************************************************************** -->
<h2><a name="typesystem">Type System</a></h2>
<!-- *********************************************************************** -->

<div>

<p>The LLVM type system is one of the most important features of the
   intermediate representation.  Being typed enables a number of optimizations
   to be performed on the intermediate representation directly, without having
   to do extra analyses on the side before the transformation.  A strong type
   system makes it easier to read the generated code and enables novel analyses
   and transformations that are not feasible to perform on normal three address
   code representations.</p>

<!-- ======================================================================= -->
<h3>
  <a name="t_classifications">Type Classifications</a>
</h3>

<div>

<p>The types fall into a few useful classifications:</p>

<table border="1" cellspacing="0" cellpadding="4">
  <tbody>
    <tr><th>Classification</th><th>Types</th></tr>
    <tr>
      <td><a href="#t_integer">integer</a></td>
      <td><tt>i1, i2, i3, ... i8, ... i16, ... i32, ... i64, ... </tt></td>
    </tr>
    <tr>
      <td><a href="#t_floating">floating point</a></td>
      <td><tt>float, double, x86_fp80, fp128, ppc_fp128</tt></td>
    </tr>
    <tr>
      <td><a name="t_firstclass">first class</a></td>
      <td><a href="#t_integer">integer</a>,
          <a href="#t_floating">floating point</a>,
          <a href="#t_pointer">pointer</a>,
          <a href="#t_vector">vector</a>,
          <a href="#t_struct">structure</a>,
          <a href="#t_array">array</a>,
          <a href="#t_label">label</a>,
          <a href="#t_metadata">metadata</a>.
      </td>
    </tr>
    <tr>
      <td><a href="#t_primitive">primitive</a></td>
      <td><a href="#t_label">label</a>,
          <a href="#t_void">void</a>,
          <a href="#t_integer">integer</a>,
          <a href="#t_floating">floating point</a>,
          <a href="#t_x86mmx">x86mmx</a>,
          <a href="#t_metadata">metadata</a>.</td>
    </tr>
    <tr>
      <td><a href="#t_derived">derived</a></td>
      <td><a href="#t_array">array</a>,
          <a href="#t_function">function</a>,
          <a href="#t_pointer">pointer</a>,
          <a href="#t_struct">structure</a>,
          <a href="#t_vector">vector</a>,
          <a href="#t_opaque">opaque</a>.
      </td>
    </tr>
  </tbody>
</table>

<p>The <a href="#t_firstclass">first class</a> types are perhaps the most
   important.  Values of these types are the only ones which can be produced by
   instructions.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="t_primitive">Primitive Types</a>
</h3>

<div>

<p>The primitive types are the fundamental building blocks of the LLVM
   system.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_integer">Integer Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The integer type is a very simple type that simply specifies an arbitrary
   bit width for the integer type desired. Any bit width from 1 bit to
   2<sup>23</sup>-1 (about 8 million) can be specified.</p>

<h5>Syntax:</h5>
<pre>
  iN
</pre>

<p>The number of bits the integer will occupy is specified by the <tt>N</tt>
   value.</p>

<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>i1</tt></td>
    <td class="left">a single-bit integer.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>i32</tt></td>
    <td class="left">a 32-bit integer.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>i1942652</tt></td>
    <td class="left">a really big integer of over 1 million bits.</td>
  </tr>
</table>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_floating">Floating Point Types</a>
</h4>

<div>

<table>
  <tbody>
    <tr><th>Type</th><th>Description</th></tr>
    <tr><td><tt>float</tt></td><td>32-bit floating point value</td></tr>
    <tr><td><tt>double</tt></td><td>64-bit floating point value</td></tr>
    <tr><td><tt>fp128</tt></td><td>128-bit floating point value (112-bit mantissa)</td></tr>
    <tr><td><tt>x86_fp80</tt></td><td>80-bit floating point value (X87)</td></tr>
    <tr><td><tt>ppc_fp128</tt></td><td>128-bit floating point value (two 64-bits)</td></tr>
  </tbody>
</table>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_x86mmx">X86mmx Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The x86mmx type represents a value held in an MMX register on an x86 machine.  The operations allowed on it are quite limited:  parameters and return values, load and store, and bitcast.  User-specified MMX instructions are represented as intrinsic or asm calls with arguments and/or results of this type.  There are no arrays, vectors or constants of this type.</p>

<h5>Syntax:</h5>
<pre>
  x86mmx
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_void">Void Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The void type does not represent any value and has no size.</p>

<h5>Syntax:</h5>
<pre>
  void
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_label">Label Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The label type represents code labels.</p>

<h5>Syntax:</h5>
<pre>
  label
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_metadata">Metadata Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The metadata type represents embedded metadata. No derived types may be
   created from metadata except for <a href="#t_function">function</a>
   arguments.

<h5>Syntax:</h5>
<pre>
  metadata
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="t_derived">Derived Types</a>
</h3>

<div>

<p>The real power in LLVM comes from the derived types in the system.  This is
   what allows a programmer to represent arrays, functions, pointers, and other
   useful types.  Each of these types contain one or more element types which
   may be a primitive type, or another derived type.  For example, it is
   possible to have a two dimensional array, using an array as the element type
   of another array.</p>

</div>
  

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_aggregate">Aggregate Types</a>
</h4>

<div>

<p>Aggregate Types are a subset of derived types that can contain multiple
  member types. <a href="#t_array">Arrays</a>,
  <a href="#t_struct">structs</a>, and <a href="#t_vector">vectors</a> are
  aggregate types.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_array">Array Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The array type is a very simple derived type that arranges elements
   sequentially in memory.  The array type requires a size (number of elements)
   and an underlying data type.</p>

<h5>Syntax:</h5>
<pre>
  [&lt;# elements&gt; x &lt;elementtype&gt;]
</pre>

<p>The number of elements is a constant integer value; <tt>elementtype</tt> may
   be any type with a size.</p>

<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>[40 x i32]</tt></td>
    <td class="left">Array of 40 32-bit integer values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>[41 x i32]</tt></td>
    <td class="left">Array of 41 32-bit integer values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>[4 x i8]</tt></td>
    <td class="left">Array of 4 8-bit integer values.</td>
  </tr>
</table>
<p>Here are some examples of multidimensional arrays:</p>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>[3 x [4 x i32]]</tt></td>
    <td class="left">3x4 array of 32-bit integer values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>[12 x [10 x float]]</tt></td>
    <td class="left">12x10 array of single precision floating point values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>[2 x [3 x [4 x i16]]]</tt></td>
    <td class="left">2x3x4 array of 16-bit integer  values.</td>
  </tr>
</table>

<p>There is no restriction on indexing beyond the end of the array implied by
   a static type (though there are restrictions on indexing beyond the bounds
   of an allocated object in some cases). This means that single-dimension
   'variable sized array' addressing can be implemented in LLVM with a zero
   length array type. An implementation of 'pascal style arrays' in LLVM could
   use the type "<tt>{ i32, [0 x float]}</tt>", for example.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_function">Function Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The function type can be thought of as a function signature.  It consists of
   a return type and a list of formal parameter types. The return type of a
   function type is a first class type or a void type.</p>

<h5>Syntax:</h5>
<pre>
  &lt;returntype&gt; (&lt;parameter list&gt;)
</pre>

<p>...where '<tt>&lt;parameter list&gt;</tt>' is a comma-separated list of type
   specifiers.  Optionally, the parameter list may include a type <tt>...</tt>,
   which indicates that the function takes a variable number of arguments.
   Variable argument functions can access their arguments with
   the <a href="#int_varargs">variable argument handling intrinsic</a>
   functions.  '<tt>&lt;returntype&gt;</tt>' is any type except
   <a href="#t_label">label</a>.</p>

<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>i32 (i32)</tt></td>
    <td class="left">function taking an <tt>i32</tt>, returning an <tt>i32</tt>
    </td>
  </tr><tr class="layout">
    <td class="left"><tt>float&nbsp;(i16,&nbsp;i32&nbsp;*)&nbsp;*
    </tt></td>
    <td class="left"><a href="#t_pointer">Pointer</a> to a function that takes
      an <tt>i16</tt> and a <a href="#t_pointer">pointer</a> to <tt>i32</tt>,
      returning <tt>float</tt>.
    </td>
  </tr><tr class="layout">
    <td class="left"><tt>i32 (i8*, ...)</tt></td>
    <td class="left">A vararg function that takes at least one
      <a href="#t_pointer">pointer</a> to <tt>i8 </tt> (char in C),
      which returns an integer.  This is the signature for <tt>printf</tt> in
      LLVM.
    </td>
  </tr><tr class="layout">
    <td class="left"><tt>{i32, i32} (i32)</tt></td>
    <td class="left">A function taking an <tt>i32</tt>, returning a
        <a href="#t_struct">structure</a> containing two <tt>i32</tt> values
    </td>
  </tr>
</table>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_struct">Structure Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The structure type is used to represent a collection of data members together
  in memory.  The elements of a structure may be any type that has a size.</p>

<p>Structures in memory are accessed using '<tt><a href="#i_load">load</a></tt>'
   and '<tt><a href="#i_store">store</a></tt>' by getting a pointer to a field
   with the '<tt><a href="#i_getelementptr">getelementptr</a></tt>' instruction.
   Structures in registers are accessed using the
   '<tt><a href="#i_extractvalue">extractvalue</a></tt>' and
   '<tt><a href="#i_insertvalue">insertvalue</a></tt>' instructions.</p>
  
<p>Structures may optionally be "packed" structures, which indicate that the 
  alignment of the struct is one byte, and that there is no padding between
  the elements.  In non-packed structs, padding between field types is inserted
  as defined by the TargetData string in the module, which is required to match
  what the underlying code generator expects.</p>

<p>Structures can either be "literal" or "identified".  A literal structure is
  defined inline with other types (e.g. <tt>{i32, i32}*</tt>) whereas identified
  types are always defined at the top level with a name.  Literal types are
  uniqued by their contents and can never be recursive or opaque since there is
  no way to write one.  Identified types can be recursive, can be opaqued, and are
  never uniqued.
</p>
  
<h5>Syntax:</h5>
<pre>
  %T1 = type { &lt;type list&gt; }     <i>; Identified normal struct type</i>
  %T2 = type &lt;{ &lt;type list&gt; }&gt;   <i>; Identified packed struct type</i>
</pre>
  
<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>{ i32, i32, i32 }</tt></td>
    <td class="left">A triple of three <tt>i32</tt> values</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>{&nbsp;float,&nbsp;i32&nbsp;(i32)&nbsp;*&nbsp;}</tt></td>
    <td class="left">A pair, where the first element is a <tt>float</tt> and the
      second element is a <a href="#t_pointer">pointer</a> to a
      <a href="#t_function">function</a> that takes an <tt>i32</tt>, returning
      an <tt>i32</tt>.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>&lt;{ i8, i32 }&gt;</tt></td>
    <td class="left">A packed struct known to be 5 bytes in size.</td>
  </tr>
</table>

</div>
  
<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_opaque">Opaque Structure Types</a>
</h4>

<div>

<h5>Overview:</h5>
<p>Opaque structure types are used to represent named structure types that do
   not have a body specified.  This corresponds (for example) to the C notion of
   a forward declared structure.</p>

<h5>Syntax:</h5>
<pre>
  %X = type opaque
  %52 = type opaque
</pre>

<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>opaque</tt></td>
    <td class="left">An opaque type.</td>
  </tr>
</table>

</div>



<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_pointer">Pointer Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>The pointer type is used to specify memory locations.
   Pointers are commonly used to reference objects in memory.</p>
   
<p>Pointer types may have an optional address space attribute defining the
   numbered address space where the pointed-to object resides. The default
   address space is number zero. The semantics of non-zero address
   spaces are target-specific.</p>

<p>Note that LLVM does not permit pointers to void (<tt>void*</tt>) nor does it
   permit pointers to labels (<tt>label*</tt>).  Use <tt>i8*</tt> instead.</p>

<h5>Syntax:</h5>
<pre>
  &lt;type&gt; *
</pre>

<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>[4 x i32]*</tt></td>
    <td class="left">A <a href="#t_pointer">pointer</a> to <a
                    href="#t_array">array</a> of four <tt>i32</tt> values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>i32 (i32*) *</tt></td>
    <td class="left"> A <a href="#t_pointer">pointer</a> to a <a
      href="#t_function">function</a> that takes an <tt>i32*</tt>, returning an
      <tt>i32</tt>.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>i32 addrspace(5)*</tt></td>
    <td class="left">A <a href="#t_pointer">pointer</a> to an <tt>i32</tt> value
     that resides in address space #5.</td>
  </tr>
</table>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="t_vector">Vector Type</a>
</h4>

<div>

<h5>Overview:</h5>
<p>A vector type is a simple derived type that represents a vector of elements.
   Vector types are used when multiple primitive data are operated in parallel
   using a single instruction (SIMD).  A vector type requires a size (number of
   elements) and an underlying primitive data type.  Vector types are considered
   <a href="#t_firstclass">first class</a>.</p>

<h5>Syntax:</h5>
<pre>
  &lt; &lt;# elements&gt; x &lt;elementtype&gt; &gt;
</pre>

<p>The number of elements is a constant integer value larger than 0; elementtype
   may be any integer or floating point type.  Vectors of size zero are not
   allowed, and pointers are not allowed as the element type.</p>

<h5>Examples:</h5>
<table class="layout">
  <tr class="layout">
    <td class="left"><tt>&lt;4 x i32&gt;</tt></td>
    <td class="left">Vector of 4 32-bit integer values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>&lt;8 x float&gt;</tt></td>
    <td class="left">Vector of 8 32-bit floating-point values.</td>
  </tr>
  <tr class="layout">
    <td class="left"><tt>&lt;2 x i64&gt;</tt></td>
    <td class="left">Vector of 2 64-bit integer values.</td>
  </tr>
</table>

</div>

</div>

<!-- *********************************************************************** -->
<h2><a name="constants">Constants</a></h2>
<!-- *********************************************************************** -->

<div>

<p>LLVM has several different basic types of constants.  This section describes
   them all and their syntax.</p>

<!-- ======================================================================= -->
<h3>
  <a name="simpleconstants">Simple Constants</a>
</h3>

<div>

<dl>
  <dt><b>Boolean constants</b></dt>
  <dd>The two strings '<tt>true</tt>' and '<tt>false</tt>' are both valid
      constants of the <tt><a href="#t_integer">i1</a></tt> type.</dd>

  <dt><b>Integer constants</b></dt>
  <dd>Standard integers (such as '4') are constants of
      the <a href="#t_integer">integer</a> type.  Negative numbers may be used
      with integer types.</dd>

  <dt><b>Floating point constants</b></dt>
  <dd>Floating point constants use standard decimal notation (e.g. 123.421),
      exponential notation (e.g. 1.23421e+2), or a more precise hexadecimal
      notation (see below).  The assembler requires the exact decimal value of a
      floating-point constant.  For example, the assembler accepts 1.25 but
      rejects 1.3 because 1.3 is a repeating decimal in binary.  Floating point
      constants must have a <a href="#t_floating">floating point</a> type. </dd>

  <dt><b>Null pointer constants</b></dt>
  <dd>The identifier '<tt>null</tt>' is recognized as a null pointer constant
      and must be of <a href="#t_pointer">pointer type</a>.</dd>
</dl>

<p>The one non-intuitive notation for constants is the hexadecimal form of
   floating point constants.  For example, the form '<tt>double
   0x432ff973cafa8000</tt>' is equivalent to (but harder to read than)
   '<tt>double 4.5e+15</tt>'.  The only time hexadecimal floating point
   constants are required (and the only time that they are generated by the
   disassembler) is when a floating point constant must be emitted but it cannot
   be represented as a decimal floating point number in a reasonable number of
   digits.  For example, NaN's, infinities, and other special values are
   represented in their IEEE hexadecimal format so that assembly and disassembly
   do not cause any bits to change in the constants.</p>

<p>When using the hexadecimal form, constants of types float and double are
   represented using the 16-digit form shown above (which matches the IEEE754
   representation for double); float values must, however, be exactly
   representable as IEE754 single precision.  Hexadecimal format is always used
   for long double, and there are three forms of long double.  The 80-bit format
   used by x86 is represented as <tt>0xK</tt> followed by 20 hexadecimal digits.
   The 128-bit format used by PowerPC (two adjacent doubles) is represented
   by <tt>0xM</tt> followed by 32 hexadecimal digits.  The IEEE 128-bit format
   is represented by <tt>0xL</tt> followed by 32 hexadecimal digits; no
   currently supported target uses this format.  Long doubles will only work if
   they match the long double format on your target.  All hexadecimal formats
   are big-endian (sign bit at the left).</p>

<p>There are no constants of type x86mmx.</p>
</div>

<!-- ======================================================================= -->
<h3>
<a name="aggregateconstants"></a> <!-- old anchor -->
<a name="complexconstants">Complex Constants</a>
</h3>

<div>

<p>Complex constants are a (potentially recursive) combination of simple
   constants and smaller complex constants.</p>

<dl>
  <dt><b>Structure constants</b></dt>
  <dd>Structure constants are represented with notation similar to structure
      type definitions (a comma separated list of elements, surrounded by braces
      (<tt>{}</tt>)).  For example: "<tt>{ i32 4, float 17.0, i32* @G }</tt>",
      where "<tt>@G</tt>" is declared as "<tt>@G = external global i32</tt>".
      Structure constants must have <a href="#t_struct">structure type</a>, and
      the number and types of elements must match those specified by the
      type.</dd>

  <dt><b>Array constants</b></dt>
  <dd>Array constants are represented with notation similar to array type
     definitions (a comma separated list of elements, surrounded by square
     brackets (<tt>[]</tt>)).  For example: "<tt>[ i32 42, i32 11, i32 74
     ]</tt>".  Array constants must have <a href="#t_array">array type</a>, and
     the number and types of elements must match those specified by the
     type.</dd>

  <dt><b>Vector constants</b></dt>
  <dd>Vector constants are represented with notation similar to vector type
      definitions (a comma separated list of elements, surrounded by
      less-than/greater-than's (<tt>&lt;&gt;</tt>)).  For example: "<tt>&lt; i32
      42, i32 11, i32 74, i32 100 &gt;</tt>".  Vector constants must
      have <a href="#t_vector">vector type</a>, and the number and types of
      elements must match those specified by the type.</dd>

  <dt><b>Zero initialization</b></dt>
  <dd>The string '<tt>zeroinitializer</tt>' can be used to zero initialize a
      value to zero of <em>any</em> type, including scalar and
      <a href="#t_aggregate">aggregate</a> types.
      This is often used to avoid having to print large zero initializers
      (e.g. for large arrays) and is always exactly equivalent to using explicit
      zero initializers.</dd>

  <dt><b>Metadata node</b></dt>
  <dd>A metadata node is a structure-like constant with
      <a href="#t_metadata">metadata type</a>.  For example: "<tt>metadata !{
      i32 0, metadata !"test" }</tt>".  Unlike other constants that are meant to
      be interpreted as part of the instruction stream, metadata is a place to
      attach additional information such as debug info.</dd>
</dl>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="globalconstants">Global Variable and Function Addresses</a>
</h3>

<div>

<p>The addresses of <a href="#globalvars">global variables</a>
   and <a href="#functionstructure">functions</a> are always implicitly valid
   (link-time) constants.  These constants are explicitly referenced when
   the <a href="#identifiers">identifier for the global</a> is used and always
   have <a href="#t_pointer">pointer</a> type. For example, the following is a
   legal LLVM file:</p>

<pre class="doc_code">
@X = global i32 17
@Y = global i32 42
@Z = global [2 x i32*] [ i32* @X, i32* @Y ]
</pre>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="undefvalues">Undefined Values</a>
</h3>

<div>

<p>The string '<tt>undef</tt>' can be used anywhere a constant is expected, and
   indicates that the user of the value may receive an unspecified bit-pattern.
   Undefined values may be of any type (other than '<tt>label</tt>'
   or '<tt>void</tt>') and be used anywhere a constant is permitted.</p>

<p>Undefined values are useful because they indicate to the compiler that the
   program is well defined no matter what value is used.  This gives the
   compiler more freedom to optimize.  Here are some examples of (potentially
   surprising) transformations that are valid (in pseudo IR):</p>


<pre class="doc_code">
  %A = add %X, undef
  %B = sub %X, undef
  %C = xor %X, undef
Safe:
  %A = undef
  %B = undef
  %C = undef
</pre>

<p>This is safe because all of the output bits are affected by the undef bits.
   Any output bit can have a zero or one depending on the input bits.</p>

<pre class="doc_code">
  %A = or %X, undef
  %B = and %X, undef
Safe:
  %A = -1
  %B = 0
Unsafe:
  %A = undef
  %B = undef
</pre>

<p>These logical operations have bits that are not always affected by the input.
   For example, if <tt>%X</tt> has a zero bit, then the output of the
   '<tt>and</tt>' operation will always be a zero for that bit, no matter what
   the corresponding bit from the '<tt>undef</tt>' is. As such, it is unsafe to
   optimize or assume that the result of the '<tt>and</tt>' is '<tt>undef</tt>'.
   However, it is safe to assume that all bits of the '<tt>undef</tt>' could be
   0, and optimize the '<tt>and</tt>' to 0. Likewise, it is safe to assume that
   all the bits of the '<tt>undef</tt>' operand to the '<tt>or</tt>' could be
   set, allowing the '<tt>or</tt>' to be folded to -1.</p>

<pre class="doc_code">
  %A = select undef, %X, %Y
  %B = select undef, 42, %Y
  %C = select %X, %Y, undef
Safe:
  %A = %X     (or %Y)
  %B = 42     (or %Y)
  %C = %Y
Unsafe:
  %A = undef
  %B = undef
  %C = undef
</pre>

<p>This set of examples shows that undefined '<tt>select</tt>' (and conditional
   branch) conditions can go <em>either way</em>, but they have to come from one
   of the two operands.  In the <tt>%A</tt> example, if <tt>%X</tt> and
   <tt>%Y</tt> were both known to have a clear low bit, then <tt>%A</tt> would
   have to have a cleared low bit. However, in the <tt>%C</tt> example, the
   optimizer is allowed to assume that the '<tt>undef</tt>' operand could be the
   same as <tt>%Y</tt>, allowing the whole '<tt>select</tt>' to be
   eliminated.</p>

<pre class="doc_code">
  %A = xor undef, undef

  %B = undef
  %C = xor %B, %B

  %D = undef
  %E = icmp lt %D, 4
  %F = icmp gte %D, 4

Safe:
  %A = undef
  %B = undef
  %C = undef
  %D = undef
  %E = undef
  %F = undef
</pre>

<p>This example points out that two '<tt>undef</tt>' operands are not
   necessarily the same. This can be surprising to people (and also matches C
   semantics) where they assume that "<tt>X^X</tt>" is always zero, even
   if <tt>X</tt> is undefined. This isn't true for a number of reasons, but the
   short answer is that an '<tt>undef</tt>' "variable" can arbitrarily change
   its value over its "live range".  This is true because the variable doesn't
   actually <em>have a live range</em>. Instead, the value is logically read
   from arbitrary registers that happen to be around when needed, so the value
   is not necessarily consistent over time. In fact, <tt>%A</tt> and <tt>%C</tt>
   need to have the same semantics or the core LLVM "replace all uses with"
   concept would not hold.</p>

<pre class="doc_code">
  %A = fdiv undef, %X
  %B = fdiv %X, undef
Safe:
  %A = undef
b: unreachable
</pre>

<p>These examples show the crucial difference between an <em>undefined
  value</em> and <em>undefined behavior</em>. An undefined value (like
  '<tt>undef</tt>') is allowed to have an arbitrary bit-pattern. This means that
  the <tt>%A</tt> operation can be constant folded to '<tt>undef</tt>', because
  the '<tt>undef</tt>' could be an SNaN, and <tt>fdiv</tt> is not (currently)
  defined on SNaN's. However, in the second example, we can make a more
  aggressive assumption: because the <tt>undef</tt> is allowed to be an
  arbitrary value, we are allowed to assume that it could be zero. Since a
  divide by zero has <em>undefined behavior</em>, we are allowed to assume that
  the operation does not execute at all. This allows us to delete the divide and
  all code after it. Because the undefined operation "can't happen", the
  optimizer can assume that it occurs in dead code.</p>

<pre class="doc_code">
a:  store undef -> %X
b:  store %X -> undef
Safe:
a: &lt;deleted&gt;
b: unreachable
</pre>

<p>These examples reiterate the <tt>fdiv</tt> example: a store <em>of</em> an
   undefined value can be assumed to not have any effect; we can assume that the
   value is overwritten with bits that happen to match what was already there.
   However, a store <em>to</em> an undefined location could clobber arbitrary
   memory, therefore, it has undefined behavior.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="trapvalues">Trap Values</a>
</h3>

<div>

<p>Trap values are similar to <a href="#undefvalues">undef values</a>, however
   instead of representing an unspecified bit pattern, they represent the
   fact that an instruction or constant expression which cannot evoke side
   effects has nevertheless detected a condition which results in undefined
   behavior.</p>

<p>There is currently no way of representing a trap value in the IR; they
   only exist when produced by operations such as
   <a href="#i_add"><tt>add</tt></a> with the <tt>nsw</tt> flag.</p>

<p>Trap value behavior is defined in terms of value <i>dependence</i>:</p>

<ul>
<li>Values other than <a href="#i_phi"><tt>phi</tt></a> nodes depend on
    their operands.</li>

<li><a href="#i_phi"><tt>Phi</tt></a> nodes depend on the operand corresponding
    to their dynamic predecessor basic block.</li>

<li>Function arguments depend on the corresponding actual argument values in
    the dynamic callers of their functions.</li>

<li><a href="#i_call"><tt>Call</tt></a> instructions depend on the
    <a href="#i_ret"><tt>ret</tt></a> instructions that dynamically transfer
    control back to them.</li>

<li><a href="#i_invoke"><tt>Invoke</tt></a> instructions depend on the
    <a href="#i_ret"><tt>ret</tt></a>, <a href="#i_unwind"><tt>unwind</tt></a>,
    or exception-throwing call instructions that dynamically transfer control
    back to them.</li>

<li>Non-volatile loads and stores depend on the most recent stores to all of the
    referenced memory addresses, following the order in the IR
    (including loads and stores implied by intrinsics such as
    <a href="#int_memcpy"><tt>@llvm.memcpy</tt></a>.)</li>

<!-- TODO: In the case of multiple threads, this only applies if the store
     "happens-before" the load or store. -->

<!-- TODO: floating-point exception state -->

<li>An instruction with externally visible side effects depends on the most
    recent preceding instruction with externally visible side effects, following
    the order in the IR. (This includes
    <a href="#volatile">volatile operations</a>.)</li>

<li>An instruction <i>control-depends</i> on a
    <a href="#terminators">terminator instruction</a>
    if the terminator instruction has multiple successors and the instruction
    is always executed when control transfers to one of the successors, and
    may not be executed when control is transferred to another.</li>

<li>Additionally, an instruction also <i>control-depends</i> on a terminator
    instruction if the set of instructions it otherwise depends on would be
    different if the terminator had transferred control to a different
    successor.</li>

<li>Dependence is transitive.</li>

</ul>

<p>Whenever a trap value is generated, all values which depend on it evaluate
   to trap. If they have side effects, they evoke their side effects as if each
   operand with a trap value were undef. If they have externally-visible side
   effects, the behavior is undefined.</p>

<p>Here are some examples:</p>

<pre class="doc_code">
entry:
  %trap = sub nuw i32 0, 1           ; Results in a trap value.
  %still_trap = and i32 %trap, 0     ; Whereas (and i32 undef, 0) would return 0.
  %trap_yet_again = getelementptr i32* @h, i32 %still_trap
  store i32 0, i32* %trap_yet_again  ; undefined behavior

  store i32 %trap, i32* @g           ; Trap value conceptually stored to memory.
  %trap2 = load i32* @g              ; Returns a trap value, not just undef.

  volatile store i32 %trap, i32* @g  ; External observation; undefined behavior.

  %narrowaddr = bitcast i32* @g to i16*
  %wideaddr = bitcast i32* @g to i64*
  %trap3 = load i16* %narrowaddr     ; Returns a trap value.
  %trap4 = load i64* %wideaddr       ; Returns a trap value.

  %cmp = icmp slt i32 %trap, 0       ; Returns a trap value.
  br i1 %cmp, label %true, label %end ; Branch to either destination.

true:
  volatile store i32 0, i32* @g      ; This is control-dependent on %cmp, so
                                     ; it has undefined behavior.
  br label %end

end:
  %p = phi i32 [ 0, %entry ], [ 1, %true ]
                                     ; Both edges into this PHI are
                                     ; control-dependent on %cmp, so this
                                     ; always results in a trap value.

  volatile store i32 0, i32* @g      ; This would depend on the store in %true
                                     ; if %cmp is true, or the store in %entry
                                     ; otherwise, so this is undefined behavior.

  br i1 %cmp, label %second_true, label %second_end
                                     ; The same branch again, but this time the
                                     ; true block doesn't have side effects.

second_true:
  ; No side effects!
  ret void

second_end:
  volatile store i32 0, i32* @g      ; This time, the instruction always depends
                                     ; on the store in %end. Also, it is
                                     ; control-equivalent to %end, so this is
                                     ; well-defined (again, ignoring earlier
                                     ; undefined behavior in this example).
</pre>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="blockaddress">Addresses of Basic Blocks</a>
</h3>

<div>

<p><b><tt>blockaddress(@function, %block)</tt></b></p>

<p>The '<tt>blockaddress</tt>' constant computes the address of the specified
   basic block in the specified function, and always has an i8* type.  Taking
   the address of the entry block is illegal.</p>

<p>This value only has defined behavior when used as an operand to the
   '<a href="#i_indirectbr"><tt>indirectbr</tt></a>' instruction, or for
   comparisons against null. Pointer equality tests between labels addresses
   results in undefined behavior &mdash; though, again, comparison against null
   is ok, and no label is equal to the null pointer. This may be passed around
   as an opaque pointer sized value as long as the bits are not inspected. This
   allows <tt>ptrtoint</tt> and arithmetic to be performed on these values so
   long as the original value is reconstituted before the <tt>indirectbr</tt>
   instruction.</p>

<p>Finally, some targets may provide defined semantics when using the value as
   the operand to an inline assembly, but that is target specific.</p>

</div>


<!-- ======================================================================= -->
<h3>
  <a name="constantexprs">Constant Expressions</a>
</h3>

<div>

<p>Constant expressions are used to allow expressions involving other constants
   to be used as constants.  Constant expressions may be of
   any <a href="#t_firstclass">first class</a> type and may involve any LLVM
   operation that does not have side effects (e.g. load and call are not
   supported). The following is the syntax for constant expressions:</p>

<dl>
  <dt><b><tt>trunc (CST to TYPE)</tt></b></dt>
  <dd>Truncate a constant to another type. The bit size of CST must be larger
      than the bit size of TYPE. Both types must be integers.</dd>

  <dt><b><tt>zext (CST to TYPE)</tt></b></dt>
  <dd>Zero extend a constant to another type. The bit size of CST must be
      smaller than the bit size of TYPE.  Both types must be integers.</dd>

  <dt><b><tt>sext (CST to TYPE)</tt></b></dt>
  <dd>Sign extend a constant to another type. The bit size of CST must be
      smaller than the bit size of TYPE.  Both types must be integers.</dd>

  <dt><b><tt>fptrunc (CST to TYPE)</tt></b></dt>
  <dd>Truncate a floating point constant to another floating point type. The
      size of CST must be larger than the size of TYPE. Both types must be
      floating point.</dd>

  <dt><b><tt>fpext (CST to TYPE)</tt></b></dt>
  <dd>Floating point extend a constant to another type. The size of CST must be
      smaller or equal to the size of TYPE. Both types must be floating
      point.</dd>

  <dt><b><tt>fptoui (CST to TYPE)</tt></b></dt>
  <dd>Convert a floating point constant to the corresponding unsigned integer
      constant. TYPE must be a scalar or vector integer type. CST must be of
      scalar or vector floating point type. Both CST and TYPE must be scalars,
      or vectors of the same number of elements. If the value won't fit in the
      integer type, the results are undefined.</dd>

  <dt><b><tt>fptosi (CST to TYPE)</tt></b></dt>
  <dd>Convert a floating point constant to the corresponding signed integer
      constant.  TYPE must be a scalar or vector integer type. CST must be of
      scalar or vector floating point type. Both CST and TYPE must be scalars,
      or vectors of the same number of elements. If the value won't fit in the
      integer type, the results are undefined.</dd>

  <dt><b><tt>uitofp (CST to TYPE)</tt></b></dt>
  <dd>Convert an unsigned integer constant to the corresponding floating point
      constant. TYPE must be a scalar or vector floating point type. CST must be
      of scalar or vector integer type. Both CST and TYPE must be scalars, or
      vectors of the same number of elements. If the value won't fit in the
      floating point type, the results are undefined.</dd>

  <dt><b><tt>sitofp (CST to TYPE)</tt></b></dt>
  <dd>Convert a signed integer constant to the corresponding floating point
      constant. TYPE must be a scalar or vector floating point type. CST must be
      of scalar or vector integer type. Both CST and TYPE must be scalars, or
      vectors of the same number of elements. If the value won't fit in the
      floating point type, the results are undefined.</dd>

  <dt><b><tt>ptrtoint (CST to TYPE)</tt></b></dt>
  <dd>Convert a pointer typed constant to the corresponding integer constant
      <tt>TYPE</tt> must be an integer type. <tt>CST</tt> must be of pointer
      type. The <tt>CST</tt> value is zero extended, truncated, or unchanged to
      make it fit in <tt>TYPE</tt>.</dd>

  <dt><b><tt>inttoptr (CST to TYPE)</tt></b></dt>
  <dd>Convert a integer constant to a pointer constant.  TYPE must be a pointer
      type.  CST must be of integer type. The CST value is zero extended,
      truncated, or unchanged to make it fit in a pointer size. This one is
      <i>really</i> dangerous!</dd>

  <dt><b><tt>bitcast (CST to TYPE)</tt></b></dt>
  <dd>Convert a constant, CST, to another TYPE. The constraints of the operands
      are the same as those for the <a href="#i_bitcast">bitcast
      instruction</a>.</dd>

  <dt><b><tt>getelementptr (CSTPTR, IDX0, IDX1, ...)</tt></b></dt>
  <dt><b><tt>getelementptr inbounds (CSTPTR, IDX0, IDX1, ...)</tt></b></dt>
  <dd>Perform the <a href="#i_getelementptr">getelementptr operation</a> on
      constants.  As with the <a href="#i_getelementptr">getelementptr</a>
      instruction, the index list may have zero or more indexes, which are
      required to make sense for the type of "CSTPTR".</dd>

  <dt><b><tt>select (COND, VAL1, VAL2)</tt></b></dt>
  <dd>Perform the <a href="#i_select">select operation</a> on constants.</dd>

  <dt><b><tt>icmp COND (VAL1, VAL2)</tt></b></dt>
  <dd>Performs the <a href="#i_icmp">icmp operation</a> on constants.</dd>

  <dt><b><tt>fcmp COND (VAL1, VAL2)</tt></b></dt>
  <dd>Performs the <a href="#i_fcmp">fcmp operation</a> on constants.</dd>

  <dt><b><tt>extractelement (VAL, IDX)</tt></b></dt>
  <dd>Perform the <a href="#i_extractelement">extractelement operation</a> on
      constants.</dd>

  <dt><b><tt>insertelement (VAL, ELT, IDX)</tt></b></dt>
  <dd>Perform the <a href="#i_insertelement">insertelement operation</a> on
    constants.</dd>

  <dt><b><tt>shufflevector (VEC1, VEC2, IDXMASK)</tt></b></dt>
  <dd>Perform the <a href="#i_shufflevector">shufflevector operation</a> on
      constants.</dd>

  <dt><b><tt>extractvalue (VAL, IDX0, IDX1, ...)</tt></b></dt>
  <dd>Perform the <a href="#i_extractvalue">extractvalue operation</a> on
    constants. The index list is interpreted in a similar manner as indices in
    a '<a href="#i_getelementptr">getelementptr</a>' operation. At least one
    index value must be specified.</dd>

  <dt><b><tt>insertvalue (VAL, ELT, IDX0, IDX1, ...)</tt></b></dt>
  <dd>Perform the <a href="#i_insertvalue">insertvalue operation</a> on
    constants. The index list is interpreted in a similar manner as indices in
    a '<a href="#i_getelementptr">getelementptr</a>' operation. At least one
    index value must be specified.</dd>

  <dt><b><tt>OPCODE (LHS, RHS)</tt></b></dt>
  <dd>Perform the specified operation of the LHS and RHS constants. OPCODE may
      be any of the <a href="#binaryops">binary</a>
      or <a href="#bitwiseops">bitwise binary</a> operations.  The constraints
      on operands are the same as those for the corresponding instruction
      (e.g. no bitwise operations on floating point values are allowed).</dd>
</dl>

</div>

</div>

<!-- *********************************************************************** -->
<h2><a name="othervalues">Other Values</a></h2>
<!-- *********************************************************************** -->
<div>
<!-- ======================================================================= -->
<h3>
<a name="inlineasm">Inline Assembler Expressions</a>
</h3>

<div>

<p>LLVM supports inline assembler expressions (as opposed
   to <a href="#moduleasm"> Module-Level Inline Assembly</a>) through the use of
   a special value.  This value represents the inline assembler as a string
   (containing the instructions to emit), a list of operand constraints (stored
   as a string), a flag that indicates whether or not the inline asm
   expression has side effects, and a flag indicating whether the function
   containing the asm needs to align its stack conservatively.  An example
   inline assembler expression is:</p>

<pre class="doc_code">
i32 (i32) asm "bswap $0", "=r,r"
</pre>

<p>Inline assembler expressions may <b>only</b> be used as the callee operand of
   a <a href="#i_call"><tt>call</tt> instruction</a>.  Thus, typically we
   have:</p>

<pre class="doc_code">
%X = call i32 asm "<a href="#int_bswap">bswap</a> $0", "=r,r"(i32 %Y)
</pre>

<p>Inline asms with side effects not visible in the constraint list must be
   marked as having side effects.  This is done through the use of the
   '<tt>sideeffect</tt>' keyword, like so:</p>

<pre class="doc_code">
call void asm sideeffect "eieio", ""()
</pre>

<p>In some cases inline asms will contain code that will not work unless the
   stack is aligned in some way, such as calls or SSE instructions on x86,
   yet will not contain code that does that alignment within the asm.
   The compiler should make conservative assumptions about what the asm might
   contain and should generate its usual stack alignment code in the prologue
   if the '<tt>alignstack</tt>' keyword is present:</p>

<pre class="doc_code">
call void asm alignstack "eieio", ""()
</pre>

<p>If both keywords appear the '<tt>sideeffect</tt>' keyword must come
   first.</p>

<p>TODO: The format of the asm and constraints string still need to be
   documented here.  Constraints on what can be done (e.g. duplication, moving,
   etc need to be documented).  This is probably best done by reference to
   another document that covers inline asm from a holistic perspective.</p>

<h4>
<a name="inlineasm_md">Inline Asm Metadata</a>
</h4>

<div>

<p>The call instructions that wrap inline asm nodes may have a "!srcloc" MDNode
   attached to it that contains a list of constant integers.  If present, the
  code generator will use the integer as the location cookie value when report
   errors through the LLVMContext error reporting mechanisms.  This allows a
   front-end to correlate backend errors that occur with inline asm back to the
   source code that produced it.  For example:</p>

<pre class="doc_code">
call void asm sideeffect "something bad", ""()<b>, !srcloc !42</b>
...
!42 = !{ i32 1234567 }
</pre>

<p>It is up to the front-end to make sense of the magic numbers it places in the
   IR.  If the MDNode contains multiple constants, the code generator will use
   the one that corresponds to the line of the asm that the error occurs on.</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="metadata">Metadata Nodes and Metadata Strings</a>
</h3>

<div>

<p>LLVM IR allows metadata to be attached to instructions in the program that
   can convey extra information about the code to the optimizers and code
   generator.  One example application of metadata is source-level debug
   information.  There are two metadata primitives: strings and nodes. All
   metadata has the <tt>metadata</tt> type and is identified in syntax by a
   preceding exclamation point ('<tt>!</tt>').</p>

<p>A metadata string is a string surrounded by double quotes.  It can contain
   any character by escaping non-printable characters with "\xx" where "xx" is
   the two digit hex code.  For example: "<tt>!"test\00"</tt>".</p>

<p>Metadata nodes are represented with notation similar to structure constants
   (a comma separated list of elements, surrounded by braces and preceded by an
   exclamation point).  For example: "<tt>!{ metadata !"test\00", i32
   10}</tt>".  Metadata nodes can have any values as their operand.</p>

<p>A <a href="#namedmetadatastructure">named metadata</a> is a collection of 
   metadata nodes, which can be looked up in the module symbol table. For
   example: "<tt>!foo =  metadata !{!4, !3}</tt>".

<p>Metadata can be used as function arguments. Here <tt>llvm.dbg.value</tt> 
   function is using two metadata arguments.</p>

<div class="doc_code">
<pre>
call void @llvm.dbg.value(metadata !24, i64 0, metadata !25)
</pre>
</div>

<p>Metadata can be attached with an instruction. Here metadata <tt>!21</tt> is
   attached with <tt>add</tt> instruction using <tt>!dbg</tt> identifier.</p>

<div class="doc_code">
<pre>
%indvar.next = add i64 %indvar, 1, !dbg !21
</pre>
</div>

</div>

</div>

<!-- *********************************************************************** -->
<h2>
  <a name="intrinsic_globals">Intrinsic Global Variables</a>
</h2>
<!-- *********************************************************************** -->
<div>
<p>LLVM has a number of "magic" global variables that contain data that affect
code generation or other IR semantics.  These are documented here.  All globals
of this sort should have a section specified as "<tt>llvm.metadata</tt>".  This
section and all globals that start with "<tt>llvm.</tt>" are reserved for use
by LLVM.</p>

<!-- ======================================================================= -->
<h3>
<a name="intg_used">The '<tt>llvm.used</tt>' Global Variable</a>
</h3>

<div>

<p>The <tt>@llvm.used</tt> global is an array with i8* element type which has <a
href="#linkage_appending">appending linkage</a>.  This array contains a list of
pointers to global variables and functions which may optionally have a pointer
cast formed of bitcast or getelementptr.  For example, a legal use of it is:</p>

<pre>
  @X = global i8 4
  @Y = global i32 123

  @llvm.used = appending global [2 x i8*] [
     i8* @X,
     i8* bitcast (i32* @Y to i8*)
  ], section "llvm.metadata"
</pre>

<p>If a global variable appears in the <tt>@llvm.used</tt> list, then the
compiler, assembler, and linker are required to treat the symbol as if there is
a reference to the global that it cannot see.  For example, if a variable has
internal linkage and no references other than that from the <tt>@llvm.used</tt>
list, it cannot be deleted.  This is commonly used to represent references from
inline asms and other things the compiler cannot "see", and corresponds to
"attribute((used))" in GNU C.</p>

<p>On some targets, the code generator must emit a directive to the assembler or
object file to prevent the assembler and linker from molesting the symbol.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="intg_compiler_used">
    The '<tt>llvm.compiler.used</tt>' Global Variable
  </a>
</h3>

<div>

<p>The <tt>@llvm.compiler.used</tt> directive is the same as the
<tt>@llvm.used</tt> directive, except that it only prevents the compiler from
touching the symbol.  On targets that support it, this allows an intelligent
linker to optimize references to the symbol without being impeded as it would be
by <tt>@llvm.used</tt>.</p>

<p>This is a rare construct that should only be used in rare circumstances, and
should not be exposed to source languages.</p>

</div>

<!-- ======================================================================= -->
<h3>
<a name="intg_global_ctors">The '<tt>llvm.global_ctors</tt>' Global Variable</a>
</h3>

<div>
<pre>
%0 = type { i32, void ()* }
@llvm.global_ctors = appending global [1 x %0] [%0 { i32 65535, void ()* @ctor }]
</pre>
<p>The <tt>@llvm.global_ctors</tt> array contains a list of constructor functions and associated priorities.  The functions referenced by this array will be called in ascending order of priority (i.e. lowest first) when the module is loaded.  The order of functions with the same priority is not defined.
</p>

</div>

<!-- ======================================================================= -->
<h3>
<a name="intg_global_dtors">The '<tt>llvm.global_dtors</tt>' Global Variable</a>
</h3>

<div>
<pre>
%0 = type { i32, void ()* }
@llvm.global_dtors = appending global [1 x %0] [%0 { i32 65535, void ()* @dtor }]
</pre>

<p>The <tt>@llvm.global_dtors</tt> array contains a list of destructor functions and associated priorities.  The functions referenced by this array will be called in descending order of priority (i.e. highest first) when the module is loaded.  The order of functions with the same priority is not defined.
</p>

</div>

</div>

<!-- *********************************************************************** -->
<h2><a name="instref">Instruction Reference</a></h2>
<!-- *********************************************************************** -->

<div>

<p>The LLVM instruction set consists of several different classifications of
   instructions: <a href="#terminators">terminator
   instructions</a>, <a href="#binaryops">binary instructions</a>,
   <a href="#bitwiseops">bitwise binary instructions</a>,
   <a href="#memoryops">memory instructions</a>, and
   <a href="#otherops">other instructions</a>.</p>

<!-- ======================================================================= -->
<h3>
  <a name="terminators">Terminator Instructions</a>
</h3>

<div>

<p>As mentioned <a href="#functionstructure">previously</a>, every basic block
   in a program ends with a "Terminator" instruction, which indicates which
   block should be executed after the current block is finished. These
   terminator instructions typically yield a '<tt>void</tt>' value: they produce
   control flow, not values (the one exception being the
   '<a href="#i_invoke"><tt>invoke</tt></a>' instruction).</p>

<p>The terminator instructions are: 
   '<a href="#i_ret"><tt>ret</tt></a>', 
   '<a href="#i_br"><tt>br</tt></a>',
   '<a href="#i_switch"><tt>switch</tt></a>', 
   '<a href="#i_indirectbr"><tt>indirectbr</tt></a>',
   '<a href="#i_invoke"><tt>invoke</tt></a>', 
   '<a href="#i_unwind"><tt>unwind</tt></a>',
   '<a href="#i_resume"><tt>resume</tt></a>', and 
   '<a href="#i_unreachable"><tt>unreachable</tt></a>'.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_ret">'<tt>ret</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  ret &lt;type&gt; &lt;value&gt;       <i>; Return a value from a non-void function</i>
  ret void                 <i>; Return from void function</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>ret</tt>' instruction is used to return control flow (and optionally
   a value) from a function back to the caller.</p>

<p>There are two forms of the '<tt>ret</tt>' instruction: one that returns a
   value and then causes control flow, and one that just causes control flow to
   occur.</p>

<h5>Arguments:</h5>
<p>The '<tt>ret</tt>' instruction optionally accepts a single argument, the
   return value. The type of the return value must be a
   '<a href="#t_firstclass">first class</a>' type.</p>

<p>A function is not <a href="#wellformed">well formed</a> if it it has a
   non-void return type and contains a '<tt>ret</tt>' instruction with no return
   value or a return value with a type that does not match its type, or if it
   has a void return type and contains a '<tt>ret</tt>' instruction with a
   return value.</p>

<h5>Semantics:</h5>
<p>When the '<tt>ret</tt>' instruction is executed, control flow returns back to
   the calling function's context.  If the caller is a
   "<a href="#i_call"><tt>call</tt></a>" instruction, execution continues at the
   instruction after the call.  If the caller was an
   "<a href="#i_invoke"><tt>invoke</tt></a>" instruction, execution continues at
   the beginning of the "normal" destination block.  If the instruction returns
   a value, that value shall set the call or invoke instruction's return
   value.</p>

<h5>Example:</h5>
<pre>
  ret i32 5                       <i>; Return an integer value of 5</i>
  ret void                        <i>; Return from a void function</i>
  ret { i32, i8 } { i32 4, i8 2 } <i>; Return a struct of values 4 and 2</i>
</pre>

</div>
<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_br">'<tt>br</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  br i1 &lt;cond&gt;, label &lt;iftrue&gt;, label &lt;iffalse&gt;
  br label &lt;dest&gt;          <i>; Unconditional branch</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>br</tt>' instruction is used to cause control flow to transfer to a
   different basic block in the current function.  There are two forms of this
   instruction, corresponding to a conditional branch and an unconditional
   branch.</p>

<h5>Arguments:</h5>
<p>The conditional branch form of the '<tt>br</tt>' instruction takes a single
   '<tt>i1</tt>' value and two '<tt>label</tt>' values.  The unconditional form
   of the '<tt>br</tt>' instruction takes a single '<tt>label</tt>' value as a
   target.</p>

<h5>Semantics:</h5>
<p>Upon execution of a conditional '<tt>br</tt>' instruction, the '<tt>i1</tt>'
   argument is evaluated.  If the value is <tt>true</tt>, control flows to the
   '<tt>iftrue</tt>' <tt>label</tt> argument.  If "cond" is <tt>false</tt>,
   control flows to the '<tt>iffalse</tt>' <tt>label</tt> argument.</p>

<h5>Example:</h5>
<pre>
Test:
  %cond = <a href="#i_icmp">icmp</a> eq i32 %a, %b
  br i1 %cond, label %IfEqual, label %IfUnequal
IfEqual:
  <a href="#i_ret">ret</a> i32 1
IfUnequal:
  <a href="#i_ret">ret</a> i32 0
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_switch">'<tt>switch</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  switch &lt;intty&gt; &lt;value&gt;, label &lt;defaultdest&gt; [ &lt;intty&gt; &lt;val&gt;, label &lt;dest&gt; ... ]
</pre>

<h5>Overview:</h5>
<p>The '<tt>switch</tt>' instruction is used to transfer control flow to one of
   several different places.  It is a generalization of the '<tt>br</tt>'
   instruction, allowing a branch to occur to one of many possible
   destinations.</p>

<h5>Arguments:</h5>
<p>The '<tt>switch</tt>' instruction uses three parameters: an integer
   comparison value '<tt>value</tt>', a default '<tt>label</tt>' destination,
   and an array of pairs of comparison value constants and '<tt>label</tt>'s.
   The table is not allowed to contain duplicate constant entries.</p>

<h5>Semantics:</h5>
<p>The <tt>switch</tt> instruction specifies a table of values and
   destinations. When the '<tt>switch</tt>' instruction is executed, this table
   is searched for the given value.  If the value is found, control flow is
   transferred to the corresponding destination; otherwise, control flow is
   transferred to the default destination.</p>

<h5>Implementation:</h5>
<p>Depending on properties of the target machine and the particular
   <tt>switch</tt> instruction, this instruction may be code generated in
   different ways.  For example, it could be generated as a series of chained
   conditional branches or with a lookup table.</p>

<h5>Example:</h5>
<pre>
 <i>; Emulate a conditional br instruction</i>
 %Val = <a href="#i_zext">zext</a> i1 %value to i32
 switch i32 %Val, label %truedest [ i32 0, label %falsedest ]

 <i>; Emulate an unconditional br instruction</i>
 switch i32 0, label %dest [ ]

 <i>; Implement a jump table:</i>
 switch i32 %val, label %otherwise [ i32 0, label %onzero
                                     i32 1, label %onone
                                     i32 2, label %ontwo ]
</pre>

</div>


<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_indirectbr">'<tt>indirectbr</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  indirectbr &lt;somety&gt;* &lt;address&gt;, [ label &lt;dest1&gt;, label &lt;dest2&gt;, ... ]
</pre>

<h5>Overview:</h5>

<p>The '<tt>indirectbr</tt>' instruction implements an indirect branch to a label
   within the current function, whose address is specified by
   "<tt>address</tt>".  Address must be derived from a <a
   href="#blockaddress">blockaddress</a> constant.</p>

<h5>Arguments:</h5>

<p>The '<tt>address</tt>' argument is the address of the label to jump to.  The
   rest of the arguments indicate the full set of possible destinations that the
   address may point to.  Blocks are allowed to occur multiple times in the
   destination list, though this isn't particularly useful.</p>

<p>This destination list is required so that dataflow analysis has an accurate
   understanding of the CFG.</p>

<h5>Semantics:</h5>

<p>Control transfers to the block specified in the address argument.  All
   possible destination blocks must be listed in the label list, otherwise this
   instruction has undefined behavior.  This implies that jumps to labels
   defined in other functions have undefined behavior as well.</p>

<h5>Implementation:</h5>

<p>This is typically implemented with a jump through a register.</p>

<h5>Example:</h5>
<pre>
 indirectbr i8* %Addr, [ label %bb1, label %bb2, label %bb3 ]
</pre>

</div>


<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_invoke">'<tt>invoke</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = invoke [<a href="#callingconv">cconv</a>] [<a href="#paramattrs">ret attrs</a>] &lt;ptr to function ty&gt; &lt;function ptr val&gt;(&lt;function args&gt;) [<a href="#fnattrs">fn attrs</a>]
                to label &lt;normal label&gt; unwind label &lt;exception label&gt;
</pre>

<h5>Overview:</h5>
<p>The '<tt>invoke</tt>' instruction causes control to transfer to a specified
   function, with the possibility of control flow transfer to either the
   '<tt>normal</tt>' label or the '<tt>exception</tt>' label.  If the callee
   function returns with the "<tt><a href="#i_ret">ret</a></tt>" instruction,
   control flow will return to the "normal" label.  If the callee (or any
   indirect callees) returns with the "<a href="#i_unwind"><tt>unwind</tt></a>"
   instruction, control is interrupted and continued at the dynamically nearest
   "exception" label.</p>

<p>The '<tt>exception</tt>' label is a
   <i><a href="ExceptionHandling.html#overview">landing pad</a></i> for the
   exception. As such, '<tt>exception</tt>' label is required to have the
   "<a href="#i_landingpad"><tt>landingpad</tt></a>" instruction, which contains
   the information about about the behavior of the program after unwinding
   happens, as its first non-PHI instruction. The restrictions on the
   "<tt>landingpad</tt>" instruction's tightly couples it to the
   "<tt>invoke</tt>" instruction, so that the important information contained
   within the "<tt>landingpad</tt>" instruction can't be lost through normal
   code motion.</p>

<h5>Arguments:</h5>
<p>This instruction requires several arguments:</p>

<ol>
  <li>The optional "cconv" marker indicates which <a href="#callingconv">calling
      convention</a> the call should use.  If none is specified, the call
      defaults to using C calling conventions.</li>

  <li>The optional <a href="#paramattrs">Parameter Attributes</a> list for
      return values. Only '<tt>zeroext</tt>', '<tt>signext</tt>', and
      '<tt>inreg</tt>' attributes are valid here.</li>

  <li>'<tt>ptr to function ty</tt>': shall be the signature of the pointer to
      function value being invoked.  In most cases, this is a direct function
      invocation, but indirect <tt>invoke</tt>s are just as possible, branching
      off an arbitrary pointer to function value.</li>

  <li>'<tt>function ptr val</tt>': An LLVM value containing a pointer to a
      function to be invoked. </li>

  <li>'<tt>function args</tt>': argument list whose types match the function
      signature argument types and parameter attributes. All arguments must be
      of <a href="#t_firstclass">first class</a> type. If the function
      signature indicates the function accepts a variable number of arguments,
      the extra arguments can be specified.</li>

  <li>'<tt>normal label</tt>': the label reached when the called function
      executes a '<tt><a href="#i_ret">ret</a></tt>' instruction. </li>

  <li>'<tt>exception label</tt>': the label reached when a callee returns with
      the <a href="#i_unwind"><tt>unwind</tt></a> instruction. </li>

  <li>The optional <a href="#fnattrs">function attributes</a> list. Only
      '<tt>noreturn</tt>', '<tt>nounwind</tt>', '<tt>readonly</tt>' and
      '<tt>readnone</tt>' attributes are valid here.</li>
</ol>

<h5>Semantics:</h5>
<p>This instruction is designed to operate as a standard
   '<tt><a href="#i_call">call</a></tt>' instruction in most regards.  The
   primary difference is that it establishes an association with a label, which
   is used by the runtime library to unwind the stack.</p>

<p>This instruction is used in languages with destructors to ensure that proper
   cleanup is performed in the case of either a <tt>longjmp</tt> or a thrown
   exception.  Additionally, this is important for implementation of
   '<tt>catch</tt>' clauses in high-level languages that support them.</p>

<p>For the purposes of the SSA form, the definition of the value returned by the
   '<tt>invoke</tt>' instruction is deemed to occur on the edge from the current
   block to the "normal" label. If the callee unwinds then no return value is
   available.</p>

<p>Note that the code generator does not yet completely support unwind, and
that the invoke/unwind semantics are likely to change in future versions.</p>

<h5>Example:</h5>
<pre>
  %retval = invoke i32 @Test(i32 15) to label %Continue
              unwind label %TestCleanup              <i>; {i32}:retval set</i>
  %retval = invoke <a href="#callingconv">coldcc</a> i32 %Testfnptr(i32 15) to label %Continue
              unwind label %TestCleanup              <i>; {i32}:retval set</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->

<h4>
  <a name="i_unwind">'<tt>unwind</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  unwind
</pre>

<h5>Overview:</h5>
<p>The '<tt>unwind</tt>' instruction unwinds the stack, continuing control flow
   at the first callee in the dynamic call stack which used
   an <a href="#i_invoke"><tt>invoke</tt></a> instruction to perform the call.
   This is primarily used to implement exception handling.</p>

<h5>Semantics:</h5>
<p>The '<tt>unwind</tt>' instruction causes execution of the current function to
   immediately halt.  The dynamic call stack is then searched for the
   first <a href="#i_invoke"><tt>invoke</tt></a> instruction on the call stack.
   Once found, execution continues at the "exceptional" destination block
   specified by the <tt>invoke</tt> instruction.  If there is no <tt>invoke</tt>
   instruction in the dynamic call chain, undefined behavior results.</p>

<p>Note that the code generator does not yet completely support unwind, and
that the invoke/unwind semantics are likely to change in future versions.</p>

</div>

 <!-- _______________________________________________________________________ -->
 
<h4>
  <a name="i_resume">'<tt>resume</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  resume &lt;type&gt; &lt;value&gt;
</pre>

<h5>Overview:</h5>
<p>The '<tt>resume</tt>' instruction is a terminator instruction that has no
   successors.</p>

<h5>Arguments:</h5>
<p>The '<tt>resume</tt>' instruction requires one argument, which must have the
   same type as the result of any '<tt>landingpad</tt>' instruction in the same
   function.</p>

<h5>Semantics:</h5>
<p>The '<tt>resume</tt>' instruction resumes propagation of an existing
   (in-flight) exception whose unwinding was interrupted with
   a <a href="#i_landingpad"><tt>landingpad</tt></a> instruction.</p>

<h5>Example:</h5>
<pre>
  resume { i8*, i32 } %exn
</pre>

</div>

<!-- _______________________________________________________________________ -->

<h4>
  <a name="i_unreachable">'<tt>unreachable</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  unreachable
</pre>

<h5>Overview:</h5>
<p>The '<tt>unreachable</tt>' instruction has no defined semantics.  This
   instruction is used to inform the optimizer that a particular portion of the
   code is not reachable.  This can be used to indicate that the code after a
   no-return function cannot be reached, and other facts.</p>

<h5>Semantics:</h5>
<p>The '<tt>unreachable</tt>' instruction has no defined semantics.</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="binaryops">Binary Operations</a>
</h3>

<div>

<p>Binary operators are used to do most of the computation in a program.  They
   require two operands of the same type, execute an operation on them, and
   produce a single value.  The operands might represent multiple data, as is
   the case with the <a href="#t_vector">vector</a> data type.  The result value
   has the same type as its operands.</p>

<p>There are several different binary operators:</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_add">'<tt>add</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = add &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;          <i>; yields {ty}:result</i>
  &lt;result&gt; = add nuw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;      <i>; yields {ty}:result</i>
  &lt;result&gt; = add nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;      <i>; yields {ty}:result</i>
  &lt;result&gt; = add nuw nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;  <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>add</tt>' instruction returns the sum of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>add</tt>' instruction must
   be <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of
   integer values. Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the integer sum of the two operands.</p>

<p>If the sum has unsigned overflow, the result returned is the mathematical
   result modulo 2<sup>n</sup>, where n is the bit width of the result.</p>

<p>Because LLVM integers use a two's complement representation, this instruction
   is appropriate for both signed and unsigned integers.</p>

<p><tt>nuw</tt> and <tt>nsw</tt> stand for &quot;No Unsigned Wrap&quot;
   and &quot;No Signed Wrap&quot;, respectively. If the <tt>nuw</tt> and/or
   <tt>nsw</tt> keywords are present, the result value of the <tt>add</tt>
   is a <a href="#trapvalues">trap value</a> if unsigned and/or signed overflow,
   respectively, occurs.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = add i32 4, %var          <i>; yields {i32}:result = 4 + %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_fadd">'<tt>fadd</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fadd &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fadd</tt>' instruction returns the sum of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>fadd</tt>' instruction must be
   <a href="#t_floating">floating point</a> or <a href="#t_vector">vector</a> of
   floating point values. Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the floating point sum of the two operands.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = fadd float 4.0, %var          <i>; yields {float}:result = 4.0 + %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_sub">'<tt>sub</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = sub &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;          <i>; yields {ty}:result</i>
  &lt;result&gt; = sub nuw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;      <i>; yields {ty}:result</i>
  &lt;result&gt; = sub nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;      <i>; yields {ty}:result</i>
  &lt;result&gt; = sub nuw nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;  <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>sub</tt>' instruction returns the difference of its two
   operands.</p>

<p>Note that the '<tt>sub</tt>' instruction is used to represent the
   '<tt>neg</tt>' instruction present in most other intermediate
   representations.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>sub</tt>' instruction must
   be <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of
   integer values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the integer difference of the two operands.</p>

<p>If the difference has unsigned overflow, the result returned is the
   mathematical result modulo 2<sup>n</sup>, where n is the bit width of the
   result.</p>

<p>Because LLVM integers use a two's complement representation, this instruction
   is appropriate for both signed and unsigned integers.</p>

<p><tt>nuw</tt> and <tt>nsw</tt> stand for &quot;No Unsigned Wrap&quot;
   and &quot;No Signed Wrap&quot;, respectively. If the <tt>nuw</tt> and/or
   <tt>nsw</tt> keywords are present, the result value of the <tt>sub</tt>
   is a <a href="#trapvalues">trap value</a> if unsigned and/or signed overflow,
   respectively, occurs.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = sub i32 4, %var          <i>; yields {i32}:result = 4 - %var</i>
  &lt;result&gt; = sub i32 0, %val          <i>; yields {i32}:result = -%var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_fsub">'<tt>fsub</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fsub &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fsub</tt>' instruction returns the difference of its two
   operands.</p>

<p>Note that the '<tt>fsub</tt>' instruction is used to represent the
   '<tt>fneg</tt>' instruction present in most other intermediate
   representations.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>fsub</tt>' instruction must be
   <a href="#t_floating">floating point</a> or <a href="#t_vector">vector</a> of
   floating point values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the floating point difference of the two operands.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = fsub float 4.0, %var           <i>; yields {float}:result = 4.0 - %var</i>
  &lt;result&gt; = fsub float -0.0, %val          <i>; yields {float}:result = -%var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_mul">'<tt>mul</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = mul &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;          <i>; yields {ty}:result</i>
  &lt;result&gt; = mul nuw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;      <i>; yields {ty}:result</i>
  &lt;result&gt; = mul nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;      <i>; yields {ty}:result</i>
  &lt;result&gt; = mul nuw nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;  <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>mul</tt>' instruction returns the product of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>mul</tt>' instruction must
   be <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of
   integer values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the integer product of the two operands.</p>

<p>If the result of the multiplication has unsigned overflow, the result
   returned is the mathematical result modulo 2<sup>n</sup>, where n is the bit
   width of the result.</p>

<p>Because LLVM integers use a two's complement representation, and the result
   is the same width as the operands, this instruction returns the correct
   result for both signed and unsigned integers.  If a full product
   (e.g. <tt>i32</tt>x<tt>i32</tt>-><tt>i64</tt>) is needed, the operands should
   be sign-extended or zero-extended as appropriate to the width of the full
   product.</p>

<p><tt>nuw</tt> and <tt>nsw</tt> stand for &quot;No Unsigned Wrap&quot;
   and &quot;No Signed Wrap&quot;, respectively. If the <tt>nuw</tt> and/or
   <tt>nsw</tt> keywords are present, the result value of the <tt>mul</tt>
   is a <a href="#trapvalues">trap value</a> if unsigned and/or signed overflow,
   respectively, occurs.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = mul i32 4, %var          <i>; yields {i32}:result = 4 * %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_fmul">'<tt>fmul</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fmul &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fmul</tt>' instruction returns the product of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>fmul</tt>' instruction must be
   <a href="#t_floating">floating point</a> or <a href="#t_vector">vector</a> of
   floating point values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the floating point product of the two operands.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = fmul float 4.0, %var          <i>; yields {float}:result = 4.0 * %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_udiv">'<tt>udiv</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = udiv &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;         <i>; yields {ty}:result</i>
  &lt;result&gt; = udiv exact &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>udiv</tt>' instruction returns the quotient of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>udiv</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the unsigned integer quotient of the two operands.</p>

<p>Note that unsigned integer division and signed integer division are distinct
   operations; for signed integer division, use '<tt>sdiv</tt>'.</p>

<p>Division by zero leads to undefined behavior.</p>

<p>If the <tt>exact</tt> keyword is present, the result value of the
   <tt>udiv</tt> is a <a href="#trapvalues">trap value</a> if %op1 is not a
  multiple of %op2 (as such, "((a udiv exact b) mul b) == a").</p>


<h5>Example:</h5>
<pre>
  &lt;result&gt; = udiv i32 4, %var          <i>; yields {i32}:result = 4 / %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_sdiv">'<tt>sdiv</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = sdiv &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;         <i>; yields {ty}:result</i>
  &lt;result&gt; = sdiv exact &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>sdiv</tt>' instruction returns the quotient of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>sdiv</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the signed integer quotient of the two operands rounded
   towards zero.</p>

<p>Note that signed integer division and unsigned integer division are distinct
   operations; for unsigned integer division, use '<tt>udiv</tt>'.</p>

<p>Division by zero leads to undefined behavior. Overflow also leads to
   undefined behavior; this is a rare case, but can occur, for example, by doing
   a 32-bit division of -2147483648 by -1.</p>

<p>If the <tt>exact</tt> keyword is present, the result value of the
   <tt>sdiv</tt> is a <a href="#trapvalues">trap value</a> if the result would
   be rounded.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = sdiv i32 4, %var          <i>; yields {i32}:result = 4 / %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_fdiv">'<tt>fdiv</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fdiv &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fdiv</tt>' instruction returns the quotient of its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>fdiv</tt>' instruction must be
   <a href="#t_floating">floating point</a> or <a href="#t_vector">vector</a> of
   floating point values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The value produced is the floating point quotient of the two operands.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = fdiv float 4.0, %var          <i>; yields {float}:result = 4.0 / %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_urem">'<tt>urem</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = urem &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>urem</tt>' instruction returns the remainder from the unsigned
   division of its two arguments.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>urem</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>This instruction returns the unsigned integer <i>remainder</i> of a division.
   This instruction always performs an unsigned division to get the
   remainder.</p>

<p>Note that unsigned integer remainder and signed integer remainder are
   distinct operations; for signed integer remainder, use '<tt>srem</tt>'.</p>

<p>Taking the remainder of a division by zero leads to undefined behavior.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = urem i32 4, %var          <i>; yields {i32}:result = 4 % %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_srem">'<tt>srem</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = srem &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>srem</tt>' instruction returns the remainder from the signed
   division of its two operands. This instruction can also take
   <a href="#t_vector">vector</a> versions of the values in which case the
   elements must be integers.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>srem</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>This instruction returns the <i>remainder</i> of a division (where the result
   is either zero or has the same sign as the dividend, <tt>op1</tt>), not the
   <i>modulo</i> operator (where the result is either zero or has the same sign
   as the divisor, <tt>op2</tt>) of a value.
   For more information about the difference,
   see <a href="http://mathforum.org/dr.math/problems/anne.4.28.99.html">The
   Math Forum</a>. For a table of how this is implemented in various languages,
   please see <a href="http://en.wikipedia.org/wiki/Modulo_operation">
   Wikipedia: modulo operation</a>.</p>

<p>Note that signed integer remainder and unsigned integer remainder are
   distinct operations; for unsigned integer remainder, use '<tt>urem</tt>'.</p>

<p>Taking the remainder of a division by zero leads to undefined behavior.
   Overflow also leads to undefined behavior; this is a rare case, but can
   occur, for example, by taking the remainder of a 32-bit division of
   -2147483648 by -1.  (The remainder doesn't actually overflow, but this rule
   lets srem be implemented using instructions that return both the result of
   the division and the remainder.)</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = srem i32 4, %var          <i>; yields {i32}:result = 4 % %var</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_frem">'<tt>frem</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = frem &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>frem</tt>' instruction returns the remainder from the division of
   its two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>frem</tt>' instruction must be
   <a href="#t_floating">floating point</a> or <a href="#t_vector">vector</a> of
   floating point values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>This instruction returns the <i>remainder</i> of a division.  The remainder
   has the same sign as the dividend.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = frem float 4.0, %var          <i>; yields {float}:result = 4.0 % %var</i>
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="bitwiseops">Bitwise Binary Operations</a>
</h3>

<div>

<p>Bitwise binary operators are used to do various forms of bit-twiddling in a
   program.  They are generally very efficient instructions and can commonly be
   strength reduced from other instructions.  They require two operands of the
   same type, execute an operation on them, and produce a single value.  The
   resulting value is the same type as its operands.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_shl">'<tt>shl</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = shl &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;           <i>; yields {ty}:result</i>
  &lt;result&gt; = shl nuw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;       <i>; yields {ty}:result</i>
  &lt;result&gt; = shl nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;       <i>; yields {ty}:result</i>
  &lt;result&gt; = shl nuw nsw &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>shl</tt>' instruction returns the first operand shifted to the left
   a specified number of bits.</p>

<h5>Arguments:</h5>
<p>Both arguments to the '<tt>shl</tt>' instruction must be the
    same <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of
    integer type.  '<tt>op2</tt>' is treated as an unsigned value.</p>

<h5>Semantics:</h5>
<p>The value produced is <tt>op1</tt> * 2<sup><tt>op2</tt></sup> mod
   2<sup>n</sup>, where <tt>n</tt> is the width of the result.  If <tt>op2</tt>
   is (statically or dynamically) negative or equal to or larger than the number
   of bits in <tt>op1</tt>, the result is undefined.  If the arguments are
   vectors, each vector element of <tt>op1</tt> is shifted by the corresponding
   shift amount in <tt>op2</tt>.</p>

<p>If the <tt>nuw</tt> keyword is present, then the shift produces a 
   <a href="#trapvalues">trap value</a> if it shifts out any non-zero bits.  If
   the <tt>nsw</tt> keyword is present, then the shift produces a
   <a href="#trapvalues">trap value</a> if it shifts out any bits that disagree
   with the resultant sign bit.  As such, NUW/NSW have the same semantics as
   they would if the shift were expressed as a mul instruction with the same
   nsw/nuw bits in (mul %op1, (shl 1, %op2)).</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = shl i32 4, %var   <i>; yields {i32}: 4 &lt;&lt; %var</i>
  &lt;result&gt; = shl i32 4, 2      <i>; yields {i32}: 16</i>
  &lt;result&gt; = shl i32 1, 10     <i>; yields {i32}: 1024</i>
  &lt;result&gt; = shl i32 1, 32     <i>; undefined</i>
  &lt;result&gt; = shl &lt;2 x i32&gt; &lt; i32 1, i32 1&gt;, &lt; i32 1, i32 2&gt;   <i>; yields: result=&lt;2 x i32&gt; &lt; i32 2, i32 4&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_lshr">'<tt>lshr</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = lshr &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;         <i>; yields {ty}:result</i>
  &lt;result&gt; = lshr exact &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>lshr</tt>' instruction (logical shift right) returns the first
   operand shifted to the right a specified number of bits with zero fill.</p>

<h5>Arguments:</h5>
<p>Both arguments to the '<tt>lshr</tt>' instruction must be the same
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   type. '<tt>op2</tt>' is treated as an unsigned value.</p>

<h5>Semantics:</h5>
<p>This instruction always performs a logical shift right operation. The most
   significant bits of the result will be filled with zero bits after the shift.
   If <tt>op2</tt> is (statically or dynamically) equal to or larger than the
   number of bits in <tt>op1</tt>, the result is undefined. If the arguments are
   vectors, each vector element of <tt>op1</tt> is shifted by the corresponding
   shift amount in <tt>op2</tt>.</p>

<p>If the <tt>exact</tt> keyword is present, the result value of the
   <tt>lshr</tt> is a <a href="#trapvalues">trap value</a> if any of the bits
   shifted out are non-zero.</p>


<h5>Example:</h5>
<pre>
  &lt;result&gt; = lshr i32 4, 1   <i>; yields {i32}:result = 2</i>
  &lt;result&gt; = lshr i32 4, 2   <i>; yields {i32}:result = 1</i>
  &lt;result&gt; = lshr i8  4, 3   <i>; yields {i8}:result = 0</i>
  &lt;result&gt; = lshr i8 -2, 1   <i>; yields {i8}:result = 0x7FFFFFFF </i>
  &lt;result&gt; = lshr i32 1, 32  <i>; undefined</i>
  &lt;result&gt; = lshr &lt;2 x i32&gt; &lt; i32 -2, i32 4&gt;, &lt; i32 1, i32 2&gt;   <i>; yields: result=&lt;2 x i32&gt; &lt; i32 0x7FFFFFFF, i32 1&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_ashr">'<tt>ashr</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = ashr &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;         <i>; yields {ty}:result</i>
  &lt;result&gt; = ashr exact &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>ashr</tt>' instruction (arithmetic shift right) returns the first
   operand shifted to the right a specified number of bits with sign
   extension.</p>

<h5>Arguments:</h5>
<p>Both arguments to the '<tt>ashr</tt>' instruction must be the same
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   type.  '<tt>op2</tt>' is treated as an unsigned value.</p>

<h5>Semantics:</h5>
<p>This instruction always performs an arithmetic shift right operation, The
   most significant bits of the result will be filled with the sign bit
   of <tt>op1</tt>.  If <tt>op2</tt> is (statically or dynamically) equal to or
   larger than the number of bits in <tt>op1</tt>, the result is undefined. If
   the arguments are vectors, each vector element of <tt>op1</tt> is shifted by
   the corresponding shift amount in <tt>op2</tt>.</p>

<p>If the <tt>exact</tt> keyword is present, the result value of the
   <tt>ashr</tt> is a <a href="#trapvalues">trap value</a> if any of the bits
   shifted out are non-zero.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = ashr i32 4, 1   <i>; yields {i32}:result = 2</i>
  &lt;result&gt; = ashr i32 4, 2   <i>; yields {i32}:result = 1</i>
  &lt;result&gt; = ashr i8  4, 3   <i>; yields {i8}:result = 0</i>
  &lt;result&gt; = ashr i8 -2, 1   <i>; yields {i8}:result = -1</i>
  &lt;result&gt; = ashr i32 1, 32  <i>; undefined</i>
  &lt;result&gt; = ashr &lt;2 x i32&gt; &lt; i32 -2, i32 4&gt;, &lt; i32 1, i32 3&gt;   <i>; yields: result=&lt;2 x i32&gt; &lt; i32 -1, i32 0&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_and">'<tt>and</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = and &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>and</tt>' instruction returns the bitwise logical and of its two
   operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>and</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The truth table used for the '<tt>and</tt>' instruction is:</p>

<table border="1" cellspacing="0" cellpadding="4">
  <tbody>
    <tr>
      <td>In0</td>
      <td>In1</td>
      <td>Out</td>
    </tr>
    <tr>
      <td>0</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>0</td>
    </tr>
    <tr>
      <td>1</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>1</td>
      <td>1</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = and i32 4, %var         <i>; yields {i32}:result = 4 &amp; %var</i>
  &lt;result&gt; = and i32 15, 40          <i>; yields {i32}:result = 8</i>
  &lt;result&gt; = and i32 4, 8            <i>; yields {i32}:result = 0</i>
</pre>
</div>
<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_or">'<tt>or</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = or &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>or</tt>' instruction returns the bitwise logical inclusive or of its
   two operands.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>or</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The truth table used for the '<tt>or</tt>' instruction is:</p>

<table border="1" cellspacing="0" cellpadding="4">
  <tbody>
    <tr>
      <td>In0</td>
      <td>In1</td>
      <td>Out</td>
    </tr>
    <tr>
      <td>0</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <td>1</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <td>1</td>
      <td>1</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = or i32 4, %var         <i>; yields {i32}:result = 4 | %var</i>
  &lt;result&gt; = or i32 15, 40          <i>; yields {i32}:result = 47</i>
  &lt;result&gt; = or i32 4, 8            <i>; yields {i32}:result = 12</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_xor">'<tt>xor</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = xor &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {ty}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>xor</tt>' instruction returns the bitwise logical exclusive or of
   its two operands.  The <tt>xor</tt> is used to implement the "one's
   complement" operation, which is the "~" operator in C.</p>

<h5>Arguments:</h5>
<p>The two arguments to the '<tt>xor</tt>' instruction must be
   <a href="#t_integer">integer</a> or <a href="#t_vector">vector</a> of integer
   values.  Both arguments must have identical types.</p>

<h5>Semantics:</h5>
<p>The truth table used for the '<tt>xor</tt>' instruction is:</p>

<table border="1" cellspacing="0" cellpadding="4">
  <tbody>
    <tr>
      <td>In0</td>
      <td>In1</td>
      <td>Out</td>
    </tr>
    <tr>
      <td>0</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <td>0</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <td>1</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <td>1</td>
      <td>1</td>
      <td>0</td>
    </tr>
  </tbody>
</table>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = xor i32 4, %var         <i>; yields {i32}:result = 4 ^ %var</i>
  &lt;result&gt; = xor i32 15, 40          <i>; yields {i32}:result = 39</i>
  &lt;result&gt; = xor i32 4, 8            <i>; yields {i32}:result = 12</i>
  &lt;result&gt; = xor i32 %V, -1          <i>; yields {i32}:result = ~%V</i>
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="vectorops">Vector Operations</a>
</h3>

<div>

<p>LLVM supports several instructions to represent vector operations in a
   target-independent manner.  These instructions cover the element-access and
   vector-specific operations needed to process vectors effectively.  While LLVM
   does directly support these vector operations, many sophisticated algorithms
   will want to use target-specific intrinsics to take full advantage of a
   specific target.</p>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_extractelement">'<tt>extractelement</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = extractelement &lt;n x &lt;ty&gt;&gt; &lt;val&gt;, i32 &lt;idx&gt;    <i>; yields &lt;ty&gt;</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>extractelement</tt>' instruction extracts a single scalar element
   from a vector at a specified index.</p>


<h5>Arguments:</h5>
<p>The first operand of an '<tt>extractelement</tt>' instruction is a value
   of <a href="#t_vector">vector</a> type.  The second operand is an index
   indicating the position from which to extract the element.  The index may be
   a variable.</p>

<h5>Semantics:</h5>
<p>The result is a scalar of the same type as the element type of
   <tt>val</tt>.  Its value is the value at position <tt>idx</tt> of
   <tt>val</tt>.  If <tt>idx</tt> exceeds the length of <tt>val</tt>, the
   results are undefined.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = extractelement &lt;4 x i32&gt; %vec, i32 0    <i>; yields i32</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_insertelement">'<tt>insertelement</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = insertelement &lt;n x &lt;ty&gt;&gt; &lt;val&gt;, &lt;ty&gt; &lt;elt&gt;, i32 &lt;idx&gt;    <i>; yields &lt;n x &lt;ty&gt;&gt;</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>insertelement</tt>' instruction inserts a scalar element into a
   vector at a specified index.</p>

<h5>Arguments:</h5>
<p>The first operand of an '<tt>insertelement</tt>' instruction is a value
   of <a href="#t_vector">vector</a> type.  The second operand is a scalar value
   whose type must equal the element type of the first operand.  The third
   operand is an index indicating the position at which to insert the value.
   The index may be a variable.</p>

<h5>Semantics:</h5>
<p>The result is a vector of the same type as <tt>val</tt>.  Its element values
   are those of <tt>val</tt> except at position <tt>idx</tt>, where it gets the
   value <tt>elt</tt>.  If <tt>idx</tt> exceeds the length of <tt>val</tt>, the
   results are undefined.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = insertelement &lt;4 x i32&gt; %vec, i32 1, i32 0    <i>; yields &lt;4 x i32&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_shufflevector">'<tt>shufflevector</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = shufflevector &lt;n x &lt;ty&gt;&gt; &lt;v1&gt;, &lt;n x &lt;ty&gt;&gt; &lt;v2&gt;, &lt;m x i32&gt; &lt;mask&gt;    <i>; yields &lt;m x &lt;ty&gt;&gt;</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>shufflevector</tt>' instruction constructs a permutation of elements
   from two input vectors, returning a vector with the same element type as the
   input and length that is the same as the shuffle mask.</p>

<h5>Arguments:</h5>
<p>The first two operands of a '<tt>shufflevector</tt>' instruction are vectors
   with types that match each other. The third argument is a shuffle mask whose
   element type is always 'i32'.  The result of the instruction is a vector
   whose length is the same as the shuffle mask and whose element type is the
   same as the element type of the first two operands.</p>

<p>The shuffle mask operand is required to be a constant vector with either
   constant integer or undef values.</p>

<h5>Semantics:</h5>
<p>The elements of the two input vectors are numbered from left to right across
   both of the vectors.  The shuffle mask operand specifies, for each element of
   the result vector, which element of the two input vectors the result element
   gets.  The element selector may be undef (meaning "don't care") and the
   second operand may be undef if performing a shuffle from only one vector.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = shufflevector &lt;4 x i32&gt; %v1, &lt;4 x i32&gt; %v2,
                          &lt;4 x i32&gt; &lt;i32 0, i32 4, i32 1, i32 5&gt;  <i>; yields &lt;4 x i32&gt;</i>
  &lt;result&gt; = shufflevector &lt;4 x i32&gt; %v1, &lt;4 x i32&gt; undef,
                          &lt;4 x i32&gt; &lt;i32 0, i32 1, i32 2, i32 3&gt;  <i>; yields &lt;4 x i32&gt;</i> - Identity shuffle.
  &lt;result&gt; = shufflevector &lt;8 x i32&gt; %v1, &lt;8 x i32&gt; undef,
                          &lt;4 x i32&gt; &lt;i32 0, i32 1, i32 2, i32 3&gt;  <i>; yields &lt;4 x i32&gt;</i>
  &lt;result&gt; = shufflevector &lt;4 x i32&gt; %v1, &lt;4 x i32&gt; %v2,
                          &lt;8 x i32&gt; &lt;i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7 &gt;  <i>; yields &lt;8 x i32&gt;</i>
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="aggregateops">Aggregate Operations</a>
</h3>

<div>

<p>LLVM supports several instructions for working with
  <a href="#t_aggregate">aggregate</a> values.</p>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_extractvalue">'<tt>extractvalue</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = extractvalue &lt;aggregate type&gt; &lt;val&gt;, &lt;idx&gt;{, &lt;idx&gt;}*
</pre>

<h5>Overview:</h5>
<p>The '<tt>extractvalue</tt>' instruction extracts the value of a member field
   from an <a href="#t_aggregate">aggregate</a> value.</p>

<h5>Arguments:</h5>
<p>The first operand of an '<tt>extractvalue</tt>' instruction is a value
   of <a href="#t_struct">struct</a> or
   <a href="#t_array">array</a> type.  The operands are constant indices to
   specify which value to extract in a similar manner as indices in a
   '<tt><a href="#i_getelementptr">getelementptr</a></tt>' instruction.</p>
   <p>The major differences to <tt>getelementptr</tt> indexing are:</p>
     <ul>
       <li>Since the value being indexed is not a pointer, the first index is
           omitted and assumed to be zero.</li>
       <li>At least one index must be specified.</li>
       <li>Not only struct indices but also array indices must be in
           bounds.</li>
     </ul>

<h5>Semantics:</h5>
<p>The result is the value at the position in the aggregate specified by the
   index operands.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = extractvalue {i32, float} %agg, 0    <i>; yields i32</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_insertvalue">'<tt>insertvalue</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = insertvalue &lt;aggregate type&gt; &lt;val&gt;, &lt;ty&gt; &lt;elt&gt;, &lt;idx&gt;{, &lt;idx&gt;}*    <i>; yields &lt;aggregate type&gt;</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>insertvalue</tt>' instruction inserts a value into a member field
   in an <a href="#t_aggregate">aggregate</a> value.</p>

<h5>Arguments:</h5>
<p>The first operand of an '<tt>insertvalue</tt>' instruction is a value
   of <a href="#t_struct">struct</a> or
   <a href="#t_array">array</a> type.  The second operand is a first-class
   value to insert.  The following operands are constant indices indicating
   the position at which to insert the value in a similar manner as indices in a
   '<tt><a href="#i_extractvalue">extractvalue</a></tt>' instruction.  The
   value to insert must have the same type as the value identified by the
   indices.</p>

<h5>Semantics:</h5>
<p>The result is an aggregate of the same type as <tt>val</tt>.  Its value is
   that of <tt>val</tt> except that the value at the position specified by the
   indices is that of <tt>elt</tt>.</p>

<h5>Example:</h5>
<pre>
  %agg1 = insertvalue {i32, float} undef, i32 1, 0              <i>; yields {i32 1, float undef}</i>
  %agg2 = insertvalue {i32, float} %agg1, float %val, 1         <i>; yields {i32 1, float %val}</i>
  %agg3 = insertvalue {i32, {float}} %agg1, float %val, 1, 0    <i>; yields {i32 1, float %val}</i>
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="memoryops">Memory Access and Addressing Operations</a>
</h3>

<div>

<p>A key design point of an SSA-based representation is how it represents
   memory.  In LLVM, no memory locations are in SSA form, which makes things
   very simple.  This section describes how to read, write, and allocate
   memory in LLVM.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_alloca">'<tt>alloca</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = alloca &lt;type&gt;[, &lt;ty&gt; &lt;NumElements&gt;][, align &lt;alignment&gt;]     <i>; yields {type*}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>alloca</tt>' instruction allocates memory on the stack frame of the
   currently executing function, to be automatically released when this function
   returns to its caller. The object is always allocated in the generic address
   space (address space zero).</p>

<h5>Arguments:</h5>
<p>The '<tt>alloca</tt>' instruction
   allocates <tt>sizeof(&lt;type&gt;)*NumElements</tt> bytes of memory on the
   runtime stack, returning a pointer of the appropriate type to the program.
   If "NumElements" is specified, it is the number of elements allocated,
   otherwise "NumElements" is defaulted to be one.  If a constant alignment is
   specified, the value result of the allocation is guaranteed to be aligned to
   at least that boundary.  If not specified, or if zero, the target can choose
   to align the allocation on any convenient boundary compatible with the
   type.</p>

<p>'<tt>type</tt>' may be any sized type.</p>

<h5>Semantics:</h5>
<p>Memory is allocated; a pointer is returned.  The operation is undefined if
   there is insufficient stack space for the allocation.  '<tt>alloca</tt>'d
   memory is automatically released when the function returns.  The
   '<tt>alloca</tt>' instruction is commonly used to represent automatic
   variables that must have an address available.  When the function returns
   (either with the <tt><a href="#i_ret">ret</a></tt>
   or <tt><a href="#i_unwind">unwind</a></tt> instructions), the memory is
   reclaimed.  Allocating zero bytes is legal, but the result is undefined.</p>

<h5>Example:</h5>
<pre>
  %ptr = alloca i32                             <i>; yields {i32*}:ptr</i>
  %ptr = alloca i32, i32 4                      <i>; yields {i32*}:ptr</i>
  %ptr = alloca i32, i32 4, align 1024          <i>; yields {i32*}:ptr</i>
  %ptr = alloca i32, align 1024                 <i>; yields {i32*}:ptr</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_load">'<tt>load</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = load [volatile] &lt;ty&gt;* &lt;pointer&gt;[, align &lt;alignment&gt;][, !nontemporal !&lt;index&gt;]
  &lt;result&gt; = load atomic [volatile] &lt;ty&gt;* &lt;pointer&gt; [singlethread] &lt;ordering&gt;, align &lt;alignment&gt;
  !&lt;index&gt; = !{ i32 1 }
</pre>

<h5>Overview:</h5>
<p>The '<tt>load</tt>' instruction is used to read from memory.</p>

<h5>Arguments:</h5>
<p>The argument to the '<tt>load</tt>' instruction specifies the memory address
   from which to load.  The pointer must point to
   a <a href="#t_firstclass">first class</a> type.  If the <tt>load</tt> is
   marked as <tt>volatile</tt>, then the optimizer is not allowed to modify the
   number or order of execution of this <tt>load</tt> with other <a
   href="#volatile">volatile operations</a>.</p>

<p>If the <code>load</code> is marked as <code>atomic</code>, it takes an extra
   <a href="#ordering">ordering</a> and optional <code>singlethread</code>
   argument.  The <code>release</code> and <code>acq_rel</code> orderings are
   not valid on <code>load</code> instructions.  Atomic loads produce <a
   href="#memorymodel">defined</a> results when they may see multiple atomic
   stores.  The type of the pointee must be an integer type whose bit width
   is a power of two greater than or equal to eight and less than or equal
   to a target-specific size limit. <code>align</code> must be explicitly 
   specified on atomic loads, and the load has undefined behavior if the
   alignment is not set to a value which is at least the size in bytes of
   the pointee. <code>!nontemporal</code> does not have any defined semantics
   for atomic loads.</p>

<p>The optional constant <tt>align</tt> argument specifies the alignment of the
   operation (that is, the alignment of the memory address). A value of 0 or an
   omitted <tt>align</tt> argument means that the operation has the preferential
   alignment for the target. It is the responsibility of the code emitter to
   ensure that the alignment information is correct. Overestimating the
   alignment results in undefined behavior. Underestimating the alignment may
   produce less efficient code. An alignment of 1 is always safe.</p>

<p>The optional <tt>!nontemporal</tt> metadata must reference a single
   metatadata name &lt;index&gt; corresponding to a metadata node with
   one <tt>i32</tt> entry of value 1.  The existence of
   the <tt>!nontemporal</tt> metatadata on the instruction tells the optimizer
   and code generator that this load is not expected to be reused in the cache.
   The code generator may select special instructions to save cache bandwidth,
   such as the <tt>MOVNT</tt> instruction on x86.</p>

<h5>Semantics:</h5>
<p>The location of memory pointed to is loaded.  If the value being loaded is of
   scalar type then the number of bytes read does not exceed the minimum number
   of bytes needed to hold all bits of the type.  For example, loading an
   <tt>i24</tt> reads at most three bytes.  When loading a value of a type like
   <tt>i20</tt> with a size that is not an integral number of bytes, the result
   is undefined if the value was not originally written using a store of the
   same type.</p>

<h5>Examples:</h5>
<pre>
  %ptr = <a href="#i_alloca">alloca</a> i32                               <i>; yields {i32*}:ptr</i>
  <a href="#i_store">store</a> i32 3, i32* %ptr                          <i>; yields {void}</i>
  %val = load i32* %ptr                           <i>; yields {i32}:val = i32 3</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_store">'<tt>store</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  store [volatile] &lt;ty&gt; &lt;value&gt;, &lt;ty&gt;* &lt;pointer&gt;[, align &lt;alignment&gt;][, !nontemporal !&lt;index&gt;]                   <i>; yields {void}</i>
  store atomic [volatile] &lt;ty&gt; &lt;value&gt;, &lt;ty&gt;* &lt;pointer&gt; [singlethread] &lt;ordering&gt;, align &lt;alignment&gt;             <i>; yields {void}</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>store</tt>' instruction is used to write to memory.</p>

<h5>Arguments:</h5>
<p>There are two arguments to the '<tt>store</tt>' instruction: a value to store
   and an address at which to store it.  The type of the
   '<tt>&lt;pointer&gt;</tt>' operand must be a pointer to
   the <a href="#t_firstclass">first class</a> type of the
   '<tt>&lt;value&gt;</tt>' operand. If the <tt>store</tt> is marked as
   <tt>volatile</tt>, then the optimizer is not allowed to modify the number or
   order of execution of this <tt>store</tt> with other <a
   href="#volatile">volatile operations</a>.</p>

<p>If the <code>store</code> is marked as <code>atomic</code>, it takes an extra
   <a href="#ordering">ordering</a> and optional <code>singlethread</code>
   argument.  The <code>acquire</code> and <code>acq_rel</code> orderings aren't
   valid on <code>store</code> instructions.  Atomic loads produce <a
   href="#memorymodel">defined</a> results when they may see multiple atomic
   stores. The type of the pointee must be an integer type whose bit width
   is a power of two greater than or equal to eight and less than or equal
   to a target-specific size limit. <code>align</code> must be explicitly 
   specified on atomic stores, and the store has undefined behavior if the
   alignment is not set to a value which is at least the size in bytes of
   the pointee. <code>!nontemporal</code> does not have any defined semantics
   for atomic stores.</p>

<p>The optional constant "align" argument specifies the alignment of the
   operation (that is, the alignment of the memory address). A value of 0 or an
   omitted "align" argument means that the operation has the preferential
   alignment for the target. It is the responsibility of the code emitter to
   ensure that the alignment information is correct. Overestimating the
   alignment results in an undefined behavior. Underestimating the alignment may
   produce less efficient code. An alignment of 1 is always safe.</p>

<p>The optional !nontemporal metadata must reference a single metatadata
   name &lt;index&gt; corresponding to a metadata node with one i32 entry of
   value 1.  The existence of the !nontemporal metatadata on the
   instruction tells the optimizer and code generator that this load is
   not expected to be reused in the cache.  The code generator may
   select special instructions to save cache bandwidth, such as the
   MOVNT instruction on x86.</p>


<h5>Semantics:</h5>
<p>The contents of memory are updated to contain '<tt>&lt;value&gt;</tt>' at the
   location specified by the '<tt>&lt;pointer&gt;</tt>' operand.  If
   '<tt>&lt;value&gt;</tt>' is of scalar type then the number of bytes written
   does not exceed the minimum number of bytes needed to hold all bits of the
   type.  For example, storing an <tt>i24</tt> writes at most three bytes.  When
   writing a value of a type like <tt>i20</tt> with a size that is not an
   integral number of bytes, it is unspecified what happens to the extra bits
   that do not belong to the type, but they will typically be overwritten.</p>

<h5>Example:</h5>
<pre>
  %ptr = <a href="#i_alloca">alloca</a> i32                               <i>; yields {i32*}:ptr</i>
  store i32 3, i32* %ptr                          <i>; yields {void}</i>
  %val = <a href="#i_load">load</a> i32* %ptr                           <i>; yields {i32}:val = i32 3</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
<a name="i_fence">'<tt>fence</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  fence [singlethread] &lt;ordering&gt;                   <i>; yields {void}</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fence</tt>' instruction is used to introduce happens-before edges
between operations.</p>

<h5>Arguments:</h5> <p>'<code>fence</code>' instructions take an <a
href="#ordering">ordering</a> argument which defines what
<i>synchronizes-with</i> edges they add.  They can only be given
<code>acquire</code>, <code>release</code>, <code>acq_rel</code>, and
<code>seq_cst</code> orderings.</p>

<h5>Semantics:</h5>
<p>A fence <var>A</var> which has (at least) <code>release</code> ordering
semantics <i>synchronizes with</i> a fence <var>B</var> with (at least)
<code>acquire</code> ordering semantics if and only if there exist atomic
operations <var>X</var> and <var>Y</var>, both operating on some atomic object
<var>M</var>, such that <var>A</var> is sequenced before <var>X</var>,
<var>X</var> modifies <var>M</var> (either directly or through some side effect
of a sequence headed by <var>X</var>), <var>Y</var> is sequenced before
<var>B</var>, and <var>Y</var> observes <var>M</var>. This provides a
<i>happens-before</i> dependency between <var>A</var> and <var>B</var>. Rather
than an explicit <code>fence</code>, one (but not both) of the atomic operations
<var>X</var> or <var>Y</var> might provide a <code>release</code> or
<code>acquire</code> (resp.) ordering constraint and still
<i>synchronize-with</i> the explicit <code>fence</code> and establish the
<i>happens-before</i> edge.</p>

<p>A <code>fence</code> which has <code>seq_cst</code> ordering, in addition to
having both <code>acquire</code> and <code>release</code> semantics specified
above, participates in the global program order of other <code>seq_cst</code>
operations and/or fences.</p>

<p>The optional "<a href="#singlethread"><code>singlethread</code></a>" argument
specifies that the fence only synchronizes with other fences in the same
thread.  (This is useful for interacting with signal handlers.)</p>

<h5>Example:</h5>
<pre>
  fence acquire                          <i>; yields {void}</i>
  fence singlethread seq_cst             <i>; yields {void}</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
<a name="i_cmpxchg">'<tt>cmpxchg</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  cmpxchg [volatile] &lt;ty&gt;* &lt;pointer&gt;, &lt;ty&gt; &lt;cmp&gt;, &lt;ty&gt; &lt;new&gt; [singlethread] &lt;ordering&gt;                   <i>; yields {ty}</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>cmpxchg</tt>' instruction is used to atomically modify memory.
It loads a value in memory and compares it to a given value. If they are
equal, it stores a new value into the memory.</p>

<h5>Arguments:</h5>
<p>There are three arguments to the '<code>cmpxchg</code>' instruction: an
address to operate on, a value to compare to the value currently be at that
address, and a new value to place at that address if the compared values are
equal.  The type of '<var>&lt;cmp&gt;</var>' must be an integer type whose
bit width is a power of two greater than or equal to eight and less than
or equal to a target-specific size limit. '<var>&lt;cmp&gt;</var>' and
'<var>&lt;new&gt;</var>' must have the same type, and the type of
'<var>&lt;pointer&gt;</var>' must be a pointer to that type. If the
<code>cmpxchg</code> is marked as <code>volatile</code>, then the
optimizer is not allowed to modify the number or order of execution
of this <code>cmpxchg</code> with other <a href="#volatile">volatile
operations</a>.</p>

<!-- FIXME: Extend allowed types. -->

<p>The <a href="#ordering"><var>ordering</var></a> argument specifies how this
<code>cmpxchg</code> synchronizes with other atomic operations.</p>

<p>The optional "<code>singlethread</code>" argument declares that the
<code>cmpxchg</code> is only atomic with respect to code (usually signal
handlers) running in the same thread as the <code>cmpxchg</code>.  Otherwise the
cmpxchg is atomic with respect to all other code in the system.</p>

<p>The pointer passed into cmpxchg must have alignment greater than or equal to
the size in memory of the operand.

<h5>Semantics:</h5>
<p>The contents of memory at the location specified by the
'<tt>&lt;pointer&gt;</tt>' operand is read and compared to
'<tt>&lt;cmp&gt;</tt>'; if the read value is the equal,
'<tt>&lt;new&gt;</tt>' is written.  The original value at the location
is returned.

<p>A successful <code>cmpxchg</code> is a read-modify-write instruction for the
purpose of identifying <a href="#release_sequence">release sequences</a>.  A
failed <code>cmpxchg</code> is equivalent to an atomic load with an ordering
parameter determined by dropping any <code>release</code> part of the
<code>cmpxchg</code>'s ordering.</p>

<!--
FIXME: Is compare_exchange_weak() necessary?  (Consider after we've done
optimization work on ARM.)

FIXME: Is a weaker ordering constraint on failure helpful in practice?
-->

<h5>Example:</h5>
<pre>
entry:
  %orig = atomic <a href="#i_load">load</a> i32* %ptr unordered                       <i>; yields {i32}</i>
  <a href="#i_br">br</a> label %loop

loop:
  %cmp = <a href="#i_phi">phi</a> i32 [ %orig, %entry ], [%old, %loop]
  %squared = <a href="#i_mul">mul</a> i32 %cmp, %cmp
  %old = cmpxchg i32* %ptr, i32 %cmp, i32 %squared                       <i>; yields {i32}</i>
  %success = <a href="#i_icmp">icmp</a> eq i32 %cmp, %old
  <a href="#i_br">br</a> i1 %success, label %done, label %loop

done:
  ...
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
<a name="i_atomicrmw">'<tt>atomicrmw</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  atomicrmw [volatile] &lt;operation&gt; &lt;ty&gt;* &lt;pointer&gt;, &lt;ty&gt; &lt;value&gt; [singlethread] &lt;ordering&gt;                   <i>; yields {ty}</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>atomicrmw</tt>' instruction is used to atomically modify memory.</p>

<h5>Arguments:</h5>
<p>There are three arguments to the '<code>atomicrmw</code>' instruction: an
operation to apply, an address whose value to modify, an argument to the
operation.  The operation must be one of the following keywords:</p>
<ul>
  <li>xchg</li>
  <li>add</li>
  <li>sub</li>
  <li>and</li>
  <li>nand</li>
  <li>or</li>
  <li>xor</li>
  <li>max</li>
  <li>min</li>
  <li>umax</li>
  <li>umin</li>
</ul>

<p>The type of '<var>&lt;value&gt;</var>' must be an integer type whose
bit width is a power of two greater than or equal to eight and less than
or equal to a target-specific size limit.  The type of the
'<code>&lt;pointer&gt;</code>' operand must be a pointer to that type.
If the <code>atomicrmw</code> is marked as <code>volatile</code>, then the
optimizer is not allowed to modify the number or order of execution of this
<code>atomicrmw</code> with other <a href="#volatile">volatile
  operations</a>.</p>

<!-- FIXME: Extend allowed types. -->

<h5>Semantics:</h5>
<p>The contents of memory at the location specified by the
'<tt>&lt;pointer&gt;</tt>' operand are atomically read, modified, and written
back.  The original value at the location is returned.  The modification is
specified by the <var>operation</var> argument:</p>

<ul>
  <li>xchg: <code>*ptr = val</code></li>
  <li>add: <code>*ptr = *ptr + val</code></li>
  <li>sub: <code>*ptr = *ptr - val</code></li>
  <li>and: <code>*ptr = *ptr &amp; val</code></li>
  <li>nand: <code>*ptr = ~(*ptr &amp; val)</code></li>
  <li>or: <code>*ptr = *ptr | val</code></li>
  <li>xor: <code>*ptr = *ptr ^ val</code></li>
  <li>max: <code>*ptr = *ptr &gt; val ? *ptr : val</code> (using a signed comparison)</li>
  <li>min: <code>*ptr = *ptr &lt; val ? *ptr : val</code> (using a signed comparison)</li>
  <li>umax: <code>*ptr = *ptr &gt; val ? *ptr : val</code> (using an unsigned comparison)</li>
  <li>umin: <code>*ptr = *ptr &lt; val ? *ptr : val</code> (using an unsigned comparison)</li>
</ul>

<h5>Example:</h5>
<pre>
  %old = atomicrmw add i32* %ptr, i32 1 acquire                        <i>; yields {i32}</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_getelementptr">'<tt>getelementptr</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = getelementptr &lt;pty&gt;* &lt;ptrval&gt;{, &lt;ty&gt; &lt;idx&gt;}*
  &lt;result&gt; = getelementptr inbounds &lt;pty&gt;* &lt;ptrval&gt;{, &lt;ty&gt; &lt;idx&gt;}*
</pre>

<h5>Overview:</h5>
<p>The '<tt>getelementptr</tt>' instruction is used to get the address of a
   subelement of an <a href="#t_aggregate">aggregate</a> data structure.
   It performs address calculation only and does not access memory.</p>

<h5>Arguments:</h5>
<p>The first argument is always a pointer, and forms the basis of the
   calculation. The remaining arguments are indices that indicate which of the
   elements of the aggregate object are indexed. The interpretation of each
   index is dependent on the type being indexed into. The first index always
   indexes the pointer value given as the first argument, the second index
   indexes a value of the type pointed to (not necessarily the value directly
   pointed to, since the first index can be non-zero), etc. The first type
   indexed into must be a pointer value, subsequent types can be arrays,
   vectors, and structs. Note that subsequent types being indexed into
   can never be pointers, since that would require loading the pointer before
   continuing calculation.</p>

<p>The type of each index argument depends on the type it is indexing into.
   When indexing into a (optionally packed) structure, only <tt>i32</tt>
   integer <b>constants</b> are allowed.  When indexing into an array, pointer
   or vector, integers of any width are allowed, and they are not required to be
   constant.  These integers are treated as signed values where relevant.</p>

<p>For example, let's consider a C code fragment and how it gets compiled to
   LLVM:</p>

<pre class="doc_code">
struct RT {
  char A;
  int B[10][20];
  char C;
};
struct ST {
  int X;
  double Y;
  struct RT Z;
};

int *foo(struct ST *s) {
  return &amp;s[1].Z.B[5][13];
}
</pre>

<p>The LLVM code generated by the GCC frontend is:</p>

<pre class="doc_code">
%RT = <a href="#namedtypes">type</a> { i8 , [10 x [20 x i32]], i8  }
%ST = <a href="#namedtypes">type</a> { i32, double, %RT }

define i32* @foo(%ST* %s) {
entry:
  %reg = getelementptr %ST* %s, i32 1, i32 2, i32 1, i32 5, i32 13
  ret i32* %reg
}
</pre>

<h5>Semantics:</h5>
<p>In the example above, the first index is indexing into the '<tt>%ST*</tt>'
   type, which is a pointer, yielding a '<tt>%ST</tt>' = '<tt>{ i32, double, %RT
   }</tt>' type, a structure.  The second index indexes into the third element
   of the structure, yielding a '<tt>%RT</tt>' = '<tt>{ i8 , [10 x [20 x i32]],
   i8 }</tt>' type, another structure.  The third index indexes into the second
   element of the structure, yielding a '<tt>[10 x [20 x i32]]</tt>' type, an
   array.  The two dimensions of the array are subscripted into, yielding an
   '<tt>i32</tt>' type.  The '<tt>getelementptr</tt>' instruction returns a
   pointer to this element, thus computing a value of '<tt>i32*</tt>' type.</p>

<p>Note that it is perfectly legal to index partially through a structure,
   returning a pointer to an inner element.  Because of this, the LLVM code for
   the given testcase is equivalent to:</p>

<pre>
  define i32* @foo(%ST* %s) {
    %t1 = getelementptr %ST* %s, i32 1                        <i>; yields %ST*:%t1</i>
    %t2 = getelementptr %ST* %t1, i32 0, i32 2                <i>; yields %RT*:%t2</i>
    %t3 = getelementptr %RT* %t2, i32 0, i32 1                <i>; yields [10 x [20 x i32]]*:%t3</i>
    %t4 = getelementptr [10 x [20 x i32]]* %t3, i32 0, i32 5  <i>; yields [20 x i32]*:%t4</i>
    %t5 = getelementptr [20 x i32]* %t4, i32 0, i32 13        <i>; yields i32*:%t5</i>
    ret i32* %t5
  }
</pre>

<p>If the <tt>inbounds</tt> keyword is present, the result value of the
   <tt>getelementptr</tt> is a <a href="#trapvalues">trap value</a> if the
   base pointer is not an <i>in bounds</i> address of an allocated object,
   or if any of the addresses that would be formed by successive addition of
   the offsets implied by the indices to the base address with infinitely
   precise signed arithmetic are not an <i>in bounds</i> address of that
   allocated object. The <i>in bounds</i> addresses for an allocated object
   are all the addresses that point into the object, plus the address one
   byte past the end.</p>

<p>If the <tt>inbounds</tt> keyword is not present, the offsets are added to
   the base address with silently-wrapping two's complement arithmetic. If the
   offsets have a different width from the pointer, they are sign-extended or
   truncated to the width of the pointer. The result value of the
   <tt>getelementptr</tt> may be outside the object pointed to by the base
   pointer. The result value may not necessarily be used to access memory
   though, even if it happens to point into allocated storage. See the
   <a href="#pointeraliasing">Pointer Aliasing Rules</a> section for more
   information.</p>

<p>The getelementptr instruction is often confusing.  For some more insight into
   how it works, see <a href="GetElementPtr.html">the getelementptr FAQ</a>.</p>

<h5>Example:</h5>
<pre>
    <i>; yields [12 x i8]*:aptr</i>
    %aptr = getelementptr {i32, [12 x i8]}* %saptr, i64 0, i32 1
    <i>; yields i8*:vptr</i>
    %vptr = getelementptr {i32, &lt;2 x i8&gt;}* %svptr, i64 0, i32 1, i32 1
    <i>; yields i8*:eptr</i>
    %eptr = getelementptr [12 x i8]* %aptr, i64 0, i32 1
    <i>; yields i32*:iptr</i>
    %iptr = getelementptr [10 x i32]* @arr, i16 0, i16 0
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="convertops">Conversion Operations</a>
</h3>

<div>

<p>The instructions in this category are the conversion instructions (casting)
   which all take a single operand and a type. They perform various bit
   conversions on the operand.</p>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_trunc">'<tt>trunc .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = trunc &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>trunc</tt>' instruction truncates its operand to the
   type <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>trunc</tt>' instruction takes a value to trunc, and a type to trunc it to.
   Both types must be of <a href="#t_integer">integer</a> types, or vectors
   of the same number of integers.
   The bit size of the <tt>value</tt> must be larger than
   the bit size of the destination type, <tt>ty2</tt>.
   Equal sized types are not allowed.</p>

<h5>Semantics:</h5>
<p>The '<tt>trunc</tt>' instruction truncates the high order bits
   in <tt>value</tt> and converts the remaining bits to <tt>ty2</tt>. Since the
   source size must be larger than the destination size, <tt>trunc</tt> cannot
   be a <i>no-op cast</i>.  It will always truncate bits.</p>

<h5>Example:</h5>
<pre>
  %X = trunc i32 257 to i8                        <i>; yields i8:1</i>
  %Y = trunc i32 123 to i1                        <i>; yields i1:true</i>
  %Z = trunc i32 122 to i1                        <i>; yields i1:false</i>
  %W = trunc &lt;2 x i16&gt; &lt;i16 8, i16 7&gt; to &lt;2 x i8&gt; <i>; yields &lt;i8 8, i8 7&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_zext">'<tt>zext .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = zext &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>zext</tt>' instruction zero extends its operand to type
   <tt>ty2</tt>.</p>


<h5>Arguments:</h5>
<p>The '<tt>zext</tt>' instruction takes a value to cast, and a type to cast it to.
   Both types must be of <a href="#t_integer">integer</a> types, or vectors
   of the same number of integers.
   The bit size of the <tt>value</tt> must be smaller than
   the bit size of the destination type,
   <tt>ty2</tt>.</p>

<h5>Semantics:</h5>
<p>The <tt>zext</tt> fills the high order bits of the <tt>value</tt> with zero
   bits until it reaches the size of the destination type, <tt>ty2</tt>.</p>

<p>When zero extending from i1, the result will always be either 0 or 1.</p>

<h5>Example:</h5>
<pre>
  %X = zext i32 257 to i64              <i>; yields i64:257</i>
  %Y = zext i1 true to i32              <i>; yields i32:1</i>
  %Z = zext &lt;2 x i16&gt; &lt;i16 8, i16 7&gt; to &lt;2 x i32&gt; <i>; yields &lt;i32 8, i32 7&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_sext">'<tt>sext .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = sext &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>sext</tt>' sign extends <tt>value</tt> to the type <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>sext</tt>' instruction takes a value to cast, and a type to cast it to.
   Both types must be of <a href="#t_integer">integer</a> types, or vectors
   of the same number of integers.
   The bit size of the <tt>value</tt> must be smaller than
   the bit size of the destination type,
   <tt>ty2</tt>.</p>

<h5>Semantics:</h5>
<p>The '<tt>sext</tt>' instruction performs a sign extension by copying the sign
   bit (highest order bit) of the <tt>value</tt> until it reaches the bit size
   of the type <tt>ty2</tt>.</p>

<p>When sign extending from i1, the extension always results in -1 or 0.</p>

<h5>Example:</h5>
<pre>
  %X = sext i8  -1 to i16              <i>; yields i16   :65535</i>
  %Y = sext i1 true to i32             <i>; yields i32:-1</i>
  %Z = sext &lt;2 x i16&gt; &lt;i16 8, i16 7&gt; to &lt;2 x i32&gt; <i>; yields &lt;i32 8, i32 7&gt;</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_fptrunc">'<tt>fptrunc .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fptrunc &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fptrunc</tt>' instruction truncates <tt>value</tt> to type
   <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>fptrunc</tt>' instruction takes a <a href="#t_floating">floating
   point</a> value to cast and a <a href="#t_floating">floating point</a> type
   to cast it to. The size of <tt>value</tt> must be larger than the size of
   <tt>ty2</tt>. This implies that <tt>fptrunc</tt> cannot be used to make a
   <i>no-op cast</i>.</p>

<h5>Semantics:</h5>
<p>The '<tt>fptrunc</tt>' instruction truncates a <tt>value</tt> from a larger
   <a href="#t_floating">floating point</a> type to a smaller
   <a href="#t_floating">floating point</a> type.  If the value cannot fit
   within the destination type, <tt>ty2</tt>, then the results are
   undefined.</p>

<h5>Example:</h5>
<pre>
  %X = fptrunc double 123.0 to float         <i>; yields float:123.0</i>
  %Y = fptrunc double 1.0E+300 to float      <i>; yields undefined</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_fpext">'<tt>fpext .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fpext &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fpext</tt>' extends a floating point <tt>value</tt> to a larger
   floating point value.</p>

<h5>Arguments:</h5>
<p>The '<tt>fpext</tt>' instruction takes a
   <a href="#t_floating">floating point</a> <tt>value</tt> to cast, and
   a <a href="#t_floating">floating point</a> type to cast it to. The source
   type must be smaller than the destination type.</p>

<h5>Semantics:</h5>
<p>The '<tt>fpext</tt>' instruction extends the <tt>value</tt> from a smaller
   <a href="#t_floating">floating point</a> type to a larger
   <a href="#t_floating">floating point</a> type. The <tt>fpext</tt> cannot be
   used to make a <i>no-op cast</i> because it always changes bits. Use
   <tt>bitcast</tt> to make a <i>no-op cast</i> for a floating point cast.</p>

<h5>Example:</h5>
<pre>
  %X = fpext float 3.125 to double         <i>; yields double:3.125000e+00</i>
  %Y = fpext double %X to fp128            <i>; yields fp128:0xL00000000000000004000900000000000</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_fptoui">'<tt>fptoui .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fptoui &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fptoui</tt>' converts a floating point <tt>value</tt> to its
   unsigned integer equivalent of type <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>fptoui</tt>' instruction takes a value to cast, which must be a
   scalar or vector <a href="#t_floating">floating point</a> value, and a type
   to cast it to <tt>ty2</tt>, which must be an <a href="#t_integer">integer</a>
   type. If <tt>ty</tt> is a vector floating point type, <tt>ty2</tt> must be a
   vector integer type with the same number of elements as <tt>ty</tt></p>

<h5>Semantics:</h5>
<p>The '<tt>fptoui</tt>' instruction converts its
   <a href="#t_floating">floating point</a> operand into the nearest (rounding
   towards zero) unsigned integer value. If the value cannot fit
   in <tt>ty2</tt>, the results are undefined.</p>

<h5>Example:</h5>
<pre>
  %X = fptoui double 123.0 to i32      <i>; yields i32:123</i>
  %Y = fptoui float 1.0E+300 to i1     <i>; yields undefined:1</i>
  %Z = fptoui float 1.04E+17 to i8     <i>; yields undefined:1</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_fptosi">'<tt>fptosi .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fptosi &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fptosi</tt>' instruction converts
   <a href="#t_floating">floating point</a> <tt>value</tt> to
   type <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>fptosi</tt>' instruction takes a value to cast, which must be a
   scalar or vector <a href="#t_floating">floating point</a> value, and a type
   to cast it to <tt>ty2</tt>, which must be an <a href="#t_integer">integer</a>
   type. If <tt>ty</tt> is a vector floating point type, <tt>ty2</tt> must be a
   vector integer type with the same number of elements as <tt>ty</tt></p>

<h5>Semantics:</h5>
<p>The '<tt>fptosi</tt>' instruction converts its
   <a href="#t_floating">floating point</a> operand into the nearest (rounding
   towards zero) signed integer value. If the value cannot fit in <tt>ty2</tt>,
   the results are undefined.</p>

<h5>Example:</h5>
<pre>
  %X = fptosi double -123.0 to i32      <i>; yields i32:-123</i>
  %Y = fptosi float 1.0E-247 to i1      <i>; yields undefined:1</i>
  %Z = fptosi float 1.04E+17 to i8      <i>; yields undefined:1</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_uitofp">'<tt>uitofp .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = uitofp &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>uitofp</tt>' instruction regards <tt>value</tt> as an unsigned
   integer and converts that value to the <tt>ty2</tt> type.</p>

<h5>Arguments:</h5>
<p>The '<tt>uitofp</tt>' instruction takes a value to cast, which must be a
   scalar or vector <a href="#t_integer">integer</a> value, and a type to cast
   it to <tt>ty2</tt>, which must be an <a href="#t_floating">floating point</a>
   type. If <tt>ty</tt> is a vector integer type, <tt>ty2</tt> must be a vector
   floating point type with the same number of elements as <tt>ty</tt></p>

<h5>Semantics:</h5>
<p>The '<tt>uitofp</tt>' instruction interprets its operand as an unsigned
   integer quantity and converts it to the corresponding floating point
   value. If the value cannot fit in the floating point value, the results are
   undefined.</p>

<h5>Example:</h5>
<pre>
  %X = uitofp i32 257 to float         <i>; yields float:257.0</i>
  %Y = uitofp i8 -1 to double          <i>; yields double:255.0</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_sitofp">'<tt>sitofp .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = sitofp &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>sitofp</tt>' instruction regards <tt>value</tt> as a signed integer
   and converts that value to the <tt>ty2</tt> type.</p>

<h5>Arguments:</h5>
<p>The '<tt>sitofp</tt>' instruction takes a value to cast, which must be a
   scalar or vector <a href="#t_integer">integer</a> value, and a type to cast
   it to <tt>ty2</tt>, which must be an <a href="#t_floating">floating point</a>
   type. If <tt>ty</tt> is a vector integer type, <tt>ty2</tt> must be a vector
   floating point type with the same number of elements as <tt>ty</tt></p>

<h5>Semantics:</h5>
<p>The '<tt>sitofp</tt>' instruction interprets its operand as a signed integer
   quantity and converts it to the corresponding floating point value. If the
   value cannot fit in the floating point value, the results are undefined.</p>

<h5>Example:</h5>
<pre>
  %X = sitofp i32 257 to float         <i>; yields float:257.0</i>
  %Y = sitofp i8 -1 to double          <i>; yields double:-1.0</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_ptrtoint">'<tt>ptrtoint .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = ptrtoint &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>ptrtoint</tt>' instruction converts the pointer <tt>value</tt> to
   the integer type <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>ptrtoint</tt>' instruction takes a <tt>value</tt> to cast, which
   must be a <a href="#t_pointer">pointer</a> value, and a type to cast it to
   <tt>ty2</tt>, which must be an <a href="#t_integer">integer</a> type.</p>

<h5>Semantics:</h5>
<p>The '<tt>ptrtoint</tt>' instruction converts <tt>value</tt> to integer type
   <tt>ty2</tt> by interpreting the pointer value as an integer and either
   truncating or zero extending that value to the size of the integer type. If
   <tt>value</tt> is smaller than <tt>ty2</tt> then a zero extension is done. If
   <tt>value</tt> is larger than <tt>ty2</tt> then a truncation is done. If they
   are the same size, then nothing is done (<i>no-op cast</i>) other than a type
   change.</p>

<h5>Example:</h5>
<pre>
  %X = ptrtoint i32* %X to i8           <i>; yields truncation on 32-bit architecture</i>
  %Y = ptrtoint i32* %x to i64          <i>; yields zero extension on 32-bit architecture</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_inttoptr">'<tt>inttoptr .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = inttoptr &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>inttoptr</tt>' instruction converts an integer <tt>value</tt> to a
   pointer type, <tt>ty2</tt>.</p>

<h5>Arguments:</h5>
<p>The '<tt>inttoptr</tt>' instruction takes an <a href="#t_integer">integer</a>
   value to cast, and a type to cast it to, which must be a
   <a href="#t_pointer">pointer</a> type.</p>

<h5>Semantics:</h5>
<p>The '<tt>inttoptr</tt>' instruction converts <tt>value</tt> to type
   <tt>ty2</tt> by applying either a zero extension or a truncation depending on
   the size of the integer <tt>value</tt>. If <tt>value</tt> is larger than the
   size of a pointer then a truncation is done. If <tt>value</tt> is smaller
   than the size of a pointer then a zero extension is done. If they are the
   same size, nothing is done (<i>no-op cast</i>).</p>

<h5>Example:</h5>
<pre>
  %X = inttoptr i32 255 to i32*          <i>; yields zero extension on 64-bit architecture</i>
  %Y = inttoptr i32 255 to i32*          <i>; yields no-op on 32-bit architecture</i>
  %Z = inttoptr i64 0 to i32*            <i>; yields truncation on 32-bit architecture</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_bitcast">'<tt>bitcast .. to</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = bitcast &lt;ty&gt; &lt;value&gt; to &lt;ty2&gt;             <i>; yields ty2</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>bitcast</tt>' instruction converts <tt>value</tt> to type
   <tt>ty2</tt> without changing any bits.</p>

<h5>Arguments:</h5>
<p>The '<tt>bitcast</tt>' instruction takes a value to cast, which must be a
   non-aggregate first class value, and a type to cast it to, which must also be
   a non-aggregate <a href="#t_firstclass">first class</a> type. The bit sizes
   of <tt>value</tt> and the destination type, <tt>ty2</tt>, must be
   identical. If the source type is a pointer, the destination type must also be
   a pointer.  This instruction supports bitwise conversion of vectors to
   integers and to vectors of other types (as long as they have the same
   size).</p>

<h5>Semantics:</h5>
<p>The '<tt>bitcast</tt>' instruction converts <tt>value</tt> to type
   <tt>ty2</tt>. It is always a <i>no-op cast</i> because no bits change with
   this conversion.  The conversion is done as if the <tt>value</tt> had been
   stored to memory and read back as type <tt>ty2</tt>. Pointer types may only
   be converted to other pointer types with this instruction. To convert
   pointers to other types, use the <a href="#i_inttoptr">inttoptr</a> or
   <a href="#i_ptrtoint">ptrtoint</a> instructions first.</p>

<h5>Example:</h5>
<pre>
  %X = bitcast i8 255 to i8              <i>; yields i8 :-1</i>
  %Y = bitcast i32* %x to sint*          <i>; yields sint*:%x</i>
  %Z = bitcast &lt;2 x int&gt; %V to i64;      <i>; yields i64: %V</i>
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="otherops">Other Operations</a>
</h3>

<div>

<p>The instructions in this category are the "miscellaneous" instructions, which
   defy better classification.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_icmp">'<tt>icmp</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = icmp &lt;cond&gt; &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;   <i>; yields {i1} or {&lt;N x i1&gt;}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>icmp</tt>' instruction returns a boolean value or a vector of
   boolean values based on comparison of its two integer, integer vector, or
   pointer operands.</p>

<h5>Arguments:</h5>
<p>The '<tt>icmp</tt>' instruction takes three operands. The first operand is
   the condition code indicating the kind of comparison to perform. It is not a
   value, just a keyword. The possible condition code are:</p>

<ol>
  <li><tt>eq</tt>: equal</li>
  <li><tt>ne</tt>: not equal </li>
  <li><tt>ugt</tt>: unsigned greater than</li>
  <li><tt>uge</tt>: unsigned greater or equal</li>
  <li><tt>ult</tt>: unsigned less than</li>
  <li><tt>ule</tt>: unsigned less or equal</li>
  <li><tt>sgt</tt>: signed greater than</li>
  <li><tt>sge</tt>: signed greater or equal</li>
  <li><tt>slt</tt>: signed less than</li>
  <li><tt>sle</tt>: signed less or equal</li>
</ol>

<p>The remaining two arguments must be <a href="#t_integer">integer</a> or
   <a href="#t_pointer">pointer</a> or integer <a href="#t_vector">vector</a>
   typed.  They must also be identical types.</p>

<h5>Semantics:</h5>
<p>The '<tt>icmp</tt>' compares <tt>op1</tt> and <tt>op2</tt> according to the
   condition code given as <tt>cond</tt>. The comparison performed always yields
   either an <a href="#t_integer"><tt>i1</tt></a> or vector of <tt>i1</tt>
   result, as follows:</p>

<ol>
  <li><tt>eq</tt>: yields <tt>true</tt> if the operands are equal,
      <tt>false</tt> otherwise. No sign interpretation is necessary or
      performed.</li>

  <li><tt>ne</tt>: yields <tt>true</tt> if the operands are unequal,
      <tt>false</tt> otherwise. No sign interpretation is necessary or
      performed.</li>

  <li><tt>ugt</tt>: interprets the operands as unsigned values and yields
      <tt>true</tt> if <tt>op1</tt> is greater than <tt>op2</tt>.</li>

  <li><tt>uge</tt>: interprets the operands as unsigned values and yields
      <tt>true</tt> if <tt>op1</tt> is greater than or equal
      to <tt>op2</tt>.</li>

  <li><tt>ult</tt>: interprets the operands as unsigned values and yields
      <tt>true</tt> if <tt>op1</tt> is less than <tt>op2</tt>.</li>

  <li><tt>ule</tt>: interprets the operands as unsigned values and yields
      <tt>true</tt> if <tt>op1</tt> is less than or equal to <tt>op2</tt>.</li>

  <li><tt>sgt</tt>: interprets the operands as signed values and yields
      <tt>true</tt> if <tt>op1</tt> is greater than <tt>op2</tt>.</li>

  <li><tt>sge</tt>: interprets the operands as signed values and yields
      <tt>true</tt> if <tt>op1</tt> is greater than or equal
      to <tt>op2</tt>.</li>

  <li><tt>slt</tt>: interprets the operands as signed values and yields
      <tt>true</tt> if <tt>op1</tt> is less than <tt>op2</tt>.</li>

  <li><tt>sle</tt>: interprets the operands as signed values and yields
      <tt>true</tt> if <tt>op1</tt> is less than or equal to <tt>op2</tt>.</li>
</ol>

<p>If the operands are <a href="#t_pointer">pointer</a> typed, the pointer
   values are compared as if they were integers.</p>

<p>If the operands are integer vectors, then they are compared element by
   element. The result is an <tt>i1</tt> vector with the same number of elements
   as the values being compared.  Otherwise, the result is an <tt>i1</tt>.</p>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = icmp eq i32 4, 5          <i>; yields: result=false</i>
  &lt;result&gt; = icmp ne float* %X, %X     <i>; yields: result=false</i>
  &lt;result&gt; = icmp ult i16  4, 5        <i>; yields: result=true</i>
  &lt;result&gt; = icmp sgt i16  4, 5        <i>; yields: result=false</i>
  &lt;result&gt; = icmp ule i16 -4, 5        <i>; yields: result=false</i>
  &lt;result&gt; = icmp sge i16  4, 5        <i>; yields: result=false</i>
</pre>

<p>Note that the code generator does not yet support vector types with
   the <tt>icmp</tt> instruction.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_fcmp">'<tt>fcmp</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = fcmp &lt;cond&gt; &lt;ty&gt; &lt;op1&gt;, &lt;op2&gt;     <i>; yields {i1} or {&lt;N x i1&gt;}:result</i>
</pre>

<h5>Overview:</h5>
<p>The '<tt>fcmp</tt>' instruction returns a boolean value or vector of boolean
   values based on comparison of its operands.</p>

<p>If the operands are floating point scalars, then the result type is a boolean
(<a href="#t_integer"><tt>i1</tt></a>).</p>

<p>If the operands are floating point vectors, then the result type is a vector
   of boolean with the same number of elements as the operands being
   compared.</p>

<h5>Arguments:</h5>
<p>The '<tt>fcmp</tt>' instruction takes three operands. The first operand is
   the condition code indicating the kind of comparison to perform. It is not a
   value, just a keyword. The possible condition code are:</p>

<ol>
  <li><tt>false</tt>: no comparison, always returns false</li>
  <li><tt>oeq</tt>: ordered and equal</li>
  <li><tt>ogt</tt>: ordered and greater than </li>
  <li><tt>oge</tt>: ordered and greater than or equal</li>
  <li><tt>olt</tt>: ordered and less than </li>
  <li><tt>ole</tt>: ordered and less than or equal</li>
  <li><tt>one</tt>: ordered and not equal</li>
  <li><tt>ord</tt>: ordered (no nans)</li>
  <li><tt>ueq</tt>: unordered or equal</li>
  <li><tt>ugt</tt>: unordered or greater than </li>
  <li><tt>uge</tt>: unordered or greater than or equal</li>
  <li><tt>ult</tt>: unordered or less than </li>
  <li><tt>ule</tt>: unordered or less than or equal</li>
  <li><tt>une</tt>: unordered or not equal</li>
  <li><tt>uno</tt>: unordered (either nans)</li>
  <li><tt>true</tt>: no comparison, always returns true</li>
</ol>

<p><i>Ordered</i> means that neither operand is a QNAN while
   <i>unordered</i> means that either operand may be a QNAN.</p>

<p>Each of <tt>val1</tt> and <tt>val2</tt> arguments must be either
   a <a href="#t_floating">floating point</a> type or
   a <a href="#t_vector">vector</a> of floating point type.  They must have
   identical types.</p>

<h5>Semantics:</h5>
<p>The '<tt>fcmp</tt>' instruction compares <tt>op1</tt> and <tt>op2</tt>
   according to the condition code given as <tt>cond</tt>.  If the operands are
   vectors, then the vectors are compared element by element.  Each comparison
   performed always yields an <a href="#t_integer">i1</a> result, as
   follows:</p>

<ol>
  <li><tt>false</tt>: always yields <tt>false</tt>, regardless of operands.</li>

  <li><tt>oeq</tt>: yields <tt>true</tt> if both operands are not a QNAN and
      <tt>op1</tt> is equal to <tt>op2</tt>.</li>

  <li><tt>ogt</tt>: yields <tt>true</tt> if both operands are not a QNAN and
      <tt>op1</tt> is greater than <tt>op2</tt>.</li>

  <li><tt>oge</tt>: yields <tt>true</tt> if both operands are not a QNAN and
      <tt>op1</tt> is greater than or equal to <tt>op2</tt>.</li>

  <li><tt>olt</tt>: yields <tt>true</tt> if both operands are not a QNAN and
      <tt>op1</tt> is less than <tt>op2</tt>.</li>

  <li><tt>ole</tt>: yields <tt>true</tt> if both operands are not a QNAN and
      <tt>op1</tt> is less than or equal to <tt>op2</tt>.</li>

  <li><tt>one</tt>: yields <tt>true</tt> if both operands are not a QNAN and
      <tt>op1</tt> is not equal to <tt>op2</tt>.</li>

  <li><tt>ord</tt>: yields <tt>true</tt> if both operands are not a QNAN.</li>

  <li><tt>ueq</tt>: yields <tt>true</tt> if either operand is a QNAN or
      <tt>op1</tt> is equal to <tt>op2</tt>.</li>

  <li><tt>ugt</tt>: yields <tt>true</tt> if either operand is a QNAN or
      <tt>op1</tt> is greater than <tt>op2</tt>.</li>

  <li><tt>uge</tt>: yields <tt>true</tt> if either operand is a QNAN or
      <tt>op1</tt> is greater than or equal to <tt>op2</tt>.</li>

  <li><tt>ult</tt>: yields <tt>true</tt> if either operand is a QNAN or
      <tt>op1</tt> is less than <tt>op2</tt>.</li>

  <li><tt>ule</tt>: yields <tt>true</tt> if either operand is a QNAN or
      <tt>op1</tt> is less than or equal to <tt>op2</tt>.</li>

  <li><tt>une</tt>: yields <tt>true</tt> if either operand is a QNAN or
      <tt>op1</tt> is not equal to <tt>op2</tt>.</li>

  <li><tt>uno</tt>: yields <tt>true</tt> if either operand is a QNAN.</li>

  <li><tt>true</tt>: always yields <tt>true</tt>, regardless of operands.</li>
</ol>

<h5>Example:</h5>
<pre>
  &lt;result&gt; = fcmp oeq float 4.0, 5.0    <i>; yields: result=false</i>
  &lt;result&gt; = fcmp one float 4.0, 5.0    <i>; yields: result=true</i>
  &lt;result&gt; = fcmp olt float 4.0, 5.0    <i>; yields: result=true</i>
  &lt;result&gt; = fcmp ueq double 1.0, 2.0   <i>; yields: result=false</i>
</pre>

<p>Note that the code generator does not yet support vector types with
   the <tt>fcmp</tt> instruction.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_phi">'<tt>phi</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = phi &lt;ty&gt; [ &lt;val0&gt;, &lt;label0&gt;], ...
</pre>

<h5>Overview:</h5>
<p>The '<tt>phi</tt>' instruction is used to implement the &#966; node in the
   SSA graph representing the function.</p>

<h5>Arguments:</h5>
<p>The type of the incoming values is specified with the first type field. After
   this, the '<tt>phi</tt>' instruction takes a list of pairs as arguments, with
   one pair for each predecessor basic block of the current block.  Only values
   of <a href="#t_firstclass">first class</a> type may be used as the value
   arguments to the PHI node.  Only labels may be used as the label
   arguments.</p>

<p>There must be no non-phi instructions between the start of a basic block and
   the PHI instructions: i.e. PHI instructions must be first in a basic
   block.</p>

<p>For the purposes of the SSA form, the use of each incoming value is deemed to
   occur on the edge from the corresponding predecessor block to the current
   block (but after any definition of an '<tt>invoke</tt>' instruction's return
   value on the same edge).</p>

<h5>Semantics:</h5>
<p>At runtime, the '<tt>phi</tt>' instruction logically takes on the value
   specified by the pair corresponding to the predecessor basic block that
   executed just prior to the current block.</p>

<h5>Example:</h5>
<pre>
Loop:       ; Infinite loop that counts from 0 on up...
  %indvar = phi i32 [ 0, %LoopHeader ], [ %nextindvar, %Loop ]
  %nextindvar = add i32 %indvar, 1
  br label %Loop
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
   <a name="i_select">'<tt>select</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = select <i>selty</i> &lt;cond&gt;, &lt;ty&gt; &lt;val1&gt;, &lt;ty&gt; &lt;val2&gt;             <i>; yields ty</i>

  <i>selty</i> is either i1 or {&lt;N x i1&gt;}
</pre>

<h5>Overview:</h5>
<p>The '<tt>select</tt>' instruction is used to choose one value based on a
   condition, without branching.</p>


<h5>Arguments:</h5>
<p>The '<tt>select</tt>' instruction requires an 'i1' value or a vector of 'i1'
   values indicating the condition, and two values of the
   same <a href="#t_firstclass">first class</a> type.  If the val1/val2 are
   vectors and the condition is a scalar, then entire vectors are selected, not
   individual elements.</p>

<h5>Semantics:</h5>
<p>If the condition is an i1 and it evaluates to 1, the instruction returns the
   first value argument; otherwise, it returns the second value argument.</p>

<p>If the condition is a vector of i1, then the value arguments must be vectors
   of the same size, and the selection is done element by element.</p>

<h5>Example:</h5>
<pre>
  %X = select i1 true, i8 17, i8 42          <i>; yields i8:17</i>
</pre>

<p>Note that the code generator does not yet support conditions
   with vector type.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_call">'<tt>call</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;result&gt; = [tail] call [<a href="#callingconv">cconv</a>] [<a href="#paramattrs">ret attrs</a>] &lt;ty&gt; [&lt;fnty&gt;*] &lt;fnptrval&gt;(&lt;function args&gt;) [<a href="#fnattrs">fn attrs</a>]
</pre>

<h5>Overview:</h5>
<p>The '<tt>call</tt>' instruction represents a simple function call.</p>

<h5>Arguments:</h5>
<p>This instruction requires several arguments:</p>

<ol>
  <li>The optional "tail" marker indicates that the callee function does not
      access any allocas or varargs in the caller.  Note that calls may be
      marked "tail" even if they do not occur before
      a <a href="#i_ret"><tt>ret</tt></a> instruction.  If the "tail" marker is
      present, the function call is eligible for tail call optimization,
      but <a href="CodeGenerator.html#tailcallopt">might not in fact be
      optimized into a jump</a>.  The code generator may optimize calls marked
      "tail" with either 1) automatic <a href="CodeGenerator.html#sibcallopt">
      sibling call optimization</a> when the caller and callee have
      matching signatures, or 2) forced tail call optimization when the
      following extra requirements are met:
      <ul>
        <li>Caller and callee both have the calling
            convention <tt>fastcc</tt>.</li>
        <li>The call is in tail position (ret immediately follows call and ret
            uses value of call or is void).</li>
        <li>Option <tt>-tailcallopt</tt> is enabled,
            or <code>llvm::GuaranteedTailCallOpt</code> is <code>true</code>.</li>
        <li><a href="CodeGenerator.html#tailcallopt">Platform specific
            constraints are met.</a></li>
      </ul>
  </li>

  <li>The optional "cconv" marker indicates which <a href="#callingconv">calling
      convention</a> the call should use.  If none is specified, the call
      defaults to using C calling conventions.  The calling convention of the
      call must match the calling convention of the target function, or else the
      behavior is undefined.</li>

  <li>The optional <a href="#paramattrs">Parameter Attributes</a> list for
      return values. Only '<tt>zeroext</tt>', '<tt>signext</tt>', and
      '<tt>inreg</tt>' attributes are valid here.</li>

  <li>'<tt>ty</tt>': the type of the call instruction itself which is also the
      type of the return value.  Functions that return no value are marked
      <tt><a href="#t_void">void</a></tt>.</li>

  <li>'<tt>fnty</tt>': shall be the signature of the pointer to function value
      being invoked.  The argument types must match the types implied by this
      signature.  This type can be omitted if the function is not varargs and if
      the function type does not return a pointer to a function.</li>

  <li>'<tt>fnptrval</tt>': An LLVM value containing a pointer to a function to
      be invoked. In most cases, this is a direct function invocation, but
      indirect <tt>call</tt>s are just as possible, calling an arbitrary pointer
      to function value.</li>

  <li>'<tt>function args</tt>': argument list whose types match the function
      signature argument types and parameter attributes. All arguments must be
      of <a href="#t_firstclass">first class</a> type. If the function
      signature indicates the function accepts a variable number of arguments,
      the extra arguments can be specified.</li>

  <li>The optional <a href="#fnattrs">function attributes</a> list. Only
      '<tt>noreturn</tt>', '<tt>nounwind</tt>', '<tt>readonly</tt>' and
      '<tt>readnone</tt>' attributes are valid here.</li>
</ol>

<h5>Semantics:</h5>
<p>The '<tt>call</tt>' instruction is used to cause control flow to transfer to
   a specified function, with its incoming arguments bound to the specified
   values. Upon a '<tt><a href="#i_ret">ret</a></tt>' instruction in the called
   function, control flow continues with the instruction after the function
   call, and the return value of the function is bound to the result
   argument.</p>

<h5>Example:</h5>
<pre>
  %retval = call i32 @test(i32 %argc)
  call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42)        <i>; yields i32</i>
  %X = tail call i32 @foo()                                    <i>; yields i32</i>
  %Y = tail call <a href="#callingconv">fastcc</a> i32 @foo()  <i>; yields i32</i>
  call void %foo(i8 97 signext)

  %struct.A = type { i32, i8 }
  %r = call %struct.A @foo()                        <i>; yields { 32, i8 }</i>
  %gr = extractvalue %struct.A %r, 0                <i>; yields i32</i>
  %gr1 = extractvalue %struct.A %r, 1               <i>; yields i8</i>
  %Z = call void @foo() noreturn                    <i>; indicates that %foo never returns normally</i>
  %ZZ = call zeroext i32 @bar()                     <i>; Return value is %zero extended</i>
</pre>

<p>llvm treats calls to some functions with names and arguments that match the
standard C99 library as being the C99 library functions, and may perform
optimizations or generate code for them under that assumption.  This is
something we'd like to change in the future to provide better support for
freestanding environments and non-C-based languages.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_va_arg">'<tt>va_arg</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;resultval&gt; = va_arg &lt;va_list*&gt; &lt;arglist&gt;, &lt;argty&gt;
</pre>

<h5>Overview:</h5>
<p>The '<tt>va_arg</tt>' instruction is used to access arguments passed through
   the "variable argument" area of a function call.  It is used to implement the
   <tt>va_arg</tt> macro in C.</p>

<h5>Arguments:</h5>
<p>This instruction takes a <tt>va_list*</tt> value and the type of the
   argument. It returns a value of the specified argument type and increments
   the <tt>va_list</tt> to point to the next argument.  The actual type
   of <tt>va_list</tt> is target specific.</p>

<h5>Semantics:</h5>
<p>The '<tt>va_arg</tt>' instruction loads an argument of the specified type
   from the specified <tt>va_list</tt> and causes the <tt>va_list</tt> to point
   to the next argument.  For more information, see the variable argument
   handling <a href="#int_varargs">Intrinsic Functions</a>.</p>

<p>It is legal for this instruction to be called in a function which does not
   take a variable number of arguments, for example, the <tt>vfprintf</tt>
   function.</p>

<p><tt>va_arg</tt> is an LLVM instruction instead of
   an <a href="#intrinsics">intrinsic function</a> because it takes a type as an
   argument.</p>

<h5>Example:</h5>
<p>See the <a href="#int_varargs">variable argument processing</a> section.</p>

<p>Note that the code generator does not yet fully support va_arg on many
   targets. Also, it does not currently support va_arg with aggregate types on
   any target.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="i_landingpad">'<tt>landingpad</tt>' Instruction</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  &lt;resultval&gt; = landingpad &lt;somety&gt; personality &lt;type&gt; &lt;pers_fn&gt; &lt;clause&gt;+
  &lt;resultval&gt; = landingpad &lt;somety&gt; personality &lt;type&gt; &lt;pers_fn&gt; cleanup &lt;clause&gt;*

  &lt;clause&gt; := catch &lt;type&gt; &lt;value&gt;
  &lt;clause&gt; := filter &lt;array constant type&gt; &lt;array constant&gt;
</pre>

<h5>Overview:</h5>
<p>The '<tt>landingpad</tt>' instruction is used by
   <a href="ExceptionHandling.html#overview">LLVM's exception handling
   system</a> to specify that a basic block is a landing pad &mdash; one where
   the exception lands, and corresponds to the code found in the
   <i><tt>catch</tt></i> portion of a <i><tt>try/catch</tt></i> sequence. It
   defines values supplied by the personality function (<tt>pers_fn</tt>) upon
   re-entry to the function. The <tt>resultval</tt> has the
   type <tt>somety</tt>.</p>

<h5>Arguments:</h5>
<p>This instruction takes a <tt>pers_fn</tt> value. This is the personality
   function associated with the unwinding mechanism. The optional
   <tt>cleanup</tt> flag indicates that the landing pad block is a cleanup.</p>

<p>A <tt>clause</tt> begins with the clause type &mdash; <tt>catch</tt>
   or <tt>filter</tt> &mdash; and contains the global variable representing the
   "type" that may be caught or filtered respectively. Unlike the
   <tt>catch</tt> clause, the <tt>filter</tt> clause takes an array constant as
   its argument. Use "<tt>[0 x i8**] undef</tt>" for a filter which cannot
   throw. The '<tt>landingpad</tt>' instruction must contain <em>at least</em>
   one <tt>clause</tt> or the <tt>cleanup</tt> flag.</p>

<h5>Semantics:</h5>
<p>The '<tt>landingpad</tt>' instruction defines the values which are set by the
   personality function (<tt>pers_fn</tt>) upon re-entry to the function, and
   therefore the "result type" of the <tt>landingpad</tt> instruction. As with
   calling conventions, how the personality function results are represented in
   LLVM IR is target specific.</p>

<p>The clauses are applied in order from top to bottom. If two
   <tt>landingpad</tt> instructions are merged together through inlining, the
   clauses from the calling function are appended to the list of clauses.</p>

<p>The <tt>landingpad</tt> instruction has several restrictions:</p>

<ul>
  <li>A landing pad block is a basic block which is the unwind destination of an
      '<tt>invoke</tt>' instruction.</li>
  <li>A landing pad block must have a '<tt>landingpad</tt>' instruction as its
      first non-PHI instruction.</li>
  <li>There can be only one '<tt>landingpad</tt>' instruction within the landing
      pad block.</li>
  <li>A basic block that is not a landing pad block may not include a
      '<tt>landingpad</tt>' instruction.</li>
  <li>All '<tt>landingpad</tt>' instructions in a function must have the same
      personality function.</li>
</ul>

<h5>Example:</h5>
<pre>
  ;; A landing pad which can catch an integer.
  %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
           catch i8** @_ZTIi
  ;; A landing pad that is a cleanup.
  %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
           cleanup
  ;; A landing pad which can catch an integer and can only throw a double.
  %res = landingpad { i8*, i32 } personality i32 (...)* @__gxx_personality_v0
           catch i8** @_ZTIi
           filter [1 x i8**] [@_ZTId]
</pre>

</div>

</div>

</div>

<!-- *********************************************************************** -->
<h2><a name="intrinsics">Intrinsic Functions</a></h2>
<!-- *********************************************************************** -->

<div>

<p>LLVM supports the notion of an "intrinsic function".  These functions have
   well known names and semantics and are required to follow certain
   restrictions.  Overall, these intrinsics represent an extension mechanism for
   the LLVM language that does not require changing all of the transformations
   in LLVM when adding to the language (or the bitcode reader/writer, the
   parser, etc...).</p>

<p>Intrinsic function names must all start with an "<tt>llvm.</tt>" prefix. This
   prefix is reserved in LLVM for intrinsic names; thus, function names may not
   begin with this prefix.  Intrinsic functions must always be external
   functions: you cannot define the body of intrinsic functions.  Intrinsic
   functions may only be used in call or invoke instructions: it is illegal to
   take the address of an intrinsic function.  Additionally, because intrinsic
   functions are part of the LLVM language, it is required if any are added that
   they be documented here.</p>

<p>Some intrinsic functions can be overloaded, i.e., the intrinsic represents a
   family of functions that perform the same operation but on different data
   types. Because LLVM can represent over 8 million different integer types,
   overloading is used commonly to allow an intrinsic function to operate on any
   integer type. One or more of the argument types or the result type can be
   overloaded to accept any integer type. Argument types may also be defined as
   exactly matching a previous argument's type or the result type. This allows
   an intrinsic function which accepts multiple arguments, but needs all of them
   to be of the same type, to only be overloaded with respect to a single
   argument or the result.</p>

<p>Overloaded intrinsics will have the names of its overloaded argument types
   encoded into its function name, each preceded by a period. Only those types
   which are overloaded result in a name suffix. Arguments whose type is matched
   against another type do not. For example, the <tt>llvm.ctpop</tt> function
   can take an integer of any width and returns an integer of exactly the same
   integer width. This leads to a family of functions such as
   <tt>i8 @llvm.ctpop.i8(i8 %val)</tt> and <tt>i29 @llvm.ctpop.i29(i29
   %val)</tt>.  Only one type, the return type, is overloaded, and only one type
   suffix is required. Because the argument's type is matched against the return
   type, it does not require its own name suffix.</p>

<p>To learn how to add an intrinsic function, please see the
   <a href="ExtendingLLVM.html">Extending LLVM Guide</a>.</p>

<!-- ======================================================================= -->
<h3>
  <a name="int_varargs">Variable Argument Handling Intrinsics</a>
</h3>

<div>

<p>Variable argument support is defined in LLVM with
   the <a href="#i_va_arg"><tt>va_arg</tt></a> instruction and these three
   intrinsic functions.  These functions are related to the similarly named
   macros defined in the <tt>&lt;stdarg.h&gt;</tt> header file.</p>

<p>All of these functions operate on arguments that use a target-specific value
   type "<tt>va_list</tt>".  The LLVM assembly language reference manual does
   not define what this type is, so all transformations should be prepared to
   handle these functions regardless of the type used.</p>

<p>This example shows how the <a href="#i_va_arg"><tt>va_arg</tt></a>
   instruction and the variable argument handling intrinsic functions are
   used.</p>

<pre class="doc_code">
define i32 @test(i32 %X, ...) {
  ; Initialize variable argument processing
  %ap = alloca i8*
  %ap2 = bitcast i8** %ap to i8*
  call void @llvm.va_start(i8* %ap2)

  ; Read a single integer argument
  %tmp = va_arg i8** %ap, i32

  ; Demonstrate usage of llvm.va_copy and llvm.va_end
  %aq = alloca i8*
  %aq2 = bitcast i8** %aq to i8*
  call void @llvm.va_copy(i8* %aq2, i8* %ap2)
  call void @llvm.va_end(i8* %aq2)

  ; Stop processing of arguments.
  call void @llvm.va_end(i8* %ap2)
  ret i32 %tmp
}

declare void @llvm.va_start(i8*)
declare void @llvm.va_copy(i8*, i8*)
declare void @llvm.va_end(i8*)
</pre>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_va_start">'<tt>llvm.va_start</tt>' Intrinsic</a>
</h4>


<div>

<h5>Syntax:</h5>
<pre>
  declare void %llvm.va_start(i8* &lt;arglist&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.va_start</tt>' intrinsic initializes <tt>*&lt;arglist&gt;</tt>
   for subsequent use by <tt><a href="#i_va_arg">va_arg</a></tt>.</p>

<h5>Arguments:</h5>
<p>The argument is a pointer to a <tt>va_list</tt> element to initialize.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.va_start</tt>' intrinsic works just like the <tt>va_start</tt>
   macro available in C.  In a target-dependent way, it initializes
   the <tt>va_list</tt> element to which the argument points, so that the next
   call to <tt>va_arg</tt> will produce the first variable argument passed to
   the function.  Unlike the C <tt>va_start</tt> macro, this intrinsic does not
   need to know the last argument of the function as the compiler can figure
   that out.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
 <a name="int_va_end">'<tt>llvm.va_end</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.va_end(i8* &lt;arglist&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.va_end</tt>' intrinsic destroys <tt>*&lt;arglist&gt;</tt>,
   which has been initialized previously
   with <tt><a href="#int_va_start">llvm.va_start</a></tt>
   or <tt><a href="#i_va_copy">llvm.va_copy</a></tt>.</p>

<h5>Arguments:</h5>
<p>The argument is a pointer to a <tt>va_list</tt> to destroy.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.va_end</tt>' intrinsic works just like the <tt>va_end</tt>
   macro available in C.  In a target-dependent way, it destroys
   the <tt>va_list</tt> element to which the argument points.  Calls
   to <a href="#int_va_start"><tt>llvm.va_start</tt></a>
   and <a href="#int_va_copy"> <tt>llvm.va_copy</tt></a> must be matched exactly
   with calls to <tt>llvm.va_end</tt>.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_va_copy">'<tt>llvm.va_copy</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.va_copy(i8* &lt;destarglist&gt;, i8* &lt;srcarglist&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.va_copy</tt>' intrinsic copies the current argument position
   from the source argument list to the destination argument list.</p>

<h5>Arguments:</h5>
<p>The first argument is a pointer to a <tt>va_list</tt> element to initialize.
   The second argument is a pointer to a <tt>va_list</tt> element to copy
   from.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.va_copy</tt>' intrinsic works just like the <tt>va_copy</tt>
   macro available in C.  In a target-dependent way, it copies the
   source <tt>va_list</tt> element into the destination <tt>va_list</tt>
   element.  This intrinsic is necessary because
   the <tt><a href="#int_va_start"> llvm.va_start</a></tt> intrinsic may be
   arbitrarily complex and require, for example, memory allocation.</p>

</div>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_gc">Accurate Garbage Collection Intrinsics</a>
</h3>

<div>

<p>LLVM support for <a href="GarbageCollection.html">Accurate Garbage
Collection</a> (GC) requires the implementation and generation of these
intrinsics. These intrinsics allow identification of <a href="#int_gcroot">GC
roots on the stack</a>, as well as garbage collector implementations that
require <a href="#int_gcread">read</a> and <a href="#int_gcwrite">write</a>
barriers.  Front-ends for type-safe garbage collected languages should generate
these intrinsics to make use of the LLVM garbage collectors.  For more details,
see <a href="GarbageCollection.html">Accurate Garbage Collection with
LLVM</a>.</p>

<p>The garbage collection intrinsics only operate on objects in the generic
   address space (address space zero).</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_gcroot">'<tt>llvm.gcroot</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.gcroot(i8** %ptrloc, i8* %metadata)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.gcroot</tt>' intrinsic declares the existence of a GC root to
   the code generator, and allows some metadata to be associated with it.</p>

<h5>Arguments:</h5>
<p>The first argument specifies the address of a stack object that contains the
   root pointer.  The second pointer (which must be either a constant or a
   global value address) contains the meta-data to be associated with the
   root.</p>

<h5>Semantics:</h5>
<p>At runtime, a call to this intrinsic stores a null pointer into the "ptrloc"
   location.  At compile-time, the code generator generates information to allow
   the runtime to find the pointer at GC safe points. The '<tt>llvm.gcroot</tt>'
   intrinsic may only be used in a function which <a href="#gc">specifies a GC
   algorithm</a>.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_gcread">'<tt>llvm.gcread</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i8* @llvm.gcread(i8* %ObjPtr, i8** %Ptr)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.gcread</tt>' intrinsic identifies reads of references from heap
   locations, allowing garbage collector implementations that require read
   barriers.</p>

<h5>Arguments:</h5>
<p>The second argument is the address to read from, which should be an address
   allocated from the garbage collector.  The first object is a pointer to the
   start of the referenced object, if needed by the language runtime (otherwise
   null).</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.gcread</tt>' intrinsic has the same semantics as a load
   instruction, but may be replaced with substantially more complex code by the
   garbage collector runtime, as needed. The '<tt>llvm.gcread</tt>' intrinsic
   may only be used in a function which <a href="#gc">specifies a GC
   algorithm</a>.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_gcwrite">'<tt>llvm.gcwrite</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.gcwrite(i8* %P1, i8* %Obj, i8** %P2)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.gcwrite</tt>' intrinsic identifies writes of references to heap
   locations, allowing garbage collector implementations that require write
   barriers (such as generational or reference counting collectors).</p>

<h5>Arguments:</h5>
<p>The first argument is the reference to store, the second is the start of the
   object to store it to, and the third is the address of the field of Obj to
   store to.  If the runtime does not require a pointer to the object, Obj may
   be null.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.gcwrite</tt>' intrinsic has the same semantics as a store
   instruction, but may be replaced with substantially more complex code by the
   garbage collector runtime, as needed. The '<tt>llvm.gcwrite</tt>' intrinsic
   may only be used in a function which <a href="#gc">specifies a GC
   algorithm</a>.</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_codegen">Code Generator Intrinsics</a>
</h3>

<div>

<p>These intrinsics are provided by LLVM to expose special features that may
   only be implemented with code generator support.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_returnaddress">'<tt>llvm.returnaddress</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i8  *@llvm.returnaddress(i32 &lt;level&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.returnaddress</tt>' intrinsic attempts to compute a
   target-specific value indicating the return address of the current function
   or one of its callers.</p>

<h5>Arguments:</h5>
<p>The argument to this intrinsic indicates which function to return the address
   for.  Zero indicates the calling function, one indicates its caller, etc.
   The argument is <b>required</b> to be a constant integer value.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.returnaddress</tt>' intrinsic either returns a pointer
   indicating the return address of the specified call frame, or zero if it
   cannot be identified.  The value returned by this intrinsic is likely to be
   incorrect or 0 for arguments other than zero, so it should only be used for
   debugging purposes.</p>

<p>Note that calling this intrinsic does not prevent function inlining or other
   aggressive transformations, so the value returned may not be that of the
   obvious source-language caller.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_frameaddress">'<tt>llvm.frameaddress</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i8* @llvm.frameaddress(i32 &lt;level&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.frameaddress</tt>' intrinsic attempts to return the
   target-specific frame pointer value for the specified stack frame.</p>

<h5>Arguments:</h5>
<p>The argument to this intrinsic indicates which function to return the frame
   pointer for.  Zero indicates the calling function, one indicates its caller,
   etc.  The argument is <b>required</b> to be a constant integer value.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.frameaddress</tt>' intrinsic either returns a pointer
   indicating the frame address of the specified call frame, or zero if it
   cannot be identified.  The value returned by this intrinsic is likely to be
   incorrect or 0 for arguments other than zero, so it should only be used for
   debugging purposes.</p>

<p>Note that calling this intrinsic does not prevent function inlining or other
   aggressive transformations, so the value returned may not be that of the
   obvious source-language caller.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_stacksave">'<tt>llvm.stacksave</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i8* @llvm.stacksave()
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.stacksave</tt>' intrinsic is used to remember the current state
   of the function stack, for use
   with <a href="#int_stackrestore"> <tt>llvm.stackrestore</tt></a>.  This is
   useful for implementing language features like scoped automatic variable
   sized arrays in C99.</p>

<h5>Semantics:</h5>
<p>This intrinsic returns a opaque pointer value that can be passed
   to <a href="#int_stackrestore"><tt>llvm.stackrestore</tt></a>.  When
   an <tt>llvm.stackrestore</tt> intrinsic is executed with a value saved
   from <tt>llvm.stacksave</tt>, it effectively restores the state of the stack
   to the state it was in when the <tt>llvm.stacksave</tt> intrinsic executed.
   In practice, this pops any <a href="#i_alloca">alloca</a> blocks from the
   stack that were allocated after the <tt>llvm.stacksave</tt> was executed.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_stackrestore">'<tt>llvm.stackrestore</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.stackrestore(i8* %ptr)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.stackrestore</tt>' intrinsic is used to restore the state of
   the function stack to the state it was in when the
   corresponding <a href="#int_stacksave"><tt>llvm.stacksave</tt></a> intrinsic
   executed.  This is useful for implementing language features like scoped
   automatic variable sized arrays in C99.</p>

<h5>Semantics:</h5>
<p>See the description
   for <a href="#int_stacksave"><tt>llvm.stacksave</tt></a>.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_prefetch">'<tt>llvm.prefetch</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.prefetch(i8* &lt;address&gt;, i32 &lt;rw&gt;, i32 &lt;locality&gt;, i32 &lt;cache type&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.prefetch</tt>' intrinsic is a hint to the code generator to
   insert a prefetch instruction if supported; otherwise, it is a noop.
   Prefetches have no effect on the behavior of the program but can change its
   performance characteristics.</p>

<h5>Arguments:</h5>
<p><tt>address</tt> is the address to be prefetched, <tt>rw</tt> is the
   specifier determining if the fetch should be for a read (0) or write (1),
   and <tt>locality</tt> is a temporal locality specifier ranging from (0) - no
   locality, to (3) - extremely local keep in cache. The <tt>cache type</tt>
   specifies whether the prefetch is performed on the data (1) or instruction (0)
   cache. The <tt>rw</tt>, <tt>locality</tt> and <tt>cache type</tt> arguments
   must be constant integers.</p>

<h5>Semantics:</h5>
<p>This intrinsic does not modify the behavior of the program.  In particular,
   prefetches cannot trap and do not produce a value.  On targets that support
   this intrinsic, the prefetch can provide hints to the processor cache for
   better performance.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_pcmarker">'<tt>llvm.pcmarker</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.pcmarker(i32 &lt;id&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.pcmarker</tt>' intrinsic is a method to export a Program
   Counter (PC) in a region of code to simulators and other tools.  The method
   is target specific, but it is expected that the marker will use exported
   symbols to transmit the PC of the marker.  The marker makes no guarantees
   that it will remain with any specific instruction after optimizations.  It is
   possible that the presence of a marker will inhibit optimizations.  The
   intended use is to be inserted after optimizations to allow correlations of
   simulation runs.</p>

<h5>Arguments:</h5>
<p><tt>id</tt> is a numerical id identifying the marker.</p>

<h5>Semantics:</h5>
<p>This intrinsic does not modify the behavior of the program.  Backends that do
   not support this intrinsic may ignore it.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_readcyclecounter">'<tt>llvm.readcyclecounter</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i64 @llvm.readcyclecounter()
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.readcyclecounter</tt>' intrinsic provides access to the cycle
   counter register (or similar low latency, high accuracy clocks) on those
   targets that support it.  On X86, it should map to RDTSC.  On Alpha, it
   should map to RPCC.  As the backing counters overflow quickly (on the order
   of 9 seconds on alpha), this should only be used for small timings.</p>

<h5>Semantics:</h5>
<p>When directly supported, reading the cycle counter should not modify any
   memory.  Implementations are allowed to either return a application specific
   value or a system wide value.  On backends without support, this is lowered
   to a constant 0.</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_libc">Standard C Library Intrinsics</a>
</h3>

<div>

<p>LLVM provides intrinsics for a few important standard C library functions.
   These intrinsics allow source-language front-ends to pass information about
   the alignment of the pointer arguments to the code generator, providing
   opportunity for more efficient code generation.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_memcpy">'<tt>llvm.memcpy</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.memcpy</tt> on any
   integer bit width and for different address spaces. Not all targets support
   all bit widths however.</p>

<pre>
  declare void @llvm.memcpy.p0i8.p0i8.i32(i8* &lt;dest&gt;, i8* &lt;src&gt;,
                                          i32 &lt;len&gt;, i32 &lt;align&gt;, i1 &lt;isvolatile&gt;)
  declare void @llvm.memcpy.p0i8.p0i8.i64(i8* &lt;dest&gt;, i8* &lt;src&gt;,
                                          i64 &lt;len&gt;, i32 &lt;align&gt;, i1 &lt;isvolatile&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.memcpy.*</tt>' intrinsics copy a block of memory from the
   source location to the destination location.</p>

<p>Note that, unlike the standard libc function, the <tt>llvm.memcpy.*</tt>
   intrinsics do not return a value, takes extra alignment/isvolatile arguments
   and the pointers can be in specified address spaces.</p>

<h5>Arguments:</h5>

<p>The first argument is a pointer to the destination, the second is a pointer
   to the source.  The third argument is an integer argument specifying the
   number of bytes to copy, the fourth argument is the alignment of the
   source and destination locations, and the fifth is a boolean indicating a
   volatile access.</p>

<p>If the call to this intrinsic has an alignment value that is not 0 or 1,
   then the caller guarantees that both the source and destination pointers are
   aligned to that boundary.</p>

<p>If the <tt>isvolatile</tt> parameter is <tt>true</tt>, the
   <tt>llvm.memcpy</tt> call is a <a href="#volatile">volatile operation</a>.
   The detailed access behavior is not very cleanly specified and it is unwise
   to depend on it.</p>

<h5>Semantics:</h5>

<p>The '<tt>llvm.memcpy.*</tt>' intrinsics copy a block of memory from the
   source location to the destination location, which are not allowed to
   overlap.  It copies "len" bytes of memory over.  If the argument is known to
   be aligned to some boundary, this can be specified as the fourth argument,
   otherwise it should be set to 0 or 1.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_memmove">'<tt>llvm.memmove</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use llvm.memmove on any integer bit
   width and for different address space. Not all targets support all bit
   widths however.</p>

<pre>
  declare void @llvm.memmove.p0i8.p0i8.i32(i8* &lt;dest&gt;, i8* &lt;src&gt;,
                                           i32 &lt;len&gt;, i32 &lt;align&gt;, i1 &lt;isvolatile&gt;)
  declare void @llvm.memmove.p0i8.p0i8.i64(i8* &lt;dest&gt;, i8* &lt;src&gt;,
                                           i64 &lt;len&gt;, i32 &lt;align&gt;, i1 &lt;isvolatile&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.memmove.*</tt>' intrinsics move a block of memory from the
   source location to the destination location. It is similar to the
   '<tt>llvm.memcpy</tt>' intrinsic but allows the two memory locations to
   overlap.</p>

<p>Note that, unlike the standard libc function, the <tt>llvm.memmove.*</tt>
   intrinsics do not return a value, takes extra alignment/isvolatile arguments
   and the pointers can be in specified address spaces.</p>

<h5>Arguments:</h5>

<p>The first argument is a pointer to the destination, the second is a pointer
   to the source.  The third argument is an integer argument specifying the
   number of bytes to copy, the fourth argument is the alignment of the
   source and destination locations, and the fifth is a boolean indicating a
   volatile access.</p>

<p>If the call to this intrinsic has an alignment value that is not 0 or 1,
   then the caller guarantees that the source and destination pointers are
   aligned to that boundary.</p>

<p>If the <tt>isvolatile</tt> parameter is <tt>true</tt>, the
   <tt>llvm.memmove</tt> call is a <a href="#volatile">volatile operation</a>.
   The detailed access behavior is not very cleanly specified and it is unwise
   to depend on it.</p>

<h5>Semantics:</h5>

<p>The '<tt>llvm.memmove.*</tt>' intrinsics copy a block of memory from the
   source location to the destination location, which may overlap.  It copies
   "len" bytes of memory over.  If the argument is known to be aligned to some
   boundary, this can be specified as the fourth argument, otherwise it should
   be set to 0 or 1.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_memset">'<tt>llvm.memset.*</tt>' Intrinsics</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use llvm.memset on any integer bit
   width and for different address spaces. However, not all targets support all
   bit widths.</p>

<pre>
  declare void @llvm.memset.p0i8.i32(i8* &lt;dest&gt;, i8 &lt;val&gt;,
                                     i32 &lt;len&gt;, i32 &lt;align&gt;, i1 &lt;isvolatile&gt;)
  declare void @llvm.memset.p0i8.i64(i8* &lt;dest&gt;, i8 &lt;val&gt;,
                                     i64 &lt;len&gt;, i32 &lt;align&gt;, i1 &lt;isvolatile&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.memset.*</tt>' intrinsics fill a block of memory with a
   particular byte value.</p>

<p>Note that, unlike the standard libc function, the <tt>llvm.memset</tt>
   intrinsic does not return a value and takes extra alignment/volatile
   arguments.  Also, the destination can be in an arbitrary address space.</p>

<h5>Arguments:</h5>
<p>The first argument is a pointer to the destination to fill, the second is the
   byte value with which to fill it, the third argument is an integer argument
   specifying the number of bytes to fill, and the fourth argument is the known
   alignment of the destination location.</p>

<p>If the call to this intrinsic has an alignment value that is not 0 or 1,
   then the caller guarantees that the destination pointer is aligned to that
   boundary.</p>

<p>If the <tt>isvolatile</tt> parameter is <tt>true</tt>, the
   <tt>llvm.memset</tt> call is a <a href="#volatile">volatile operation</a>.
   The detailed access behavior is not very cleanly specified and it is unwise
   to depend on it.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.memset.*</tt>' intrinsics fill "len" bytes of memory starting
   at the destination location.  If the argument is known to be aligned to some
   boundary, this can be specified as the fourth argument, otherwise it should
   be set to 0 or 1.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_sqrt">'<tt>llvm.sqrt.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.sqrt</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.sqrt.f32(float %Val)
  declare double    @llvm.sqrt.f64(double %Val)
  declare x86_fp80  @llvm.sqrt.f80(x86_fp80 %Val)
  declare fp128     @llvm.sqrt.f128(fp128 %Val)
  declare ppc_fp128 @llvm.sqrt.ppcf128(ppc_fp128 %Val)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.sqrt</tt>' intrinsics return the sqrt of the specified operand,
   returning the same value as the libm '<tt>sqrt</tt>' functions would.
   Unlike <tt>sqrt</tt> in libm, however, <tt>llvm.sqrt</tt> has undefined
   behavior for negative numbers other than -0.0 (which allows for better
   optimization, because there is no need to worry about errno being
   set).  <tt>llvm.sqrt(-0.0)</tt> is defined to return -0.0 like IEEE sqrt.</p>

<h5>Arguments:</h5>
<p>The argument and return value are floating point numbers of the same
   type.</p>

<h5>Semantics:</h5>
<p>This function returns the sqrt of the specified operand if it is a
   nonnegative floating point number.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_powi">'<tt>llvm.powi.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.powi</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.powi.f32(float  %Val, i32 %power)
  declare double    @llvm.powi.f64(double %Val, i32 %power)
  declare x86_fp80  @llvm.powi.f80(x86_fp80  %Val, i32 %power)
  declare fp128     @llvm.powi.f128(fp128 %Val, i32 %power)
  declare ppc_fp128 @llvm.powi.ppcf128(ppc_fp128  %Val, i32 %power)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.powi.*</tt>' intrinsics return the first operand raised to the
   specified (positive or negative) power.  The order of evaluation of
   multiplications is not defined.  When a vector of floating point type is
   used, the second argument remains a scalar integer value.</p>

<h5>Arguments:</h5>
<p>The second argument is an integer power, and the first is a value to raise to
   that power.</p>

<h5>Semantics:</h5>
<p>This function returns the first value raised to the second power with an
   unspecified sequence of rounding operations.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_sin">'<tt>llvm.sin.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.sin</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.sin.f32(float  %Val)
  declare double    @llvm.sin.f64(double %Val)
  declare x86_fp80  @llvm.sin.f80(x86_fp80  %Val)
  declare fp128     @llvm.sin.f128(fp128 %Val)
  declare ppc_fp128 @llvm.sin.ppcf128(ppc_fp128  %Val)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.sin.*</tt>' intrinsics return the sine of the operand.</p>

<h5>Arguments:</h5>
<p>The argument and return value are floating point numbers of the same
   type.</p>

<h5>Semantics:</h5>
<p>This function returns the sine of the specified operand, returning the same
   values as the libm <tt>sin</tt> functions would, and handles error conditions
   in the same way.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_cos">'<tt>llvm.cos.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.cos</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.cos.f32(float  %Val)
  declare double    @llvm.cos.f64(double %Val)
  declare x86_fp80  @llvm.cos.f80(x86_fp80  %Val)
  declare fp128     @llvm.cos.f128(fp128 %Val)
  declare ppc_fp128 @llvm.cos.ppcf128(ppc_fp128  %Val)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.cos.*</tt>' intrinsics return the cosine of the operand.</p>

<h5>Arguments:</h5>
<p>The argument and return value are floating point numbers of the same
   type.</p>

<h5>Semantics:</h5>
<p>This function returns the cosine of the specified operand, returning the same
   values as the libm <tt>cos</tt> functions would, and handles error conditions
   in the same way.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_pow">'<tt>llvm.pow.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.pow</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.pow.f32(float  %Val, float %Power)
  declare double    @llvm.pow.f64(double %Val, double %Power)
  declare x86_fp80  @llvm.pow.f80(x86_fp80  %Val, x86_fp80 %Power)
  declare fp128     @llvm.pow.f128(fp128 %Val, fp128 %Power)
  declare ppc_fp128 @llvm.pow.ppcf128(ppc_fp128  %Val, ppc_fp128 Power)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.pow.*</tt>' intrinsics return the first operand raised to the
   specified (positive or negative) power.</p>

<h5>Arguments:</h5>
<p>The second argument is a floating point power, and the first is a value to
   raise to that power.</p>

<h5>Semantics:</h5>
<p>This function returns the first value raised to the second power, returning
   the same values as the libm <tt>pow</tt> functions would, and handles error
   conditions in the same way.</p>

</div>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_exp">'<tt>llvm.exp.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.exp</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.exp.f32(float  %Val)
  declare double    @llvm.exp.f64(double %Val)
  declare x86_fp80  @llvm.exp.f80(x86_fp80  %Val)
  declare fp128     @llvm.exp.f128(fp128 %Val)
  declare ppc_fp128 @llvm.exp.ppcf128(ppc_fp128  %Val)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.exp.*</tt>' intrinsics perform the exp function.</p>

<h5>Arguments:</h5>
<p>The argument and return value are floating point numbers of the same
   type.</p>

<h5>Semantics:</h5>
<p>This function returns the same values as the libm <tt>exp</tt> functions
   would, and handles error conditions in the same way.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_log">'<tt>llvm.log.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.log</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.log.f32(float  %Val)
  declare double    @llvm.log.f64(double %Val)
  declare x86_fp80  @llvm.log.f80(x86_fp80  %Val)
  declare fp128     @llvm.log.f128(fp128 %Val)
  declare ppc_fp128 @llvm.log.ppcf128(ppc_fp128  %Val)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.log.*</tt>' intrinsics perform the log function.</p>

<h5>Arguments:</h5>
<p>The argument and return value are floating point numbers of the same
   type.</p>

<h5>Semantics:</h5>
<p>This function returns the same values as the libm <tt>log</tt> functions
   would, and handles error conditions in the same way.</p>

<h4>
  <a name="int_fma">'<tt>llvm.fma.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.fma</tt> on any
   floating point or vector of floating point type. Not all targets support all
   types however.</p>

<pre>
  declare float     @llvm.fma.f32(float  %a, float  %b, float  %c)
  declare double    @llvm.fma.f64(double %a, double %b, double %c)
  declare x86_fp80  @llvm.fma.f80(x86_fp80 %a, x86_fp80 %b, x86_fp80 %c)
  declare fp128     @llvm.fma.f128(fp128 %a, fp128 %b, fp128 %c)
  declare ppc_fp128 @llvm.fma.ppcf128(ppc_fp128 %a, ppc_fp128 %b, ppc_fp128 %c)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.fma.*</tt>' intrinsics perform the fused multiply-add
   operation.</p>

<h5>Arguments:</h5>
<p>The argument and return value are floating point numbers of the same
   type.</p>

<h5>Semantics:</h5>
<p>This function returns the same values as the libm <tt>fma</tt> functions
   would.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_manip">Bit Manipulation Intrinsics</a>
</h3>

<div>

<p>LLVM provides intrinsics for a few important bit manipulation operations.
   These allow efficient code generation for some algorithms.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_bswap">'<tt>llvm.bswap.*</tt>' Intrinsics</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic function. You can use bswap on any integer
   type that is an even number of bytes (i.e. BitWidth % 16 == 0).</p>

<pre>
  declare i16 @llvm.bswap.i16(i16 &lt;id&gt;)
  declare i32 @llvm.bswap.i32(i32 &lt;id&gt;)
  declare i64 @llvm.bswap.i64(i64 &lt;id&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.bswap</tt>' family of intrinsics is used to byte swap integer
   values with an even number of bytes (positive multiple of 16 bits).  These
   are useful for performing operations on data that is not in the target's
   native byte order.</p>

<h5>Semantics:</h5>
<p>The <tt>llvm.bswap.i16</tt> intrinsic returns an i16 value that has the high
   and low byte of the input i16 swapped.  Similarly,
   the <tt>llvm.bswap.i32</tt> intrinsic returns an i32 value that has the four
   bytes of the input i32 swapped, so that if the input bytes are numbered 0, 1,
   2, 3 then the returned i32 will have its bytes in 3, 2, 1, 0 order.
   The <tt>llvm.bswap.i48</tt>, <tt>llvm.bswap.i64</tt> and other intrinsics
   extend this concept to additional even-byte lengths (6 bytes, 8 bytes and
   more, respectively).</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_ctpop">'<tt>llvm.ctpop.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use llvm.ctpop on any integer bit
   width, or on any vector with integer elements. Not all targets support all
  bit widths or vector types, however.</p>

<pre>
  declare i8 @llvm.ctpop.i8(i8  &lt;src&gt;)
  declare i16 @llvm.ctpop.i16(i16 &lt;src&gt;)
  declare i32 @llvm.ctpop.i32(i32 &lt;src&gt;)
  declare i64 @llvm.ctpop.i64(i64 &lt;src&gt;)
  declare i256 @llvm.ctpop.i256(i256 &lt;src&gt;)
  declare &lt;2 x i32&gt; @llvm.ctpop.v2i32(&lt;2 x i32&gt; &lt;src&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.ctpop</tt>' family of intrinsics counts the number of bits set
   in a value.</p>

<h5>Arguments:</h5>
<p>The only argument is the value to be counted.  The argument may be of any
   integer type, or a vector with integer elements.
   The return type must match the argument type.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.ctpop</tt>' intrinsic counts the 1's in a variable, or within each
   element of a vector.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_ctlz">'<tt>llvm.ctlz.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.ctlz</tt> on any
   integer bit width, or any vector whose elements are integers. Not all
   targets support all bit widths or vector types, however.</p>

<pre>
  declare i8 @llvm.ctlz.i8 (i8  &lt;src&gt;)
  declare i16 @llvm.ctlz.i16(i16 &lt;src&gt;)
  declare i32 @llvm.ctlz.i32(i32 &lt;src&gt;)
  declare i64 @llvm.ctlz.i64(i64 &lt;src&gt;)
  declare i256 @llvm.ctlz.i256(i256 &lt;src&gt;)
  declare &lt;2 x i32&gt; @llvm.ctlz.v2i32(&lt;2 x i32&gt; &lt;src;gt)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.ctlz</tt>' family of intrinsic functions counts the number of
   leading zeros in a variable.</p>

<h5>Arguments:</h5>
<p>The only argument is the value to be counted.  The argument may be of any
   integer type, or any vector type with integer element type.
   The return type must match the argument type.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.ctlz</tt>' intrinsic counts the leading (most significant)
   zeros in a variable, or within each element of the vector if the operation
   is of vector type.  If the src == 0 then the result is the size in bits of
   the type of src. For example, <tt>llvm.ctlz(i32 2) = 30</tt>.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_cttz">'<tt>llvm.cttz.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.cttz</tt> on any
   integer bit width, or any vector of integer elements. Not all targets
   support all bit widths or vector types, however.</p>

<pre>
  declare i8 @llvm.cttz.i8 (i8  &lt;src&gt;)
  declare i16 @llvm.cttz.i16(i16 &lt;src&gt;)
  declare i32 @llvm.cttz.i32(i32 &lt;src&gt;)
  declare i64 @llvm.cttz.i64(i64 &lt;src&gt;)
  declare i256 @llvm.cttz.i256(i256 &lt;src&gt;)
  declase &lt;2 x i32&gt; @llvm.cttz.v2i32(&lt;2 x i32&gt; &lt;src&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.cttz</tt>' family of intrinsic functions counts the number of
   trailing zeros.</p>

<h5>Arguments:</h5>
<p>The only argument is the value to be counted.  The argument may be of any
   integer type, or a vectory with integer element type..  The return type
   must match the argument type.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.cttz</tt>' intrinsic counts the trailing (least significant)
   zeros in a variable, or within each element of a vector.
   If the src == 0 then the result is the size in bits of
   the type of src.  For example, <tt>llvm.cttz(2) = 1</tt>.</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_overflow">Arithmetic with Overflow Intrinsics</a>
</h3>

<div>

<p>LLVM provides intrinsics for some arithmetic with overflow operations.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_sadd_overflow">
    '<tt>llvm.sadd.with.overflow.*</tt>' Intrinsics
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.sadd.with.overflow</tt>
   on any integer bit width.</p>

<pre>
  declare {i16, i1} @llvm.sadd.with.overflow.i16(i16 %a, i16 %b)
  declare {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %b)
  declare {i64, i1} @llvm.sadd.with.overflow.i64(i64 %a, i64 %b)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.sadd.with.overflow</tt>' family of intrinsic functions perform
   a signed addition of the two arguments, and indicate whether an overflow
   occurred during the signed summation.</p>

<h5>Arguments:</h5>
<p>The arguments (%a and %b) and the first element of the result structure may
   be of integer types of any bit width, but they must have the same bit
   width. The second element of the result structure must be of
   type <tt>i1</tt>. <tt>%a</tt> and <tt>%b</tt> are the two values that will
   undergo signed addition.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.sadd.with.overflow</tt>' family of intrinsic functions perform
   a signed addition of the two variables. They return a structure &mdash; the
   first element of which is the signed summation, and the second element of
   which is a bit specifying if the signed summation resulted in an
   overflow.</p>

<h5>Examples:</h5>
<pre>
  %res = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %b)
  %sum = extractvalue {i32, i1} %res, 0
  %obit = extractvalue {i32, i1} %res, 1
  br i1 %obit, label %overflow, label %normal
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_uadd_overflow">
    '<tt>llvm.uadd.with.overflow.*</tt>' Intrinsics
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.uadd.with.overflow</tt>
   on any integer bit width.</p>

<pre>
  declare {i16, i1} @llvm.uadd.with.overflow.i16(i16 %a, i16 %b)
  declare {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 %b)
  declare {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 %b)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.uadd.with.overflow</tt>' family of intrinsic functions perform
   an unsigned addition of the two arguments, and indicate whether a carry
   occurred during the unsigned summation.</p>

<h5>Arguments:</h5>
<p>The arguments (%a and %b) and the first element of the result structure may
   be of integer types of any bit width, but they must have the same bit
   width. The second element of the result structure must be of
   type <tt>i1</tt>. <tt>%a</tt> and <tt>%b</tt> are the two values that will
   undergo unsigned addition.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.uadd.with.overflow</tt>' family of intrinsic functions perform
   an unsigned addition of the two arguments. They return a structure &mdash;
   the first element of which is the sum, and the second element of which is a
   bit specifying if the unsigned summation resulted in a carry.</p>

<h5>Examples:</h5>
<pre>
  %res = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 %b)
  %sum = extractvalue {i32, i1} %res, 0
  %obit = extractvalue {i32, i1} %res, 1
  br i1 %obit, label %carry, label %normal
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_ssub_overflow">
    '<tt>llvm.ssub.with.overflow.*</tt>' Intrinsics
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.ssub.with.overflow</tt>
   on any integer bit width.</p>

<pre>
  declare {i16, i1} @llvm.ssub.with.overflow.i16(i16 %a, i16 %b)
  declare {i32, i1} @llvm.ssub.with.overflow.i32(i32 %a, i32 %b)
  declare {i64, i1} @llvm.ssub.with.overflow.i64(i64 %a, i64 %b)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.ssub.with.overflow</tt>' family of intrinsic functions perform
   a signed subtraction of the two arguments, and indicate whether an overflow
   occurred during the signed subtraction.</p>

<h5>Arguments:</h5>
<p>The arguments (%a and %b) and the first element of the result structure may
   be of integer types of any bit width, but they must have the same bit
   width. The second element of the result structure must be of
   type <tt>i1</tt>. <tt>%a</tt> and <tt>%b</tt> are the two values that will
   undergo signed subtraction.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.ssub.with.overflow</tt>' family of intrinsic functions perform
   a signed subtraction of the two arguments. They return a structure &mdash;
   the first element of which is the subtraction, and the second element of
   which is a bit specifying if the signed subtraction resulted in an
   overflow.</p>

<h5>Examples:</h5>
<pre>
  %res = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %a, i32 %b)
  %sum = extractvalue {i32, i1} %res, 0
  %obit = extractvalue {i32, i1} %res, 1
  br i1 %obit, label %overflow, label %normal
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_usub_overflow">
    '<tt>llvm.usub.with.overflow.*</tt>' Intrinsics
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.usub.with.overflow</tt>
   on any integer bit width.</p>

<pre>
  declare {i16, i1} @llvm.usub.with.overflow.i16(i16 %a, i16 %b)
  declare {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 %b)
  declare {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 %b)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.usub.with.overflow</tt>' family of intrinsic functions perform
   an unsigned subtraction of the two arguments, and indicate whether an
   overflow occurred during the unsigned subtraction.</p>

<h5>Arguments:</h5>
<p>The arguments (%a and %b) and the first element of the result structure may
   be of integer types of any bit width, but they must have the same bit
   width. The second element of the result structure must be of
   type <tt>i1</tt>. <tt>%a</tt> and <tt>%b</tt> are the two values that will
   undergo unsigned subtraction.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.usub.with.overflow</tt>' family of intrinsic functions perform
   an unsigned subtraction of the two arguments. They return a structure &mdash;
   the first element of which is the subtraction, and the second element of
   which is a bit specifying if the unsigned subtraction resulted in an
   overflow.</p>

<h5>Examples:</h5>
<pre>
  %res = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 %b)
  %sum = extractvalue {i32, i1} %res, 0
  %obit = extractvalue {i32, i1} %res, 1
  br i1 %obit, label %overflow, label %normal
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_smul_overflow">
    '<tt>llvm.smul.with.overflow.*</tt>' Intrinsics
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.smul.with.overflow</tt>
   on any integer bit width.</p>

<pre>
  declare {i16, i1} @llvm.smul.with.overflow.i16(i16 %a, i16 %b)
  declare {i32, i1} @llvm.smul.with.overflow.i32(i32 %a, i32 %b)
  declare {i64, i1} @llvm.smul.with.overflow.i64(i64 %a, i64 %b)
</pre>

<h5>Overview:</h5>

<p>The '<tt>llvm.smul.with.overflow</tt>' family of intrinsic functions perform
   a signed multiplication of the two arguments, and indicate whether an
   overflow occurred during the signed multiplication.</p>

<h5>Arguments:</h5>
<p>The arguments (%a and %b) and the first element of the result structure may
   be of integer types of any bit width, but they must have the same bit
   width. The second element of the result structure must be of
   type <tt>i1</tt>. <tt>%a</tt> and <tt>%b</tt> are the two values that will
   undergo signed multiplication.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.smul.with.overflow</tt>' family of intrinsic functions perform
   a signed multiplication of the two arguments. They return a structure &mdash;
   the first element of which is the multiplication, and the second element of
   which is a bit specifying if the signed multiplication resulted in an
   overflow.</p>

<h5>Examples:</h5>
<pre>
  %res = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %a, i32 %b)
  %sum = extractvalue {i32, i1} %res, 0
  %obit = extractvalue {i32, i1} %res, 1
  br i1 %obit, label %overflow, label %normal
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_umul_overflow">
    '<tt>llvm.umul.with.overflow.*</tt>' Intrinsics
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.umul.with.overflow</tt>
   on any integer bit width.</p>

<pre>
  declare {i16, i1} @llvm.umul.with.overflow.i16(i16 %a, i16 %b)
  declare {i32, i1} @llvm.umul.with.overflow.i32(i32 %a, i32 %b)
  declare {i64, i1} @llvm.umul.with.overflow.i64(i64 %a, i64 %b)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.umul.with.overflow</tt>' family of intrinsic functions perform
   a unsigned multiplication of the two arguments, and indicate whether an
   overflow occurred during the unsigned multiplication.</p>

<h5>Arguments:</h5>
<p>The arguments (%a and %b) and the first element of the result structure may
   be of integer types of any bit width, but they must have the same bit
   width. The second element of the result structure must be of
   type <tt>i1</tt>. <tt>%a</tt> and <tt>%b</tt> are the two values that will
   undergo unsigned multiplication.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.umul.with.overflow</tt>' family of intrinsic functions perform
   an unsigned multiplication of the two arguments. They return a structure
   &mdash; the first element of which is the multiplication, and the second
   element of which is a bit specifying if the unsigned multiplication resulted
   in an overflow.</p>

<h5>Examples:</h5>
<pre>
  %res = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %a, i32 %b)
  %sum = extractvalue {i32, i1} %res, 0
  %obit = extractvalue {i32, i1} %res, 1
  br i1 %obit, label %overflow, label %normal
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_fp16">Half Precision Floating Point Intrinsics</a>
</h3>

<div>

<p>Half precision floating point is a storage-only format. This means that it is
   a dense encoding (in memory) but does not support computation in the
   format.</p>
   
<p>This means that code must first load the half-precision floating point
   value as an i16, then convert it to float with <a
   href="#int_convert_from_fp16"><tt>llvm.convert.from.fp16</tt></a>.
   Computation can then be performed on the float value (including extending to
   double etc).  To store the value back to memory, it is first converted to
   float if needed, then converted to i16 with
   <a href="#int_convert_to_fp16"><tt>llvm.convert.to.fp16</tt></a>, then
   storing as an i16 value.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_convert_to_fp16">
    '<tt>llvm.convert.to.fp16</tt>' Intrinsic
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i16 @llvm.convert.to.fp16(f32 %a)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.convert.to.fp16</tt>' intrinsic function performs
   a conversion from single precision floating point format to half precision
   floating point format.</p>

<h5>Arguments:</h5>
<p>The intrinsic function contains single argument - the value to be
   converted.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.convert.to.fp16</tt>' intrinsic function performs
   a conversion from single precision floating point format to half precision
   floating point format. The return value is an <tt>i16</tt> which
   contains the converted number.</p>

<h5>Examples:</h5>
<pre>
  %res = call i16 @llvm.convert.to.fp16(f32 %a)
  store i16 %res, i16* @x, align 2
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_convert_from_fp16">
    '<tt>llvm.convert.from.fp16</tt>' Intrinsic
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare f32 @llvm.convert.from.fp16(i16 %a)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.convert.from.fp16</tt>' intrinsic function performs
   a conversion from half precision floating point format to single precision
   floating point format.</p>

<h5>Arguments:</h5>
<p>The intrinsic function contains single argument - the value to be
   converted.</p>

<h5>Semantics:</h5>
<p>The '<tt>llvm.convert.from.fp16</tt>' intrinsic function performs a
   conversion from half single precision floating point format to single
   precision floating point format. The input half-float value is represented by
   an <tt>i16</tt> value.</p>

<h5>Examples:</h5>
<pre>
  %a = load i16* @x, align 2
  %res = call f32 @llvm.convert.from.fp16(i16 %a)
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_debugger">Debugger Intrinsics</a>
</h3>

<div>

<p>The LLVM debugger intrinsics (which all start with <tt>llvm.dbg.</tt>
   prefix), are described in
   the <a href="SourceLevelDebugging.html#format_common_intrinsics">LLVM Source
   Level Debugging</a> document.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_eh">Exception Handling Intrinsics</a>
</h3>

<div>

<p>The LLVM exception handling intrinsics (which all start with
   <tt>llvm.eh.</tt> prefix), are described in
   the <a href="ExceptionHandling.html#format_common_intrinsics">LLVM Exception
   Handling</a> document.</p>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_trampoline">Trampoline Intrinsics</a>
</h3>

<div>

<p>These intrinsics make it possible to excise one parameter, marked with
   the <a href="#nest"><tt>nest</tt></a> attribute, from a function.
   The result is a callable
   function pointer lacking the nest parameter - the caller does not need to
   provide a value for it.  Instead, the value to use is stored in advance in a
   "trampoline", a block of memory usually allocated on the stack, which also
   contains code to splice the nest value into the argument list.  This is used
   to implement the GCC nested function address extension.</p>

<p>For example, if the function is
   <tt>i32 f(i8* nest %c, i32 %x, i32 %y)</tt> then the resulting function
   pointer has signature <tt>i32 (i32, i32)*</tt>.  It can be created as
   follows:</p>

<pre class="doc_code">
  %tramp = alloca [10 x i8], align 4 ; size and alignment only correct for X86
  %tramp1 = getelementptr [10 x i8]* %tramp, i32 0, i32 0
  call i8* @llvm.init.trampoline(i8* %tramp1, i8* bitcast (i32 (i8*, i32, i32)* @f to i8*), i8* %nval)
  %p = call i8* @llvm.adjust.trampoline(i8* %tramp1)
  %fp = bitcast i8* %p to i32 (i32, i32)*
</pre>

<p>The call <tt>%val = call i32 %fp(i32 %x, i32 %y)</tt> is then equivalent
   to <tt>%val = call i32 %f(i8* %nval, i32 %x, i32 %y)</tt>.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_it">
    '<tt>llvm.init.trampoline</tt>' Intrinsic
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.init.trampoline(i8* &lt;tramp&gt;, i8* &lt;func&gt;, i8* &lt;nval&gt;)
</pre>

<h5>Overview:</h5>
<p>This fills the memory pointed to by <tt>tramp</tt> with executable code,
   turning it into a trampoline.</p>

<h5>Arguments:</h5>
<p>The <tt>llvm.init.trampoline</tt> intrinsic takes three arguments, all
   pointers.  The <tt>tramp</tt> argument must point to a sufficiently large and
   sufficiently aligned block of memory; this memory is written to by the
   intrinsic.  Note that the size and the alignment are target-specific - LLVM
   currently provides no portable way of determining them, so a front-end that
   generates this intrinsic needs to have some target-specific knowledge.
   The <tt>func</tt> argument must hold a function bitcast to
   an <tt>i8*</tt>.</p>

<h5>Semantics:</h5>
<p>The block of memory pointed to by <tt>tramp</tt> is filled with target
   dependent code, turning it into a function.  Then <tt>tramp</tt> needs to be
   passed to <a href="#int_at">llvm.adjust.trampoline</a> to get a pointer
   which can be <a href="#int_trampoline">bitcast (to a new function) and
   called</a>.  The new function's signature is the same as that of
   <tt>func</tt> with any arguments marked with the <tt>nest</tt> attribute
   removed.  At most one such <tt>nest</tt> argument is allowed, and it must be of
   pointer type.  Calling the new function is equivalent to calling <tt>func</tt>
   with the same argument list, but with <tt>nval</tt> used for the missing
   <tt>nest</tt> argument.  If, after calling <tt>llvm.init.trampoline</tt>, the
   memory pointed to by <tt>tramp</tt> is modified, then the effect of any later call
   to the returned function pointer is undefined.</p>
</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_at">
    '<tt>llvm.adjust.trampoline</tt>' Intrinsic
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i8* @llvm.adjust.trampoline(i8* &lt;tramp&gt;)
</pre>

<h5>Overview:</h5>
<p>This performs any required machine-specific adjustment to the address of a
   trampoline (passed as <tt>tramp</tt>).</p>

<h5>Arguments:</h5>
<p><tt>tramp</tt> must point to a block of memory which already has trampoline code
   filled in by a previous call to <a href="#int_it"><tt>llvm.init.trampoline</tt>
   </a>.</p>

<h5>Semantics:</h5>
<p>On some architectures the address of the code to be executed needs to be
   different to the address where the trampoline is actually stored.  This
   intrinsic returns the executable address corresponding to <tt>tramp</tt>
   after performing the required machine specific adjustments.
   The pointer returned can then be <a href="#int_trampoline"> bitcast and
   executed</a>.
</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_atomics">Atomic Operations and Synchronization Intrinsics</a>
</h3>

<div>

<p>These intrinsic functions expand the "universal IR" of LLVM to represent
   hardware constructs for atomic operations and memory synchronization.  This
   provides an interface to the hardware, not an interface to the programmer. It
   is aimed at a low enough level to allow any programming models or APIs
   (Application Programming Interfaces) which need atomic behaviors to map
   cleanly onto it. It is also modeled primarily on hardware behavior. Just as
   hardware provides a "universal IR" for source languages, it also provides a
   starting point for developing a "universal" atomic operation and
   synchronization IR.</p>

<p>These do <em>not</em> form an API such as high-level threading libraries,
   software transaction memory systems, atomic primitives, and intrinsic
   functions as found in BSD, GNU libc, atomic_ops, APR, and other system and
   application libraries.  The hardware interface provided by LLVM should allow
   a clean implementation of all of these APIs and parallel programming models.
   No one model or paradigm should be selected above others unless the hardware
   itself ubiquitously does so.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_memory_barrier">'<tt>llvm.memory.barrier</tt>' Intrinsic</a>
</h4>

<div>
<h5>Syntax:</h5>
<pre>
  declare void @llvm.memory.barrier(i1 &lt;ll&gt;, i1 &lt;ls&gt;, i1 &lt;sl&gt;, i1 &lt;ss&gt;, i1 &lt;device&gt;)
</pre>

<h5>Overview:</h5>
<p>The <tt>llvm.memory.barrier</tt> intrinsic guarantees ordering between
   specific pairs of memory access types.</p>

<h5>Arguments:</h5>
<p>The <tt>llvm.memory.barrier</tt> intrinsic requires five boolean arguments.
   The first four arguments enables a specific barrier as listed below.  The
   fifth argument specifies that the barrier applies to io or device or uncached
   memory.</p>

<ul>
  <li><tt>ll</tt>: load-load barrier</li>
  <li><tt>ls</tt>: load-store barrier</li>
  <li><tt>sl</tt>: store-load barrier</li>
  <li><tt>ss</tt>: store-store barrier</li>
  <li><tt>device</tt>: barrier applies to device and uncached memory also.</li>
</ul>

<h5>Semantics:</h5>
<p>This intrinsic causes the system to enforce some ordering constraints upon
   the loads and stores of the program. This barrier does not
   indicate <em>when</em> any events will occur, it only enforces
   an <em>order</em> in which they occur. For any of the specified pairs of load
   and store operations (f.ex.  load-load, or store-load), all of the first
   operations preceding the barrier will complete before any of the second
   operations succeeding the barrier begin. Specifically the semantics for each
   pairing is as follows:</p>

<ul>
  <li><tt>ll</tt>: All loads before the barrier must complete before any load
      after the barrier begins.</li>
  <li><tt>ls</tt>: All loads before the barrier must complete before any
      store after the barrier begins.</li>
  <li><tt>ss</tt>: All stores before the barrier must complete before any
      store after the barrier begins.</li>
  <li><tt>sl</tt>: All stores before the barrier must complete before any
      load after the barrier begins.</li>
</ul>

<p>These semantics are applied with a logical "and" behavior when more than one
   is enabled in a single memory barrier intrinsic.</p>

<p>Backends may implement stronger barriers than those requested when they do
   not support as fine grained a barrier as requested.  Some architectures do
   not need all types of barriers and on such architectures, these become
   noops.</p>

<h5>Example:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 4, %ptr

%result1  = load i32* %ptr      <i>; yields {i32}:result1 = 4</i>
            call void @llvm.memory.barrier(i1 false, i1 true, i1 false, i1 false, i1 true)
                                <i>; guarantee the above finishes</i>
            store i32 8, %ptr   <i>; before this begins</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_atomic_cmp_swap">'<tt>llvm.atomic.cmp.swap.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.atomic.cmp.swap</tt> on
   any integer bit width and for different address spaces. Not all targets
   support all bit widths however.</p>

<pre>
  declare i8 @llvm.atomic.cmp.swap.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;cmp&gt;, i8 &lt;val&gt;)
  declare i16 @llvm.atomic.cmp.swap.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;cmp&gt;, i16 &lt;val&gt;)
  declare i32 @llvm.atomic.cmp.swap.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;cmp&gt;, i32 &lt;val&gt;)
  declare i64 @llvm.atomic.cmp.swap.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;cmp&gt;, i64 &lt;val&gt;)
</pre>

<h5>Overview:</h5>
<p>This loads a value in memory and compares it to a given value. If they are
   equal, it stores a new value into the memory.</p>

<h5>Arguments:</h5>
<p>The <tt>llvm.atomic.cmp.swap</tt> intrinsic takes three arguments. The result
   as well as both <tt>cmp</tt> and <tt>val</tt> must be integer values with the
   same bit width. The <tt>ptr</tt> argument must be a pointer to a value of
   this integer type. While any bit width integer may be used, targets may only
   lower representations they support in hardware.</p>

<h5>Semantics:</h5>
<p>This entire intrinsic must be executed atomically. It first loads the value
   in memory pointed to by <tt>ptr</tt> and compares it with the
   value <tt>cmp</tt>. If they are equal, <tt>val</tt> is stored into the
   memory. The loaded value is yielded in all cases. This provides the
   equivalent of an atomic compare-and-swap operation within the SSA
   framework.</p>

<h5>Examples:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 4, %ptr

%val1     = add i32 4, 4
%result1  = call i32 @llvm.atomic.cmp.swap.i32.p0i32(i32* %ptr, i32 4, %val1)
                                          <i>; yields {i32}:result1 = 4</i>
%stored1  = icmp eq i32 %result1, 4       <i>; yields {i1}:stored1 = true</i>
%memval1  = load i32* %ptr                <i>; yields {i32}:memval1 = 8</i>

%val2     = add i32 1, 1
%result2  = call i32 @llvm.atomic.cmp.swap.i32.p0i32(i32* %ptr, i32 5, %val2)
                                          <i>; yields {i32}:result2 = 8</i>
%stored2  = icmp eq i32 %result2, 5       <i>; yields {i1}:stored2 = false</i>

%memval2  = load i32* %ptr                <i>; yields {i32}:memval2 = 8</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_atomic_swap">'<tt>llvm.atomic.swap.*</tt>' Intrinsic</a>
</h4>

<div>
<h5>Syntax:</h5>

<p>This is an overloaded intrinsic. You can use <tt>llvm.atomic.swap</tt> on any
   integer bit width. Not all targets support all bit widths however.</p>

<pre>
  declare i8 @llvm.atomic.swap.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;val&gt;)
  declare i16 @llvm.atomic.swap.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;val&gt;)
  declare i32 @llvm.atomic.swap.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;val&gt;)
  declare i64 @llvm.atomic.swap.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;val&gt;)
</pre>

<h5>Overview:</h5>
<p>This intrinsic loads the value stored in memory at <tt>ptr</tt> and yields
   the value from memory. It then stores the value in <tt>val</tt> in the memory
   at <tt>ptr</tt>.</p>

<h5>Arguments:</h5>
<p>The <tt>llvm.atomic.swap</tt> intrinsic takes two arguments. Both
  the <tt>val</tt> argument and the result must be integers of the same bit
  width.  The first argument, <tt>ptr</tt>, must be a pointer to a value of this
  integer type. The targets may only lower integer representations they
  support.</p>

<h5>Semantics:</h5>
<p>This intrinsic loads the value pointed to by <tt>ptr</tt>, yields it, and
   stores <tt>val</tt> back into <tt>ptr</tt> atomically. This provides the
   equivalent of an atomic swap operation within the SSA framework.</p>

<h5>Examples:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 4, %ptr

%val1     = add i32 4, 4
%result1  = call i32 @llvm.atomic.swap.i32.p0i32(i32* %ptr, i32 %val1)
                                        <i>; yields {i32}:result1 = 4</i>
%stored1  = icmp eq i32 %result1, 4     <i>; yields {i1}:stored1 = true</i>
%memval1  = load i32* %ptr              <i>; yields {i32}:memval1 = 8</i>

%val2     = add i32 1, 1
%result2  = call i32 @llvm.atomic.swap.i32.p0i32(i32* %ptr, i32 %val2)
                                        <i>; yields {i32}:result2 = 8</i>

%stored2  = icmp eq i32 %result2, 8     <i>; yields {i1}:stored2 = true</i>
%memval2  = load i32* %ptr              <i>; yields {i32}:memval2 = 2</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_atomic_load_add">'<tt>llvm.atomic.load.add.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.atomic.load.add</tt> on
   any integer bit width. Not all targets support all bit widths however.</p>

<pre>
  declare i8 @llvm.atomic.load.add.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.add.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.add.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.add.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<h5>Overview:</h5>
<p>This intrinsic adds <tt>delta</tt> to the value stored in memory
   at <tt>ptr</tt>. It yields the original value at <tt>ptr</tt>.</p>

<h5>Arguments:</h5>
<p>The intrinsic takes two arguments, the first a pointer to an integer value
   and the second an integer value. The result is also an integer value. These
   integer types can have any bit width, but they must all have the same bit
   width. The targets may only lower integer representations they support.</p>

<h5>Semantics:</h5>
<p>This intrinsic does a series of operations atomically. It first loads the
   value stored at <tt>ptr</tt>. It then adds <tt>delta</tt>, stores the result
   to <tt>ptr</tt>. It yields the original value stored at <tt>ptr</tt>.</p>

<h5>Examples:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 4, %ptr
%result1  = call i32 @llvm.atomic.load.add.i32.p0i32(i32* %ptr, i32 4)
                                <i>; yields {i32}:result1 = 4</i>
%result2  = call i32 @llvm.atomic.load.add.i32.p0i32(i32* %ptr, i32 2)
                                <i>; yields {i32}:result2 = 8</i>
%result3  = call i32 @llvm.atomic.load.add.i32.p0i32(i32* %ptr, i32 5)
                                <i>; yields {i32}:result3 = 10</i>
%memval1  = load i32* %ptr      <i>; yields {i32}:memval1 = 15</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_atomic_load_sub">'<tt>llvm.atomic.load.sub.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use <tt>llvm.atomic.load.sub</tt> on
   any integer bit width and for different address spaces. Not all targets
   support all bit widths however.</p>

<pre>
  declare i8 @llvm.atomic.load.sub.i8.p0i32(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.sub.i16.p0i32(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.sub.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.sub.i64.p0i32(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<h5>Overview:</h5>
<p>This intrinsic subtracts <tt>delta</tt> to the value stored in memory at
   <tt>ptr</tt>. It yields the original value at <tt>ptr</tt>.</p>

<h5>Arguments:</h5>
<p>The intrinsic takes two arguments, the first a pointer to an integer value
   and the second an integer value. The result is also an integer value. These
   integer types can have any bit width, but they must all have the same bit
   width. The targets may only lower integer representations they support.</p>

<h5>Semantics:</h5>
<p>This intrinsic does a series of operations atomically. It first loads the
   value stored at <tt>ptr</tt>. It then subtracts <tt>delta</tt>, stores the
   result to <tt>ptr</tt>. It yields the original value stored
   at <tt>ptr</tt>.</p>

<h5>Examples:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 8, %ptr
%result1  = call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %ptr, i32 4)
                                <i>; yields {i32}:result1 = 8</i>
%result2  = call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %ptr, i32 2)
                                <i>; yields {i32}:result2 = 4</i>
%result3  = call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %ptr, i32 5)
                                <i>; yields {i32}:result3 = 2</i>
%memval1  = load i32* %ptr      <i>; yields {i32}:memval1 = -3</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_atomic_load_and">
    '<tt>llvm.atomic.load.and.*</tt>' Intrinsic
  </a>
  <br>
  <a name="int_atomic_load_nand">
    '<tt>llvm.atomic.load.nand.*</tt>' Intrinsic
  </a>
  <br>
  <a name="int_atomic_load_or">
    '<tt>llvm.atomic.load.or.*</tt>' Intrinsic
  </a>
  <br>
  <a name="int_atomic_load_xor">
    '<tt>llvm.atomic.load.xor.*</tt>' Intrinsic
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>These are overloaded intrinsics. You can
  use <tt>llvm.atomic.load_and</tt>, <tt>llvm.atomic.load_nand</tt>,
  <tt>llvm.atomic.load_or</tt>, and <tt>llvm.atomic.load_xor</tt> on any integer
  bit width and for different address spaces. Not all targets support all bit
  widths however.</p>

<pre>
  declare i8 @llvm.atomic.load.and.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.and.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.and.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.and.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<pre>
  declare i8 @llvm.atomic.load.or.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.or.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.or.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.or.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<pre>
  declare i8 @llvm.atomic.load.nand.i8.p0i32(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.nand.i16.p0i32(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.nand.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.nand.i64.p0i32(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<pre>
  declare i8 @llvm.atomic.load.xor.i8.p0i32(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.xor.i16.p0i32(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.xor.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.xor.i64.p0i32(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<h5>Overview:</h5>
<p>These intrinsics bitwise the operation (and, nand, or, xor) <tt>delta</tt> to
   the value stored in memory at <tt>ptr</tt>. It yields the original value
   at <tt>ptr</tt>.</p>

<h5>Arguments:</h5>
<p>These intrinsics take two arguments, the first a pointer to an integer value
   and the second an integer value. The result is also an integer value. These
   integer types can have any bit width, but they must all have the same bit
   width. The targets may only lower integer representations they support.</p>

<h5>Semantics:</h5>
<p>These intrinsics does a series of operations atomically. They first load the
   value stored at <tt>ptr</tt>. They then do the bitwise
   operation <tt>delta</tt>, store the result to <tt>ptr</tt>. They yield the
   original value stored at <tt>ptr</tt>.</p>

<h5>Examples:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 0x0F0F, %ptr
%result0  = call i32 @llvm.atomic.load.nand.i32.p0i32(i32* %ptr, i32 0xFF)
                                <i>; yields {i32}:result0 = 0x0F0F</i>
%result1  = call i32 @llvm.atomic.load.and.i32.p0i32(i32* %ptr, i32 0xFF)
                                <i>; yields {i32}:result1 = 0xFFFFFFF0</i>
%result2  = call i32 @llvm.atomic.load.or.i32.p0i32(i32* %ptr, i32 0F)
                                <i>; yields {i32}:result2 = 0xF0</i>
%result3  = call i32 @llvm.atomic.load.xor.i32.p0i32(i32* %ptr, i32 0F)
                                <i>; yields {i32}:result3 = FF</i>
%memval1  = load i32* %ptr      <i>; yields {i32}:memval1 = F0</i>
</pre>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_atomic_load_max">
    '<tt>llvm.atomic.load.max.*</tt>' Intrinsic
  </a>
  <br>
  <a name="int_atomic_load_min">
    '<tt>llvm.atomic.load.min.*</tt>' Intrinsic
  </a>
  <br>
  <a name="int_atomic_load_umax">
    '<tt>llvm.atomic.load.umax.*</tt>' Intrinsic
  </a>
  <br>
  <a name="int_atomic_load_umin">
    '<tt>llvm.atomic.load.umin.*</tt>' Intrinsic
  </a>
</h4>

<div>

<h5>Syntax:</h5>
<p>These are overloaded intrinsics. You can use <tt>llvm.atomic.load_max</tt>,
   <tt>llvm.atomic.load_min</tt>, <tt>llvm.atomic.load_umax</tt>, and
   <tt>llvm.atomic.load_umin</tt> on any integer bit width and for different
   address spaces. Not all targets support all bit widths however.</p>

<pre>
  declare i8 @llvm.atomic.load.max.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.max.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.max.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.max.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<pre>
  declare i8 @llvm.atomic.load.min.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.min.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.min.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.min.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<pre>
  declare i8 @llvm.atomic.load.umax.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.umax.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.umax.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.umax.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<pre>
  declare i8 @llvm.atomic.load.umin.i8.p0i8(i8* &lt;ptr&gt;, i8 &lt;delta&gt;)
  declare i16 @llvm.atomic.load.umin.i16.p0i16(i16* &lt;ptr&gt;, i16 &lt;delta&gt;)
  declare i32 @llvm.atomic.load.umin.i32.p0i32(i32* &lt;ptr&gt;, i32 &lt;delta&gt;)
  declare i64 @llvm.atomic.load.umin.i64.p0i64(i64* &lt;ptr&gt;, i64 &lt;delta&gt;)
</pre>

<h5>Overview:</h5>
<p>These intrinsics takes the signed or unsigned minimum or maximum of
   <tt>delta</tt> and the value stored in memory at <tt>ptr</tt>. It yields the
   original value at <tt>ptr</tt>.</p>

<h5>Arguments:</h5>
<p>These intrinsics take two arguments, the first a pointer to an integer value
   and the second an integer value. The result is also an integer value. These
   integer types can have any bit width, but they must all have the same bit
   width. The targets may only lower integer representations they support.</p>

<h5>Semantics:</h5>
<p>These intrinsics does a series of operations atomically. They first load the
   value stored at <tt>ptr</tt>. They then do the signed or unsigned min or
   max <tt>delta</tt> and the value, store the result to <tt>ptr</tt>. They
   yield the original value stored at <tt>ptr</tt>.</p>

<h5>Examples:</h5>
<pre>
%mallocP  = tail call i8* @malloc(i32 ptrtoint (i32* getelementptr (i32* null, i32 1) to i32))
%ptr      = bitcast i8* %mallocP to i32*
            store i32 7, %ptr
%result0  = call i32 @llvm.atomic.load.min.i32.p0i32(i32* %ptr, i32 -2)
                                <i>; yields {i32}:result0 = 7</i>
%result1  = call i32 @llvm.atomic.load.max.i32.p0i32(i32* %ptr, i32 8)
                                <i>; yields {i32}:result1 = -2</i>
%result2  = call i32 @llvm.atomic.load.umin.i32.p0i32(i32* %ptr, i32 10)
                                <i>; yields {i32}:result2 = 8</i>
%result3  = call i32 @llvm.atomic.load.umax.i32.p0i32(i32* %ptr, i32 30)
                                <i>; yields {i32}:result3 = 8</i>
%memval1  = load i32* %ptr      <i>; yields {i32}:memval1 = 30</i>
</pre>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_memorymarkers">Memory Use Markers</a>
</h3>

<div>

<p>This class of intrinsics exists to information about the lifetime of memory
   objects and ranges where variables are immutable.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_lifetime_start">'<tt>llvm.lifetime.start</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.lifetime.start(i64 &lt;size&gt;, i8* nocapture &lt;ptr&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.lifetime.start</tt>' intrinsic specifies the start of a memory
   object's lifetime.</p>

<h5>Arguments:</h5>
<p>The first argument is a constant integer representing the size of the
   object, or -1 if it is variable sized.  The second argument is a pointer to
   the object.</p>

<h5>Semantics:</h5>
<p>This intrinsic indicates that before this point in the code, the value of the
   memory pointed to by <tt>ptr</tt> is dead.  This means that it is known to
   never be used and has an undefined value.  A load from the pointer that
   precedes this intrinsic can be replaced with
   <tt>'<a href="#undefvalues">undef</a>'</tt>.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_lifetime_end">'<tt>llvm.lifetime.end</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.lifetime.end(i64 &lt;size&gt;, i8* nocapture &lt;ptr&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.lifetime.end</tt>' intrinsic specifies the end of a memory
   object's lifetime.</p>

<h5>Arguments:</h5>
<p>The first argument is a constant integer representing the size of the
   object, or -1 if it is variable sized.  The second argument is a pointer to
   the object.</p>

<h5>Semantics:</h5>
<p>This intrinsic indicates that after this point in the code, the value of the
   memory pointed to by <tt>ptr</tt> is dead.  This means that it is known to
   never be used and has an undefined value.  Any stores into the memory object
   following this intrinsic may be removed as dead.

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_invariant_start">'<tt>llvm.invariant.start</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare {}* @llvm.invariant.start(i64 &lt;size&gt;, i8* nocapture &lt;ptr&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.invariant.start</tt>' intrinsic specifies that the contents of
   a memory object will not change.</p>

<h5>Arguments:</h5>
<p>The first argument is a constant integer representing the size of the
   object, or -1 if it is variable sized.  The second argument is a pointer to
   the object.</p>

<h5>Semantics:</h5>
<p>This intrinsic indicates that until an <tt>llvm.invariant.end</tt> that uses
   the return value, the referenced memory location is constant and
   unchanging.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_invariant_end">'<tt>llvm.invariant.end</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.invariant.end({}* &lt;start&gt;, i64 &lt;size&gt;, i8* nocapture &lt;ptr&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.invariant.end</tt>' intrinsic specifies that the contents of
   a memory object are mutable.</p>

<h5>Arguments:</h5>
<p>The first argument is the matching <tt>llvm.invariant.start</tt> intrinsic.
   The second argument is a constant integer representing the size of the
   object, or -1 if it is variable sized and the third argument is a pointer
   to the object.</p>

<h5>Semantics:</h5>
<p>This intrinsic indicates that the memory is mutable again.</p>

</div>

</div>

<!-- ======================================================================= -->
<h3>
  <a name="int_general">General Intrinsics</a>
</h3>

<div>

<p>This class of intrinsics is designed to be generic and has no specific
   purpose.</p>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_var_annotation">'<tt>llvm.var.annotation</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.var.annotation(i8* &lt;val&gt;, i8* &lt;str&gt;, i8* &lt;str&gt;, i32  &lt;int&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.var.annotation</tt>' intrinsic.</p>

<h5>Arguments:</h5>
<p>The first argument is a pointer to a value, the second is a pointer to a
   global string, the third is a pointer to a global string which is the source
   file name, and the last argument is the line number.</p>

<h5>Semantics:</h5>
<p>This intrinsic allows annotation of local variables with arbitrary strings.
   This can be useful for special purpose optimizations that want to look for
   these annotations.  These have no other defined use; they are ignored by code
   generation and optimization.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_annotation">'<tt>llvm.annotation.*</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<p>This is an overloaded intrinsic. You can use '<tt>llvm.annotation</tt>' on
   any integer bit width.</p>

<pre>
  declare i8 @llvm.annotation.i8(i8 &lt;val&gt;, i8* &lt;str&gt;, i8* &lt;str&gt;, i32  &lt;int&gt;)
  declare i16 @llvm.annotation.i16(i16 &lt;val&gt;, i8* &lt;str&gt;, i8* &lt;str&gt;, i32  &lt;int&gt;)
  declare i32 @llvm.annotation.i32(i32 &lt;val&gt;, i8* &lt;str&gt;, i8* &lt;str&gt;, i32  &lt;int&gt;)
  declare i64 @llvm.annotation.i64(i64 &lt;val&gt;, i8* &lt;str&gt;, i8* &lt;str&gt;, i32  &lt;int&gt;)
  declare i256 @llvm.annotation.i256(i256 &lt;val&gt;, i8* &lt;str&gt;, i8* &lt;str&gt;, i32  &lt;int&gt;)
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.annotation</tt>' intrinsic.</p>

<h5>Arguments:</h5>
<p>The first argument is an integer value (result of some expression), the
   second is a pointer to a global string, the third is a pointer to a global
   string which is the source file name, and the last argument is the line
   number.  It returns the value of the first argument.</p>

<h5>Semantics:</h5>
<p>This intrinsic allows annotations to be put on arbitrary expressions with
   arbitrary strings.  This can be useful for special purpose optimizations that
   want to look for these annotations.  These have no other defined use; they
   are ignored by code generation and optimization.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_trap">'<tt>llvm.trap</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.trap()
</pre>

<h5>Overview:</h5>
<p>The '<tt>llvm.trap</tt>' intrinsic.</p>

<h5>Arguments:</h5>
<p>None.</p>

<h5>Semantics:</h5>
<p>This intrinsics is lowered to the target dependent trap instruction. If the
   target does not have a trap instruction, this intrinsic will be lowered to
   the call of the <tt>abort()</tt> function.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_stackprotector">'<tt>llvm.stackprotector</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare void @llvm.stackprotector(i8* &lt;guard&gt;, i8** &lt;slot&gt;)
</pre>

<h5>Overview:</h5>
<p>The <tt>llvm.stackprotector</tt> intrinsic takes the <tt>guard</tt> and
   stores it onto the stack at <tt>slot</tt>. The stack slot is adjusted to
   ensure that it is placed on the stack before local variables.</p>

<h5>Arguments:</h5>
<p>The <tt>llvm.stackprotector</tt> intrinsic requires two pointer
   arguments. The first argument is the value loaded from the stack
   guard <tt>@__stack_chk_guard</tt>. The second variable is an <tt>alloca</tt>
   that has enough space to hold the value of the guard.</p>

<h5>Semantics:</h5>
<p>This intrinsic causes the prologue/epilogue inserter to force the position of
   the <tt>AllocaInst</tt> stack slot to be before local variables on the
   stack. This is to ensure that if a local variable on the stack is
   overwritten, it will destroy the value of the guard. When the function exits,
   the guard on the stack is checked against the original guard. If they are
   different, then the program aborts by calling the <tt>__stack_chk_fail()</tt>
   function.</p>

</div>

<!-- _______________________________________________________________________ -->
<h4>
  <a name="int_objectsize">'<tt>llvm.objectsize</tt>' Intrinsic</a>
</h4>

<div>

<h5>Syntax:</h5>
<pre>
  declare i32 @llvm.objectsize.i32(i8* &lt;object&gt;, i1 &lt;type&gt;)
  declare i64 @llvm.objectsize.i64(i8* &lt;object&gt;, i1 &lt;type&gt;)
</pre>

<h5>Overview:</h5>
<p>The <tt>llvm.objectsize</tt> intrinsic is designed to provide information to
   the optimizers to determine at compile time whether a) an operation (like
   memcpy) will overflow a buffer that corresponds to an object, or b) that a
   runtime check for overflow isn't necessary. An object in this context means
   an allocation of a specific class, structure, array, or other object.</p>

<h5>Arguments:</h5>
<p>The <tt>llvm.objectsize</tt> intrinsic takes two arguments. The first
   argument is a pointer to or into the <tt>object</tt>. The second argument
   is a boolean 0 or 1. This argument determines whether you want the 
   maximum (0) or minimum (1) bytes remaining. This needs to be a literal 0 or
   1, variables are not allowed.</p>
   
<h5>Semantics:</h5>
<p>The <tt>llvm.objectsize</tt> intrinsic is lowered to either a constant
   representing the size of the object concerned, or <tt>i32/i64 -1 or 0</tt>,
   depending on the <tt>type</tt> argument, if the size cannot be determined at
   compile time.</p>

</div>

</div>

</div>

<!-- *********************************************************************** -->
<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>

  <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
  <a href="http://llvm.org/">The LLVM Compiler Infrastructure</a><br>
  Last modified: $Date$
</address>

</body>
</html>
