[www-releases] r225843 - Add documentation for 3.5.1

Tom Stellard thomas.stellard at amd.com
Tue Jan 13 14:55:45 PST 2015


Added: www-releases/trunk/3.5.1/docs/LangRef.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.5.1/docs/LangRef.html?rev=225843&view=auto
==============================================================================
--- www-releases/trunk/3.5.1/docs/LangRef.html (added)
+++ www-releases/trunk/3.5.1/docs/LangRef.html Tue Jan 13 16:55:20 2015
@@ -0,0 +1,9449 @@
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>LLVM Language Reference Manual — LLVM 3.5 documentation</title>
+    
+    <link rel="stylesheet" href="_static/llvm-theme.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '',
+        VERSION:     '3.5',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="LLVM 3.5 documentation" href="index.html" />
+    <link rel="next" title="Building LLVM with CMake" href="CMake.html" />
+    <link rel="prev" title="Overview" href="index.html" />
+<style type="text/css">
+  table.right { float: right; margin-left: 20px; }
+  table.right td { border: 1px solid #ccc; }
+</style>
+
+  </head>
+  <body>
+<div class="logo">
+  <a href="index.html">
+    <img src="_static/logo.png"
+         alt="LLVM Logo" width="250" height="88"/></a>
+</div>
+
+    <div class="related">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="CMake.html" title="Building LLVM with CMake"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="index.html" title="Overview"
+             accesskey="P">previous</a> |</li>
+  <li><a href="http://llvm.org/">LLVM Home</a> | </li>
+  <li><a href="index.html">Documentation</a>»</li>
+ 
+      </ul>
+    </div>
+
+
+    <div class="document">
+      <div class="documentwrapper">
+          <div class="body">
+            
+  <div class="section" id="llvm-language-reference-manual">
+<h1>LLVM Language Reference Manual<a class="headerlink" href="#llvm-language-reference-manual" title="Permalink to this headline">¶</a></h1>
+<div class="contents local topic" id="contents">
+<ul class="simple">
+<li><a class="reference internal" href="#abstract" id="id550">Abstract</a></li>
+<li><a class="reference internal" href="#introduction" id="id551">Introduction</a><ul>
+<li><a class="reference internal" href="#well-formedness" id="id552">Well-Formedness</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#identifiers" id="id553">Identifiers</a></li>
+<li><a class="reference internal" href="#high-level-structure" id="id554">High Level Structure</a><ul>
+<li><a class="reference internal" href="#module-structure" id="id555">Module Structure</a></li>
+<li><a class="reference internal" href="#linkage-types" id="id556">Linkage Types</a></li>
+<li><a class="reference internal" href="#calling-conventions" id="id557">Calling Conventions</a></li>
+<li><a class="reference internal" href="#visibility-styles" id="id558">Visibility Styles</a></li>
+<li><a class="reference internal" href="#dll-storage-classes" id="id559">DLL Storage Classes</a></li>
+<li><a class="reference internal" href="#thread-local-storage-models" id="id560">Thread Local Storage Models</a></li>
+<li><a class="reference internal" href="#structure-types" id="id561">Structure Types</a></li>
+<li><a class="reference internal" href="#global-variables" id="id562">Global Variables</a></li>
+<li><a class="reference internal" href="#functions" id="id563">Functions</a></li>
+<li><a class="reference internal" href="#aliases" id="id564">Aliases</a></li>
+<li><a class="reference internal" href="#comdats" id="id565">Comdats</a></li>
+<li><a class="reference internal" href="#named-metadata" id="id566">Named Metadata</a></li>
+<li><a class="reference internal" href="#parameter-attributes" id="id567">Parameter Attributes</a></li>
+<li><a class="reference internal" href="#garbage-collector-names" id="id568">Garbage Collector Names</a></li>
+<li><a class="reference internal" href="#prefix-data" id="id569">Prefix Data</a></li>
+<li><a class="reference internal" href="#attribute-groups" id="id570">Attribute Groups</a></li>
+<li><a class="reference internal" href="#function-attributes" id="id571">Function Attributes</a></li>
+<li><a class="reference internal" href="#module-level-inline-assembly" id="id572">Module-Level Inline Assembly</a></li>
+<li><a class="reference internal" href="#data-layout" id="id573">Data Layout</a></li>
+<li><a class="reference internal" href="#target-triple" id="id574">Target Triple</a></li>
+<li><a class="reference internal" href="#pointer-aliasing-rules" id="id575">Pointer Aliasing Rules</a></li>
+<li><a class="reference internal" href="#volatile-memory-accesses" id="id576">Volatile Memory Accesses</a></li>
+<li><a class="reference internal" href="#memory-model-for-concurrent-operations" id="id577">Memory Model for Concurrent Operations</a></li>
+<li><a class="reference internal" href="#atomic-memory-ordering-constraints" id="id578">Atomic Memory Ordering Constraints</a></li>
+<li><a class="reference internal" href="#fast-math-flags" id="id579">Fast-Math Flags</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#type-system" id="id580">Type System</a><ul>
+<li><a class="reference internal" href="#void-type" id="id581">Void Type</a></li>
+<li><a class="reference internal" href="#function-type" id="id582">Function Type</a></li>
+<li><a class="reference internal" href="#first-class-types" id="id583">First Class Types</a><ul>
+<li><a class="reference internal" href="#single-value-types" id="id584">Single Value Types</a><ul>
+<li><a class="reference internal" href="#integer-type" id="id585">Integer Type</a></li>
+<li><a class="reference internal" href="#floating-point-types" id="id586">Floating Point Types</a></li>
+<li><a class="reference internal" href="#x86-mmx-type" id="id587">X86_mmx Type</a></li>
+<li><a class="reference internal" href="#pointer-type" id="id588">Pointer Type</a></li>
+<li><a class="reference internal" href="#vector-type" id="id589">Vector Type</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#label-type" id="id590">Label Type</a></li>
+<li><a class="reference internal" href="#metadata-type" id="id591">Metadata Type</a></li>
+<li><a class="reference internal" href="#aggregate-types" id="id592">Aggregate Types</a><ul>
+<li><a class="reference internal" href="#array-type" id="id593">Array Type</a></li>
+<li><a class="reference internal" href="#structure-type" id="id594">Structure Type</a></li>
+<li><a class="reference internal" href="#opaque-structure-types" id="id595">Opaque Structure Types</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#constants" id="id596">Constants</a><ul>
+<li><a class="reference internal" href="#simple-constants" id="id597">Simple Constants</a></li>
+<li><a class="reference internal" href="#complex-constants" id="id598">Complex Constants</a></li>
+<li><a class="reference internal" href="#global-variable-and-function-addresses" id="id599">Global Variable and Function Addresses</a></li>
+<li><a class="reference internal" href="#undefined-values" id="id600">Undefined Values</a></li>
+<li><a class="reference internal" href="#poison-values" id="id601">Poison Values</a></li>
+<li><a class="reference internal" href="#addresses-of-basic-blocks" id="id602">Addresses of Basic Blocks</a></li>
+<li><a class="reference internal" href="#constant-expressions" id="id603">Constant Expressions</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#other-values" id="id604">Other Values</a><ul>
+<li><a class="reference internal" href="#inline-assembler-expressions" id="id605">Inline Assembler Expressions</a><ul>
+<li><a class="reference internal" href="#inline-asm-metadata" id="id606">Inline Asm Metadata</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#metadata-nodes-and-metadata-strings" id="id607">Metadata Nodes and Metadata Strings</a><ul>
+<li><a class="reference internal" href="#tbaa-metadata" id="id608">‘<tt class="docutils literal"><span class="pre">tbaa</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#tbaa-struct-metadata" id="id609">‘<tt class="docutils literal"><span class="pre">tbaa.struct</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#fpmath-metadata" id="id610">‘<tt class="docutils literal"><span class="pre">fpmath</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#range-metadata" id="id611">‘<tt class="docutils literal"><span class="pre">range</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#llvm-loop" id="id612">‘<tt class="docutils literal"><span class="pre">llvm.loop</span></tt>‘</a></li>
+<li><a class="reference internal" href="#llvm-loop-vectorize-and-llvm-loop-interleave" id="id613">‘<tt class="docutils literal"><span class="pre">llvm.loop.vectorize</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">llvm.loop.interleave</span></tt>‘</a></li>
+<li><a class="reference internal" href="#llvm-loop-interleave-count-metadata" id="id614">‘<tt class="docutils literal"><span class="pre">llvm.loop.interleave.count</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#llvm-loop-vectorize-enable-metadata" id="id615">‘<tt class="docutils literal"><span class="pre">llvm.loop.vectorize.enable</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#llvm-loop-vectorize-width-metadata" id="id616">‘<tt class="docutils literal"><span class="pre">llvm.loop.vectorize.width</span></tt>‘ Metadata</a></li>
+<li><a class="reference internal" href="#llvm-mem" id="id617">‘<tt class="docutils literal"><span class="pre">llvm.mem</span></tt>‘</a></li>
+<li><a class="reference internal" href="#llvm-mem-parallel-loop-access-metadata" id="id618">‘<tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt>‘ Metadata</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#module-flags-metadata" id="id619">Module Flags Metadata</a><ul>
+<li><a class="reference internal" href="#objective-c-garbage-collection-module-flags-metadata" id="id620">Objective-C Garbage Collection Module Flags Metadata</a></li>
+<li><a class="reference internal" href="#automatic-linker-flags-module-flags-metadata" id="id621">Automatic Linker Flags Module Flags Metadata</a></li>
+<li><a class="reference internal" href="#c-type-width-module-flags-metadata" id="id622">C type width Module Flags Metadata</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#intrinsic-global-variables" id="id623">Intrinsic Global Variables</a><ul>
+<li><a class="reference internal" href="#the-llvm-used-global-variable" id="id624">The ‘<tt class="docutils literal"><span class="pre">llvm.used</span></tt>‘ Global Variable</a></li>
+<li><a class="reference internal" href="#the-llvm-compiler-used-global-variable" id="id625">The ‘<tt class="docutils literal"><span class="pre">llvm.compiler.used</span></tt>‘ Global Variable</a></li>
+<li><a class="reference internal" href="#the-llvm-global-ctors-global-variable" id="id626">The ‘<tt class="docutils literal"><span class="pre">llvm.global_ctors</span></tt>‘ Global Variable</a></li>
+<li><a class="reference internal" href="#the-llvm-global-dtors-global-variable" id="id627">The ‘<tt class="docutils literal"><span class="pre">llvm.global_dtors</span></tt>‘ Global Variable</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#instruction-reference" id="id628">Instruction Reference</a><ul>
+<li><a class="reference internal" href="#terminator-instructions" id="id629">Terminator Instructions</a><ul>
+<li><a class="reference internal" href="#ret-instruction" id="id630">‘<tt class="docutils literal"><span class="pre">ret</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#syntax" id="id631">Syntax:</a></li>
+<li><a class="reference internal" href="#overview" id="id632">Overview:</a></li>
+<li><a class="reference internal" href="#arguments" id="id633">Arguments:</a></li>
+<li><a class="reference internal" href="#semantics" id="id634">Semantics:</a></li>
+<li><a class="reference internal" href="#example" id="id635">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#br-instruction" id="id636">‘<tt class="docutils literal"><span class="pre">br</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id4" id="id637">Syntax:</a></li>
+<li><a class="reference internal" href="#id5" id="id638">Overview:</a></li>
+<li><a class="reference internal" href="#id6" id="id639">Arguments:</a></li>
+<li><a class="reference internal" href="#id7" id="id640">Semantics:</a></li>
+<li><a class="reference internal" href="#id8" id="id641">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#switch-instruction" id="id642">‘<tt class="docutils literal"><span class="pre">switch</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id9" id="id643">Syntax:</a></li>
+<li><a class="reference internal" href="#id10" id="id644">Overview:</a></li>
+<li><a class="reference internal" href="#id11" id="id645">Arguments:</a></li>
+<li><a class="reference internal" href="#id12" id="id646">Semantics:</a></li>
+<li><a class="reference internal" href="#implementation" id="id647">Implementation:</a></li>
+<li><a class="reference internal" href="#id13" id="id648">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#indirectbr-instruction" id="id649">‘<tt class="docutils literal"><span class="pre">indirectbr</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id14" id="id650">Syntax:</a></li>
+<li><a class="reference internal" href="#id15" id="id651">Overview:</a></li>
+<li><a class="reference internal" href="#id16" id="id652">Arguments:</a></li>
+<li><a class="reference internal" href="#id17" id="id653">Semantics:</a></li>
+<li><a class="reference internal" href="#id18" id="id654">Implementation:</a></li>
+<li><a class="reference internal" href="#id19" id="id655">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#invoke-instruction" id="id656">‘<tt class="docutils literal"><span class="pre">invoke</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id20" id="id657">Syntax:</a></li>
+<li><a class="reference internal" href="#id21" id="id658">Overview:</a></li>
+<li><a class="reference internal" href="#id22" id="id659">Arguments:</a></li>
+<li><a class="reference internal" href="#id23" id="id660">Semantics:</a></li>
+<li><a class="reference internal" href="#id24" id="id661">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#resume-instruction" id="id662">‘<tt class="docutils literal"><span class="pre">resume</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id25" id="id663">Syntax:</a></li>
+<li><a class="reference internal" href="#id26" id="id664">Overview:</a></li>
+<li><a class="reference internal" href="#id27" id="id665">Arguments:</a></li>
+<li><a class="reference internal" href="#id28" id="id666">Semantics:</a></li>
+<li><a class="reference internal" href="#id29" id="id667">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#unreachable-instruction" id="id668">‘<tt class="docutils literal"><span class="pre">unreachable</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id30" id="id669">Syntax:</a></li>
+<li><a class="reference internal" href="#id31" id="id670">Overview:</a></li>
+<li><a class="reference internal" href="#id32" id="id671">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#binary-operations" id="id672">Binary Operations</a><ul>
+<li><a class="reference internal" href="#add-instruction" id="id673">‘<tt class="docutils literal"><span class="pre">add</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id33" id="id674">Syntax:</a></li>
+<li><a class="reference internal" href="#id34" id="id675">Overview:</a></li>
+<li><a class="reference internal" href="#id35" id="id676">Arguments:</a></li>
+<li><a class="reference internal" href="#id36" id="id677">Semantics:</a></li>
+<li><a class="reference internal" href="#id37" id="id678">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fadd-instruction" id="id679">‘<tt class="docutils literal"><span class="pre">fadd</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id38" id="id680">Syntax:</a></li>
+<li><a class="reference internal" href="#id39" id="id681">Overview:</a></li>
+<li><a class="reference internal" href="#id40" id="id682">Arguments:</a></li>
+<li><a class="reference internal" href="#id41" id="id683">Semantics:</a></li>
+<li><a class="reference internal" href="#id42" id="id684">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#sub-instruction" id="id685">‘<tt class="docutils literal"><span class="pre">sub</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id43" id="id686">Syntax:</a></li>
+<li><a class="reference internal" href="#id44" id="id687">Overview:</a></li>
+<li><a class="reference internal" href="#id45" id="id688">Arguments:</a></li>
+<li><a class="reference internal" href="#id46" id="id689">Semantics:</a></li>
+<li><a class="reference internal" href="#id47" id="id690">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fsub-instruction" id="id691">‘<tt class="docutils literal"><span class="pre">fsub</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id48" id="id692">Syntax:</a></li>
+<li><a class="reference internal" href="#id49" id="id693">Overview:</a></li>
+<li><a class="reference internal" href="#id50" id="id694">Arguments:</a></li>
+<li><a class="reference internal" href="#id51" id="id695">Semantics:</a></li>
+<li><a class="reference internal" href="#id52" id="id696">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#mul-instruction" id="id697">‘<tt class="docutils literal"><span class="pre">mul</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id53" id="id698">Syntax:</a></li>
+<li><a class="reference internal" href="#id54" id="id699">Overview:</a></li>
+<li><a class="reference internal" href="#id55" id="id700">Arguments:</a></li>
+<li><a class="reference internal" href="#id56" id="id701">Semantics:</a></li>
+<li><a class="reference internal" href="#id57" id="id702">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fmul-instruction" id="id703">‘<tt class="docutils literal"><span class="pre">fmul</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id58" id="id704">Syntax:</a></li>
+<li><a class="reference internal" href="#id59" id="id705">Overview:</a></li>
+<li><a class="reference internal" href="#id60" id="id706">Arguments:</a></li>
+<li><a class="reference internal" href="#id61" id="id707">Semantics:</a></li>
+<li><a class="reference internal" href="#id62" id="id708">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#udiv-instruction" id="id709">‘<tt class="docutils literal"><span class="pre">udiv</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id63" id="id710">Syntax:</a></li>
+<li><a class="reference internal" href="#id64" id="id711">Overview:</a></li>
+<li><a class="reference internal" href="#id65" id="id712">Arguments:</a></li>
+<li><a class="reference internal" href="#id66" id="id713">Semantics:</a></li>
+<li><a class="reference internal" href="#id67" id="id714">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#sdiv-instruction" id="id715">‘<tt class="docutils literal"><span class="pre">sdiv</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id68" id="id716">Syntax:</a></li>
+<li><a class="reference internal" href="#id69" id="id717">Overview:</a></li>
+<li><a class="reference internal" href="#id70" id="id718">Arguments:</a></li>
+<li><a class="reference internal" href="#id71" id="id719">Semantics:</a></li>
+<li><a class="reference internal" href="#id72" id="id720">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fdiv-instruction" id="id721">‘<tt class="docutils literal"><span class="pre">fdiv</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id73" id="id722">Syntax:</a></li>
+<li><a class="reference internal" href="#id74" id="id723">Overview:</a></li>
+<li><a class="reference internal" href="#id75" id="id724">Arguments:</a></li>
+<li><a class="reference internal" href="#id76" id="id725">Semantics:</a></li>
+<li><a class="reference internal" href="#id77" id="id726">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#urem-instruction" id="id727">‘<tt class="docutils literal"><span class="pre">urem</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id78" id="id728">Syntax:</a></li>
+<li><a class="reference internal" href="#id79" id="id729">Overview:</a></li>
+<li><a class="reference internal" href="#id80" id="id730">Arguments:</a></li>
+<li><a class="reference internal" href="#id81" id="id731">Semantics:</a></li>
+<li><a class="reference internal" href="#id82" id="id732">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#srem-instruction" id="id733">‘<tt class="docutils literal"><span class="pre">srem</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id83" id="id734">Syntax:</a></li>
+<li><a class="reference internal" href="#id84" id="id735">Overview:</a></li>
+<li><a class="reference internal" href="#id85" id="id736">Arguments:</a></li>
+<li><a class="reference internal" href="#id86" id="id737">Semantics:</a></li>
+<li><a class="reference internal" href="#id87" id="id738">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#frem-instruction" id="id739">‘<tt class="docutils literal"><span class="pre">frem</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id88" id="id740">Syntax:</a></li>
+<li><a class="reference internal" href="#id89" id="id741">Overview:</a></li>
+<li><a class="reference internal" href="#id90" id="id742">Arguments:</a></li>
+<li><a class="reference internal" href="#id91" id="id743">Semantics:</a></li>
+<li><a class="reference internal" href="#id92" id="id744">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#bitwise-binary-operations" id="id745">Bitwise Binary Operations</a><ul>
+<li><a class="reference internal" href="#shl-instruction" id="id746">‘<tt class="docutils literal"><span class="pre">shl</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id93" id="id747">Syntax:</a></li>
+<li><a class="reference internal" href="#id94" id="id748">Overview:</a></li>
+<li><a class="reference internal" href="#id95" id="id749">Arguments:</a></li>
+<li><a class="reference internal" href="#id96" id="id750">Semantics:</a></li>
+<li><a class="reference internal" href="#id97" id="id751">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#lshr-instruction" id="id752">‘<tt class="docutils literal"><span class="pre">lshr</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id98" id="id753">Syntax:</a></li>
+<li><a class="reference internal" href="#id99" id="id754">Overview:</a></li>
+<li><a class="reference internal" href="#id100" id="id755">Arguments:</a></li>
+<li><a class="reference internal" href="#id101" id="id756">Semantics:</a></li>
+<li><a class="reference internal" href="#id102" id="id757">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#ashr-instruction" id="id758">‘<tt class="docutils literal"><span class="pre">ashr</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id103" id="id759">Syntax:</a></li>
+<li><a class="reference internal" href="#id104" id="id760">Overview:</a></li>
+<li><a class="reference internal" href="#id105" id="id761">Arguments:</a></li>
+<li><a class="reference internal" href="#id106" id="id762">Semantics:</a></li>
+<li><a class="reference internal" href="#id107" id="id763">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#and-instruction" id="id764">‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id108" id="id765">Syntax:</a></li>
+<li><a class="reference internal" href="#id109" id="id766">Overview:</a></li>
+<li><a class="reference internal" href="#id110" id="id767">Arguments:</a></li>
+<li><a class="reference internal" href="#id111" id="id768">Semantics:</a></li>
+<li><a class="reference internal" href="#id112" id="id769">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#or-instruction" id="id770">‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id113" id="id771">Syntax:</a></li>
+<li><a class="reference internal" href="#id114" id="id772">Overview:</a></li>
+<li><a class="reference internal" href="#id115" id="id773">Arguments:</a></li>
+<li><a class="reference internal" href="#id116" id="id774">Semantics:</a></li>
+<li><a class="reference internal" href="#id117" id="id775">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#xor-instruction" id="id776">‘<tt class="docutils literal"><span class="pre">xor</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id118" id="id777">Syntax:</a></li>
+<li><a class="reference internal" href="#id119" id="id778">Overview:</a></li>
+<li><a class="reference internal" href="#id120" id="id779">Arguments:</a></li>
+<li><a class="reference internal" href="#id121" id="id780">Semantics:</a></li>
+<li><a class="reference internal" href="#id122" id="id781">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#vector-operations" id="id782">Vector Operations</a><ul>
+<li><a class="reference internal" href="#extractelement-instruction" id="id783">‘<tt class="docutils literal"><span class="pre">extractelement</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id123" id="id784">Syntax:</a></li>
+<li><a class="reference internal" href="#id124" id="id785">Overview:</a></li>
+<li><a class="reference internal" href="#id125" id="id786">Arguments:</a></li>
+<li><a class="reference internal" href="#id126" id="id787">Semantics:</a></li>
+<li><a class="reference internal" href="#id127" id="id788">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#insertelement-instruction" id="id789">‘<tt class="docutils literal"><span class="pre">insertelement</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id128" id="id790">Syntax:</a></li>
+<li><a class="reference internal" href="#id129" id="id791">Overview:</a></li>
+<li><a class="reference internal" href="#id130" id="id792">Arguments:</a></li>
+<li><a class="reference internal" href="#id131" id="id793">Semantics:</a></li>
+<li><a class="reference internal" href="#id132" id="id794">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#shufflevector-instruction" id="id795">‘<tt class="docutils literal"><span class="pre">shufflevector</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id133" id="id796">Syntax:</a></li>
+<li><a class="reference internal" href="#id134" id="id797">Overview:</a></li>
+<li><a class="reference internal" href="#id135" id="id798">Arguments:</a></li>
+<li><a class="reference internal" href="#id136" id="id799">Semantics:</a></li>
+<li><a class="reference internal" href="#id137" id="id800">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#aggregate-operations" id="id801">Aggregate Operations</a><ul>
+<li><a class="reference internal" href="#extractvalue-instruction" id="id802">‘<tt class="docutils literal"><span class="pre">extractvalue</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id138" id="id803">Syntax:</a></li>
+<li><a class="reference internal" href="#id139" id="id804">Overview:</a></li>
+<li><a class="reference internal" href="#id140" id="id805">Arguments:</a></li>
+<li><a class="reference internal" href="#id141" id="id806">Semantics:</a></li>
+<li><a class="reference internal" href="#id142" id="id807">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#insertvalue-instruction" id="id808">‘<tt class="docutils literal"><span class="pre">insertvalue</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id143" id="id809">Syntax:</a></li>
+<li><a class="reference internal" href="#id144" id="id810">Overview:</a></li>
+<li><a class="reference internal" href="#id145" id="id811">Arguments:</a></li>
+<li><a class="reference internal" href="#id146" id="id812">Semantics:</a></li>
+<li><a class="reference internal" href="#id147" id="id813">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#memory-access-and-addressing-operations" id="id814">Memory Access and Addressing Operations</a><ul>
+<li><a class="reference internal" href="#alloca-instruction" id="id815">‘<tt class="docutils literal"><span class="pre">alloca</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id148" id="id816">Syntax:</a></li>
+<li><a class="reference internal" href="#id149" id="id817">Overview:</a></li>
+<li><a class="reference internal" href="#id150" id="id818">Arguments:</a></li>
+<li><a class="reference internal" href="#id151" id="id819">Semantics:</a></li>
+<li><a class="reference internal" href="#id152" id="id820">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#load-instruction" id="id821">‘<tt class="docutils literal"><span class="pre">load</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id153" id="id822">Syntax:</a></li>
+<li><a class="reference internal" href="#id154" id="id823">Overview:</a></li>
+<li><a class="reference internal" href="#id155" id="id824">Arguments:</a></li>
+<li><a class="reference internal" href="#id156" id="id825">Semantics:</a></li>
+<li><a class="reference internal" href="#id157" id="id826">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#store-instruction" id="id827">‘<tt class="docutils literal"><span class="pre">store</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id158" id="id828">Syntax:</a></li>
+<li><a class="reference internal" href="#id159" id="id829">Overview:</a></li>
+<li><a class="reference internal" href="#id160" id="id830">Arguments:</a></li>
+<li><a class="reference internal" href="#id161" id="id831">Semantics:</a></li>
+<li><a class="reference internal" href="#id162" id="id832">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fence-instruction" id="id833">‘<tt class="docutils literal"><span class="pre">fence</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id163" id="id834">Syntax:</a></li>
+<li><a class="reference internal" href="#id164" id="id835">Overview:</a></li>
+<li><a class="reference internal" href="#id165" id="id836">Arguments:</a></li>
+<li><a class="reference internal" href="#id166" id="id837">Semantics:</a></li>
+<li><a class="reference internal" href="#id167" id="id838">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#cmpxchg-instruction" id="id839">‘<tt class="docutils literal"><span class="pre">cmpxchg</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id168" id="id840">Syntax:</a></li>
+<li><a class="reference internal" href="#id169" id="id841">Overview:</a></li>
+<li><a class="reference internal" href="#id170" id="id842">Arguments:</a></li>
+<li><a class="reference internal" href="#id171" id="id843">Semantics:</a></li>
+<li><a class="reference internal" href="#id172" id="id844">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#atomicrmw-instruction" id="id845">‘<tt class="docutils literal"><span class="pre">atomicrmw</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id173" id="id846">Syntax:</a></li>
+<li><a class="reference internal" href="#id174" id="id847">Overview:</a></li>
+<li><a class="reference internal" href="#id175" id="id848">Arguments:</a></li>
+<li><a class="reference internal" href="#id176" id="id849">Semantics:</a></li>
+<li><a class="reference internal" href="#id177" id="id850">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#getelementptr-instruction" id="id851">‘<tt class="docutils literal"><span class="pre">getelementptr</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id178" id="id852">Syntax:</a></li>
+<li><a class="reference internal" href="#id179" id="id853">Overview:</a></li>
+<li><a class="reference internal" href="#id180" id="id854">Arguments:</a></li>
+<li><a class="reference internal" href="#id181" id="id855">Semantics:</a></li>
+<li><a class="reference internal" href="#id182" id="id856">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#conversion-operations" id="id857">Conversion Operations</a><ul>
+<li><a class="reference internal" href="#trunc-to-instruction" id="id858">‘<tt class="docutils literal"><span class="pre">trunc</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id183" id="id859">Syntax:</a></li>
+<li><a class="reference internal" href="#id184" id="id860">Overview:</a></li>
+<li><a class="reference internal" href="#id185" id="id861">Arguments:</a></li>
+<li><a class="reference internal" href="#id186" id="id862">Semantics:</a></li>
+<li><a class="reference internal" href="#id187" id="id863">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#zext-to-instruction" id="id864">‘<tt class="docutils literal"><span class="pre">zext</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id188" id="id865">Syntax:</a></li>
+<li><a class="reference internal" href="#id189" id="id866">Overview:</a></li>
+<li><a class="reference internal" href="#id190" id="id867">Arguments:</a></li>
+<li><a class="reference internal" href="#id191" id="id868">Semantics:</a></li>
+<li><a class="reference internal" href="#id192" id="id869">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#sext-to-instruction" id="id870">‘<tt class="docutils literal"><span class="pre">sext</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id193" id="id871">Syntax:</a></li>
+<li><a class="reference internal" href="#id194" id="id872">Overview:</a></li>
+<li><a class="reference internal" href="#id195" id="id873">Arguments:</a></li>
+<li><a class="reference internal" href="#id196" id="id874">Semantics:</a></li>
+<li><a class="reference internal" href="#id197" id="id875">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fptrunc-to-instruction" id="id876">‘<tt class="docutils literal"><span class="pre">fptrunc</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id198" id="id877">Syntax:</a></li>
+<li><a class="reference internal" href="#id199" id="id878">Overview:</a></li>
+<li><a class="reference internal" href="#id200" id="id879">Arguments:</a></li>
+<li><a class="reference internal" href="#id201" id="id880">Semantics:</a></li>
+<li><a class="reference internal" href="#id202" id="id881">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fpext-to-instruction" id="id882">‘<tt class="docutils literal"><span class="pre">fpext</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id203" id="id883">Syntax:</a></li>
+<li><a class="reference internal" href="#id204" id="id884">Overview:</a></li>
+<li><a class="reference internal" href="#id205" id="id885">Arguments:</a></li>
+<li><a class="reference internal" href="#id206" id="id886">Semantics:</a></li>
+<li><a class="reference internal" href="#id207" id="id887">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fptoui-to-instruction" id="id888">‘<tt class="docutils literal"><span class="pre">fptoui</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id208" id="id889">Syntax:</a></li>
+<li><a class="reference internal" href="#id209" id="id890">Overview:</a></li>
+<li><a class="reference internal" href="#id210" id="id891">Arguments:</a></li>
+<li><a class="reference internal" href="#id211" id="id892">Semantics:</a></li>
+<li><a class="reference internal" href="#id212" id="id893">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fptosi-to-instruction" id="id894">‘<tt class="docutils literal"><span class="pre">fptosi</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id213" id="id895">Syntax:</a></li>
+<li><a class="reference internal" href="#id214" id="id896">Overview:</a></li>
+<li><a class="reference internal" href="#id215" id="id897">Arguments:</a></li>
+<li><a class="reference internal" href="#id216" id="id898">Semantics:</a></li>
+<li><a class="reference internal" href="#id217" id="id899">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#uitofp-to-instruction" id="id900">‘<tt class="docutils literal"><span class="pre">uitofp</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id218" id="id901">Syntax:</a></li>
+<li><a class="reference internal" href="#id219" id="id902">Overview:</a></li>
+<li><a class="reference internal" href="#id220" id="id903">Arguments:</a></li>
+<li><a class="reference internal" href="#id221" id="id904">Semantics:</a></li>
+<li><a class="reference internal" href="#id222" id="id905">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#sitofp-to-instruction" id="id906">‘<tt class="docutils literal"><span class="pre">sitofp</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id223" id="id907">Syntax:</a></li>
+<li><a class="reference internal" href="#id224" id="id908">Overview:</a></li>
+<li><a class="reference internal" href="#id225" id="id909">Arguments:</a></li>
+<li><a class="reference internal" href="#id226" id="id910">Semantics:</a></li>
+<li><a class="reference internal" href="#id227" id="id911">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#ptrtoint-to-instruction" id="id912">‘<tt class="docutils literal"><span class="pre">ptrtoint</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id228" id="id913">Syntax:</a></li>
+<li><a class="reference internal" href="#id229" id="id914">Overview:</a></li>
+<li><a class="reference internal" href="#id230" id="id915">Arguments:</a></li>
+<li><a class="reference internal" href="#id231" id="id916">Semantics:</a></li>
+<li><a class="reference internal" href="#id232" id="id917">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#inttoptr-to-instruction" id="id918">‘<tt class="docutils literal"><span class="pre">inttoptr</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id233" id="id919">Syntax:</a></li>
+<li><a class="reference internal" href="#id234" id="id920">Overview:</a></li>
+<li><a class="reference internal" href="#id235" id="id921">Arguments:</a></li>
+<li><a class="reference internal" href="#id236" id="id922">Semantics:</a></li>
+<li><a class="reference internal" href="#id237" id="id923">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#bitcast-to-instruction" id="id924">‘<tt class="docutils literal"><span class="pre">bitcast</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id238" id="id925">Syntax:</a></li>
+<li><a class="reference internal" href="#id239" id="id926">Overview:</a></li>
+<li><a class="reference internal" href="#id240" id="id927">Arguments:</a></li>
+<li><a class="reference internal" href="#id241" id="id928">Semantics:</a></li>
+<li><a class="reference internal" href="#id242" id="id929">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#addrspacecast-to-instruction" id="id930">‘<tt class="docutils literal"><span class="pre">addrspacecast</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id243" id="id931">Syntax:</a></li>
+<li><a class="reference internal" href="#id244" id="id932">Overview:</a></li>
+<li><a class="reference internal" href="#id245" id="id933">Arguments:</a></li>
+<li><a class="reference internal" href="#id246" id="id934">Semantics:</a></li>
+<li><a class="reference internal" href="#id247" id="id935">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#other-operations" id="id936">Other Operations</a><ul>
+<li><a class="reference internal" href="#icmp-instruction" id="id937">‘<tt class="docutils literal"><span class="pre">icmp</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id248" id="id938">Syntax:</a></li>
+<li><a class="reference internal" href="#id249" id="id939">Overview:</a></li>
+<li><a class="reference internal" href="#id250" id="id940">Arguments:</a></li>
+<li><a class="reference internal" href="#id251" id="id941">Semantics:</a></li>
+<li><a class="reference internal" href="#id252" id="id942">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#fcmp-instruction" id="id943">‘<tt class="docutils literal"><span class="pre">fcmp</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id253" id="id944">Syntax:</a></li>
+<li><a class="reference internal" href="#id254" id="id945">Overview:</a></li>
+<li><a class="reference internal" href="#id255" id="id946">Arguments:</a></li>
+<li><a class="reference internal" href="#id256" id="id947">Semantics:</a></li>
+<li><a class="reference internal" href="#id257" id="id948">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#phi-instruction" id="id949">‘<tt class="docutils literal"><span class="pre">phi</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id258" id="id950">Syntax:</a></li>
+<li><a class="reference internal" href="#id259" id="id951">Overview:</a></li>
+<li><a class="reference internal" href="#id260" id="id952">Arguments:</a></li>
+<li><a class="reference internal" href="#id261" id="id953">Semantics:</a></li>
+<li><a class="reference internal" href="#id262" id="id954">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#select-instruction" id="id955">‘<tt class="docutils literal"><span class="pre">select</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id263" id="id956">Syntax:</a></li>
+<li><a class="reference internal" href="#id264" id="id957">Overview:</a></li>
+<li><a class="reference internal" href="#id265" id="id958">Arguments:</a></li>
+<li><a class="reference internal" href="#id266" id="id959">Semantics:</a></li>
+<li><a class="reference internal" href="#id267" id="id960">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#call-instruction" id="id961">‘<tt class="docutils literal"><span class="pre">call</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id268" id="id962">Syntax:</a></li>
+<li><a class="reference internal" href="#id269" id="id963">Overview:</a></li>
+<li><a class="reference internal" href="#id270" id="id964">Arguments:</a></li>
+<li><a class="reference internal" href="#id271" id="id965">Semantics:</a></li>
+<li><a class="reference internal" href="#id272" id="id966">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#va-arg-instruction" id="id967">‘<tt class="docutils literal"><span class="pre">va_arg</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id273" id="id968">Syntax:</a></li>
+<li><a class="reference internal" href="#id274" id="id969">Overview:</a></li>
+<li><a class="reference internal" href="#id275" id="id970">Arguments:</a></li>
+<li><a class="reference internal" href="#id276" id="id971">Semantics:</a></li>
+<li><a class="reference internal" href="#id277" id="id972">Example:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#landingpad-instruction" id="id973">‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ Instruction</a><ul>
+<li><a class="reference internal" href="#id278" id="id974">Syntax:</a></li>
+<li><a class="reference internal" href="#id279" id="id975">Overview:</a></li>
+<li><a class="reference internal" href="#id280" id="id976">Arguments:</a></li>
+<li><a class="reference internal" href="#id281" id="id977">Semantics:</a></li>
+<li><a class="reference internal" href="#id282" id="id978">Example:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#intrinsic-functions" id="id979">Intrinsic Functions</a><ul>
+<li><a class="reference internal" href="#variable-argument-handling-intrinsics" id="id980">Variable Argument Handling Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-va-start-intrinsic" id="id981">‘<tt class="docutils literal"><span class="pre">llvm.va_start</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id283" id="id982">Syntax:</a></li>
+<li><a class="reference internal" href="#id284" id="id983">Overview:</a></li>
+<li><a class="reference internal" href="#id285" id="id984">Arguments:</a></li>
+<li><a class="reference internal" href="#id286" id="id985">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-va-end-intrinsic" id="id986">‘<tt class="docutils literal"><span class="pre">llvm.va_end</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id287" id="id987">Syntax:</a></li>
+<li><a class="reference internal" href="#id288" id="id988">Overview:</a></li>
+<li><a class="reference internal" href="#id289" id="id989">Arguments:</a></li>
+<li><a class="reference internal" href="#id290" id="id990">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-va-copy-intrinsic" id="id991">‘<tt class="docutils literal"><span class="pre">llvm.va_copy</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id291" id="id992">Syntax:</a></li>
+<li><a class="reference internal" href="#id292" id="id993">Overview:</a></li>
+<li><a class="reference internal" href="#id293" id="id994">Arguments:</a></li>
+<li><a class="reference internal" href="#id294" id="id995">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#accurate-garbage-collection-intrinsics" id="id996">Accurate Garbage Collection Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-gcroot-intrinsic" id="id997">‘<tt class="docutils literal"><span class="pre">llvm.gcroot</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id295" id="id998">Syntax:</a></li>
+<li><a class="reference internal" href="#id296" id="id999">Overview:</a></li>
+<li><a class="reference internal" href="#id297" id="id1000">Arguments:</a></li>
+<li><a class="reference internal" href="#id298" id="id1001">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-gcread-intrinsic" id="id1002">‘<tt class="docutils literal"><span class="pre">llvm.gcread</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id299" id="id1003">Syntax:</a></li>
+<li><a class="reference internal" href="#id300" id="id1004">Overview:</a></li>
+<li><a class="reference internal" href="#id301" id="id1005">Arguments:</a></li>
+<li><a class="reference internal" href="#id302" id="id1006">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-gcwrite-intrinsic" id="id1007">‘<tt class="docutils literal"><span class="pre">llvm.gcwrite</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id303" id="id1008">Syntax:</a></li>
+<li><a class="reference internal" href="#id304" id="id1009">Overview:</a></li>
+<li><a class="reference internal" href="#id305" id="id1010">Arguments:</a></li>
+<li><a class="reference internal" href="#id306" id="id1011">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#code-generator-intrinsics" id="id1012">Code Generator Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-returnaddress-intrinsic" id="id1013">‘<tt class="docutils literal"><span class="pre">llvm.returnaddress</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id307" id="id1014">Syntax:</a></li>
+<li><a class="reference internal" href="#id308" id="id1015">Overview:</a></li>
+<li><a class="reference internal" href="#id309" id="id1016">Arguments:</a></li>
+<li><a class="reference internal" href="#id310" id="id1017">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-frameaddress-intrinsic" id="id1018">‘<tt class="docutils literal"><span class="pre">llvm.frameaddress</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id311" id="id1019">Syntax:</a></li>
+<li><a class="reference internal" href="#id312" id="id1020">Overview:</a></li>
+<li><a class="reference internal" href="#id313" id="id1021">Arguments:</a></li>
+<li><a class="reference internal" href="#id314" id="id1022">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-read-register-and-llvm-write-register-intrinsics" id="id1023">‘<tt class="docutils literal"><span class="pre">llvm.read_register</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">llvm.write_register</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id315" id="id1024">Syntax:</a></li>
+<li><a class="reference internal" href="#id316" id="id1025">Overview:</a></li>
+<li><a class="reference internal" href="#id317" id="id1026">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-stacksave-intrinsic" id="id1027">‘<tt class="docutils literal"><span class="pre">llvm.stacksave</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id318" id="id1028">Syntax:</a></li>
+<li><a class="reference internal" href="#id319" id="id1029">Overview:</a></li>
+<li><a class="reference internal" href="#id320" id="id1030">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-stackrestore-intrinsic" id="id1031">‘<tt class="docutils literal"><span class="pre">llvm.stackrestore</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id321" id="id1032">Syntax:</a></li>
+<li><a class="reference internal" href="#id322" id="id1033">Overview:</a></li>
+<li><a class="reference internal" href="#id323" id="id1034">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-prefetch-intrinsic" id="id1035">‘<tt class="docutils literal"><span class="pre">llvm.prefetch</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id324" id="id1036">Syntax:</a></li>
+<li><a class="reference internal" href="#id325" id="id1037">Overview:</a></li>
+<li><a class="reference internal" href="#id326" id="id1038">Arguments:</a></li>
+<li><a class="reference internal" href="#id327" id="id1039">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-pcmarker-intrinsic" id="id1040">‘<tt class="docutils literal"><span class="pre">llvm.pcmarker</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id328" id="id1041">Syntax:</a></li>
+<li><a class="reference internal" href="#id329" id="id1042">Overview:</a></li>
+<li><a class="reference internal" href="#id330" id="id1043">Arguments:</a></li>
+<li><a class="reference internal" href="#id331" id="id1044">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-readcyclecounter-intrinsic" id="id1045">‘<tt class="docutils literal"><span class="pre">llvm.readcyclecounter</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id332" id="id1046">Syntax:</a></li>
+<li><a class="reference internal" href="#id333" id="id1047">Overview:</a></li>
+<li><a class="reference internal" href="#id334" id="id1048">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-clear-cache-intrinsic" id="id1049">‘<tt class="docutils literal"><span class="pre">llvm.clear_cache</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id335" id="id1050">Syntax:</a></li>
+<li><a class="reference internal" href="#id336" id="id1051">Overview:</a></li>
+<li><a class="reference internal" href="#id337" id="id1052">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#standard-c-library-intrinsics" id="id1053">Standard C Library Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-memcpy-intrinsic" id="id1054">‘<tt class="docutils literal"><span class="pre">llvm.memcpy</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id338" id="id1055">Syntax:</a></li>
+<li><a class="reference internal" href="#id339" id="id1056">Overview:</a></li>
+<li><a class="reference internal" href="#id340" id="id1057">Arguments:</a></li>
+<li><a class="reference internal" href="#id341" id="id1058">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-memmove-intrinsic" id="id1059">‘<tt class="docutils literal"><span class="pre">llvm.memmove</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id342" id="id1060">Syntax:</a></li>
+<li><a class="reference internal" href="#id343" id="id1061">Overview:</a></li>
+<li><a class="reference internal" href="#id344" id="id1062">Arguments:</a></li>
+<li><a class="reference internal" href="#id345" id="id1063">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-memset-intrinsics" id="id1064">‘<tt class="docutils literal"><span class="pre">llvm.memset.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id346" id="id1065">Syntax:</a></li>
+<li><a class="reference internal" href="#id347" id="id1066">Overview:</a></li>
+<li><a class="reference internal" href="#id348" id="id1067">Arguments:</a></li>
+<li><a class="reference internal" href="#id349" id="id1068">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-sqrt-intrinsic" id="id1069">‘<tt class="docutils literal"><span class="pre">llvm.sqrt.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id350" id="id1070">Syntax:</a></li>
+<li><a class="reference internal" href="#id351" id="id1071">Overview:</a></li>
+<li><a class="reference internal" href="#id352" id="id1072">Arguments:</a></li>
+<li><a class="reference internal" href="#id353" id="id1073">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-powi-intrinsic" id="id1074">‘<tt class="docutils literal"><span class="pre">llvm.powi.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id354" id="id1075">Syntax:</a></li>
+<li><a class="reference internal" href="#id355" id="id1076">Overview:</a></li>
+<li><a class="reference internal" href="#id356" id="id1077">Arguments:</a></li>
+<li><a class="reference internal" href="#id357" id="id1078">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-sin-intrinsic" id="id1079">‘<tt class="docutils literal"><span class="pre">llvm.sin.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id358" id="id1080">Syntax:</a></li>
+<li><a class="reference internal" href="#id359" id="id1081">Overview:</a></li>
+<li><a class="reference internal" href="#id360" id="id1082">Arguments:</a></li>
+<li><a class="reference internal" href="#id361" id="id1083">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-cos-intrinsic" id="id1084">‘<tt class="docutils literal"><span class="pre">llvm.cos.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id362" id="id1085">Syntax:</a></li>
+<li><a class="reference internal" href="#id363" id="id1086">Overview:</a></li>
+<li><a class="reference internal" href="#id364" id="id1087">Arguments:</a></li>
+<li><a class="reference internal" href="#id365" id="id1088">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-pow-intrinsic" id="id1089">‘<tt class="docutils literal"><span class="pre">llvm.pow.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id366" id="id1090">Syntax:</a></li>
+<li><a class="reference internal" href="#id367" id="id1091">Overview:</a></li>
+<li><a class="reference internal" href="#id368" id="id1092">Arguments:</a></li>
+<li><a class="reference internal" href="#id369" id="id1093">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-exp-intrinsic" id="id1094">‘<tt class="docutils literal"><span class="pre">llvm.exp.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id370" id="id1095">Syntax:</a></li>
+<li><a class="reference internal" href="#id371" id="id1096">Overview:</a></li>
+<li><a class="reference internal" href="#id372" id="id1097">Arguments:</a></li>
+<li><a class="reference internal" href="#id373" id="id1098">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-exp2-intrinsic" id="id1099">‘<tt class="docutils literal"><span class="pre">llvm.exp2.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id374" id="id1100">Syntax:</a></li>
+<li><a class="reference internal" href="#id375" id="id1101">Overview:</a></li>
+<li><a class="reference internal" href="#id376" id="id1102">Arguments:</a></li>
+<li><a class="reference internal" href="#id377" id="id1103">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-log-intrinsic" id="id1104">‘<tt class="docutils literal"><span class="pre">llvm.log.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id378" id="id1105">Syntax:</a></li>
+<li><a class="reference internal" href="#id379" id="id1106">Overview:</a></li>
+<li><a class="reference internal" href="#id380" id="id1107">Arguments:</a></li>
+<li><a class="reference internal" href="#id381" id="id1108">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-log10-intrinsic" id="id1109">‘<tt class="docutils literal"><span class="pre">llvm.log10.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id382" id="id1110">Syntax:</a></li>
+<li><a class="reference internal" href="#id383" id="id1111">Overview:</a></li>
+<li><a class="reference internal" href="#id384" id="id1112">Arguments:</a></li>
+<li><a class="reference internal" href="#id385" id="id1113">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-log2-intrinsic" id="id1114">‘<tt class="docutils literal"><span class="pre">llvm.log2.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id386" id="id1115">Syntax:</a></li>
+<li><a class="reference internal" href="#id387" id="id1116">Overview:</a></li>
+<li><a class="reference internal" href="#id388" id="id1117">Arguments:</a></li>
+<li><a class="reference internal" href="#id389" id="id1118">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-fma-intrinsic" id="id1119">‘<tt class="docutils literal"><span class="pre">llvm.fma.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id390" id="id1120">Syntax:</a></li>
+<li><a class="reference internal" href="#id391" id="id1121">Overview:</a></li>
+<li><a class="reference internal" href="#id392" id="id1122">Arguments:</a></li>
+<li><a class="reference internal" href="#id393" id="id1123">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-fabs-intrinsic" id="id1124">‘<tt class="docutils literal"><span class="pre">llvm.fabs.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id394" id="id1125">Syntax:</a></li>
+<li><a class="reference internal" href="#id395" id="id1126">Overview:</a></li>
+<li><a class="reference internal" href="#id396" id="id1127">Arguments:</a></li>
+<li><a class="reference internal" href="#id397" id="id1128">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-copysign-intrinsic" id="id1129">‘<tt class="docutils literal"><span class="pre">llvm.copysign.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id398" id="id1130">Syntax:</a></li>
+<li><a class="reference internal" href="#id399" id="id1131">Overview:</a></li>
+<li><a class="reference internal" href="#id400" id="id1132">Arguments:</a></li>
+<li><a class="reference internal" href="#id401" id="id1133">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-floor-intrinsic" id="id1134">‘<tt class="docutils literal"><span class="pre">llvm.floor.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id402" id="id1135">Syntax:</a></li>
+<li><a class="reference internal" href="#id403" id="id1136">Overview:</a></li>
+<li><a class="reference internal" href="#id404" id="id1137">Arguments:</a></li>
+<li><a class="reference internal" href="#id405" id="id1138">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-ceil-intrinsic" id="id1139">‘<tt class="docutils literal"><span class="pre">llvm.ceil.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id406" id="id1140">Syntax:</a></li>
+<li><a class="reference internal" href="#id407" id="id1141">Overview:</a></li>
+<li><a class="reference internal" href="#id408" id="id1142">Arguments:</a></li>
+<li><a class="reference internal" href="#id409" id="id1143">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-trunc-intrinsic" id="id1144">‘<tt class="docutils literal"><span class="pre">llvm.trunc.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id410" id="id1145">Syntax:</a></li>
+<li><a class="reference internal" href="#id411" id="id1146">Overview:</a></li>
+<li><a class="reference internal" href="#id412" id="id1147">Arguments:</a></li>
+<li><a class="reference internal" href="#id413" id="id1148">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-rint-intrinsic" id="id1149">‘<tt class="docutils literal"><span class="pre">llvm.rint.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id414" id="id1150">Syntax:</a></li>
+<li><a class="reference internal" href="#id415" id="id1151">Overview:</a></li>
+<li><a class="reference internal" href="#id416" id="id1152">Arguments:</a></li>
+<li><a class="reference internal" href="#id417" id="id1153">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-nearbyint-intrinsic" id="id1154">‘<tt class="docutils literal"><span class="pre">llvm.nearbyint.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id418" id="id1155">Syntax:</a></li>
+<li><a class="reference internal" href="#id419" id="id1156">Overview:</a></li>
+<li><a class="reference internal" href="#id420" id="id1157">Arguments:</a></li>
+<li><a class="reference internal" href="#id421" id="id1158">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-round-intrinsic" id="id1159">‘<tt class="docutils literal"><span class="pre">llvm.round.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id422" id="id1160">Syntax:</a></li>
+<li><a class="reference internal" href="#id423" id="id1161">Overview:</a></li>
+<li><a class="reference internal" href="#id424" id="id1162">Arguments:</a></li>
+<li><a class="reference internal" href="#id425" id="id1163">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#bit-manipulation-intrinsics" id="id1164">Bit Manipulation Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-bswap-intrinsics" id="id1165">‘<tt class="docutils literal"><span class="pre">llvm.bswap.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id426" id="id1166">Syntax:</a></li>
+<li><a class="reference internal" href="#id427" id="id1167">Overview:</a></li>
+<li><a class="reference internal" href="#id428" id="id1168">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-ctpop-intrinsic" id="id1169">‘<tt class="docutils literal"><span class="pre">llvm.ctpop.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id429" id="id1170">Syntax:</a></li>
+<li><a class="reference internal" href="#id430" id="id1171">Overview:</a></li>
+<li><a class="reference internal" href="#id431" id="id1172">Arguments:</a></li>
+<li><a class="reference internal" href="#id432" id="id1173">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-ctlz-intrinsic" id="id1174">‘<tt class="docutils literal"><span class="pre">llvm.ctlz.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id433" id="id1175">Syntax:</a></li>
+<li><a class="reference internal" href="#id434" id="id1176">Overview:</a></li>
+<li><a class="reference internal" href="#id435" id="id1177">Arguments:</a></li>
+<li><a class="reference internal" href="#id436" id="id1178">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-cttz-intrinsic" id="id1179">‘<tt class="docutils literal"><span class="pre">llvm.cttz.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id437" id="id1180">Syntax:</a></li>
+<li><a class="reference internal" href="#id438" id="id1181">Overview:</a></li>
+<li><a class="reference internal" href="#id439" id="id1182">Arguments:</a></li>
+<li><a class="reference internal" href="#id440" id="id1183">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#arithmetic-with-overflow-intrinsics" id="id1184">Arithmetic with Overflow Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-sadd-with-overflow-intrinsics" id="id1185">‘<tt class="docutils literal"><span class="pre">llvm.sadd.with.overflow.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id441" id="id1186">Syntax:</a></li>
+<li><a class="reference internal" href="#id442" id="id1187">Overview:</a></li>
+<li><a class="reference internal" href="#id443" id="id1188">Arguments:</a></li>
+<li><a class="reference internal" href="#id444" id="id1189">Semantics:</a></li>
+<li><a class="reference internal" href="#id445" id="id1190">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-uadd-with-overflow-intrinsics" id="id1191">‘<tt class="docutils literal"><span class="pre">llvm.uadd.with.overflow.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id446" id="id1192">Syntax:</a></li>
+<li><a class="reference internal" href="#id447" id="id1193">Overview:</a></li>
+<li><a class="reference internal" href="#id448" id="id1194">Arguments:</a></li>
+<li><a class="reference internal" href="#id449" id="id1195">Semantics:</a></li>
+<li><a class="reference internal" href="#id450" id="id1196">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-ssub-with-overflow-intrinsics" id="id1197">‘<tt class="docutils literal"><span class="pre">llvm.ssub.with.overflow.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id451" id="id1198">Syntax:</a></li>
+<li><a class="reference internal" href="#id452" id="id1199">Overview:</a></li>
+<li><a class="reference internal" href="#id453" id="id1200">Arguments:</a></li>
+<li><a class="reference internal" href="#id454" id="id1201">Semantics:</a></li>
+<li><a class="reference internal" href="#id455" id="id1202">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-usub-with-overflow-intrinsics" id="id1203">‘<tt class="docutils literal"><span class="pre">llvm.usub.with.overflow.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id456" id="id1204">Syntax:</a></li>
+<li><a class="reference internal" href="#id457" id="id1205">Overview:</a></li>
+<li><a class="reference internal" href="#id458" id="id1206">Arguments:</a></li>
+<li><a class="reference internal" href="#id459" id="id1207">Semantics:</a></li>
+<li><a class="reference internal" href="#id460" id="id1208">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-smul-with-overflow-intrinsics" id="id1209">‘<tt class="docutils literal"><span class="pre">llvm.smul.with.overflow.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id461" id="id1210">Syntax:</a></li>
+<li><a class="reference internal" href="#id462" id="id1211">Overview:</a></li>
+<li><a class="reference internal" href="#id463" id="id1212">Arguments:</a></li>
+<li><a class="reference internal" href="#id464" id="id1213">Semantics:</a></li>
+<li><a class="reference internal" href="#id465" id="id1214">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-umul-with-overflow-intrinsics" id="id1215">‘<tt class="docutils literal"><span class="pre">llvm.umul.with.overflow.*</span></tt>‘ Intrinsics</a><ul>
+<li><a class="reference internal" href="#id466" id="id1216">Syntax:</a></li>
+<li><a class="reference internal" href="#id467" id="id1217">Overview:</a></li>
+<li><a class="reference internal" href="#id468" id="id1218">Arguments:</a></li>
+<li><a class="reference internal" href="#id469" id="id1219">Semantics:</a></li>
+<li><a class="reference internal" href="#id470" id="id1220">Examples:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#specialised-arithmetic-intrinsics" id="id1221">Specialised Arithmetic Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-fmuladd-intrinsic" id="id1222">‘<tt class="docutils literal"><span class="pre">llvm.fmuladd.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id471" id="id1223">Syntax:</a></li>
+<li><a class="reference internal" href="#id472" id="id1224">Overview:</a></li>
+<li><a class="reference internal" href="#id473" id="id1225">Arguments:</a></li>
+<li><a class="reference internal" href="#id474" id="id1226">Semantics:</a></li>
+<li><a class="reference internal" href="#id475" id="id1227">Examples:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#half-precision-floating-point-intrinsics" id="id1228">Half Precision Floating Point Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-convert-to-fp16-intrinsic" id="id1229">‘<tt class="docutils literal"><span class="pre">llvm.convert.to.fp16</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id476" id="id1230">Syntax:</a></li>
+<li><a class="reference internal" href="#id477" id="id1231">Overview:</a></li>
+<li><a class="reference internal" href="#id478" id="id1232">Arguments:</a></li>
+<li><a class="reference internal" href="#id479" id="id1233">Semantics:</a></li>
+<li><a class="reference internal" href="#id480" id="id1234">Examples:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-convert-from-fp16-intrinsic" id="id1235">‘<tt class="docutils literal"><span class="pre">llvm.convert.from.fp16</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id481" id="id1236">Syntax:</a></li>
+<li><a class="reference internal" href="#id482" id="id1237">Overview:</a></li>
+<li><a class="reference internal" href="#id483" id="id1238">Arguments:</a></li>
+<li><a class="reference internal" href="#id484" id="id1239">Semantics:</a></li>
+<li><a class="reference internal" href="#id485" id="id1240">Examples:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#debugger-intrinsics" id="id1241">Debugger Intrinsics</a></li>
+<li><a class="reference internal" href="#exception-handling-intrinsics" id="id1242">Exception Handling Intrinsics</a></li>
+<li><a class="reference internal" href="#trampoline-intrinsics" id="id1243">Trampoline Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-init-trampoline-intrinsic" id="id1244">‘<tt class="docutils literal"><span class="pre">llvm.init.trampoline</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id486" id="id1245">Syntax:</a></li>
+<li><a class="reference internal" href="#id487" id="id1246">Overview:</a></li>
+<li><a class="reference internal" href="#id488" id="id1247">Arguments:</a></li>
+<li><a class="reference internal" href="#id489" id="id1248">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-adjust-trampoline-intrinsic" id="id1249">‘<tt class="docutils literal"><span class="pre">llvm.adjust.trampoline</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id490" id="id1250">Syntax:</a></li>
+<li><a class="reference internal" href="#id491" id="id1251">Overview:</a></li>
+<li><a class="reference internal" href="#id492" id="id1252">Arguments:</a></li>
+<li><a class="reference internal" href="#id493" id="id1253">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#memory-use-markers" id="id1254">Memory Use Markers</a><ul>
+<li><a class="reference internal" href="#llvm-lifetime-start-intrinsic" id="id1255">‘<tt class="docutils literal"><span class="pre">llvm.lifetime.start</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id494" id="id1256">Syntax:</a></li>
+<li><a class="reference internal" href="#id495" id="id1257">Overview:</a></li>
+<li><a class="reference internal" href="#id496" id="id1258">Arguments:</a></li>
+<li><a class="reference internal" href="#id497" id="id1259">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-lifetime-end-intrinsic" id="id1260">‘<tt class="docutils literal"><span class="pre">llvm.lifetime.end</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id498" id="id1261">Syntax:</a></li>
+<li><a class="reference internal" href="#id499" id="id1262">Overview:</a></li>
+<li><a class="reference internal" href="#id500" id="id1263">Arguments:</a></li>
+<li><a class="reference internal" href="#id501" id="id1264">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-invariant-start-intrinsic" id="id1265">‘<tt class="docutils literal"><span class="pre">llvm.invariant.start</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id502" id="id1266">Syntax:</a></li>
+<li><a class="reference internal" href="#id503" id="id1267">Overview:</a></li>
+<li><a class="reference internal" href="#id504" id="id1268">Arguments:</a></li>
+<li><a class="reference internal" href="#id505" id="id1269">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-invariant-end-intrinsic" id="id1270">‘<tt class="docutils literal"><span class="pre">llvm.invariant.end</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id506" id="id1271">Syntax:</a></li>
+<li><a class="reference internal" href="#id507" id="id1272">Overview:</a></li>
+<li><a class="reference internal" href="#id508" id="id1273">Arguments:</a></li>
+<li><a class="reference internal" href="#id509" id="id1274">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#general-intrinsics" id="id1275">General Intrinsics</a><ul>
+<li><a class="reference internal" href="#llvm-var-annotation-intrinsic" id="id1276">‘<tt class="docutils literal"><span class="pre">llvm.var.annotation</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id510" id="id1277">Syntax:</a></li>
+<li><a class="reference internal" href="#id511" id="id1278">Overview:</a></li>
+<li><a class="reference internal" href="#id512" id="id1279">Arguments:</a></li>
+<li><a class="reference internal" href="#id513" id="id1280">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-ptr-annotation-intrinsic" id="id1281">‘<tt class="docutils literal"><span class="pre">llvm.ptr.annotation.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id514" id="id1282">Syntax:</a></li>
+<li><a class="reference internal" href="#id515" id="id1283">Overview:</a></li>
+<li><a class="reference internal" href="#id516" id="id1284">Arguments:</a></li>
+<li><a class="reference internal" href="#id517" id="id1285">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-annotation-intrinsic" id="id1286">‘<tt class="docutils literal"><span class="pre">llvm.annotation.*</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id518" id="id1287">Syntax:</a></li>
+<li><a class="reference internal" href="#id519" id="id1288">Overview:</a></li>
+<li><a class="reference internal" href="#id520" id="id1289">Arguments:</a></li>
+<li><a class="reference internal" href="#id521" id="id1290">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-trap-intrinsic" id="id1291">‘<tt class="docutils literal"><span class="pre">llvm.trap</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id522" id="id1292">Syntax:</a></li>
+<li><a class="reference internal" href="#id523" id="id1293">Overview:</a></li>
+<li><a class="reference internal" href="#id524" id="id1294">Arguments:</a></li>
+<li><a class="reference internal" href="#id525" id="id1295">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-debugtrap-intrinsic" id="id1296">‘<tt class="docutils literal"><span class="pre">llvm.debugtrap</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id526" id="id1297">Syntax:</a></li>
+<li><a class="reference internal" href="#id527" id="id1298">Overview:</a></li>
+<li><a class="reference internal" href="#id528" id="id1299">Arguments:</a></li>
+<li><a class="reference internal" href="#id529" id="id1300">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-stackprotector-intrinsic" id="id1301">‘<tt class="docutils literal"><span class="pre">llvm.stackprotector</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id530" id="id1302">Syntax:</a></li>
+<li><a class="reference internal" href="#id531" id="id1303">Overview:</a></li>
+<li><a class="reference internal" href="#id532" id="id1304">Arguments:</a></li>
+<li><a class="reference internal" href="#id533" id="id1305">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-stackprotectorcheck-intrinsic" id="id1306">‘<tt class="docutils literal"><span class="pre">llvm.stackprotectorcheck</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id534" id="id1307">Syntax:</a></li>
+<li><a class="reference internal" href="#id535" id="id1308">Overview:</a></li>
+<li><a class="reference internal" href="#id536" id="id1309">Arguments:</a></li>
+<li><a class="reference internal" href="#id537" id="id1310">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-objectsize-intrinsic" id="id1311">‘<tt class="docutils literal"><span class="pre">llvm.objectsize</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id538" id="id1312">Syntax:</a></li>
+<li><a class="reference internal" href="#id539" id="id1313">Overview:</a></li>
+<li><a class="reference internal" href="#id540" id="id1314">Arguments:</a></li>
+<li><a class="reference internal" href="#id541" id="id1315">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-expect-intrinsic" id="id1316">‘<tt class="docutils literal"><span class="pre">llvm.expect</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id542" id="id1317">Syntax:</a></li>
+<li><a class="reference internal" href="#id543" id="id1318">Overview:</a></li>
+<li><a class="reference internal" href="#id544" id="id1319">Arguments:</a></li>
+<li><a class="reference internal" href="#id545" id="id1320">Semantics:</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#llvm-donothing-intrinsic" id="id1321">‘<tt class="docutils literal"><span class="pre">llvm.donothing</span></tt>‘ Intrinsic</a><ul>
+<li><a class="reference internal" href="#id546" id="id1322">Syntax:</a></li>
+<li><a class="reference internal" href="#id547" id="id1323">Overview:</a></li>
+<li><a class="reference internal" href="#id548" id="id1324">Arguments:</a></li>
+<li><a class="reference internal" href="#id549" id="id1325">Semantics:</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#stack-map-intrinsics" id="id1326">Stack Map Intrinsics</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="abstract">
+<h2><a class="toc-backref" href="#id550">Abstract</a><a class="headerlink" href="#abstract" title="Permalink to this headline">¶</a></h2>
+<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>
+<div class="section" id="introduction">
+<h2><a class="toc-backref" href="#id551">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
+<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>
+<div class="section" id="well-formedness">
+<span id="wellformed"></span><h3><a class="toc-backref" href="#id552">Well-Formedness</a><a class="headerlink" href="#well-formedness" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%x</span> <span class="p">=</span> <span class="k">add</span> <span class="k">i32</span> <span class="m">1</span><span class="p">,</span> <span class="nv">%x</span>
+</pre></div>
+</div>
+<p>because the definition of <tt class="docutils literal"><span class="pre">%x</span></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>
+<div class="section" id="identifiers">
+<span id="id1"></span><h2><a class="toc-backref" href="#id553">Identifiers</a><a class="headerlink" href="#identifiers" title="Permalink to this headline">¶</a></h2>
+<p>LLVM identifiers come in two basic types: global and local. Global
+identifiers (functions, global variables) begin with the <tt class="docutils literal"><span class="pre">'@'</span></tt>
+character. Local identifiers (register names, types) begin with the
+<tt class="docutils literal"><span class="pre">'%'</span></tt> character. Additionally, there are three different formats for
+identifiers, for different purposes:</p>
+<ol class="arabic simple">
+<li>Named values are represented as a string of characters with their
+prefix. For example, <tt class="docutils literal"><span class="pre">%foo</span></tt>, <tt class="docutils literal"><span class="pre">@DivisionByZero</span></tt>,
+<tt class="docutils literal"><span class="pre">%a.really.long.identifier</span></tt>. The actual regular expression used is
+‘<tt class="docutils literal"><span class="pre">[%@][a-zA-Z$._][a-zA-Z$._0-9]*</span></tt>‘. Identifiers which require other
+characters in their names can be surrounded with quotes. Special
+characters may be escaped using <tt class="docutils literal"><span class="pre">"\xx"</span></tt> where <tt class="docutils literal"><span class="pre">xx</span></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 class="docutils literal"><span class="pre">%12</span></tt>, <tt class="docutils literal"><span class="pre">@2</span></tt>, <tt class="docutils literal"><span class="pre">%44</span></tt>.</li>
+<li>Constants, which are described in the section  <a class="reference internal" href="#constants">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 class="docutils literal"><span class="pre">add</span></tt>‘,
+‘<tt class="docutils literal"><span class="pre">bitcast</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">ret</span></tt>‘, etc...), for primitive type names (‘<tt class="docutils literal"><span class="pre">void</span></tt>‘,
+‘<tt class="docutils literal"><span class="pre">i32</span></tt>‘, etc...), and others. These reserved words cannot conflict
+with variable names, because none of them start with a prefix character
+(<tt class="docutils literal"><span class="pre">'%'</span></tt> or <tt class="docutils literal"><span class="pre">'@'</span></tt>).</p>
+<p>Here is an example of LLVM code to multiply the integer variable
+‘<tt class="docutils literal"><span class="pre">%X</span></tt>‘ by 8:</p>
+<p>The easy way:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%result</span> <span class="p">=</span> <span class="k">mul</span> <span class="k">i32</span> <span class="nv">%X</span><span class="p">,</span> <span class="m">8</span>
+</pre></div>
+</div>
+<p>After strength reduction:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%result</span> <span class="p">=</span> <span class="k">shl</span> <span class="k">i32</span> <span class="nv">%X</span><span class="p">,</span> <span class="m">3</span>
+</pre></div>
+</div>
+<p>And the hard way:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">%0</span> <span class="p">=</span> <span class="k">add</span> <span class="k">i32</span> <span class="nv">%X</span><span class="p">,</span> <span class="nv">%X</span>           <span class="c">; yields i32:%0</span>
+<span class="nv-Anonymous">%1</span> <span class="p">=</span> <span class="k">add</span> <span class="k">i32</span> <span class="nv-Anonymous">%0</span><span class="p">,</span> <span class="nv-Anonymous">%0</span>           <span class="c">; yields i32:%1</span>
+<span class="nv">%result</span> <span class="p">=</span> <span class="k">add</span> <span class="k">i32</span> <span class="nv-Anonymous">%1</span><span class="p">,</span> <span class="nv-Anonymous">%1</span>
+</pre></div>
+</div>
+<p>This last way of multiplying <tt class="docutils literal"><span class="pre">%X</span></tt> by 8 illustrates several important
+lexical features of LLVM:</p>
+<ol class="arabic simple">
+<li>Comments are delimited with a ‘<tt class="docutils literal"><span class="pre">;</span></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 (using a per-function
+incrementing counter, starting with 0). Note that basic blocks are
+included in this numbering. For example, if the entry basic block is not
+given a label name, then it will get number 0.</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.</p>
+</div>
+<div class="section" id="high-level-structure">
+<h2><a class="toc-backref" href="#id554">High Level Structure</a><a class="headerlink" href="#high-level-structure" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="module-structure">
+<h3><a class="toc-backref" href="#id555">Module Structure</a><a class="headerlink" href="#module-structure" title="Permalink to this headline">¶</a></h3>
+<p>LLVM programs are composed of <tt class="docutils literal"><span class="pre">Module</span></tt>‘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>
+<div class="highlight-llvm"><pre>; Declare the string constant as a global constant.
+ at .str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"
+
+; External declaration of the puts function
+declare i32 @puts(i8* nocapture) nounwind
+
+; Definition of main function
+define i32 @main() {   ; i32()*
+  ; Convert [13 x i8]* to i8  *...
+  %cast210 = getelementptr [13 x i8]* @.str, i64 0, i64 0
+
+  ; Call puts function to write out the string to stdout.
+  call i32 @puts(i8* %cast210)
+  ret i32 0
+}
+
+; Named metadata
+!1 = metadata !{i32 42}
+!foo = !{!1, null}</pre>
+</div>
+<p>This example is made up of a <a class="reference internal" href="#globalvars"><em>global variable</em></a> named
+“<tt class="docutils literal"><span class="pre">.str</span></tt>”, an external declaration of the “<tt class="docutils literal"><span class="pre">puts</span></tt>” function, a
+<a class="reference internal" href="#functionstructure"><em>function definition</em></a> for “<tt class="docutils literal"><span class="pre">main</span></tt>” and
+<a class="reference internal" href="#namedmetadatastructure"><em>named metadata</em></a> “<tt class="docutils literal"><span class="pre">foo</span></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 class="reference internal" href="#linkage"><em>linkage types</em></a>.</p>
+</div>
+<div class="section" id="linkage-types">
+<span id="linkage"></span><h3><a class="toc-backref" href="#id556">Linkage Types</a><a class="headerlink" href="#linkage-types" title="Permalink to this headline">¶</a></h3>
+<p>All Global Variables and Functions have one of the following types of
+linkage:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">private</span></tt></dt>
+<dd>Global values with “<tt class="docutils literal"><span class="pre">private</span></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 class="docutils literal"><span class="pre">internal</span></tt></dt>
+<dd>Similar to private, but the value shows as a local symbol
+(<tt class="docutils literal"><span class="pre">STB_LOCAL</span></tt> in the case of ELF) in the object file. This
+corresponds to the notion of the ‘<tt class="docutils literal"><span class="pre">static</span></tt>‘ keyword in C.</dd>
+<dt><tt class="docutils literal"><span class="pre">available_externally</span></tt></dt>
+<dd>Globals with “<tt class="docutils literal"><span class="pre">available_externally</span></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 class="docutils literal"><span class="pre">available_externally</span></tt> linkage
+are allowed to be discarded at will, and are otherwise the same as
+<tt class="docutils literal"><span class="pre">linkonce_odr</span></tt>. This linkage type is only allowed on definitions,
+not declarations.</dd>
+<dt><tt class="docutils literal"><span class="pre">linkonce</span></tt></dt>
+<dd>Globals with “<tt class="docutils literal"><span class="pre">linkonce</span></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 class="docutils literal"><span class="pre">linkonce</span></tt> globals are allowed to be discarded. Note
+that <tt class="docutils literal"><span class="pre">linkonce</span></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 class="docutils literal"><span class="pre">linkonce_odr</span></tt>” linkage.</dd>
+<dt><tt class="docutils literal"><span class="pre">weak</span></tt></dt>
+<dd>“<tt class="docutils literal"><span class="pre">weak</span></tt>” linkage has the same merging semantics as <tt class="docutils literal"><span class="pre">linkonce</span></tt>
+linkage, except that unreferenced globals with <tt class="docutils literal"><span class="pre">weak</span></tt> linkage may
+not be discarded. This is used for globals that are declared “weak”
+in C source code.</dd>
+<dt><tt class="docutils literal"><span class="pre">common</span></tt></dt>
+<dd>“<tt class="docutils literal"><span class="pre">common</span></tt>” linkage is most similar to “<tt class="docutils literal"><span class="pre">weak</span></tt>” linkage, but they
+are used for tentative definitions in C, such as “<tt class="docutils literal"><span class="pre">int</span> <span class="pre">X;</span></tt>” at
+global scope. Symbols with “<tt class="docutils literal"><span class="pre">common</span></tt>” linkage are merged in the
+same way as <tt class="docutils literal"><span class="pre">weak</span> <span class="pre">symbols</span></tt>, and they may not be deleted if
+unreferenced. <tt class="docutils literal"><span class="pre">common</span></tt> symbols may not have an explicit section,
+must have a zero initializer, and may not be marked
+‘<a class="reference internal" href="#globalvars"><em>constant</em></a>‘. Functions and aliases may not have
+common linkage.</dd>
+</dl>
+<dl class="docutils" id="linkage-appending">
+<dt><tt class="docutils literal"><span class="pre">appending</span></tt></dt>
+<dd>“<tt class="docutils literal"><span class="pre">appending</span></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 class="docutils literal"><span class="pre">extern_weak</span></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 class="docutils literal"><span class="pre">linkonce_odr</span></tt>, <tt class="docutils literal"><span class="pre">weak_odr</span></tt></dt>
+<dd>Some languages allow differing globals to be merged, such as two
+functions with different semantics. Other languages, such as
+<tt class="docutils literal"><span class="pre">C++</span></tt>, ensure that only equivalent globals are ever merged (the
+“one definition rule” — “ODR”).  Such languages can use the
+<tt class="docutils literal"><span class="pre">linkonce_odr</span></tt> and <tt class="docutils literal"><span class="pre">weak_odr</span></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 class="docutils literal"><span class="pre">odr</span></tt> versions.</dd>
+<dt><tt class="docutils literal"><span class="pre">external</span></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>It is illegal for a function <em>declaration</em> to have any linkage type
+other than <tt class="docutils literal"><span class="pre">external</span></tt> or <tt class="docutils literal"><span class="pre">extern_weak</span></tt>.</p>
+</div>
+<div class="section" id="calling-conventions">
+<span id="callingconv"></span><h3><a class="toc-backref" href="#id557">Calling Conventions</a><a class="headerlink" href="#calling-conventions" title="Permalink to this headline">¶</a></h3>
+<p>LLVM <a class="reference internal" href="#functionstructure"><em>functions</em></a>, <a class="reference internal" href="#i-call"><em>calls</em></a> and
+<a class="reference internal" href="#i-invoke"><em>invokes</em></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 class="docutils">
+<dt>“<tt class="docutils literal"><span class="pre">ccc</span></tt>” - The C calling convention</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>“<tt class="docutils literal"><span class="pre">fastcc</span></tt>” - The fast calling convention</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 class="reference external" href="CodeGenerator.html#id80">Tail calls can only
+be optimized when this, the GHC or the HiPE 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>“<tt class="docutils literal"><span class="pre">coldcc</span></tt>” - The cold calling convention</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. Furthermore the inliner doesn’t consider such function
+calls for inlining.</dd>
+<dt>“<tt class="docutils literal"><span class="pre">cc</span> <span class="pre">10</span></tt>” - GHC convention</dt>
+<dd><p class="first">This calling convention has been implemented specifically for use by
+the <a class="reference external" 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:</p>
+<ul class="simple">
+<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>
+<p class="last">This calling convention supports <a class="reference external" href="CodeGenerator.html#id80">tail call
+optimization</a> but requires both the
+caller and callee are using it.</p>
+</dd>
+<dt>“<tt class="docutils literal"><span class="pre">cc</span> <span class="pre">11</span></tt>” - The HiPE calling convention</dt>
+<dd>This calling convention has been implemented specifically for use by
+the <a class="reference external" href="http://www.it.uu.se/research/group/hipe/">High-Performance Erlang
+(HiPE)</a> compiler, <em>the</em>
+native code compiler of the <a class="reference external" href="http://www.erlang.org/download.shtml">Ericsson’s Open Source Erlang/OTP
+system</a>. It uses more
+registers for argument passing than the ordinary C calling
+convention and defines no callee-saved registers. The calling
+convention properly supports <a class="reference external" href="CodeGenerator.html#id80">tail call
+optimization</a> but requires that both the
+caller and the callee use it. It uses a <em>register pinning</em>
+mechanism, similar to GHC’s convention, for keeping frequently
+accessed runtime components pinned to specific hardware registers.
+At the moment only X86 supports this convention (both 32 and 64
+bit).</dd>
+<dt>“<tt class="docutils literal"><span class="pre">webkit_jscc</span></tt>” - WebKit’s JavaScript calling convention</dt>
+<dd>This calling convention has been implemented for <a class="reference external" href="https://trac.webkit.org/wiki/FTLJIT">WebKit FTL JIT</a>. It passes arguments on the
+stack right to left (as cdecl does), and returns a value in the
+platform’s customary return register.</dd>
+<dt>“<tt class="docutils literal"><span class="pre">anyregcc</span></tt>” - Dynamic calling convention for code patching</dt>
+<dd>This is a special convention that supports patching an arbitrary code
+sequence in place of a call site. This convention forces the call
+arguments into registers but allows them to be dynamcially
+allocated. This can currently only be used with calls to
+llvm.experimental.patchpoint because only this intrinsic records
+the location of its arguments in a side table. See <a class="reference internal" href="StackMaps.html"><em>Stack maps and patch points in LLVM</em></a>.</dd>
+<dt>“<tt class="docutils literal"><span class="pre">preserve_mostcc</span></tt>” - The <cite>PreserveMost</cite> calling convention</dt>
+<dd><p class="first">This calling convention attempts to make the code in the caller as little
+intrusive as possible. This calling convention behaves identical to the <cite>C</cite>
+calling convention on how arguments and return values are passed, but it
+uses a different set of caller/callee-saved registers. This alleviates the
+burden of saving and recovering a large register set before and after the
+call in the caller. If the arguments are passed in callee-saved registers,
+then they will be preserved by the callee across the call. This doesn’t
+apply for values returned in callee-saved registers.</p>
+<ul class="simple">
+<li>On X86-64 the callee preserves all general purpose registers, except for
+R11. R11 can be used as a scratch register. Floating-point registers
+(XMMs/YMMs) are not preserved and need to be saved by the caller.</li>
+</ul>
+<p>The idea behind this convention is to support calls to runtime functions
+that have a hot path and a cold path. The hot path is usually a small piece
+of code that doesn’t many registers. The cold path might need to call out to
+another function and therefore only needs to preserve the caller-saved
+registers, which haven’t already been saved by the caller. The
+<cite>PreserveMost</cite> calling convention is very similar to the <cite>cold</cite> calling
+convention in terms of caller/callee-saved registers, but they are used for
+different types of function calls. <cite>coldcc</cite> is for function calls that are
+rarely executed, whereas <cite>preserve_mostcc</cite> function calls are intended to be
+on the hot path and definitely executed a lot. Furthermore <cite>preserve_mostcc</cite>
+doesn’t prevent the inliner from inlining the function call.</p>
+<p class="last">This calling convention will be used by a future version of the ObjectiveC
+runtime and should therefore still be considered experimental at this time.
+Although this convention was created to optimize certain runtime calls to
+the ObjectiveC runtime, it is not limited to this runtime and might be used
+by other runtimes in the future too. The current implementation only
+supports X86-64, but the intention is to support more architectures in the
+future.</p>
+</dd>
+<dt>“<tt class="docutils literal"><span class="pre">preserve_allcc</span></tt>” - The <cite>PreserveAll</cite> calling convention</dt>
+<dd><p class="first">This calling convention attempts to make the code in the caller even less
+intrusive than the <cite>PreserveMost</cite> calling convention. This calling
+convention also behaves identical to the <cite>C</cite> calling convention on how
+arguments and return values are passed, but it uses a different set of
+caller/callee-saved registers. This removes the burden of saving and
+recovering a large register set before and after the call in the caller. If
+the arguments are passed in callee-saved registers, then they will be
+preserved by the callee across the call. This doesn’t apply for values
+returned in callee-saved registers.</p>
+<ul class="simple">
+<li>On X86-64 the callee preserves all general purpose registers, except for
+R11. R11 can be used as a scratch register. Furthermore it also preserves
+all floating-point registers (XMMs/YMMs).</li>
+</ul>
+<p>The idea behind this convention is to support calls to runtime functions
+that don’t need to call out to any other functions.</p>
+<p class="last">This calling convention, like the <cite>PreserveMost</cite> calling convention, will be
+used by a future version of the ObjectiveC runtime and should be considered
+experimental at this time.</p>
+</dd>
+<dt>“<tt class="docutils literal"><span class="pre">cc</span> <span class="pre"><n></span></tt>” - Numbered convention</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>
+<div class="section" id="visibility-styles">
+<span id="visibilitystyles"></span><h3><a class="toc-backref" href="#id558">Visibility Styles</a><a class="headerlink" href="#visibility-styles" title="Permalink to this headline">¶</a></h3>
+<p>All Global Variables and Functions have one of the following visibility
+styles:</p>
+<dl class="docutils">
+<dt>“<tt class="docutils literal"><span class="pre">default</span></tt>” - Default style</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>“<tt class="docutils literal"><span class="pre">hidden</span></tt>” - Hidden style</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>“<tt class="docutils literal"><span class="pre">protected</span></tt>” - Protected style</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>
+<p>A symbol with <tt class="docutils literal"><span class="pre">internal</span></tt> or <tt class="docutils literal"><span class="pre">private</span></tt> linkage must have <tt class="docutils literal"><span class="pre">default</span></tt>
+visibility.</p>
+</div>
+<div class="section" id="dll-storage-classes">
+<span id="dllstorageclass"></span><h3><a class="toc-backref" href="#id559">DLL Storage Classes</a><a class="headerlink" href="#dll-storage-classes" title="Permalink to this headline">¶</a></h3>
+<p>All Global Variables, Functions and Aliases can have one of the following
+DLL storage class:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">dllimport</span></tt></dt>
+<dd>“<tt class="docutils literal"><span class="pre">dllimport</span></tt>” 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 <tt class="docutils literal"><span class="pre">__imp_</span></tt> and the function or variable name.</dd>
+<dt><tt class="docutils literal"><span class="pre">dllexport</span></tt></dt>
+<dd>“<tt class="docutils literal"><span class="pre">dllexport</span></tt>” causes the compiler to provide a global pointer to a pointer
+in a DLL, so that it can be referenced with the <tt class="docutils literal"><span class="pre">dllimport</span></tt> attribute. On
+Microsoft Windows targets, the pointer name is formed by combining
+<tt class="docutils literal"><span class="pre">__imp_</span></tt> and the function or variable name. Since this storage class
+exists for defining a dll interface, the compiler, assembler and linker know
+it is externally referenced and must refrain from deleting the symbol.</dd>
+</dl>
+</div>
+<div class="section" id="thread-local-storage-models">
+<span id="tls-model"></span><h3><a class="toc-backref" href="#id560">Thread Local Storage Models</a><a class="headerlink" href="#thread-local-storage-models" title="Permalink to this headline">¶</a></h3>
+<p>A variable may be defined as <tt class="docutils literal"><span class="pre">thread_local</span></tt>, which means that it will
+not be shared by threads (each thread will have a separated copy of the
+variable). Not all targets support thread-local variables. Optionally, a
+TLS model may be specified:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">localdynamic</span></tt></dt>
+<dd>For variables that are only used within the current shared library.</dd>
+<dt><tt class="docutils literal"><span class="pre">initialexec</span></tt></dt>
+<dd>For variables in modules that will not be loaded dynamically.</dd>
+<dt><tt class="docutils literal"><span class="pre">localexec</span></tt></dt>
+<dd>For variables defined in the executable and only used within it.</dd>
+</dl>
+<p>If no explicit model is given, the “general dynamic” model is used.</p>
+<p>The models correspond to the ELF TLS models; see <a class="reference external" href="http://people.redhat.com/drepper/tls.pdf">ELF Handling For
+Thread-Local Storage</a> for
+more information on under which circumstances the different models may
+be used. The target may choose a different TLS model if the specified
+model is not supported, or if a better choice of model can be made.</p>
+<p>A model can also be specified in a alias, but then it only governs how
+the alias is accessed. It will not have any effect in the aliasee.</p>
+</div>
+<div class="section" id="structure-types">
+<span id="namedtypes"></span><h3><a class="toc-backref" href="#id561">Structure Types</a><a class="headerlink" href="#structure-types" title="Permalink to this headline">¶</a></h3>
+<p>LLVM IR allows you to specify both “identified” and “literal” <a class="reference internal" href="#t-struct"><em>structure
+types</em></a>.  Literal types are uniqued structurally, but identified types
+are never uniqued.  An <a class="reference internal" href="#t-opaque"><em>opaque structural type</em></a> can also be used
+to forward declare a type which is not yet available.</p>
+<p>An example of a identified structure specification is:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%mytype</span> <span class="p">=</span> <span class="k">type</span> <span class="p">{</span> <span class="nv">%mytype</span><span class="p">*,</span> <span class="k">i32</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>Prior to the LLVM 3.0 release, identified types were structurally uniqued.  Only
+literal types are uniqued in recent versions of LLVM.</p>
+</div>
+<div class="section" id="global-variables">
+<span id="globalvars"></span><h3><a class="toc-backref" href="#id562">Global Variables</a><a class="headerlink" href="#global-variables" title="Permalink to this headline">¶</a></h3>
+<p>Global variables define regions of memory allocated at compilation time
+instead of run-time.</p>
+<p>Global variables definitions must be initialized.</p>
+<p>Global variables in other translation units can also be declared, in which
+case they don’t have an initializer.</p>
+<p>Either global variable definitions or declarations may have an explicit section
+to be placed in and may have an optional explicit alignment specified.</p>
+<p>A variable may be defined as a global <tt class="docutils literal"><span class="pre">constant</span></tt>, which indicates that
+the contents of the variable will <strong>never</strong> 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 <tt class="docutils literal"><span class="pre">constant</span></tt> 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 class="docutils literal"><span class="pre">unnamed_addr</span></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 class="docutils literal"><span class="pre">unnamed_addr</span></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.
+Additionally, the global can placed in a comdat if the target has the necessary
+support.</p>
+<p>By default, global initializers are optimized by assuming that global
+variables defined within the module are not modified from their
+initial values before the start of the global initializer.  This is
+true even for variables potentially accessible from outside the
+module, including those with external linkage or appearing in
+<tt class="docutils literal"><span class="pre">@llvm.used</span></tt> or dllexported variables. This assumption may be suppressed
+by marking the variable with <tt class="docutils literal"><span class="pre">externally_initialized</span></tt>.</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. The maximum alignment is <tt class="docutils literal"><span class="pre">1</span> <span class="pre"><<</span> <span class="pre">29</span></tt>.</p>
+<p>Globals can also have a <a class="reference internal" href="#dllstorageclass"><em>DLL storage class</em></a>.</p>
+<p>Variables and aliasaes can have a
+<a class="reference internal" href="#tls-model"><em>Thread Local Storage Model</em></a>.</p>
+<p>Syntax:</p>
+<div class="highlight-python"><pre>[@<GlobalVarName> =] [Linkage] [Visibility] [DLLStorageClass] [ThreadLocal]
+                     [unnamed_addr] [AddrSpace] [ExternallyInitialized]
+                     <global | constant> <Type> [<InitializerConstant>]
+                     [, section "name"] [, align <Alignment>]</pre>
+</div>
+<p>For example, the following defines a global in a numbered address space
+with an initializer, section, and alignment:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="vg">@G</span> <span class="p">=</span> <span class="k">addrspace</span><span class="p">(</span><span class="m">5</span><span class="p">)</span> <span class="k">constant</span> <span class="kt">float</span> <span class="m">1.0</span><span class="p">,</span> <span class="k">section</span> <span class="s">"foo"</span><span class="p">,</span> <span class="k">align</span> <span class="m">4</span>
+</pre></div>
+</div>
+<p>The following example just declares a global variable</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="vg">@G</span> <span class="p">=</span> <span class="k">external</span> <span class="k">global</span> <span class="k">i32</span>
+</pre></div>
+</div>
+<p>The following example defines a thread-local global with the
+<tt class="docutils literal"><span class="pre">initialexec</span></tt> TLS model:</p>
+<div class="highlight-llvm"><pre>@G = thread_local(initialexec) global i32 0, align 4</pre>
+</div>
+</div>
+<div class="section" id="functions">
+<span id="functionstructure"></span><h3><a class="toc-backref" href="#id563">Functions</a><a class="headerlink" href="#functions" title="Permalink to this headline">¶</a></h3>
+<p>LLVM function definitions consist of the “<tt class="docutils literal"><span class="pre">define</span></tt>” keyword, an
+optional <a class="reference internal" href="#linkage"><em>linkage type</em></a>, an optional <a class="reference internal" href="BitCodeFormat.html#visibility"><em>visibility
+style</em></a>, an optional <a class="reference internal" href="#dllstorageclass"><em>DLL storage class</em></a>,
+an optional <a class="reference internal" href="#callingconv"><em>calling convention</em></a>,
+an optional <tt class="docutils literal"><span class="pre">unnamed_addr</span></tt> attribute, a return type, an optional
+<a class="reference internal" href="#paramattrs"><em>parameter attribute</em></a> for the return type, a function
+name, a (possibly empty) argument list (each with optional <a class="reference internal" href="#paramattrs"><em>parameter
+attributes</em></a>), optional <a class="reference internal" href="#fnattrs"><em>function attributes</em></a>,
+an optional section, an optional alignment,
+an optional <a class="reference internal" href="#langref-comdats"><em>comdat</em></a>,
+an optional <a class="reference internal" href="#gc"><em>garbage collector name</em></a>, an optional <a class="reference internal" href="#prefixdata"><em>prefix</em></a>, an opening
+curly brace, a list of basic blocks, and a closing curly brace.</p>
+<p>LLVM function declarations consist of the “<tt class="docutils literal"><span class="pre">declare</span></tt>” keyword, an
+optional <a class="reference internal" href="#linkage"><em>linkage type</em></a>, an optional <a class="reference internal" href="BitCodeFormat.html#visibility"><em>visibility
+style</em></a>, an optional <a class="reference internal" href="#dllstorageclass"><em>DLL storage class</em></a>,
+an optional <a class="reference internal" href="#callingconv"><em>calling convention</em></a>,
+an optional <tt class="docutils literal"><span class="pre">unnamed_addr</span></tt> attribute, a return type, an optional
+<a class="reference internal" href="#paramattrs"><em>parameter attribute</em></a> for the return type, a function
+name, a possibly empty list of arguments, an optional alignment, an optional
+<a class="reference internal" href="#gc"><em>garbage collector name</em></a> and an optional <a class="reference internal" href="#prefixdata"><em>prefix</em></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 class="reference internal" href="#terminators"><em>terminator</em></a> instruction (such as a branch or
+function return). If an explicit label is not provided, a block is assigned an
+implicit numbered label, using the next value from the same counter as used for
+unnamed temporaries (<a class="reference internal" href="#identifiers"><em>see above</em></a>). For example, if a function
+entry block does not have an explicit label, it will be assigned label “%0”,
+then the first unnamed temporary in that block will be “%1”, etc.</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 class="reference internal" href="#i-phi"><em>PHI nodes</em></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.
+Additionally, the function can placed in a COMDAT.</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 class="docutils literal"><span class="pre">unnamed_addr</span></tt> attribute is given, the address is know to not
+be significant and two identical functions can be merged.</p>
+<p>Syntax:</p>
+<div class="highlight-python"><pre>define [linkage] [visibility] [DLLStorageClass]
+       [cconv] [ret attrs]
+       <ResultType> @<FunctionName> ([argument list])
+       [unnamed_addr] [fn Attrs] [section "name"] [comdat $<ComdatName>]
+       [align N] [gc] [prefix Constant] { ... }</pre>
+</div>
+</div>
+<div class="section" id="aliases">
+<span id="langref-aliases"></span><h3><a class="toc-backref" href="#id564">Aliases</a><a class="headerlink" href="#aliases" title="Permalink to this headline">¶</a></h3>
+<p>Aliases, unlike function or variables, don’t create any new data. They
+are just a new symbol and metadata for an existing position.</p>
+<p>Aliases have a name and an aliasee that is either a global value or a
+constant expression.</p>
+<p>Aliases may have an optional <a class="reference internal" href="#linkage"><em>linkage type</em></a>, an optional
+<a class="reference internal" href="BitCodeFormat.html#visibility"><em>visibility style</em></a>, an optional <a class="reference internal" href="#dllstorageclass"><em>DLL storage class</em></a> and an optional <a class="reference internal" href="#tls-model"><em>tls model</em></a>.</p>
+<p>Syntax:</p>
+<div class="highlight-python"><pre>@<Name> = [Visibility] [DLLStorageClass] [ThreadLocal] [unnamed_addr] alias [Linkage] <AliaseeTy> @<Aliasee></pre>
+</div>
+<p>The linkage must be one of <tt class="docutils literal"><span class="pre">private</span></tt>, <tt class="docutils literal"><span class="pre">internal</span></tt>, <tt class="docutils literal"><span class="pre">linkonce</span></tt>, <tt class="docutils literal"><span class="pre">weak</span></tt>,
+<tt class="docutils literal"><span class="pre">linkonce_odr</span></tt>, <tt class="docutils literal"><span class="pre">weak_odr</span></tt>, <tt class="docutils literal"><span class="pre">external</span></tt>. Note that some system linkers
+might not correctly handle dropping a weak symbol that is aliased.</p>
+<p>Alias that are not <tt class="docutils literal"><span class="pre">unnamed_addr</span></tt> are guaranteed to have the same address as
+the aliasee expression. <tt class="docutils literal"><span class="pre">unnamed_addr</span></tt> ones are only guaranteed to point
+to the same content.</p>
+<p>Since aliases are only a second name, some restrictions apply, of which
+some can only be checked when producing an object file:</p>
+<ul class="simple">
+<li>The expression defining the aliasee must be computable at assembly
+time. Since it is just a name, no relocations can be used.</li>
+<li>No alias in the expression can be weak as the possibility of the
+intermediate alias being overridden cannot be represented in an
+object file.</li>
+<li>No global value in the expression can be a declaration, since that
+would require a relocation, which is not possible.</li>
+</ul>
+</div>
+<div class="section" id="comdats">
+<span id="langref-comdats"></span><h3><a class="toc-backref" href="#id565">Comdats</a><a class="headerlink" href="#comdats" title="Permalink to this headline">¶</a></h3>
+<p>Comdat IR provides access to COFF and ELF object file COMDAT functionality.</p>
+<p>Comdats have a name which represents the COMDAT key.  All global objects which
+specify this key will only end up in the final object file if the linker chooses
+that key over some other key.  Aliases are placed in the same COMDAT that their
+aliasee computes to, if any.</p>
+<p>Comdats have a selection kind to provide input on how the linker should
+choose between keys in two different object files.</p>
+<p>Syntax:</p>
+<div class="highlight-python"><pre>$<Name> = comdat SelectionKind</pre>
+</div>
+<p>The selection kind must be one of the following:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">any</span></tt></dt>
+<dd>The linker may choose any COMDAT key, the choice is arbitrary.</dd>
+<dt><tt class="docutils literal"><span class="pre">exactmatch</span></tt></dt>
+<dd>The linker may choose any COMDAT key but the sections must contain the
+same data.</dd>
+<dt><tt class="docutils literal"><span class="pre">largest</span></tt></dt>
+<dd>The linker will choose the section containing the largest COMDAT key.</dd>
+<dt><tt class="docutils literal"><span class="pre">noduplicates</span></tt></dt>
+<dd>The linker requires that only section with this COMDAT key exist.</dd>
+<dt><tt class="docutils literal"><span class="pre">samesize</span></tt></dt>
+<dd>The linker may choose any COMDAT key but the sections must contain the
+same amount of data.</dd>
+</dl>
+<p>Note that the Mach-O platform doesn’t support COMDATs and ELF only supports
+<tt class="docutils literal"><span class="pre">any</span></tt> as a selection kind.</p>
+<p>Here is an example of a COMDAT group where a function will only be selected if
+the COMDAT key’s section is the largest:</p>
+<div class="highlight-llvm"><pre>$foo = comdat largest
+ at foo = global i32 2, comdat $foo
+
+define void @bar() comdat $foo {
+  ret void
+}</pre>
+</div>
+<p>In a COFF object file, this will create a COMDAT section with selection kind
+<tt class="docutils literal"><span class="pre">IMAGE_COMDAT_SELECT_LARGEST</span></tt> containing the contents of the <tt class="docutils literal"><span class="pre">@foo</span></tt> symbol
+and another COMDAT section with selection kind
+<tt class="docutils literal"><span class="pre">IMAGE_COMDAT_SELECT_ASSOCIATIVE</span></tt> which is associated with the first COMDAT
+section and contains the contents of the <tt class="docutils literal"><span class="pre">@baz</span></tt> symbol.</p>
+<p>There are some restrictions on the properties of the global object.
+It, or an alias to it, must have the same name as the COMDAT group when
+targeting COFF.
+The contents and size of this object may be used during link-time to determine
+which COMDAT groups get selected depending on the selection kind.
+Because the name of the object must match the name of the COMDAT group, the
+linkage of the global object must not be local; local symbols can get renamed
+if a collision occurs in the symbol table.</p>
+<p>The combined use of COMDATS and section attributes may yield surprising results.
+For example:</p>
+<div class="highlight-llvm"><pre>$foo = comdat any
+$bar = comdat any
+ at g1 = global i32 42, section "sec", comdat $foo
+ at g2 = global i32 42, section "sec", comdat $bar</pre>
+</div>
+<p>From the object file perspective, this requires the creation of two sections
+with the same name.  This is necessary because both globals belong to different
+COMDAT groups and COMDATs, at the object file level, are represented by
+sections.</p>
+<p>Note that certain IR constructs like global variables and functions may create
+COMDATs in the object file in addition to any which are specified using COMDAT
+IR.  This arises, for example, when a global variable has linkonce_odr linkage.</p>
+</div>
+<div class="section" id="named-metadata">
+<span id="namedmetadatastructure"></span><h3><a class="toc-backref" href="#id566">Named Metadata</a><a class="headerlink" href="#named-metadata" title="Permalink to this headline">¶</a></h3>
+<p>Named metadata is a collection of metadata. <a class="reference internal" href="#metadata"><em>Metadata
+nodes</em></a> (but not metadata strings) are the only valid
+operands for a named metadata.</p>
+<p>Syntax:</p>
+<div class="highlight-python"><pre>; 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>
+</div>
+<div class="section" id="parameter-attributes">
+<span id="paramattrs"></span><h3><a class="toc-backref" href="#id567">Parameter Attributes</a><a class="headerlink" href="#parameter-attributes" title="Permalink to this headline">¶</a></h3>
+<p>The return type and each parameter of a function type may have a set of
+<em>parameter attributes</em> 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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">declare</span> <span class="k">i32</span> <span class="vg">@printf</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="k">noalias</span> <span class="k">nocapture</span><span class="p">,</span> <span class="p">...)</span>
+<span class="k">declare</span> <span class="k">i32</span> <span class="vg">@atoi</span><span class="p">(</span><span class="k">i8</span> <span class="k">zeroext</span><span class="p">)</span>
+<span class="k">declare</span> <span class="k">signext</span> <span class="k">i8</span> <span class="vg">@returns_signed_char</span><span class="p">()</span>
+</pre></div>
+</div>
+<p>Note that any attributes for the function result (<tt class="docutils literal"><span class="pre">nounwind</span></tt>,
+<tt class="docutils literal"><span class="pre">readonly</span></tt>) come immediately after the argument list.</p>
+<p>Currently, only the following parameter attributes are defined:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">zeroext</span></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 class="docutils literal"><span class="pre">signext</span></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 class="docutils literal"><span class="pre">inreg</span></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 class="docutils literal"><span class="pre">byval</span></tt></dt>
+<dd><p class="first">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 caller. 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 class="docutils literal"><span class="pre">readonly</span></tt> functions should not write to
+<tt class="docutils literal"><span class="pre">byval</span></tt> parameters). This is not a valid attribute for return
+values.</p>
+<p class="last">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>
+</dl>
+<p id="attr-inalloca"><tt class="docutils literal"><span class="pre">inalloca</span></tt></p>
+<blockquote>
+<div><p>The <tt class="docutils literal"><span class="pre">inalloca</span></tt> argument attribute allows the caller to take the
+address of outgoing stack arguments.  An <tt class="docutils literal"><span class="pre">inalloca</span></tt> argument must
+be a pointer to stack memory produced by an <tt class="docutils literal"><span class="pre">alloca</span></tt> instruction.
+The alloca, or argument allocation, must also be tagged with the
+inalloca keyword.  Only the last argument may have the <tt class="docutils literal"><span class="pre">inalloca</span></tt>
+attribute, and that argument is guaranteed to be passed in memory.</p>
+<p>An argument allocation may be used by a call at most once because
+the call may deallocate it.  The <tt class="docutils literal"><span class="pre">inalloca</span></tt> attribute cannot be
+used in conjunction with other attributes that affect argument
+storage, like <tt class="docutils literal"><span class="pre">inreg</span></tt>, <tt class="docutils literal"><span class="pre">nest</span></tt>, <tt class="docutils literal"><span class="pre">sret</span></tt>, or <tt class="docutils literal"><span class="pre">byval</span></tt>.  The
+<tt class="docutils literal"><span class="pre">inalloca</span></tt> attribute also disables LLVM’s implicit lowering of
+large aggregate return values, which means that frontend authors
+must lower them with <tt class="docutils literal"><span class="pre">sret</span></tt> pointers.</p>
+<p>When the call site is reached, the argument allocation must have
+been the most recent stack allocation that is still live, or the
+results are undefined.  It is possible to allocate additional stack
+space after an argument allocation and before its call site, but it
+must be cleared off with <a class="reference internal" href="#int-stackrestore"><em>llvm.stackrestore</em></a>.</p>
+<p>See <a class="reference internal" href="InAlloca.html"><em>Design and Usage of the InAlloca Attribute</em></a> for more information on how to use this
+attribute.</p>
+</div></blockquote>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">sret</span></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
+not to trap and to be properly aligned. This may only be applied to
+the first parameter. This is not a valid attribute for return
+values.</dd>
+</dl>
+<dl class="docutils" id="noalias">
+<dt><tt class="docutils literal"><span class="pre">noalias</span></tt></dt>
+<dd><p class="first">This indicates that pointer values <a class="reference internal" href="#pointeraliasing"><em>based</em></a> on
+the argument or return value do not alias pointer values which are
+not <em>based</em> 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 class="docutils literal"><span class="pre">noalias</span></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 class="reference internal" href="AliasAnalysis.html#must-may-or-no"><em>alias
+analysis</em></a>.</p>
+<p>Note that this definition of <tt class="docutils literal"><span class="pre">noalias</span></tt> is intentionally similar
+to the definition of <tt class="docutils literal"><span class="pre">restrict</span></tt> in C99 for function arguments,
+though it is slightly weaker.</p>
+<p class="last">For function return values, C99’s <tt class="docutils literal"><span class="pre">restrict</span></tt> is not meaningful,
+while LLVM’s <tt class="docutils literal"><span class="pre">noalias</span></tt> is.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">nocapture</span></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>
+</dl>
+<dl class="docutils" id="nest">
+<dt><tt class="docutils literal"><span class="pre">nest</span></tt></dt>
+<dd>This indicates that the pointer parameter can be excised using the
+<a class="reference internal" href="#int-trampoline"><em>trampoline intrinsics</em></a>. This is not a valid
+attribute for return values and can only be applied to one parameter.</dd>
+<dt><tt class="docutils literal"><span class="pre">returned</span></tt></dt>
+<dd>This indicates that the function always returns the argument as its return
+value. This is an optimization hint to the code generator when generating
+the caller, allowing tail call optimization and omission of register saves
+and restores in some cases; it is not checked or enforced when generating
+the callee. The parameter and the function return type must be valid
+operands for the <a class="reference internal" href="#i-bitcast"><em>bitcast instruction</em></a>. This is not a
+valid attribute for return values and can only be applied to one parameter.</dd>
+<dt><tt class="docutils literal"><span class="pre">nonnull</span></tt></dt>
+<dd>This indicates that the parameter or return pointer is not null. This
+attribute may only be applied to pointer typed parameters. This is not
+checked or enforced by LLVM, the caller must ensure that the pointer
+passed in is non-null, or the callee must ensure that the returned pointer
+is non-null.</dd>
+<dt><tt class="docutils literal"><span class="pre">dereferenceable(<n>)</span></tt></dt>
+<dd>This indicates that the parameter or return pointer is dereferenceable. This
+attribute may only be applied to pointer typed parameters. A pointer that
+is dereferenceable can be loaded from speculatively without a risk of
+trapping. The number of bytes known to be dereferenceable must be provided
+in parentheses. It is legal for the number of bytes to be less than the
+size of the pointee type. The <tt class="docutils literal"><span class="pre">nonnull</span></tt> attribute does not imply
+dereferenceability (consider a pointer to one element past the end of an
+array), however <tt class="docutils literal"><span class="pre">dereferenceable(<n>)</span></tt> does imply <tt class="docutils literal"><span class="pre">nonnull</span></tt> in
+<tt class="docutils literal"><span class="pre">addrspace(0)</span></tt> (which is the default address space).</dd>
+</dl>
+</div>
+<div class="section" id="garbage-collector-names">
+<span id="gc"></span><h3><a class="toc-backref" href="#id568">Garbage Collector Names</a><a class="headerlink" href="#garbage-collector-names" title="Permalink to this headline">¶</a></h3>
+<p>Each function may specify a garbage collector name, which is simply a
+string:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">define</span> <span class="kt">void</span> <span class="vg">@f</span><span class="p">()</span> <span class="k">gc</span> <span class="s">"name"</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>The compiler declares the supported values of <em>name</em>. Specifying a
+collector which will cause the compiler to alter its output in order to
+support the named garbage collection algorithm.</p>
+</div>
+<div class="section" id="prefix-data">
+<span id="prefixdata"></span><h3><a class="toc-backref" href="#id569">Prefix Data</a><a class="headerlink" href="#prefix-data" title="Permalink to this headline">¶</a></h3>
+<p>Prefix data is data associated with a function which the code generator
+will emit immediately before the function body.  The purpose of this feature
+is to allow frontends to associate language-specific runtime metadata with
+specific functions and make it available through the function pointer while
+still allowing the function pointer to be called.  To access the data for a
+given function, a program may bitcast the function pointer to a pointer to
+the constant’s type.  This implies that the IR symbol points to the start
+of the prefix data.</p>
+<p>To maintain the semantics of ordinary function calls, the prefix data must
+have a particular format.  Specifically, it must begin with a sequence of
+bytes which decode to a sequence of machine instructions, valid for the
+module’s target, which transfer control to the point immediately succeeding
+the prefix data, without performing any other visible action.  This allows
+the inliner and other passes to reason about the semantics of the function
+definition without needing to reason about the prefix data.  Obviously this
+makes the format of the prefix data highly target dependent.</p>
+<p>Prefix data is laid out as if it were an initializer for a global variable
+of the prefix data’s type.  No padding is automatically placed between the
+prefix data and the function body.  If padding is required, it must be part
+of the prefix data.</p>
+<p>A trivial example of valid prefix data for the x86 architecture is <tt class="docutils literal"><span class="pre">i8</span> <span class="pre">144</span></tt>,
+which encodes the <tt class="docutils literal"><span class="pre">nop</span></tt> instruction:</p>
+<div class="highlight-llvm"><pre>define void @f() prefix i8 144 { ... }</pre>
+</div>
+<p>Generally prefix data can be formed by encoding a relative branch instruction
+which skips the metadata, as in this example of valid prefix data for the
+x86_64 architecture, where the first two bytes encode <tt class="docutils literal"><span class="pre">jmp</span> <span class="pre">.+10</span></tt>:</p>
+<div class="highlight-llvm"><pre>%0 = type <{ i8, i8, i8* }>
+
+define void @f() prefix %0 <{ i8 235, i8 8, i8* @md}> { ... }</pre>
+</div>
+<p>A function may have prefix data but no body.  This has similar semantics
+to the <tt class="docutils literal"><span class="pre">available_externally</span></tt> linkage in that the data may be used by the
+optimizers but will not be emitted in the object file.</p>
+</div>
+<div class="section" id="attribute-groups">
+<span id="attrgrp"></span><h3><a class="toc-backref" href="#id570">Attribute Groups</a><a class="headerlink" href="#attribute-groups" title="Permalink to this headline">¶</a></h3>
+<p>Attribute groups are groups of attributes that are referenced by objects within
+the IR. They are important for keeping <tt class="docutils literal"><span class="pre">.ll</span></tt> files readable, because a lot of
+functions will use the same set of attributes. In the degenerative case of a
+<tt class="docutils literal"><span class="pre">.ll</span></tt> file that corresponds to a single <tt class="docutils literal"><span class="pre">.c</span></tt> file, the single attribute
+group will capture the important command line flags used to build that file.</p>
+<p>An attribute group is a module-level object. To use an attribute group, an
+object references the attribute group’s ID (e.g. <tt class="docutils literal"><span class="pre">#37</span></tt>). An object may refer
+to more than one attribute group. In that situation, the attributes from the
+different groups are merged.</p>
+<p>Here is an example of attribute groups for a function that should always be
+inlined, has a stack alignment of 4, and which shouldn’t use SSE instructions:</p>
+<div class="highlight-llvm"><pre>; Target-independent attributes:
+attributes #0 = { alwaysinline alignstack=4 }
+
+; Target-dependent attributes:
+attributes #1 = { "no-sse" }
+
+; Function @f has attributes: alwaysinline, alignstack=4, and "no-sse".
+define void @f() #0 #1 { ... }</pre>
+</div>
+</div>
+<div class="section" id="function-attributes">
+<span id="fnattrs"></span><h3><a class="toc-backref" href="#id571">Function Attributes</a><a class="headerlink" href="#function-attributes" title="Permalink to this headline">¶</a></h3>
+<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 function
+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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">define</span> <span class="kt">void</span> <span class="vg">@f</span><span class="p">()</span> <span class="k">noinline</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+<span class="k">define</span> <span class="kt">void</span> <span class="vg">@f</span><span class="p">()</span> <span class="k">alwaysinline</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+<span class="k">define</span> <span class="kt">void</span> <span class="vg">@f</span><span class="p">()</span> <span class="k">alwaysinline</span> <span class="k">optsize</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+<span class="k">define</span> <span class="kt">void</span> <span class="vg">@f</span><span class="p">()</span> <span class="k">optsize</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+</pre></div>
+</div>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">alignstack(<n>)</span></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.</dd>
+<dt><tt class="docutils literal"><span class="pre">alwaysinline</span></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 class="docutils literal"><span class="pre">builtin</span></tt></dt>
+<dd>This indicates that the callee function at a call site should be
+recognized as a built-in function, even though the function’s declaration
+uses the <tt class="docutils literal"><span class="pre">nobuiltin</span></tt> attribute. This is only valid at call sites for
+direct calls to functions which are declared with the <tt class="docutils literal"><span class="pre">nobuiltin</span></tt>
+attribute.</dd>
+<dt><tt class="docutils literal"><span class="pre">cold</span></tt></dt>
+<dd>This attribute indicates that this function is rarely called. When
+computing edge weights, basic blocks post-dominated by a cold
+function call are also considered to be cold; and, thus, given low
+weight.</dd>
+<dt><tt class="docutils literal"><span class="pre">inlinehint</span></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 class="docutils literal"><span class="pre">jumptable</span></tt></dt>
+<dd>This attribute indicates that the function should be added to a
+jump-instruction table at code-generation time, and that all address-taken
+references to this function should be replaced with a reference to the
+appropriate jump-instruction-table function pointer. Note that this creates
+a new pointer for the original function, which means that code that depends
+on function-pointer identity can break. So, any function annotated with
+<tt class="docutils literal"><span class="pre">jumptable</span></tt> must also be <tt class="docutils literal"><span class="pre">unnamed_addr</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">minsize</span></tt></dt>
+<dd>This attribute suggests that optimization passes and code generator
+passes make choices that keep the code size of this function as small
+as possible and perform optimizations that may sacrifice runtime
+performance in order to minimize the size of the generated code.</dd>
+<dt><tt class="docutils literal"><span class="pre">naked</span></tt></dt>
+<dd>This attribute disables prologue / epilogue emission for the
+function. This can have very system-specific consequences.</dd>
+<dt><tt class="docutils literal"><span class="pre">nobuiltin</span></tt></dt>
+<dd>This indicates that the callee function at a call site is not recognized as
+a built-in function. LLVM will retain the original call and not replace it
+with equivalent code based on the semantics of the built-in function, unless
+the call site uses the <tt class="docutils literal"><span class="pre">builtin</span></tt> attribute. This is valid at call sites
+and on function declarations and definitions.</dd>
+<dt><tt class="docutils literal"><span class="pre">noduplicate</span></tt></dt>
+<dd><p class="first">This attribute indicates that calls to the function cannot be
+duplicated. A call to a <tt class="docutils literal"><span class="pre">noduplicate</span></tt> function may be moved
+within its parent function, but may not be duplicated within
+its parent function.</p>
+<p class="last">A function containing a <tt class="docutils literal"><span class="pre">noduplicate</span></tt> call may still
+be an inlining candidate, provided that the call is not
+duplicated by inlining. That implies that the function has
+internal linkage and only has one call site, so the original
+call is dead after inlining.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">noimplicitfloat</span></tt></dt>
+<dd>This attributes disables implicit floating point instructions.</dd>
+<dt><tt class="docutils literal"><span class="pre">noinline</span></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 class="docutils literal"><span class="pre">alwaysinline</span></tt> attribute.</dd>
+<dt><tt class="docutils literal"><span class="pre">nonlazybind</span></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 class="docutils literal"><span class="pre">noredzone</span></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 class="docutils literal"><span class="pre">noreturn</span></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 class="docutils literal"><span class="pre">nounwind</span></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 class="docutils literal"><span class="pre">optnone</span></tt></dt>
+<dd><p class="first">This function attribute indicates that the function is not optimized
+by any optimization or code generator passes with the
+exception of interprocedural optimization passes.
+This attribute cannot be used together with the <tt class="docutils literal"><span class="pre">alwaysinline</span></tt>
+attribute; this attribute is also incompatible
+with the <tt class="docutils literal"><span class="pre">minsize</span></tt> attribute and the <tt class="docutils literal"><span class="pre">optsize</span></tt> attribute.</p>
+<p class="last">This attribute requires the <tt class="docutils literal"><span class="pre">noinline</span></tt> attribute to be specified on
+the function as well, so the function is never inlined into any caller.
+Only functions with the <tt class="docutils literal"><span class="pre">alwaysinline</span></tt> attribute are valid
+candidates for inlining into the body of this function.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">optsize</span></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 as
+long as they do not significantly impact runtime performance.</dd>
+<dt><tt class="docutils literal"><span class="pre">readnone</span></tt></dt>
+<dd><p class="first">On a function, 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 class="docutils literal"><span class="pre">byval</span></tt> arguments) and never changes any state visible
+to callers. This means that it cannot unwind exceptions by calling
+the <tt class="docutils literal"><span class="pre">C++</span></tt> exception throwing methods.</p>
+<p class="last">On an argument, this attribute indicates that the function does not
+dereference that pointer argument, even though it may read or write the
+memory that the pointer points to if accessed through other pointers.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">readonly</span></tt></dt>
+<dd><p class="first">On a function, this attribute indicates that the function does not write
+through any pointer arguments (including <tt class="docutils literal"><span class="pre">byval</span></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 class="docutils literal"><span class="pre">C++</span></tt> exception throwing
+methods.</p>
+<p class="last">On an argument, this attribute indicates that the function does not write
+through this pointer argument, even though it may write to the memory that
+the pointer points to.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">returns_twice</span></tt></dt>
+<dd>This attribute indicates that this function can return twice. The C
+<tt class="docutils literal"><span class="pre">setjmp</span></tt> is an example of such a function. The compiler disables
+some optimizations (like tail calls) in the caller of these
+functions.</dd>
+<dt><tt class="docutils literal"><span class="pre">sanitize_address</span></tt></dt>
+<dd>This attribute indicates that AddressSanitizer checks
+(dynamic address safety analysis) are enabled for this function.</dd>
+<dt><tt class="docutils literal"><span class="pre">sanitize_memory</span></tt></dt>
+<dd>This attribute indicates that MemorySanitizer checks (dynamic detection
+of accesses to uninitialized memory) are enabled for this function.</dd>
+<dt><tt class="docutils literal"><span class="pre">sanitize_thread</span></tt></dt>
+<dd>This attribute indicates that ThreadSanitizer checks
+(dynamic thread safety analysis) are enabled for this function.</dd>
+<dt><tt class="docutils literal"><span class="pre">ssp</span></tt></dt>
+<dd><p class="first">This attribute indicates that the function should emit a stack
+smashing protector. It is in the form of a “canary” — 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. The heuristic used will enable protectors for functions with:</p>
+<ul class="simple">
+<li>Character arrays larger than <tt class="docutils literal"><span class="pre">ssp-buffer-size</span></tt> (default 8).</li>
+<li>Aggregates containing character arrays larger than <tt class="docutils literal"><span class="pre">ssp-buffer-size</span></tt>.</li>
+<li>Calls to alloca() with variable sizes or constant sizes greater than
+<tt class="docutils literal"><span class="pre">ssp-buffer-size</span></tt>.</li>
+</ul>
+<p>Variables that are identified as requiring a protector will be arranged
+on the stack such that they are adjacent to the stack protector guard.</p>
+<p class="last">If a function that has an <tt class="docutils literal"><span class="pre">ssp</span></tt> attribute is inlined into a
+function that doesn’t have an <tt class="docutils literal"><span class="pre">ssp</span></tt> attribute, then the resulting
+function will have an <tt class="docutils literal"><span class="pre">ssp</span></tt> attribute.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">sspreq</span></tt></dt>
+<dd><p class="first">This attribute indicates that the function should <em>always</em> emit a
+stack smashing protector. This overrides the <tt class="docutils literal"><span class="pre">ssp</span></tt> function
+attribute.</p>
+<p>Variables that are identified as requiring a protector will be arranged
+on the stack such that they are adjacent to the stack protector guard.
+The specific layout rules are:</p>
+<ol class="arabic simple">
+<li>Large arrays and structures containing large arrays
+(<tt class="docutils literal"><span class="pre">>=</span> <span class="pre">ssp-buffer-size</span></tt>) are closest to the stack protector.</li>
+<li>Small arrays and structures containing small arrays
+(<tt class="docutils literal"><span class="pre"><</span> <span class="pre">ssp-buffer-size</span></tt>) are 2nd closest to the protector.</li>
+<li>Variables that have had their address taken are 3rd closest to the
+protector.</li>
+</ol>
+<p class="last">If a function that has an <tt class="docutils literal"><span class="pre">sspreq</span></tt> attribute is inlined into a
+function that doesn’t have an <tt class="docutils literal"><span class="pre">sspreq</span></tt> attribute or which has an
+<tt class="docutils literal"><span class="pre">ssp</span></tt> or <tt class="docutils literal"><span class="pre">sspstrong</span></tt> attribute, then the resulting function will have
+an <tt class="docutils literal"><span class="pre">sspreq</span></tt> attribute.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">sspstrong</span></tt></dt>
+<dd><p class="first">This attribute indicates that the function should emit a stack smashing
+protector. This attribute causes a strong heuristic to be used when
+determining if a function needs stack protectors.  The strong heuristic
+will enable protectors for functions with:</p>
+<ul class="simple">
+<li>Arrays of any size and type</li>
+<li>Aggregates containing an array of any size and type.</li>
+<li>Calls to alloca().</li>
+<li>Local variables that have had their address taken.</li>
+</ul>
+<p>Variables that are identified as requiring a protector will be arranged
+on the stack such that they are adjacent to the stack protector guard.
+The specific layout rules are:</p>
+<ol class="arabic simple">
+<li>Large arrays and structures containing large arrays
+(<tt class="docutils literal"><span class="pre">>=</span> <span class="pre">ssp-buffer-size</span></tt>) are closest to the stack protector.</li>
+<li>Small arrays and structures containing small arrays
+(<tt class="docutils literal"><span class="pre"><</span> <span class="pre">ssp-buffer-size</span></tt>) are 2nd closest to the protector.</li>
+<li>Variables that have had their address taken are 3rd closest to the
+protector.</li>
+</ol>
+<p>This overrides the <tt class="docutils literal"><span class="pre">ssp</span></tt> function attribute.</p>
+<p class="last">If a function that has an <tt class="docutils literal"><span class="pre">sspstrong</span></tt> attribute is inlined into a
+function that doesn’t have an <tt class="docutils literal"><span class="pre">sspstrong</span></tt> attribute, then the
+resulting function will have an <tt class="docutils literal"><span class="pre">sspstrong</span></tt> attribute.</p>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">uwtable</span></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>
+</dl>
+</div>
+<div class="section" id="module-level-inline-assembly">
+<span id="moduleasm"></span><h3><a class="toc-backref" href="#id572">Module-Level Inline Assembly</a><a class="headerlink" href="#module-level-inline-assembly" title="Permalink to this headline">¶</a></h3>
+<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 class="docutils literal"><span class="pre">.ll</span></tt> file if desired. The syntax is very simple:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">module</span> <span class="k">asm</span> <span class="s">"inline asm code goes here"</span>
+<span class="k">module</span> <span class="k">asm</span> <span class="s">"more can go here"</span>
+</pre></div>
+</div>
+<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>
+<div class="section" id="data-layout">
+<span id="langref-datalayout"></span><h3><a class="toc-backref" href="#id573">Data Layout</a><a class="headerlink" href="#data-layout" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">target</span> <span class="k">datalayout</span> <span class="p">=</span> <span class="s">"layout specification"</span>
+</pre></div>
+</div>
+<p>The <em>layout specification</em> 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 class="docutils">
+<dt><tt class="docutils literal"><span class="pre">E</span></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 class="docutils literal"><span class="pre">e</span></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 class="docutils literal"><span class="pre">S<size></span></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 class="docutils literal"><span class="pre">p[n]:<size>:<abi>:<pref></span></tt></dt>
+<dd>This specifies the <em>size</em> of a pointer and its <tt class="docutils literal"><span class="pre"><abi></span></tt> and
+<tt class="docutils literal"><span class="pre"><pref></span></tt>erred alignments for address space <tt class="docutils literal"><span class="pre">n</span></tt>. All sizes are in
+bits. The address space, <tt class="docutils literal"><span class="pre">n</span></tt> is optional, and if not specified,
+denotes the default address space 0.  The value of <tt class="docutils literal"><span class="pre">n</span></tt> must be
+in the range [1,2^23).</dd>
+<dt><tt class="docutils literal"><span class="pre">i<size>:<abi>:<pref></span></tt></dt>
+<dd>This specifies the alignment for an integer type of a given bit
+<tt class="docutils literal"><span class="pre"><size></span></tt>. The value of <tt class="docutils literal"><span class="pre"><size></span></tt> must be in the range [1,2^23).</dd>
+<dt><tt class="docutils literal"><span class="pre">v<size>:<abi>:<pref></span></tt></dt>
+<dd>This specifies the alignment for a vector type of a given bit
+<tt class="docutils literal"><span class="pre"><size></span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">f<size>:<abi>:<pref></span></tt></dt>
+<dd>This specifies the alignment for a floating point type of a given bit
+<tt class="docutils literal"><span class="pre"><size></span></tt>. Only values of <tt class="docutils literal"><span class="pre"><size></span></tt> 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.</dd>
+<dt><tt class="docutils literal"><span class="pre">a:<abi>:<pref></span></tt></dt>
+<dd>This specifies the alignment for an object of aggregate type.</dd>
+<dt><tt class="docutils literal"><span class="pre">m:<mangling></span></tt></dt>
+<dd><p class="first">If present, specifies that llvm names are mangled in the output. The
+options are</p>
+<ul class="last simple">
+<li><tt class="docutils literal"><span class="pre">e</span></tt>: ELF mangling: Private symbols get a <tt class="docutils literal"><span class="pre">.L</span></tt> prefix.</li>
+<li><tt class="docutils literal"><span class="pre">m</span></tt>: Mips mangling: Private symbols get a <tt class="docutils literal"><span class="pre">$</span></tt> prefix.</li>
+<li><tt class="docutils literal"><span class="pre">o</span></tt>: Mach-O mangling: Private symbols get <tt class="docutils literal"><span class="pre">L</span></tt> prefix. Other
+symbols get a <tt class="docutils literal"><span class="pre">_</span></tt> prefix.</li>
+<li><tt class="docutils literal"><span class="pre">w</span></tt>: Windows COFF prefix:  Similar to Mach-O, but stdcall and fastcall
+functions also get a suffix based on the frame size.</li>
+</ul>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">n<size1>:<size2>:<size3>...</span></tt></dt>
+<dd>This specifies a set of native integer widths for the target CPU in
+bits. For example, it might contain <tt class="docutils literal"><span class="pre">n32</span></tt> for 32-bit PowerPC,
+<tt class="docutils literal"><span class="pre">n32:64</span></tt> for PowerPC 64, or <tt class="docutils literal"><span class="pre">n8:16:32:64</span></tt> for X86-64. Elements of
+this set are considered to support most general arithmetic operations
+efficiently.</dd>
+</dl>
+<p>On every specification that takes a <tt class="docutils literal"><span class="pre"><abi>:<pref></span></tt>, specifying the
+<tt class="docutils literal"><span class="pre"><pref></span></tt> alignment is optional. If omitted, the preceding <tt class="docutils literal"><span class="pre">:</span></tt>
+should be omitted too and <tt class="docutils literal"><span class="pre"><pref></span></tt> will be equal to <tt class="docutils literal"><span class="pre"><abi></span></tt>.</p>
+<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 class="docutils literal"><span class="pre">datalayout</span></tt> keyword. The default
+specifications are given in this list:</p>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">E</span></tt> - big endian</li>
+<li><tt class="docutils literal"><span class="pre">p:64:64:64</span></tt> - 64-bit pointers with 64-bit alignment.</li>
+<li><tt class="docutils literal"><span class="pre">p[n]:64:64:64</span></tt> - Other address spaces are assumed to be the
+same as the default address space.</li>
+<li><tt class="docutils literal"><span class="pre">S0</span></tt> - natural stack alignment is unspecified</li>
+<li><tt class="docutils literal"><span class="pre">i1:8:8</span></tt> - i1 is 8-bit (byte) aligned</li>
+<li><tt class="docutils literal"><span class="pre">i8:8:8</span></tt> - i8 is 8-bit (byte) aligned</li>
+<li><tt class="docutils literal"><span class="pre">i16:16:16</span></tt> - i16 is 16-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">i32:32:32</span></tt> - i32 is 32-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">i64:32:64</span></tt> - i64 has ABI alignment of 32-bits but preferred
+alignment of 64-bits</li>
+<li><tt class="docutils literal"><span class="pre">f16:16:16</span></tt> - half is 16-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">f32:32:32</span></tt> - float is 32-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">f64:64:64</span></tt> - double is 64-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">f128:128:128</span></tt> - quad is 128-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">v64:64:64</span></tt> - 64-bit vector is 64-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">v128:128:128</span></tt> - 128-bit vector is 128-bit aligned</li>
+<li><tt class="docutils literal"><span class="pre">a:0:64</span></tt> - aggregates are 64-bit aligned</li>
+</ul>
+<p>When LLVM is determining the alignment for a given type, it uses the
+following rules:</p>
+<ol class="arabic simple">
+<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 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 <128 x double> can be
+implemented in terms of 64 <2 x double>, 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>
+<div class="section" id="target-triple">
+<span id="langref-triple"></span><h3><a class="toc-backref" href="#id574">Target Triple</a><a class="headerlink" href="#target-triple" title="Permalink to this headline">¶</a></h3>
+<p>A module may specify a target triple string that describes the target
+host. The syntax for the target triple is simply:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">target</span> <span class="k">triple</span> <span class="p">=</span> <span class="s">"x86_64-apple-macosx10.7.0"</span>
+</pre></div>
+</div>
+<p>The <em>target triple</em> string consists of a series of identifiers delimited
+by the minus sign character (‘-‘). The canonical forms are:</p>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">ARCHITECTURE</span><span class="o">-</span><span class="n">VENDOR</span><span class="o">-</span><span class="n">OPERATING_SYSTEM</span>
+<span class="n">ARCHITECTURE</span><span class="o">-</span><span class="n">VENDOR</span><span class="o">-</span><span class="n">OPERATING_SYSTEM</span><span class="o">-</span><span class="n">ENVIRONMENT</span>
+</pre></div>
+</div>
+<p>This information is passed along to the backend so that it generates
+code for the proper architecture. It’s possible to override this on the
+command line with the <tt class="docutils literal"><span class="pre">-mtriple</span></tt> command line option.</p>
+</div>
+<div class="section" id="pointer-aliasing-rules">
+<span id="pointeraliasing"></span><h3><a class="toc-backref" href="#id575">Pointer Aliasing Rules</a><a class="headerlink" href="#pointer-aliasing-rules" title="Permalink to this headline">¶</a></h3>
+<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 class="simple">
+<li>A pointer value is associated with the addresses associated with any
+value it is <em>based</em> on.</li>
+<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 <em>based</em> on another pointer value according to the
+following rules:</p>
+<ul class="simple">
+<li>A pointer value formed from a <tt class="docutils literal"><span class="pre">getelementptr</span></tt> operation is <em>based</em>
+on the first operand of the <tt class="docutils literal"><span class="pre">getelementptr</span></tt>.</li>
+<li>The result value of a <tt class="docutils literal"><span class="pre">bitcast</span></tt> is <em>based</em> on the operand of the
+<tt class="docutils literal"><span class="pre">bitcast</span></tt>.</li>
+<li>A pointer value formed by an <tt class="docutils literal"><span class="pre">inttoptr</span></tt> is <em>based</em> on all pointer
+values that contribute (directly or indirectly) to the computation of
+the pointer’s value.</li>
+<li>The “<em>based</em> on” relationship is transitive.</li>
+</ul>
+<p>Note that this definition of <em>“based”</em> is intentionally similar to the
+definition of <em>“based”</em> in C99, though it is slightly weaker.</p>
+<p>LLVM IR does not associate types with memory. The result type of a
+<tt class="docutils literal"><span class="pre">load</span></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 class="docutils literal"><span class="pre">store</span></tt> similarly only indicates the size and
+alignment of the store.</p>
+<p>Consequently, type-based alias analysis, aka TBAA, aka
+<tt class="docutils literal"><span class="pre">-fstrict-aliasing</span></tt>, is not applicable to general unadorned LLVM IR.
+<a class="reference internal" href="#metadata"><em>Metadata</em></a> may be used to encode additional information
+which specialized optimization passes may use to implement type-based
+alias analysis.</p>
+</div>
+<div class="section" id="volatile-memory-accesses">
+<span id="volatile"></span><h3><a class="toc-backref" href="#id576">Volatile Memory Accesses</a><a class="headerlink" href="#volatile-memory-accesses" title="Permalink to this headline">¶</a></h3>
+<p>Certain memory accesses, such as <a class="reference internal" href="#i-load"><em>load</em></a>‘s,
+<a class="reference internal" href="#i-store"><em>store</em></a>‘s, and <a class="reference internal" href="#int-memcpy"><em>llvm.memcpy</em></a>‘s may be
+marked <tt class="docutils literal"><span class="pre">volatile</span></tt>. The optimizers must not change the number of
+volatile operations or change their order of execution relative to other
+volatile operations. The optimizers <em>may</em> 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>
+<p>IR-level volatile loads and stores cannot safely be optimized into
+llvm.memcpy or llvm.memmove intrinsics even when those intrinsics are
+flagged volatile. Likewise, the backend should never split or merge
+target-legal volatile load/store instructions.</p>
+<div class="admonition-rationale admonition">
+<p class="first admonition-title">Rationale</p>
+<p class="last">Platforms may rely on volatile loads and stores of natively supported
+data width to be executed as single instruction. For example, in C
+this holds for an l-value of volatile primitive type with native
+hardware support, but not necessarily for aggregate types. The
+frontend upholds these expectations, which are intentionally
+unspecified in the IR. The rules above ensure that IR transformation
+do not violate the frontend’s contract with the language.</p>
+</div>
+</div>
+<div class="section" id="memory-model-for-concurrent-operations">
+<span id="memmodel"></span><h3><a class="toc-backref" href="#id577">Memory Model for Concurrent Operations</a><a class="headerlink" href="#memory-model-for-concurrent-operations" title="Permalink to this headline">¶</a></h3>
+<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 class="reference internal" href="Atomics.html"><em>LLVM Atomic Instructions and Concurrency Guide</em></a>.</p>
+<p>We define a <em>happens-before</em> partial order as the least partial order
+that</p>
+<ul class="simple">
+<li>Is a superset of single-thread program order, and</li>
+<li>When a <em>synchronizes-with</em> <tt class="docutils literal"><span class="pre">b</span></tt>, includes an edge from <tt class="docutils literal"><span class="pre">a</span></tt> to
+<tt class="docutils literal"><span class="pre">b</span></tt>. <em>Synchronizes-with</em> pairs are introduced by platform-specific
+techniques, like pthread locks, thread creation, thread joining,
+etc., and by atomic instructions. (See also <a class="reference internal" href="#ordering"><em>Atomic Memory Ordering
+Constraints</em></a>).</li>
+</ul>
+<p>Note that program order does not introduce <em>happens-before</em> 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.) R 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 R, R<sub>byte</sub>
+may see any write to the same byte, except:</p>
+<ul class="simple">
+<li>If write<sub>1</sub>  happens before write<sub>2</sub>, and
+write<sub>2</sub> happens before R<sub>byte</sub>, then
+R<sub>byte</sub> does not see write<sub>1</sub>.</li>
+<li>If R<sub>byte</sub> happens before write<sub>3</sub>, then
+R<sub>byte</sub> does not see write<sub>3</sub>.</li>
+</ul>
+<p>Given that definition, R<sub>byte</sub> is defined as follows:</p>
+<ul class="simple">
+<li>If R is volatile, the result is target-dependent. (Volatile is
+supposed to give guarantees which can support <tt class="docutils literal"><span class="pre">sig_atomic_t</span></tt> 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>
+<li>Otherwise, if there is no write to the same byte that happens before
+R<sub>byte</sub>, R<sub>byte</sub> returns <tt class="docutils literal"><span class="pre">undef</span></tt> for that byte.</li>
+<li>Otherwise, if R<sub>byte</sub> may see exactly one write,
+R<sub>byte</sub> returns the value written by that write.</li>
+<li>Otherwise, if R is atomic, and all the writes R<sub>byte</sub> may
+see are atomic, it chooses one of the values written. See the <a class="reference internal" href="#ordering"><em>Atomic
+Memory Ordering Constraints</em></a> section for additional
+constraints on how the choice is made.</li>
+<li>Otherwise R<sub>byte</sub> returns <tt class="docutils literal"><span class="pre">undef</span></tt>.</li>
+</ul>
+<p>R returns the value composed of the series of bytes it read. This
+implies that some bytes within the value may be <tt class="docutils literal"><span class="pre">undef</span></tt> <strong>without</strong>
+the entire value being <tt class="docutils literal"><span class="pre">undef</span></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>
+</div>
+<div class="section" id="atomic-memory-ordering-constraints">
+<span id="ordering"></span><h3><a class="toc-backref" href="#id578">Atomic Memory Ordering Constraints</a><a class="headerlink" href="#atomic-memory-ordering-constraints" title="Permalink to this headline">¶</a></h3>
+<p>Atomic instructions (<a class="reference internal" href="#i-cmpxchg"><em>cmpxchg</em></a>,
+<a class="reference internal" href="#i-atomicrmw"><em>atomicrmw</em></a>, <a class="reference internal" href="#i-fence"><em>fence</em></a>,
+<a class="reference internal" href="#i-load"><em>atomic load</em></a>, and <a class="reference internal" href="#i-store"><em>atomic store</em></a>) take
+ordering parameters that determine which other atomic instructions on
+the same address they <em>synchronize with</em>. 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 class="reference internal" href="Atomics.html"><em>atomics guide</em></a>).
+<a class="reference internal" href="#i-fence"><em>fence</em></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 class="reference internal" href="Atomics.html"><em>LLVM Atomic Instructions and Concurrency Guide</em></a>.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">unordered</span></tt></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><tt class="docutils literal"><span class="pre">monotonic</span></tt></dt>
+<dd>In addition to the guarantees of <tt class="docutils literal"><span class="pre">unordered</span></tt>, there is a single
+total order for modifications by <tt class="docutils literal"><span class="pre">monotonic</span></tt> 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 class="reference internal" href="#i-cmpxchg"><em>cmpxchg</em></a> and
+<a class="reference internal" href="#i-atomicrmw"><em>atomicrmw</em></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 <tt class="docutils literal"><span class="pre">monotonic</span></tt> (or
+stronger) operations on the same address. If an address is written
+<tt class="docutils literal"><span class="pre">monotonic</span></tt>-ally by one thread, and other threads <tt class="docutils literal"><span class="pre">monotonic</span></tt>-ally
+read that address repeatedly, the other threads must eventually see
+the write. This corresponds to the C++0x/C1x
+<tt class="docutils literal"><span class="pre">memory_order_relaxed</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">acquire</span></tt></dt>
+<dd>In addition to the guarantees of <tt class="docutils literal"><span class="pre">monotonic</span></tt>, a
+<em>synchronizes-with</em> edge may be formed with a <tt class="docutils literal"><span class="pre">release</span></tt> operation.
+This is intended to model C++’s <tt class="docutils literal"><span class="pre">memory_order_acquire</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">release</span></tt></dt>
+<dd>In addition to the guarantees of <tt class="docutils literal"><span class="pre">monotonic</span></tt>, if this operation
+writes a value which is subsequently read by an <tt class="docutils literal"><span class="pre">acquire</span></tt>
+operation, it <em>synchronizes-with</em> that operation. (This isn’t a
+complete description; see the C++0x definition of a release
+sequence.) This corresponds to the C++0x/C1x
+<tt class="docutils literal"><span class="pre">memory_order_release</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">acq_rel</span></tt> (acquire+release)</dt>
+<dd>Acts as both an <tt class="docutils literal"><span class="pre">acquire</span></tt> and <tt class="docutils literal"><span class="pre">release</span></tt> operation on its
+address. This corresponds to the C++0x/C1x <tt class="docutils literal"><span class="pre">memory_order_acq_rel</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">seq_cst</span></tt> (sequentially consistent)</dt>
+<dd>In addition to the guarantees of <tt class="docutils literal"><span class="pre">acq_rel</span></tt> (<tt class="docutils literal"><span class="pre">acquire</span></tt> for an
+operation which only reads, <tt class="docutils literal"><span class="pre">release</span></tt> 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 <em>happens-before</em> 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
+<tt class="docutils literal"><span class="pre">memory_order_seq_cst</span></tt> and Java volatile.</dd>
+</dl>
+<p id="singlethread">If an atomic operation is marked <tt class="docutils literal"><span class="pre">singlethread</span></tt>, it only <em>synchronizes
+with</em> 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 class="section" id="fast-math-flags">
+<span id="fastmath"></span><h3><a class="toc-backref" href="#id579">Fast-Math Flags</a><a class="headerlink" href="#fast-math-flags" title="Permalink to this headline">¶</a></h3>
+<p>LLVM IR floating-point binary ops (<a class="reference internal" href="#i-fadd"><em>fadd</em></a>,
+<a class="reference internal" href="#i-fsub"><em>fsub</em></a>, <a class="reference internal" href="#i-fmul"><em>fmul</em></a>, <a class="reference internal" href="#i-fdiv"><em>fdiv</em></a>,
+<a class="reference internal" href="#i-frem"><em>frem</em></a>) have the following flags that can set to enable
+otherwise unsafe floating point operations</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">nnan</span></tt></dt>
+<dd>No NaNs - Allow optimizations to assume the arguments and result are not
+NaN. Such optimizations are required to retain defined behavior over
+NaNs, but the value of the result is undefined.</dd>
+<dt><tt class="docutils literal"><span class="pre">ninf</span></tt></dt>
+<dd>No Infs - Allow optimizations to assume the arguments and result are not
++/-Inf. Such optimizations are required to retain defined behavior over
++/-Inf, but the value of the result is undefined.</dd>
+<dt><tt class="docutils literal"><span class="pre">nsz</span></tt></dt>
+<dd>No Signed Zeros - Allow optimizations to treat the sign of a zero
+argument or result as insignificant.</dd>
+<dt><tt class="docutils literal"><span class="pre">arcp</span></tt></dt>
+<dd>Allow Reciprocal - Allow optimizations to use the reciprocal of an
+argument rather than perform division.</dd>
+<dt><tt class="docutils literal"><span class="pre">fast</span></tt></dt>
+<dd>Fast - Allow algebraically equivalent transformations that may
+dramatically change results in floating point (e.g. reassociate). This
+flag implies all the others.</dd>
+</dl>
+</div>
+</div>
+<div class="section" id="type-system">
+<span id="typesystem"></span><h2><a class="toc-backref" href="#id580">Type System</a><a class="headerlink" href="#type-system" title="Permalink to this headline">¶</a></h2>
+<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>
+<div class="section" id="void-type">
+<span id="t-void"></span><h3><a class="toc-backref" href="#id581">Void Type</a><a class="headerlink" href="#void-type" title="Permalink to this headline">¶</a></h3>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<p>The void type does not represent any value and has no size.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">void</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="function-type">
+<span id="t-function"></span><h3><a class="toc-backref" href="#id582">Function Type</a><a class="headerlink" href="#function-type" title="Permalink to this headline">¶</a></h3>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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 void type or first class type — except for <a class="reference internal" href="#t-label"><em>label</em></a>
+and <a class="reference internal" href="#t-metadata"><em>metadata</em></a> types.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><pre><returntype> (<parameter list>)</pre>
+</div>
+<p>...where ‘<tt class="docutils literal"><span class="pre"><parameter</span> <span class="pre">list></span></tt>‘ is a comma-separated list of type
+specifiers. Optionally, the parameter list may include a type <tt class="docutils literal"><span class="pre">...</span></tt>, which
+indicates that the function takes a variable number of arguments.  Variable
+argument functions can access their arguments with the <a class="reference internal" href="#int-varargs"><em>variable argument
+handling intrinsic</em></a> functions.  ‘<tt class="docutils literal"><span class="pre"><returntype></span></tt>‘ is any type
+except <a class="reference internal" href="#t-label"><em>label</em></a> and <a class="reference internal" href="#t-metadata"><em>metadata</em></a>.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Examples:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<table border="1" class="docutils">
+<colgroup>
+<col width="17%" />
+<col width="83%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">i32</span> <span class="pre">(i32)</span></tt></td>
+<td>function taking an <tt class="docutils literal"><span class="pre">i32</span></tt>, returning an <tt class="docutils literal"><span class="pre">i32</span></tt></td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">float</span> <span class="pre">(i16,</span> <span class="pre">i32</span> <span class="pre">*)</span> <span class="pre">*</span></tt></td>
+<td><a class="reference internal" href="#t-pointer"><em>Pointer</em></a> to a function that takes an <tt class="docutils literal"><span class="pre">i16</span></tt> and a <a class="reference internal" href="#t-pointer"><em>pointer</em></a> to <tt class="docutils literal"><span class="pre">i32</span></tt>, returning <tt class="docutils literal"><span class="pre">float</span></tt>.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">i32</span> <span class="pre">(i8*,</span> <span class="pre">...)</span></tt></td>
+<td>A vararg function that takes at least one <a class="reference internal" href="#t-pointer"><em>pointer</em></a> to <tt class="docutils literal"><span class="pre">i8</span></tt> (char in C), which returns an integer. This is the signature for <tt class="docutils literal"><span class="pre">printf</span></tt> in LLVM.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">{i32,</span> <span class="pre">i32}</span> <span class="pre">(i32)</span></tt></td>
+<td>A function taking an <tt class="docutils literal"><span class="pre">i32</span></tt>, returning a <a class="reference internal" href="#t-struct"><em>structure</em></a> containing two <tt class="docutils literal"><span class="pre">i32</span></tt> values</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="first-class-types">
+<span id="t-firstclass"></span><h3><a class="toc-backref" href="#id583">First Class Types</a><a class="headerlink" href="#first-class-types" title="Permalink to this headline">¶</a></h3>
+<p>The <a class="reference internal" href="#t-firstclass"><em>first class</em></a> types are perhaps the most important.
+Values of these types are the only ones which can be produced by
+instructions.</p>
+<div class="section" id="single-value-types">
+<span id="t-single-value"></span><h4><a class="toc-backref" href="#id584">Single Value Types</a><a class="headerlink" href="#single-value-types" title="Permalink to this headline">¶</a></h4>
+<p>These are the types that are valid in registers from CodeGen’s perspective.</p>
+<div class="section" id="integer-type">
+<span id="t-integer"></span><h5><a class="toc-backref" href="#id585">Integer Type</a><a class="headerlink" href="#integer-type" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">iN</span>
+</pre></div>
+</div>
+<p>The number of bits the integer will occupy is specified by the <tt class="docutils literal"><span class="pre">N</span></tt>
+value.</p>
+<div class="section" id="examples">
+<h6>Examples:<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h6>
+<table border="1" class="docutils">
+<colgroup>
+<col width="25%" />
+<col width="75%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">i1</span></tt></td>
+<td>a single-bit integer.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">i32</span></tt></td>
+<td>a 32-bit integer.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">i1942652</span></tt></td>
+<td>a really big integer of over 1 million bits.</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="section" id="floating-point-types">
+<span id="t-floating"></span><h5><a class="toc-backref" href="#id586">Floating Point Types</a><a class="headerlink" href="#floating-point-types" title="Permalink to this headline">¶</a></h5>
+<table border="1" class="docutils">
+<colgroup>
+<col width="50%" />
+<col width="50%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Type</th>
+<th class="head">Description</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">half</span></tt></td>
+<td>16-bit floating point value</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">float</span></tt></td>
+<td>32-bit floating point value</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">double</span></tt></td>
+<td>64-bit floating point value</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">fp128</span></tt></td>
+<td>128-bit floating point value (112-bit mantissa)</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">x86_fp80</span></tt></td>
+<td>80-bit floating point value (X87)</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">ppc_fp128</span></tt></td>
+<td>128-bit floating point value (two 64-bits)</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="x86-mmx-type">
+<h5><a class="toc-backref" href="#id587">X86_mmx Type</a><a class="headerlink" href="#x86-mmx-type" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<p>The x86_mmx 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>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">x86_mmx</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="pointer-type">
+<span id="t-pointer"></span><h5><a class="toc-backref" href="#id588">Pointer Type</a><a class="headerlink" href="#pointer-type" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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 class="docutils literal"><span class="pre">void*</span></tt>) nor does it
+permit pointers to labels (<tt class="docutils literal"><span class="pre">label*</span></tt>). Use <tt class="docutils literal"><span class="pre">i8*</span></tt> instead.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><pre><type> *</pre>
+</div>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Examples:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<table border="1" class="docutils">
+<colgroup>
+<col width="19%" />
+<col width="81%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">[4</span> <span class="pre">x</span> <span class="pre">i32]*</span></tt></td>
+<td>A <a class="reference internal" href="#t-pointer"><em>pointer</em></a> to <a class="reference internal" href="#t-array"><em>array</em></a> of four <tt class="docutils literal"><span class="pre">i32</span></tt> values.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">i32</span> <span class="pre">(i32*)</span> <span class="pre">*</span></tt></td>
+<td>A <a class="reference internal" href="#t-pointer"><em>pointer</em></a> to a <a class="reference internal" href="#t-function"><em>function</em></a> that takes an <tt class="docutils literal"><span class="pre">i32*</span></tt>, returning an <tt class="docutils literal"><span class="pre">i32</span></tt>.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">i32</span> <span class="pre">addrspace(5)*</span></tt></td>
+<td>A <a class="reference internal" href="#t-pointer"><em>pointer</em></a> to an <tt class="docutils literal"><span class="pre">i32</span></tt> value that resides in address space #5.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="vector-type">
+<span id="t-vector"></span><h5><a class="toc-backref" href="#id589">Vector Type</a><a class="headerlink" href="#vector-type" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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 class="reference internal" href="#t-firstclass"><em>first class</em></a>.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><pre>< <# elements> x <elementtype> ></pre>
+</div>
+<p>The number of elements is a constant integer value larger than 0;
+elementtype may be any integer or floating point type, or a pointer to
+these types. Vectors of size zero are not allowed.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Examples:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<table border="1" class="docutils">
+<colgroup>
+<col width="28%" />
+<col width="72%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre"><4</span> <span class="pre">x</span> <span class="pre">i32></span></tt></td>
+<td>Vector of 4 32-bit integer values.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre"><8</span> <span class="pre">x</span> <span class="pre">float></span></tt></td>
+<td>Vector of 8 32-bit floating-point values.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre"><2</span> <span class="pre">x</span> <span class="pre">i64></span></tt></td>
+<td>Vector of 2 64-bit integer values.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre"><4</span> <span class="pre">x</span> <span class="pre">i64*></span></tt></td>
+<td>Vector of 4 pointers to 64-bit integer values.</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+<div class="section" id="label-type">
+<span id="t-label"></span><h4><a class="toc-backref" href="#id590">Label Type</a><a class="headerlink" href="#label-type" title="Permalink to this headline">¶</a></h4>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<p>The label type represents code labels.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">label</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="metadata-type">
+<span id="t-metadata"></span><h4><a class="toc-backref" href="#id591">Metadata Type</a><a class="headerlink" href="#metadata-type" title="Permalink to this headline">¶</a></h4>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<p>The metadata type represents embedded metadata. No derived types may be
+created from metadata except for <a class="reference internal" href="#t-function"><em>function</em></a> arguments.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">metadata</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="aggregate-types">
+<span id="t-aggregate"></span><h4><a class="toc-backref" href="#id592">Aggregate Types</a><a class="headerlink" href="#aggregate-types" title="Permalink to this headline">¶</a></h4>
+<p>Aggregate Types are a subset of derived types that can contain multiple
+member types. <a class="reference internal" href="#t-array"><em>Arrays</em></a> and <a class="reference internal" href="#t-struct"><em>structs</em></a> are
+aggregate types. <a class="reference internal" href="#t-vector"><em>Vectors</em></a> are not considered to be
+aggregate types.</p>
+<div class="section" id="array-type">
+<span id="t-array"></span><h5><a class="toc-backref" href="#id593">Array Type</a><a class="headerlink" href="#array-type" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><pre>[<# elements> x <elementtype>]</pre>
+</div>
+<p>The number of elements is a constant integer value; <tt class="docutils literal"><span class="pre">elementtype</span></tt> may
+be any type with a size.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Examples:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<table border="1" class="docutils">
+<colgroup>
+<col width="32%" />
+<col width="68%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">[40</span> <span class="pre">x</span> <span class="pre">i32]</span></tt></td>
+<td>Array of 40 32-bit integer values.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">[41</span> <span class="pre">x</span> <span class="pre">i32]</span></tt></td>
+<td>Array of 41 32-bit integer values.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">[4</span> <span class="pre">x</span> <span class="pre">i8]</span></tt></td>
+<td>Array of 4 8-bit integer values.</td>
+</tr>
+</tbody>
+</table>
+<p>Here are some examples of multidimensional arrays:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="33%" />
+<col width="67%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">[3</span> <span class="pre">x</span> <span class="pre">[4</span> <span class="pre">x</span> <span class="pre">i32]]</span></tt></td>
+<td>3x4 array of 32-bit integer values.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">[12</span> <span class="pre">x</span> <span class="pre">[10</span> <span class="pre">x</span> <span class="pre">float]]</span></tt></td>
+<td>12x10 array of single precision floating point values.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">[2</span> <span class="pre">x</span> <span class="pre">[3</span> <span class="pre">x</span> <span class="pre">[4</span> <span class="pre">x</span> <span class="pre">i16]]]</span></tt></td>
+<td>2x3x4 array of 16-bit integer values.</td>
+</tr>
+</tbody>
+</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 class="docutils literal"><span class="pre">{</span> <span class="pre">i32,</span> <span class="pre">[0</span> <span class="pre">x</span> <span class="pre">float]}</span></tt>”, for
+example.</p>
+</div>
+<div class="section" id="structure-type">
+<span id="t-struct"></span><h5><a class="toc-backref" href="#id594">Structure Type</a><a class="headerlink" href="#structure-type" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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 class="docutils literal"><span class="pre">load</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">store</span></tt>‘ by
+getting a pointer to a field with the ‘<tt class="docutils literal"><span class="pre">getelementptr</span></tt>‘ instruction.
+Structures in registers are accessed using the ‘<tt class="docutils literal"><span class="pre">extractvalue</span></tt>‘ and
+‘<tt class="docutils literal"><span class="pre">insertvalue</span></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 DataLayout 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 class="docutils literal"><span class="pre">{i32,</span> <span class="pre">i32}*</span></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>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><pre>%T1 = type { <type list> }     ; Identified normal struct type
+%T2 = type <{ <type list> }>   ; Identified packed struct type</pre>
+</div>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Examples:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<table border="1" class="docutils">
+<colgroup>
+<col width="14%" />
+<col width="86%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">{</span> <span class="pre">i32,</span> <span class="pre">i32,</span> <span class="pre">i32</span> <span class="pre">}</span></tt></td>
+<td>A triple of three <tt class="docutils literal"><span class="pre">i32</span></tt> values</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">{</span> <span class="pre">float,</span> <span class="pre">i32</span> <span class="pre">(i32)</span> <span class="pre">*</span> <span class="pre">}</span></tt></td>
+<td>A pair, where the first element is a <tt class="docutils literal"><span class="pre">float</span></tt> and the second element is a <a class="reference internal" href="#t-pointer"><em>pointer</em></a> to a <a class="reference internal" href="#t-function"><em>function</em></a> that takes an <tt class="docutils literal"><span class="pre">i32</span></tt>, returning an <tt class="docutils literal"><span class="pre">i32</span></tt>.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre"><{</span> <span class="pre">i8,</span> <span class="pre">i32</span> <span class="pre">}></span></tt></td>
+<td>A packed struct known to be 5 bytes in size.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="opaque-structure-types">
+<span id="t-opaque"></span><h5><a class="toc-backref" href="#id595">Opaque Structure Types</a><a class="headerlink" href="#opaque-structure-types" title="Permalink to this headline">¶</a></h5>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Overview:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<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>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Syntax:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<div class="highlight-python"><pre>%X = type opaque
+%52 = type opaque</pre>
+</div>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Examples:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<table border="1" class="docutils">
+<colgroup>
+<col width="42%" />
+<col width="58%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">opaque</span></tt></td>
+<td>An opaque type.</td>
+</tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="constants">
+<span id="id3"></span><h2><a class="toc-backref" href="#id596">Constants</a><a class="headerlink" href="#constants" title="Permalink to this headline">¶</a></h2>
+<p>LLVM has several different basic types of constants. This section
+describes them all and their syntax.</p>
+<div class="section" id="simple-constants">
+<h3><a class="toc-backref" href="#id597">Simple Constants</a><a class="headerlink" href="#simple-constants" title="Permalink to this headline">¶</a></h3>
+<dl class="docutils">
+<dt><strong>Boolean constants</strong></dt>
+<dd>The two strings ‘<tt class="docutils literal"><span class="pre">true</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">false</span></tt>‘ are both valid constants
+of the <tt class="docutils literal"><span class="pre">i1</span></tt> type.</dd>
+<dt><strong>Integer constants</strong></dt>
+<dd>Standard integers (such as ‘4’) are constants of the
+<a class="reference internal" href="#t-integer"><em>integer</em></a> type. Negative numbers may be used with
+integer types.</dd>
+<dt><strong>Floating point constants</strong></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 class="reference internal" href="#t-floating"><em>floating
+point</em></a> type.</dd>
+<dt><strong>Null pointer constants</strong></dt>
+<dd>The identifier ‘<tt class="docutils literal"><span class="pre">null</span></tt>‘ is recognized as a null pointer constant
+and must be of <a class="reference internal" href="#t-pointer"><em>pointer type</em></a>.</dd>
+</dl>
+<p>The one non-intuitive notation for constants is the hexadecimal form of
+floating point constants. For example, the form
+‘<tt class="docutils literal"><span class="pre">double</span>    <span class="pre">0x432ff973cafa8000</span></tt>‘ is equivalent to (but harder to read
+than) ‘<tt class="docutils literal"><span class="pre">double</span> <span class="pre">4.5e+15</span></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 half, float, and
+double are represented using the 16-digit form shown above (which
+matches the IEEE754 representation for double); half and float values
+must, however, be exactly representable as IEEE 754 half and single
+precision, respectively. 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 class="docutils literal"><span class="pre">0xK</span></tt> followed by 20 hexadecimal digits. The
+128-bit format used by PowerPC (two adjacent doubles) is represented by
+<tt class="docutils literal"><span class="pre">0xM</span></tt> followed by 32 hexadecimal digits. The IEEE 128-bit format is
+represented by <tt class="docutils literal"><span class="pre">0xL</span></tt> followed by 32 hexadecimal digits. Long doubles
+will only work if they match the long double format on your target.
+The IEEE 16-bit format (half precision) is represented by <tt class="docutils literal"><span class="pre">0xH</span></tt>
+followed by 4 hexadecimal digits. All hexadecimal formats are big-endian
+(sign bit at the left).</p>
+<p>There are no constants of type x86_mmx.</p>
+</div>
+<div class="section" id="complex-constants">
+<span id="complexconstants"></span><h3><a class="toc-backref" href="#id598">Complex Constants</a><a class="headerlink" href="#complex-constants" title="Permalink to this headline">¶</a></h3>
+<p>Complex constants are a (potentially recursive) combination of simple
+constants and smaller complex constants.</p>
+<dl class="docutils">
+<dt><strong>Structure constants</strong></dt>
+<dd>Structure constants are represented with notation similar to
+structure type definitions (a comma separated list of elements,
+surrounded by braces (<tt class="docutils literal"><span class="pre">{}</span></tt>)). For example:
+“<tt class="docutils literal"><span class="pre">{</span> <span class="pre">i32</span> <span class="pre">4,</span> <span class="pre">float</span> <span class="pre">17.0,</span> <span class="pre">i32*</span> <span class="pre">@G</span> <span class="pre">}</span></tt>”, where “<tt class="docutils literal"><span class="pre">@G</span></tt>” is declared as
+“<tt class="docutils literal"><span class="pre">@G</span> <span class="pre">=</span> <span class="pre">external</span> <span class="pre">global</span> <span class="pre">i32</span></tt>”. Structure constants must have
+<a class="reference internal" href="#t-struct"><em>structure type</em></a>, and the number and types of elements
+must match those specified by the type.</dd>
+<dt><strong>Array constants</strong></dt>
+<dd>Array constants are represented with notation similar to array type
+definitions (a comma separated list of elements, surrounded by
+square brackets (<tt class="docutils literal"><span class="pre">[]</span></tt>)). For example:
+“<tt class="docutils literal"><span class="pre">[</span> <span class="pre">i32</span> <span class="pre">42,</span> <span class="pre">i32</span> <span class="pre">11,</span> <span class="pre">i32</span> <span class="pre">74</span> <span class="pre">]</span></tt>”. Array constants must have
+<a class="reference internal" href="#t-array"><em>array type</em></a>, and the number and types of elements must
+match those specified by the type.</dd>
+<dt><strong>Vector constants</strong></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 class="docutils literal"><span class="pre"><></span></tt>)). For example:
+“<tt class="docutils literal"><span class="pre"><</span> <span class="pre">i32</span> <span class="pre">42,</span> <span class="pre">i32</span> <span class="pre">11,</span> <span class="pre">i32</span> <span class="pre">74,</span> <span class="pre">i32</span> <span class="pre">100</span> <span class="pre">></span></tt>”. Vector constants
+must have <a class="reference internal" href="#t-vector"><em>vector type</em></a>, and the number and types of
+elements must match those specified by the type.</dd>
+<dt><strong>Zero initialization</strong></dt>
+<dd>The string ‘<tt class="docutils literal"><span class="pre">zeroinitializer</span></tt>‘ can be used to zero initialize a
+value to zero of <em>any</em> type, including scalar and
+<a class="reference internal" href="#t-aggregate"><em>aggregate</em></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><strong>Metadata node</strong></dt>
+<dd>A metadata node is a structure-like constant with <a class="reference internal" href="#t-metadata"><em>metadata
+type</em></a>. For example:
+“<tt class="docutils literal"><span class="pre">metadata</span> <span class="pre">!{</span> <span class="pre">i32</span> <span class="pre">0,</span> <span class="pre">metadata</span> <span class="pre">!"test"</span> <span class="pre">}</span></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>
+<div class="section" id="global-variable-and-function-addresses">
+<h3><a class="toc-backref" href="#id599">Global Variable and Function Addresses</a><a class="headerlink" href="#global-variable-and-function-addresses" title="Permalink to this headline">¶</a></h3>
+<p>The addresses of <a class="reference internal" href="#globalvars"><em>global variables</em></a> and
+<a class="reference internal" href="#functionstructure"><em>functions</em></a> are always implicitly valid
+(link-time) constants. These constants are explicitly referenced when
+the <a class="reference internal" href="#identifiers"><em>identifier for the global</em></a> is used and always have
+<a class="reference internal" href="#t-pointer"><em>pointer</em></a> type. For example, the following is a legal LLVM
+file:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="vg">@X</span> <span class="p">=</span> <span class="k">global</span> <span class="k">i32</span> <span class="m">17</span>
+<span class="vg">@Y</span> <span class="p">=</span> <span class="k">global</span> <span class="k">i32</span> <span class="m">42</span>
+<span class="vg">@Z</span> <span class="p">=</span> <span class="k">global</span> <span class="p">[</span><span class="m">2</span> <span class="k">x</span> <span class="k">i32</span><span class="p">*]</span> <span class="p">[</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@X</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@Y</span> <span class="p">]</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="undefined-values">
+<span id="undefvalues"></span><h3><a class="toc-backref" href="#id600">Undefined Values</a><a class="headerlink" href="#undefined-values" title="Permalink to this headline">¶</a></h3>
+<p>The string ‘<tt class="docutils literal"><span class="pre">undef</span></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 class="docutils literal"><span class="pre">label</span></tt>‘
+or ‘<tt class="docutils literal"><span class="pre">void</span></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>
+<div class="highlight-llvm"><div class="highlight"><pre>  <span class="nv">%A</span> <span class="p">=</span> <span class="k">add</span> <span class="nv">%X</span><span class="p">,</span> <span class="k">undef</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">sub</span> <span class="nv">%X</span><span class="p">,</span> <span class="k">undef</span>
+  <span class="nv">%C</span> <span class="p">=</span> <span class="k">xor</span> <span class="nv">%X</span><span class="p">,</span> <span class="k">undef</span>
+<span class="nl">Safe:</span>
+  <span class="nv">%A</span> <span class="p">=</span> <span class="k">undef</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">undef</span>
+  <span class="nv">%C</span> <span class="p">=</span> <span class="k">undef</span>
+</pre></div>
+</div>
+<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>
+<div class="highlight-llvm"><div class="highlight"><pre>  <span class="nv">%A</span> <span class="p">=</span> <span class="k">or</span> <span class="nv">%X</span><span class="p">,</span> <span class="k">undef</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">and</span> <span class="nv">%X</span><span class="p">,</span> <span class="k">undef</span>
+<span class="nl">Safe:</span>
+  <span class="nv">%A</span> <span class="p">=</span> <span class="m">-1</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="m">0</span>
+<span class="nl">Unsafe:</span>
+  <span class="nv">%A</span> <span class="p">=</span> <span class="k">undef</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">undef</span>
+</pre></div>
+</div>
+<p>These logical operations have bits that are not always affected by the
+input. For example, if <tt class="docutils literal"><span class="pre">%X</span></tt> has a zero bit, then the output of the
+‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ operation will always be a zero for that bit, no matter what
+the corresponding bit from the ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘ is. As such, it is unsafe to
+optimize or assume that the result of the ‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ is ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘.
+However, it is safe to assume that all bits of the ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘ could be
+0, and optimize the ‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ to 0. Likewise, it is safe to assume that
+all the bits of the ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘ operand to the ‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ could be set,
+allowing the ‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ to be folded to -1.</p>
+<div class="highlight-llvm"><div class="highlight"><pre>  <span class="nv">%A</span> <span class="p">=</span> <span class="k">select</span> <span class="k">undef</span><span class="p">,</span> <span class="nv">%X</span><span class="p">,</span> <span class="nv">%Y</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">select</span> <span class="k">undef</span><span class="p">,</span> <span class="m">42</span><span class="p">,</span> <span class="nv">%Y</span>
+  <span class="nv">%C</span> <span class="p">=</span> <span class="k">select</span> <span class="nv">%X</span><span class="p">,</span> <span class="nv">%Y</span><span class="p">,</span> <span class="k">undef</span>
+<span class="nl">Safe:</span>
+  <span class="nv">%A</span> <span class="p">=</span> <span class="nv">%X</span>     <span class="p">(</span><span class="k">or</span> <span class="nv">%Y</span><span class="p">)</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="m">42</span>     <span class="p">(</span><span class="k">or</span> <span class="nv">%Y</span><span class="p">)</span>
+  <span class="nv">%C</span> <span class="p">=</span> <span class="nv">%Y</span>
+<span class="nl">Unsafe:</span>
+  <span class="nv">%A</span> <span class="p">=</span> <span class="k">undef</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">undef</span>
+  <span class="nv">%C</span> <span class="p">=</span> <span class="k">undef</span>
+</pre></div>
+</div>
+<p>This set of examples shows that undefined ‘<tt class="docutils literal"><span class="pre">select</span></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 class="docutils literal"><span class="pre">%A</span></tt> example, if <tt class="docutils literal"><span class="pre">%X</span></tt> and <tt class="docutils literal"><span class="pre">%Y</span></tt> were
+both known to have a clear low bit, then <tt class="docutils literal"><span class="pre">%A</span></tt> would have to have a
+cleared low bit. However, in the <tt class="docutils literal"><span class="pre">%C</span></tt> example, the optimizer is
+allowed to assume that the ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘ operand could be the same as
+<tt class="docutils literal"><span class="pre">%Y</span></tt>, allowing the whole ‘<tt class="docutils literal"><span class="pre">select</span></tt>‘ to be eliminated.</p>
+<div class="highlight-llvm"><pre>  %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>
+</div>
+<p>This example points out that two ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘ operands are not
+necessarily the same. This can be surprising to people (and also matches
+C semantics) where they assume that “<tt class="docutils literal"><span class="pre">X^X</span></tt>” is always zero, even if
+<tt class="docutils literal"><span class="pre">X</span></tt> is undefined. This isn’t true for a number of reasons, but the
+short answer is that an ‘<tt class="docutils literal"><span class="pre">undef</span></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 class="docutils literal"><span class="pre">%A</span></tt> and
+<tt class="docutils literal"><span class="pre">%C</span></tt> need to have the same semantics or the core LLVM “replace all
+uses with” concept would not hold.</p>
+<div class="highlight-llvm"><div class="highlight"><pre>  <span class="nv">%A</span> <span class="p">=</span> <span class="k">fdiv</span> <span class="k">undef</span><span class="p">,</span> <span class="nv">%X</span>
+  <span class="nv">%B</span> <span class="p">=</span> <span class="k">fdiv</span> <span class="nv">%X</span><span class="p">,</span> <span class="k">undef</span>
+<span class="nl">Safe:</span>
+  <span class="nv">%A</span> <span class="p">=</span> <span class="k">undef</span>
+<span class="nl">b:</span> <span class="k">unreachable</span>
+</pre></div>
+</div>
+<p>These examples show the crucial difference between an <em>undefined value</em>
+and <em>undefined behavior</em>. An undefined value (like ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘) is
+allowed to have an arbitrary bit-pattern. This means that the <tt class="docutils literal"><span class="pre">%A</span></tt>
+operation can be constant folded to ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘, because the ‘<tt class="docutils literal"><span class="pre">undef</span></tt>‘
+could be an SNaN, and <tt class="docutils literal"><span class="pre">fdiv</span></tt> is not (currently) defined on SNaN’s.
+However, in the second example, we can make a more aggressive
+assumption: because the <tt class="docutils literal"><span class="pre">undef</span></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>
+<div class="highlight-llvm"><pre>a:  store undef -> %X
+b:  store %X -> undef
+Safe:
+a: <deleted>
+b: unreachable</pre>
+</div>
+<p>These examples reiterate the <tt class="docutils literal"><span class="pre">fdiv</span></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>
+<div class="section" id="poison-values">
+<span id="poisonvalues"></span><h3><a class="toc-backref" href="#id601">Poison Values</a><a class="headerlink" href="#poison-values" title="Permalink to this headline">¶</a></h3>
+<p>Poison values are similar to <a class="reference internal" href="#undefvalues"><em>undef values</em></a>, however
+they also 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 poison value in the IR; they
+only exist when produced by operations such as <a class="reference internal" href="#i-add"><em>add</em></a> with
+the <tt class="docutils literal"><span class="pre">nsw</span></tt> flag.</p>
+<p>Poison value behavior is defined in terms of value <em>dependence</em>:</p>
+<ul class="simple">
+<li>Values other than <a class="reference internal" href="#i-phi"><em>phi</em></a> nodes depend on their operands.</li>
+<li><a class="reference internal" href="#i-phi"><em>Phi</em></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 class="reference internal" href="#i-call"><em>Call</em></a> instructions depend on the <a class="reference internal" href="#i-ret"><em>ret</em></a>
+instructions that dynamically transfer control back to them.</li>
+<li><a class="reference internal" href="#i-invoke"><em>Invoke</em></a> instructions depend on the
+<a class="reference internal" href="#i-ret"><em>ret</em></a>, <a class="reference internal" href="#i-resume"><em>resume</em></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 class="reference internal" href="#int-memcpy"><em>@llvm.memcpy</em></a>.)</li>
+<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 class="reference internal" href="#volatile"><em>volatile
+operations</em></a>.)</li>
+<li>An instruction <em>control-depends</em> on a <a class="reference internal" href="#terminators"><em>terminator
+instruction</em></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 <em>control-depends</em> 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>Poison Values have the same behavior as <a class="reference internal" href="#undefvalues"><em>undef values</em></a>,
+with the additional affect that any instruction which has a <em>dependence</em>
+on a poison value has undefined behavior.</p>
+<p>Here are some examples:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nl">entry:</span>
+  <span class="nv">%poison</span> <span class="p">=</span> <span class="k">sub</span> <span class="k">nuw</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span>           <span class="c">; Results in a poison value.</span>
+  <span class="nv">%still_poison</span> <span class="p">=</span> <span class="k">and</span> <span class="k">i32</span> <span class="nv">%poison</span><span class="p">,</span> <span class="m">0</span>   <span class="c">; 0, but also poison.</span>
+  <span class="nv">%poison_yet_again</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@h</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%still_poison</span>
+  <span class="k">store</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%poison_yet_again</span>  <span class="c">; memory at @h[0] is poisoned</span>
+
+  <span class="k">store</span> <span class="k">i32</span> <span class="nv">%poison</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span>           <span class="c">; Poison value stored to memory.</span>
+  <span class="nv">%poison2</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span>              <span class="c">; Poison value loaded back from memory.</span>
+
+  <span class="k">store</span> <span class="k">volatile</span> <span class="k">i32</span> <span class="nv">%poison</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span>  <span class="c">; External observation; undefined behavior.</span>
+
+  <span class="nv">%narrowaddr</span> <span class="p">=</span> <span class="k">bitcast</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span> <span class="k">to</span> <span class="k">i16</span><span class="p">*</span>
+  <span class="nv">%wideaddr</span> <span class="p">=</span> <span class="k">bitcast</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span> <span class="k">to</span> <span class="k">i64</span><span class="p">*</span>
+  <span class="nv">%poison3</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i16</span><span class="p">*</span> <span class="nv">%narrowaddr</span>     <span class="c">; Returns a poison value.</span>
+  <span class="nv">%poison4</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i64</span><span class="p">*</span> <span class="nv">%wideaddr</span>       <span class="c">; Returns a poison value.</span>
+
+  <span class="nv">%cmp</span> <span class="p">=</span> <span class="k">icmp</span> <span class="k">slt</span> <span class="k">i32</span> <span class="nv">%poison</span><span class="p">,</span> <span class="m">0</span>       <span class="c">; Returns a poison value.</span>
+  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%cmp</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%true</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%end</span>  <span class="c">; Branch to either destination.</span>
+
+<span class="nl">true:</span>
+  <span class="k">store</span> <span class="k">volatile</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span>        <span class="c">; This is control-dependent on %cmp, so</span>
+                                       <span class="c">; it has undefined behavior.</span>
+  <span class="k">br</span> <span class="kt">label</span> <span class="nv">%end</span>
+
+<span class="nl">end:</span>
+  <span class="nv">%p</span> <span class="p">=</span> <span class="k">phi</span> <span class="k">i32</span> <span class="p">[</span> <span class="m">0</span><span class="p">,</span> <span class="nv">%entry</span> <span class="p">],</span> <span class="p">[</span> <span class="m">1</span><span class="p">,</span> <span class="nv">%true</span> <span class="p">]</span>
+                                       <span class="c">; Both edges into this PHI are</span>
+                                       <span class="c">; control-dependent on %cmp, so this</span>
+                                       <span class="c">; always results in a poison value.</span>
+
+  <span class="k">store</span> <span class="k">volatile</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span>        <span class="c">; This would depend on the store in %true</span>
+                                       <span class="c">; if %cmp is true, or the store in %entry</span>
+                                       <span class="c">; otherwise, so this is undefined behavior.</span>
+
+  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%cmp</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%second_true</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%second_end</span>
+                                       <span class="c">; The same branch again, but this time the</span>
+                                       <span class="c">; true block doesn't have side effects.</span>
+
+<span class="nl">second_true:</span>
+  <span class="c">; No side effects!</span>
+  <span class="k">ret</span> <span class="kt">void</span>
+
+<span class="nl">second_end:</span>
+  <span class="k">store</span> <span class="k">volatile</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@g</span>        <span class="c">; This time, the instruction always depends</span>
+                                       <span class="c">; on the store in %end. Also, it is</span>
+                                       <span class="c">; control-equivalent to %end, so this is</span>
+                                       <span class="c">; well-defined (ignoring earlier undefined</span>
+                                       <span class="c">; behavior in this example).</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="addresses-of-basic-blocks">
+<span id="blockaddress"></span><h3><a class="toc-backref" href="#id602">Addresses of Basic Blocks</a><a class="headerlink" href="#addresses-of-basic-blocks" title="Permalink to this headline">¶</a></h3>
+<p><tt class="docutils literal"><span class="pre">blockaddress(@function,</span> <span class="pre">%block)</span></tt></p>
+<p>The ‘<tt class="docutils literal"><span class="pre">blockaddress</span></tt>‘ constant computes the address of the specified
+basic block in the specified function, and always has an <tt class="docutils literal"><span class="pre">i8*</span></tt> 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 class="reference internal" href="#i-indirectbr"><em>indirectbr</em></a>‘ instruction, or for comparisons
+against null. Pointer equality tests between labels addresses results in
+undefined behavior — 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 class="docutils literal"><span class="pre">ptrtoint</span></tt> and arithmetic to be performed on these values so
+long as the original value is reconstituted before the <tt class="docutils literal"><span class="pre">indirectbr</span></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>
+<div class="section" id="constant-expressions">
+<span id="constantexprs"></span><h3><a class="toc-backref" href="#id603">Constant Expressions</a><a class="headerlink" href="#constant-expressions" title="Permalink to this headline">¶</a></h3>
+<p>Constant expressions are used to allow expressions involving other
+constants to be used as constants. Constant expressions may be of any
+<a class="reference internal" href="#t-firstclass"><em>first class</em></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 class="docutils">
+<dt><tt class="docutils literal"><span class="pre">trunc</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">zext</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">sext</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">fptrunc</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">fpext</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">fptoui</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">fptosi</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">uitofp</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">sitofp</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></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><tt class="docutils literal"><span class="pre">ptrtoint</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></dt>
+<dd>Convert a pointer typed constant to the corresponding integer
+constant. <tt class="docutils literal"><span class="pre">TYPE</span></tt> must be an integer type. <tt class="docutils literal"><span class="pre">CST</span></tt> must be of
+pointer type. The <tt class="docutils literal"><span class="pre">CST</span></tt> value is zero extended, truncated, or
+unchanged to make it fit in <tt class="docutils literal"><span class="pre">TYPE</span></tt>.</dd>
+<dt><tt class="docutils literal"><span class="pre">inttoptr</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></dt>
+<dd>Convert an 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 <em>really</em> dangerous!</dd>
+<dt><tt class="docutils literal"><span class="pre">bitcast</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></dt>
+<dd>Convert a constant, CST, to another TYPE. The constraints of the
+operands are the same as those for the <a class="reference internal" href="#i-bitcast"><em>bitcast
+instruction</em></a>.</dd>
+<dt><tt class="docutils literal"><span class="pre">addrspacecast</span> <span class="pre">(CST</span> <span class="pre">to</span> <span class="pre">TYPE)</span></tt></dt>
+<dd>Convert a constant pointer or constant vector of pointer, CST, to another
+TYPE in a different address space. The constraints of the operands are the
+same as those for the <a class="reference internal" href="#i-addrspacecast"><em>addrspacecast instruction</em></a>.</dd>
+<dt><tt class="docutils literal"><span class="pre">getelementptr</span> <span class="pre">(CSTPTR,</span> <span class="pre">IDX0,</span> <span class="pre">IDX1,</span> <span class="pre">...)</span></tt>, <tt class="docutils literal"><span class="pre">getelementptr</span> <span class="pre">inbounds</span> <span class="pre">(CSTPTR,</span> <span class="pre">IDX0,</span> <span class="pre">IDX1,</span> <span class="pre">...)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-getelementptr"><em>getelementptr operation</em></a> on
+constants. As with the <a class="reference internal" href="#i-getelementptr"><em>getelementptr</em></a>
+instruction, the index list may have zero or more indexes, which are
+required to make sense for the type of “CSTPTR”.</dd>
+<dt><tt class="docutils literal"><span class="pre">select</span> <span class="pre">(COND,</span> <span class="pre">VAL1,</span> <span class="pre">VAL2)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-select"><em>select operation</em></a> on constants.</dd>
+<dt><tt class="docutils literal"><span class="pre">icmp</span> <span class="pre">COND</span> <span class="pre">(VAL1,</span> <span class="pre">VAL2)</span></tt></dt>
+<dd>Performs the <a class="reference internal" href="#i-icmp"><em>icmp operation</em></a> on constants.</dd>
+<dt><tt class="docutils literal"><span class="pre">fcmp</span> <span class="pre">COND</span> <span class="pre">(VAL1,</span> <span class="pre">VAL2)</span></tt></dt>
+<dd>Performs the <a class="reference internal" href="#i-fcmp"><em>fcmp operation</em></a> on constants.</dd>
+<dt><tt class="docutils literal"><span class="pre">extractelement</span> <span class="pre">(VAL,</span> <span class="pre">IDX)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-extractelement"><em>extractelement operation</em></a> on
+constants.</dd>
+<dt><tt class="docutils literal"><span class="pre">insertelement</span> <span class="pre">(VAL,</span> <span class="pre">ELT,</span> <span class="pre">IDX)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-insertelement"><em>insertelement operation</em></a> on
+constants.</dd>
+<dt><tt class="docutils literal"><span class="pre">shufflevector</span> <span class="pre">(VEC1,</span> <span class="pre">VEC2,</span> <span class="pre">IDXMASK)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-shufflevector"><em>shufflevector operation</em></a> on
+constants.</dd>
+<dt><tt class="docutils literal"><span class="pre">extractvalue</span> <span class="pre">(VAL,</span> <span class="pre">IDX0,</span> <span class="pre">IDX1,</span> <span class="pre">...)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-extractvalue"><em>extractvalue operation</em></a> on
+constants. The index list is interpreted in a similar manner as
+indices in a ‘<a class="reference internal" href="#i-getelementptr"><em>getelementptr</em></a>‘ operation. At
+least one index value must be specified.</dd>
+<dt><tt class="docutils literal"><span class="pre">insertvalue</span> <span class="pre">(VAL,</span> <span class="pre">ELT,</span> <span class="pre">IDX0,</span> <span class="pre">IDX1,</span> <span class="pre">...)</span></tt></dt>
+<dd>Perform the <a class="reference internal" href="#i-insertvalue"><em>insertvalue operation</em></a> on constants.
+The index list is interpreted in a similar manner as indices in a
+‘<a class="reference internal" href="#i-getelementptr"><em>getelementptr</em></a>‘ operation. At least one index
+value must be specified.</dd>
+<dt><tt class="docutils literal"><span class="pre">OPCODE</span> <span class="pre">(LHS,</span> <span class="pre">RHS)</span></tt></dt>
+<dd>Perform the specified operation of the LHS and RHS constants. OPCODE
+may be any of the <a class="reference internal" href="#binaryops"><em>binary</em></a> or <a class="reference internal" href="#bitwiseops"><em>bitwise
+binary</em></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>
+<div class="section" id="other-values">
+<h2><a class="toc-backref" href="#id604">Other Values</a><a class="headerlink" href="#other-values" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="inline-assembler-expressions">
+<span id="inlineasmexprs"></span><h3><a class="toc-backref" href="#id605">Inline Assembler Expressions</a><a class="headerlink" href="#inline-assembler-expressions" title="Permalink to this headline">¶</a></h3>
+<p>LLVM supports inline assembler expressions (as opposed to <a class="reference internal" href="#moduleasm"><em>Module-Level
+Inline Assembly</em></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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">i32</span> <span class="p">(</span><span class="k">i32</span><span class="p">)</span> <span class="k">asm</span> <span class="s">"bswap $0"</span><span class="p">,</span> <span class="s">"=r,r"</span>
+</pre></div>
+</div>
+<p>Inline assembler expressions may <strong>only</strong> be used as the callee operand
+of a <a class="reference internal" href="#i-call"><em>call</em></a> or an <a class="reference internal" href="#i-invoke"><em>invoke</em></a> instruction.
+Thus, typically we have:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">call</span> <span class="k">i32</span> <span class="k">asm</span> <span class="s">"bswap $0"</span><span class="p">,</span> <span class="s">"=r,r"</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%Y</span><span class="p">)</span>
+</pre></div>
+</div>
+<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 class="docutils literal"><span class="pre">sideeffect</span></tt>‘ keyword, like so:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">call</span> <span class="kt">void</span> <span class="k">asm</span> <span class="k">sideeffect</span> <span class="s">"eieio"</span><span class="p">,</span> <span class="s">""</span><span class="p">()</span>
+</pre></div>
+</div>
+<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 class="docutils literal"><span class="pre">alignstack</span></tt>‘ keyword is present:</p>
+<div class="highlight-llvm"><pre>call void asm alignstack "eieio", ""()</pre>
+</div>
+<p>Inline asms also support using non-standard assembly dialects. The
+assumed dialect is ATT. When the ‘<tt class="docutils literal"><span class="pre">inteldialect</span></tt>‘ keyword is present,
+the inline asm is using the Intel dialect. Currently, ATT and Intel are
+the only supported dialects. An example is:</p>
+<div class="highlight-llvm"><pre>call void asm inteldialect "eieio", ""()</pre>
+</div>
+<p>If multiple keywords appear the ‘<tt class="docutils literal"><span class="pre">sideeffect</span></tt>‘ keyword must come
+first, the ‘<tt class="docutils literal"><span class="pre">alignstack</span></tt>‘ keyword second and the ‘<tt class="docutils literal"><span class="pre">inteldialect</span></tt>‘
+keyword last.</p>
+<div class="section" id="inline-asm-metadata">
+<h4><a class="toc-backref" href="#id606">Inline Asm Metadata</a><a class="headerlink" href="#inline-asm-metadata" title="Permalink to this headline">¶</a></h4>
+<p>The call instructions that wrap inline asm nodes may have a
+“<tt class="docutils literal"><span class="pre">!srcloc</span></tt>” 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 <tt class="docutils literal"><span class="pre">LLVMContext</span></tt>
+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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">call</span> <span class="kt">void</span> <span class="k">asm</span> <span class="k">sideeffect</span> <span class="s">"something bad"</span><span class="p">,</span> <span class="s">""</span><span class="p">(),</span> <span class="nv">!srcloc</span> <span class="nv-Anonymous">!42</span>
+<span class="p">...</span>
+<span class="nv-Anonymous">!42</span> <span class="p">=</span> <span class="p">!{</span> <span class="k">i32</span> <span class="m">1234567</span> <span class="p">}</span>
+</pre></div>
+</div>
+<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>
+<div class="section" id="metadata-nodes-and-metadata-strings">
+<span id="metadata"></span><h3><a class="toc-backref" href="#id607">Metadata Nodes and Metadata Strings</a><a class="headerlink" href="#metadata-nodes-and-metadata-strings" title="Permalink to this headline">¶</a></h3>
+<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 class="docutils literal"><span class="pre">metadata</span></tt> type and is identified in syntax by a
+preceding exclamation point (‘<tt class="docutils literal"><span class="pre">!</span></tt>‘).</p>
+<p>A metadata string is a string surrounded by double quotes. It can
+contain any character by escaping non-printable characters with
+“<tt class="docutils literal"><span class="pre">\xx</span></tt>” where “<tt class="docutils literal"><span class="pre">xx</span></tt>” is the two digit hex code. For example:
+“<tt class="docutils literal"><span class="pre">!"test\00"</span></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). Metadata nodes can have any values as
+their operand. For example:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"test\00"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">10</span><span class="p">}</span>
+</pre></div>
+</div>
+<p>A <a class="reference internal" href="#namedmetadatastructure"><em>named metadata</em></a> is a collection of
+metadata nodes, which can be looked up in the module symbol table. For
+example:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">!foo</span> <span class="p">=</span>  <span class="kt">metadata</span> <span class="p">!{</span><span class="nv-Anonymous">!4</span><span class="p">,</span> <span class="nv-Anonymous">!3</span><span class="p">}</span>
+</pre></div>
+</div>
+<p>Metadata can be used as function arguments. Here <tt class="docutils literal"><span class="pre">llvm.dbg.value</span></tt>
+function is using two metadata arguments:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">call</span> <span class="kt">void</span> <span class="vg">@llvm.dbg.value</span><span class="p">(</span><span class="kt">metadata</span> <span class="nv-Anonymous">!24</span><span class="p">,</span> <span class="k">i64</span> <span class="m">0</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!25</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Metadata can be attached with an instruction. Here metadata <tt class="docutils literal"><span class="pre">!21</span></tt> is
+attached to the <tt class="docutils literal"><span class="pre">add</span></tt> instruction using the <tt class="docutils literal"><span class="pre">!dbg</span></tt> identifier:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%indvar.next</span> <span class="p">=</span> <span class="k">add</span> <span class="k">i64</span> <span class="nv">%indvar</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="nv">!dbg</span> <span class="nv-Anonymous">!21</span>
+</pre></div>
+</div>
+<p>More information about specific metadata nodes recognized by the
+optimizers and code generator is found below.</p>
+<div class="section" id="tbaa-metadata">
+<h4><a class="toc-backref" href="#id608">‘<tt class="docutils literal"><span class="pre">tbaa</span></tt>‘ Metadata</a><a class="headerlink" href="#tbaa-metadata" title="Permalink to this headline">¶</a></h4>
+<p>In LLVM IR, memory does not have types, so LLVM’s own type system is not
+suitable for doing TBAA. Instead, metadata is added to the IR to
+describe a type system of a higher level language. This can be used to
+implement typical C/C++ TBAA, but it can also be used to implement
+custom alias analysis behavior for other languages.</p>
+<p>The current metadata format is very simple. TBAA metadata nodes have up
+to three fields, e.g.:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"an example type tree"</span> <span class="p">}</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"int"</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!0</span> <span class="p">}</span>
+<span class="nv-Anonymous">!2</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"float"</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!0</span> <span class="p">}</span>
+<span class="nv-Anonymous">!3</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"const float"</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!2</span><span class="p">,</span> <span class="k">i64</span> <span class="m">1</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>The first field is an identity field. It can be any value, usually a
+metadata string, which uniquely identifies the type. The most important
+name in the tree is the name of the root node. Two trees with different
+root node names are entirely disjoint, even if they have leaves with
+common names.</p>
+<p>The second field identifies the type’s parent node in the tree, or is
+null or omitted for a root node. A type is considered to alias all of
+its descendants and all of its ancestors in the tree. Also, a type is
+considered to alias all types in other trees, so that bitcode produced
+from multiple front-ends is handled conservatively.</p>
+<p>If the third field is present, it’s an integer which if equal to 1
+indicates that the type is “constant” (meaning
+<tt class="docutils literal"><span class="pre">pointsToConstantMemory</span></tt> should return true; see <a class="reference external" href="AliasAnalysis.html#OtherItfs">other useful
+AliasAnalysis methods</a>).</p>
+</div>
+<div class="section" id="tbaa-struct-metadata">
+<h4><a class="toc-backref" href="#id609">‘<tt class="docutils literal"><span class="pre">tbaa.struct</span></tt>‘ Metadata</a><a class="headerlink" href="#tbaa-struct-metadata" title="Permalink to this headline">¶</a></h4>
+<p>The <a class="reference internal" href="#int-memcpy"><em>llvm.memcpy</em></a> is often used to implement
+aggregate assignment operations in C and similar languages, however it
+is defined to copy a contiguous region of memory, which is more than
+strictly necessary for aggregate types which contain holes due to
+padding. Also, it doesn’t contain any TBAA information about the fields
+of the aggregate.</p>
+<p><tt class="docutils literal"><span class="pre">!tbaa.struct</span></tt> metadata can describe which memory subregions in a
+memcpy are padding and what the TBAA tags of the struct are.</p>
+<p>The current metadata format is very simple. <tt class="docutils literal"><span class="pre">!tbaa.struct</span></tt> metadata
+nodes are a list of operands which are in conceptual groups of three.
+For each group of three, the first operand gives the byte offset of a
+field in bytes, the second gives its size in bytes, and the third gives
+its tbaa tag. e.g.:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!4</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i64</span> <span class="m">0</span><span class="p">,</span> <span class="k">i64</span> <span class="m">4</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!1</span><span class="p">,</span> <span class="k">i64</span> <span class="m">8</span><span class="p">,</span> <span class="k">i64</span> <span class="m">4</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!2</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>This describes a struct with two fields. The first is at offset 0 bytes
+with size 4 bytes, and has tbaa tag !1. The second is at offset 8 bytes
+and has size 4 bytes and has tbaa tag !2.</p>
+<p>Note that the fields need not be contiguous. In this example, there is a
+4 byte gap between the two fields. This gap represents padding which
+does not carry useful data and need not be preserved.</p>
+</div>
+<div class="section" id="fpmath-metadata">
+<h4><a class="toc-backref" href="#id610">‘<tt class="docutils literal"><span class="pre">fpmath</span></tt>‘ Metadata</a><a class="headerlink" href="#fpmath-metadata" title="Permalink to this headline">¶</a></h4>
+<p><tt class="docutils literal"><span class="pre">fpmath</span></tt> metadata may be attached to any instruction of floating point
+type. It can be used to express the maximum acceptable error in the
+result of that instruction, in ULPs, thus potentially allowing the
+compiler to use a more efficient but less accurate method of computing
+it. ULP is defined as follows:</p>
+<blockquote>
+<div>If <tt class="docutils literal"><span class="pre">x</span></tt> is a real number that lies between two finite consecutive
+floating-point numbers <tt class="docutils literal"><span class="pre">a</span></tt> and <tt class="docutils literal"><span class="pre">b</span></tt>, without being equal to one
+of them, then <tt class="docutils literal"><span class="pre">ulp(x)</span> <span class="pre">=</span> <span class="pre">|b</span> <span class="pre">-</span> <span class="pre">a|</span></tt>, otherwise <tt class="docutils literal"><span class="pre">ulp(x)</span></tt> is the
+distance between the two non-equal finite floating-point numbers
+nearest <tt class="docutils literal"><span class="pre">x</span></tt>. Moreover, <tt class="docutils literal"><span class="pre">ulp(NaN)</span></tt> is <tt class="docutils literal"><span class="pre">NaN</span></tt>.</div></blockquote>
+<p>The metadata node shall consist of a single positive floating point
+number representing the maximum relative error, for example:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">float</span> <span class="m">2.5</span> <span class="p">}</span> <span class="c">; maximum acceptable inaccuracy is 2.5 ULPs</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="range-metadata">
+<h4><a class="toc-backref" href="#id611">‘<tt class="docutils literal"><span class="pre">range</span></tt>‘ Metadata</a><a class="headerlink" href="#range-metadata" title="Permalink to this headline">¶</a></h4>
+<p><tt class="docutils literal"><span class="pre">range</span></tt> metadata may be attached only to <tt class="docutils literal"><span class="pre">load</span></tt>, <tt class="docutils literal"><span class="pre">call</span></tt> and <tt class="docutils literal"><span class="pre">invoke</span></tt> of
+integer types. It expresses the possible ranges the loaded value or the value
+returned by the called function at this call site is in. The ranges are
+represented with a flattened list of integers. The loaded value or the value
+returned is known to be in the union of the ranges defined by each consecutive
+pair. Each pair has the following properties:</p>
+<ul class="simple">
+<li>The type must match the type loaded by the instruction.</li>
+<li>The pair <tt class="docutils literal"><span class="pre">a,b</span></tt> represents the range <tt class="docutils literal"><span class="pre">[a,b)</span></tt>.</li>
+<li>Both <tt class="docutils literal"><span class="pre">a</span></tt> and <tt class="docutils literal"><span class="pre">b</span></tt> are constants.</li>
+<li>The range is allowed to wrap.</li>
+<li>The range should not represent the full or empty set. That is,
+<tt class="docutils literal"><span class="pre">a!=b</span></tt>.</li>
+</ul>
+<p>In addition, the pairs must be in signed order of the lower bound and
+they must be non-contiguous.</p>
+<p>Examples:</p>
+<div class="highlight-llvm"><div class="highlight"><pre>  <span class="nv">%a</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i8</span><span class="p">*</span> <span class="nv">%x</span><span class="p">,</span> <span class="k">align</span> <span class="m">1</span><span class="p">,</span> <span class="nv">!range</span> <span class="nv-Anonymous">!0</span> <span class="c">; Can only be 0 or 1</span>
+  <span class="nv">%b</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i8</span><span class="p">*</span> <span class="nv">%y</span><span class="p">,</span> <span class="k">align</span> <span class="m">1</span><span class="p">,</span> <span class="nv">!range</span> <span class="nv-Anonymous">!1</span> <span class="c">; Can only be 255 (-1), 0 or 1</span>
+  <span class="nv">%c</span> <span class="p">=</span> <span class="k">call</span> <span class="k">i8</span> <span class="vg">@foo</span><span class="p">(),</span>       <span class="nv">!range</span> <span class="nv-Anonymous">!2</span> <span class="c">; Can only be 0, 1, 3, 4 or 5</span>
+  <span class="nv">%d</span> <span class="p">=</span> <span class="k">invoke</span> <span class="k">i8</span> <span class="vg">@bar</span><span class="p">()</span> <span class="k">to</span> <span class="kt">label</span> <span class="nv">%cont</span>
+         <span class="k">unwind</span> <span class="kt">label</span> <span class="nv">%lpad</span><span class="p">,</span> <span class="nv">!range</span> <span class="nv-Anonymous">!3</span> <span class="c">; Can only be -2, -1, 3, 4 or 5</span>
+<span class="p">...</span>
+<span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i8</span> <span class="m">0</span><span class="p">,</span> <span class="k">i8</span> <span class="m">2</span> <span class="p">}</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i8</span> <span class="m">255</span><span class="p">,</span> <span class="k">i8</span> <span class="m">2</span> <span class="p">}</span>
+<span class="nv-Anonymous">!2</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i8</span> <span class="m">0</span><span class="p">,</span> <span class="k">i8</span> <span class="m">2</span><span class="p">,</span> <span class="k">i8</span> <span class="m">3</span><span class="p">,</span> <span class="k">i8</span> <span class="m">6</span> <span class="p">}</span>
+<span class="nv-Anonymous">!3</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i8</span> <span class="m">-2</span><span class="p">,</span> <span class="k">i8</span> <span class="m">0</span><span class="p">,</span> <span class="k">i8</span> <span class="m">3</span><span class="p">,</span> <span class="k">i8</span> <span class="m">6</span> <span class="p">}</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="llvm-loop">
+<h4><a class="toc-backref" href="#id612">‘<tt class="docutils literal"><span class="pre">llvm.loop</span></tt>‘</a><a class="headerlink" href="#llvm-loop" title="Permalink to this headline">¶</a></h4>
+<p>It is sometimes useful to attach information to loop constructs. Currently,
+loop metadata is implemented as metadata attached to the branch instruction
+in the loop latch block. This type of metadata refer to a metadata node that is
+guaranteed to be separate for each loop. The loop identifier metadata is
+specified with the name <tt class="docutils literal"><span class="pre">llvm.loop</span></tt>.</p>
+<p>The loop identifier metadata is implemented using a metadata that refers to
+itself to avoid merging it with any other identifier metadata, e.g.,
+during module linkage or function inlining. That is, each loop should refer
+to their own identification metadata even if they reside in separate functions.
+The following example contains loop identifier metadata for two separate loop
+constructs:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!0</span> <span class="p">}</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!1</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>The loop identifier metadata can be used to specify additional
+per-loop metadata. Any operands after the first operand can be treated
+as user-defined metadata. For example the <tt class="docutils literal"><span class="pre">llvm.loop.interleave.count</span></tt>
+suggests an interleave factor to the loop interleaver:</p>
+<div class="highlight-llvm"><div class="highlight"><pre>  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%exitcond</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%._crit_edge</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%.lr.ph</span><span class="p">,</span> <span class="nv">!llvm.loop</span> <span class="nv-Anonymous">!0</span>
+<span class="p">...</span>
+<span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!0</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!1</span> <span class="p">}</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"llvm.loop.interleave.count"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">4</span> <span class="p">}</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="llvm-loop-vectorize-and-llvm-loop-interleave">
+<h4><a class="toc-backref" href="#id613">‘<tt class="docutils literal"><span class="pre">llvm.loop.vectorize</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">llvm.loop.interleave</span></tt>‘</a><a class="headerlink" href="#llvm-loop-vectorize-and-llvm-loop-interleave" title="Permalink to this headline">¶</a></h4>
+<p>Metadata prefixed with <tt class="docutils literal"><span class="pre">llvm.loop.vectorize</span></tt> or <tt class="docutils literal"><span class="pre">llvm.loop.interleave</span></tt> are
+used to control per-loop vectorization and interleaving parameters such as
+vectorization width and interleave count.  These metadata should be used in
+conjunction with <tt class="docutils literal"><span class="pre">llvm.loop</span></tt> loop identification metadata.  The
+<tt class="docutils literal"><span class="pre">llvm.loop.vectorize</span></tt> and <tt class="docutils literal"><span class="pre">llvm.loop.interleave</span></tt> metadata are only
+optimization hints and the optimizer will only interleave and vectorize loops if
+it believes it is safe to do so.  The <tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt> metadata
+which contains information about loop-carried memory dependencies can be helpful
+in determining the safety of these transformations.</p>
+</div>
+<div class="section" id="llvm-loop-interleave-count-metadata">
+<h4><a class="toc-backref" href="#id614">‘<tt class="docutils literal"><span class="pre">llvm.loop.interleave.count</span></tt>‘ Metadata</a><a class="headerlink" href="#llvm-loop-interleave-count-metadata" title="Permalink to this headline">¶</a></h4>
+<p>This metadata suggests an interleave count to the loop interleaver.
+The first operand is the string <tt class="docutils literal"><span class="pre">llvm.loop.interleave.count</span></tt> and the
+second operand is an integer specifying the interleave count. For
+example:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"llvm.loop.interleave.count"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">4</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>Note that setting <tt class="docutils literal"><span class="pre">llvm.loop.interleave.count</span></tt> to 1 disables interleaving
+multiple iterations of the loop.  If <tt class="docutils literal"><span class="pre">llvm.loop.interleave.count</span></tt> is set to 0
+then the interleave count will be determined automatically.</p>
+</div>
+<div class="section" id="llvm-loop-vectorize-enable-metadata">
+<h4><a class="toc-backref" href="#id615">‘<tt class="docutils literal"><span class="pre">llvm.loop.vectorize.enable</span></tt>‘ Metadata</a><a class="headerlink" href="#llvm-loop-vectorize-enable-metadata" title="Permalink to this headline">¶</a></h4>
+<p>This metadata selectively enables or disables vectorization for the loop. The
+first operand is the string <tt class="docutils literal"><span class="pre">llvm.loop.vectorize.enable</span></tt> and the second operand
+is a bit.  If the bit operand value is 1 vectorization is enabled. A value of
+0 disables vectorization:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"llvm.loop.vectorize.enable"</span><span class="p">,</span> <span class="k">i1</span> <span class="m">0</span> <span class="p">}</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"llvm.loop.vectorize.enable"</span><span class="p">,</span> <span class="k">i1</span> <span class="m">1</span> <span class="p">}</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="llvm-loop-vectorize-width-metadata">
+<h4><a class="toc-backref" href="#id616">‘<tt class="docutils literal"><span class="pre">llvm.loop.vectorize.width</span></tt>‘ Metadata</a><a class="headerlink" href="#llvm-loop-vectorize-width-metadata" title="Permalink to this headline">¶</a></h4>
+<p>This metadata sets the target width of the vectorizer. The first
+operand is the string <tt class="docutils literal"><span class="pre">llvm.loop.vectorize.width</span></tt> and the second
+operand is an integer specifying the width. For example:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv">!"llvm.loop.vectorize.width"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">4</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>Note that setting <tt class="docutils literal"><span class="pre">llvm.loop.vectorize.width</span></tt> to 1 disables
+vectorization of the loop.  If <tt class="docutils literal"><span class="pre">llvm.loop.vectorize.width</span></tt> is set to
+0 or if the loop does not have this metadata the width will be
+determined automatically.</p>
+</div>
+<div class="section" id="llvm-mem">
+<h4><a class="toc-backref" href="#id617">‘<tt class="docutils literal"><span class="pre">llvm.mem</span></tt>‘</a><a class="headerlink" href="#llvm-mem" title="Permalink to this headline">¶</a></h4>
+<p>Metadata types used to annotate memory accesses with information helpful
+for optimizations are prefixed with <tt class="docutils literal"><span class="pre">llvm.mem</span></tt>.</p>
+</div>
+<div class="section" id="llvm-mem-parallel-loop-access-metadata">
+<h4><a class="toc-backref" href="#id618">‘<tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt>‘ Metadata</a><a class="headerlink" href="#llvm-mem-parallel-loop-access-metadata" title="Permalink to this headline">¶</a></h4>
+<p>The <tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt> metadata refers to a loop identifier,
+or metadata containing a list of loop identifiers for nested loops.
+The metadata is attached to memory accessing instructions and denotes that
+no loop carried memory dependence exist between it and other instructions denoted
+with the same loop identifier.</p>
+<p>Precisely, given two instructions <tt class="docutils literal"><span class="pre">m1</span></tt> and <tt class="docutils literal"><span class="pre">m2</span></tt> that both have the
+<tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt> metadata, with <tt class="docutils literal"><span class="pre">L1</span></tt> and <tt class="docutils literal"><span class="pre">L2</span></tt> being the
+set of loops associated with that metadata, respectively, then there is no loop
+carried dependence between <tt class="docutils literal"><span class="pre">m1</span></tt> and <tt class="docutils literal"><span class="pre">m2</span></tt> for loops in both <tt class="docutils literal"><span class="pre">L1</span></tt> and
+<tt class="docutils literal"><span class="pre">L2</span></tt>.</p>
+<p>As a special case, if all memory accessing instructions in a loop have
+<tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt> metadata that refers to that loop, then the
+loop has no loop carried memory dependences and is considered to be a parallel
+loop.</p>
+<p>Note that if not all memory access instructions have such metadata referring to
+the loop, then the loop is considered not being trivially parallel. Additional
+memory dependence analysis is required to make that determination.  As a fail
+safe mechanism, this causes loops that were originally parallel to be considered
+sequential (if optimization passes that are unaware of the parallel semantics
+insert new memory instructions into the loop body).</p>
+<p>Example of a loop that is considered parallel due to its correct use of
+both <tt class="docutils literal"><span class="pre">llvm.loop</span></tt> and <tt class="docutils literal"><span class="pre">llvm.mem.parallel_loop_access</span></tt>
+metadata types that refer to the same loop identifier metadata.</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nl">for.body:</span>
+  <span class="p">...</span>
+  <span class="nv">%val0</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%arrayidx</span><span class="p">,</span> <span class="nv">!llvm.mem.parallel_loop_access</span> <span class="nv-Anonymous">!0</span>
+  <span class="p">...</span>
+  <span class="k">store</span> <span class="k">i32</span> <span class="nv">%val0</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%arrayidx1</span><span class="p">,</span> <span class="nv">!llvm.mem.parallel_loop_access</span> <span class="nv-Anonymous">!0</span>
+  <span class="p">...</span>
+  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%exitcond</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%for.end</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%for.body</span><span class="p">,</span> <span class="nv">!llvm.loop</span> <span class="nv-Anonymous">!0</span>
+
+<span class="nl">for.end:</span>
+<span class="p">...</span>
+<span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!0</span> <span class="p">}</span>
+</pre></div>
+</div>
+<p>It is also possible to have nested parallel loops. In that case the
+memory accesses refer to a list of loop identifier metadata nodes instead of
+the loop identifier metadata node directly:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nl">outer.for.body:</span>
+  <span class="p">...</span>
+  <span class="nv">%val1</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%arrayidx3</span><span class="p">,</span> <span class="nv">!llvm.mem.parallel_loop_access</span> <span class="nv-Anonymous">!2</span>
+  <span class="p">...</span>
+  <span class="k">br</span> <span class="kt">label</span> <span class="nv">%inner.for.body</span>
+
+<span class="nl">inner.for.body:</span>
+  <span class="p">...</span>
+  <span class="nv">%val0</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%arrayidx1</span><span class="p">,</span> <span class="nv">!llvm.mem.parallel_loop_access</span> <span class="nv-Anonymous">!0</span>
+  <span class="p">...</span>
+  <span class="k">store</span> <span class="k">i32</span> <span class="nv">%val0</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%arrayidx2</span><span class="p">,</span> <span class="nv">!llvm.mem.parallel_loop_access</span> <span class="nv-Anonymous">!0</span>
+  <span class="p">...</span>
+  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%exitcond</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%inner.for.end</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%inner.for.body</span><span class="p">,</span> <span class="nv">!llvm.loop</span> <span class="nv-Anonymous">!1</span>
+
+<span class="nl">inner.for.end:</span>
+  <span class="p">...</span>
+  <span class="k">store</span> <span class="k">i32</span> <span class="nv">%val1</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%arrayidx4</span><span class="p">,</span> <span class="nv">!llvm.mem.parallel_loop_access</span> <span class="nv-Anonymous">!2</span>
+  <span class="p">...</span>
+  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%exitcond</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%outer.for.end</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%outer.for.body</span><span class="p">,</span> <span class="nv">!llvm.loop</span> <span class="nv-Anonymous">!2</span>
+
+<span class="nl">outer.for.end:</span>                                          <span class="c">; preds = %for.body</span>
+<span class="p">...</span>
+<span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!1</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!2</span> <span class="p">}</span> <span class="c">; a list of loop identifiers</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!1</span> <span class="p">}</span> <span class="c">; an identifier for the inner loop</span>
+<span class="nv-Anonymous">!2</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="kt">metadata</span> <span class="nv-Anonymous">!2</span> <span class="p">}</span> <span class="c">; an identifier for the outer loop</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="module-flags-metadata">
+<h2><a class="toc-backref" href="#id619">Module Flags Metadata</a><a class="headerlink" href="#module-flags-metadata" title="Permalink to this headline">¶</a></h2>
+<p>Information about the module as a whole is difficult to convey to LLVM’s
+subsystems. The LLVM IR isn’t sufficient to transmit this information.
+The <tt class="docutils literal"><span class="pre">llvm.module.flags</span></tt> named metadata exists in order to facilitate
+this. These flags are in the form of key / value pairs — much like a
+dictionary — making it easy for any subsystem who cares about a flag to
+look it up.</p>
+<p>The <tt class="docutils literal"><span class="pre">llvm.module.flags</span></tt> metadata contains a list of metadata triplets.
+Each triplet has the following form:</p>
+<ul class="simple">
+<li>The first element is a <em>behavior</em> flag, which specifies the behavior
+when two (or more) modules are merged together, and it encounters two
+(or more) metadata with the same ID. The supported behaviors are
+described below.</li>
+<li>The second element is a metadata string that is a unique ID for the
+metadata. Each module may only have one flag entry for each unique ID (not
+including entries with the <strong>Require</strong> behavior).</li>
+<li>The third element is the value of the flag.</li>
+</ul>
+<p>When two (or more) modules are merged together, the resulting
+<tt class="docutils literal"><span class="pre">llvm.module.flags</span></tt> metadata is the union of the modules’ flags. That is, for
+each unique metadata ID string, there will be exactly one entry in the merged
+modules <tt class="docutils literal"><span class="pre">llvm.module.flags</span></tt> metadata table, and the value for that entry will
+be determined by the merge behavior flag, as described below. The only exception
+is that entries with the <em>Require</em> behavior are always preserved.</p>
+<p>The following behaviors are supported:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="10%" />
+<col width="90%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Value</th>
+<th class="head">Behavior</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>1</td>
+<td><dl class="first last docutils">
+<dt><strong>Error</strong></dt>
+<dd>Emits an error if two values disagree, otherwise the resulting value
+is that of the operands.</dd>
+</dl>
+</td>
+</tr>
+<tr class="row-odd"><td>2</td>
+<td><dl class="first last docutils">
+<dt><strong>Warning</strong></dt>
+<dd>Emits a warning if two values disagree. The result value will be the
+operand for the flag from the first module being linked.</dd>
+</dl>
+</td>
+</tr>
+<tr class="row-even"><td>3</td>
+<td><dl class="first last docutils">
+<dt><strong>Require</strong></dt>
+<dd>Adds a requirement that another module flag be present and have a
+specified value after linking is performed. The value must be a
+metadata pair, where the first element of the pair is the ID of the
+module flag to be restricted, and the second element of the pair is
+the value the module flag should be restricted to. This behavior can
+be used to restrict the allowable results (via triggering of an
+error) of linking IDs with the <strong>Override</strong> behavior.</dd>
+</dl>
+</td>
+</tr>
+<tr class="row-odd"><td>4</td>
+<td><dl class="first last docutils">
+<dt><strong>Override</strong></dt>
+<dd>Uses the specified value, regardless of the behavior or value of the
+other module. If both modules specify <strong>Override</strong>, but the values
+differ, an error will be emitted.</dd>
+</dl>
+</td>
+</tr>
+<tr class="row-even"><td>5</td>
+<td><dl class="first last docutils">
+<dt><strong>Append</strong></dt>
+<dd>Appends the two values, which are required to be metadata nodes.</dd>
+</dl>
+</td>
+</tr>
+<tr class="row-odd"><td>6</td>
+<td><dl class="first last docutils">
+<dt><strong>AppendUnique</strong></dt>
+<dd>Appends the two values, which are required to be metadata
+nodes. However, duplicate entries in the second list are dropped
+during the append operation.</dd>
+</dl>
+</td>
+</tr>
+</tbody>
+</table>
+<p>It is an error for a particular unique flag ID to have multiple behaviors,
+except in the case of <strong>Require</strong> (which adds restrictions on another metadata
+value) or <strong>Override</strong>.</p>
+<p>An example of module flags:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">!0</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i32</span> <span class="m">1</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv">!"foo"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span> <span class="p">}</span>
+<span class="nv-Anonymous">!1</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i32</span> <span class="m">4</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv">!"bar"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">37</span> <span class="p">}</span>
+<span class="nv-Anonymous">!2</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i32</span> <span class="m">2</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv">!"qux"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">42</span> <span class="p">}</span>
+<span class="nv-Anonymous">!3</span> <span class="p">=</span> <span class="kt">metadata</span> <span class="p">!{</span> <span class="k">i32</span> <span class="m">3</span><span class="p">,</span> <span class="kt">metadata</span> <span class="nv">!"qux"</span><span class="p">,</span>
+  <span class="kt">metadata</span> <span class="p">!{</span>
+    <span class="kt">metadata</span> <span class="nv">!"foo"</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span>
+  <span class="p">}</span>
+<span class="p">}</span>
+<span class="nv">!llvm.module.flags</span> <span class="p">=</span> <span class="p">!{</span> <span class="nv-Anonymous">!0</span><span class="p">,</span> <span class="nv-Anonymous">!1</span><span class="p">,</span> <span class="nv-Anonymous">!2</span><span class="p">,</span> <span class="nv-Anonymous">!3</span> <span class="p">}</span>
+</pre></div>
+</div>
+<ul>
+<li><p class="first">Metadata <tt class="docutils literal"><span class="pre">!0</span></tt> has the ID <tt class="docutils literal"><span class="pre">!"foo"</span></tt> and the value ‘1’. The behavior
+if two or more <tt class="docutils literal"><span class="pre">!"foo"</span></tt> flags are seen is to emit an error if their
+values are not equal.</p>
+</li>
+<li><p class="first">Metadata <tt class="docutils literal"><span class="pre">!1</span></tt> has the ID <tt class="docutils literal"><span class="pre">!"bar"</span></tt> and the value ‘37’. The
+behavior if two or more <tt class="docutils literal"><span class="pre">!"bar"</span></tt> flags are seen is to use the value
+‘37’.</p>
+</li>
+<li><p class="first">Metadata <tt class="docutils literal"><span class="pre">!2</span></tt> has the ID <tt class="docutils literal"><span class="pre">!"qux"</span></tt> and the value ‘42’. The
+behavior if two or more <tt class="docutils literal"><span class="pre">!"qux"</span></tt> flags are seen is to emit a
+warning if their values are not equal.</p>
+</li>
+<li><p class="first">Metadata <tt class="docutils literal"><span class="pre">!3</span></tt> has the ID <tt class="docutils literal"><span class="pre">!"qux"</span></tt> and the value:</p>
+<div class="highlight-python"><pre>metadata !{ metadata !"foo", i32 1 }</pre>
+</div>
+<p>The behavior is to emit an error if the <tt class="docutils literal"><span class="pre">llvm.module.flags</span></tt> does not
+contain a flag with the ID <tt class="docutils literal"><span class="pre">!"foo"</span></tt> that has the value ‘1’ after linking is
+performed.</p>
+</li>
+</ul>
+<div class="section" id="objective-c-garbage-collection-module-flags-metadata">
+<h3><a class="toc-backref" href="#id620">Objective-C Garbage Collection Module Flags Metadata</a><a class="headerlink" href="#objective-c-garbage-collection-module-flags-metadata" title="Permalink to this headline">¶</a></h3>
+<p>On the Mach-O platform, Objective-C stores metadata about garbage
+collection in a special section called “image info”. The metadata
+consists of a version number and a bitmask specifying what types of
+garbage collection are supported (if any) by the file. If two or more
+modules are linked together their garbage collection metadata needs to
+be merged rather than appended together.</p>
+<p>The Objective-C garbage collection module flags metadata consists of the
+following key-value pairs:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="30%" />
+<col width="70%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Key</th>
+<th class="head">Value</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Version</span></tt></td>
+<td><strong>[Required]</strong> — The Objective-C ABI version. Valid values are 1 and 2.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Image</span> <span class="pre">Info</span> <span class="pre">Version</span></tt></td>
+<td><strong>[Required]</strong> — The version of the image info section. Currently
+always 0.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Image</span> <span class="pre">Info</span> <span class="pre">Section</span></tt></td>
+<td><strong>[Required]</strong> — The section to place the metadata. Valid values are
+<tt class="docutils literal"><span class="pre">"__OBJC,</span> <span class="pre">__image_info,</span> <span class="pre">regular"</span></tt> for Objective-C ABI version 1, and
+<tt class="docutils literal"><span class="pre">"__DATA,__objc_imageinfo,</span> <span class="pre">regular,</span> <span class="pre">no_dead_strip"</span></tt> for
+Objective-C ABI version 2.</td>
+</tr>
+<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Garbage</span> <span class="pre">Collection</span></tt></td>
+<td><strong>[Required]</strong> — Specifies whether garbage collection is supported or
+not. Valid values are 0, for no garbage collection, and 2, for garbage
+collection supported.</td>
+</tr>
+<tr class="row-even"><td><tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">GC</span> <span class="pre">Only</span></tt></td>
+<td><strong>[Optional]</strong> — Specifies that only garbage collection is supported.
+If present, its value must be 6. This flag requires that the
+<tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Garbage</span> <span class="pre">Collection</span></tt> flag have the value 2.</td>
+</tr>
+</tbody>
+</table>
+<p>Some important flag interactions:</p>
+<ul class="simple">
+<li>If a module with <tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Garbage</span> <span class="pre">Collection</span></tt> set to 0 is
+merged with a module with <tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Garbage</span> <span class="pre">Collection</span></tt> set to
+2, then the resulting module has the
+<tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Garbage</span> <span class="pre">Collection</span></tt> flag set to 0.</li>
+<li>A module with <tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">Garbage</span> <span class="pre">Collection</span></tt> set to 0 cannot be
+merged with a module with <tt class="docutils literal"><span class="pre">Objective-C</span> <span class="pre">GC</span> <span class="pre">Only</span></tt> set to 6.</li>
+</ul>
+</div>
+<div class="section" id="automatic-linker-flags-module-flags-metadata">
+<h3><a class="toc-backref" href="#id621">Automatic Linker Flags Module Flags Metadata</a><a class="headerlink" href="#automatic-linker-flags-module-flags-metadata" title="Permalink to this headline">¶</a></h3>
+<p>Some targets support embedding flags to the linker inside individual object
+files. Typically this is used in conjunction with language extensions which
+allow source files to explicitly declare the libraries they depend on, and have
+these automatically be transmitted to the linker via object files.</p>
+<p>These flags are encoded in the IR using metadata in the module flags section,
+using the <tt class="docutils literal"><span class="pre">Linker</span> <span class="pre">Options</span></tt> key. The merge behavior for this flag is required
+to be <tt class="docutils literal"><span class="pre">AppendUnique</span></tt>, and the value for the key is expected to be a metadata
+node which should be a list of other metadata nodes, each of which should be a
+list of metadata strings defining linker options.</p>
+<p>For example, the following metadata section specifies two separate sets of
+linker options, presumably to link against <tt class="docutils literal"><span class="pre">libz</span></tt> and the <tt class="docutils literal"><span class="pre">Cocoa</span></tt>
+framework:</p>
+<div class="highlight-python"><pre>!0 = metadata !{ i32 6, metadata !"Linker Options",
+   metadata !{
+      metadata !{ metadata !"-lz" },
+      metadata !{ metadata !"-framework", metadata !"Cocoa" } } }
+!llvm.module.flags = !{ !0 }</pre>
+</div>
+<p>The metadata encoding as lists of lists of options, as opposed to a collapsed
+list of options, is chosen so that the IR encoding can use multiple option
+strings to specify e.g., a single library, while still having that specifier be
+preserved as an atomic element that can be recognized by a target specific
+assembly writer or object file emitter.</p>
+<p>Each individual option is required to be either a valid option for the target’s
+linker, or an option that is reserved by the target specific assembly writer or
+object file emitter. No other aspect of these options is defined by the IR.</p>
+</div>
+<div class="section" id="c-type-width-module-flags-metadata">
+<h3><a class="toc-backref" href="#id622">C type width Module Flags Metadata</a><a class="headerlink" href="#c-type-width-module-flags-metadata" title="Permalink to this headline">¶</a></h3>
+<p>The ARM backend emits a section into each generated object file describing the
+options that it was compiled with (in a compiler-independent way) to prevent
+linking incompatible objects, and to allow automatic library selection. Some
+of these options are not visible at the IR level, namely wchar_t width and enum
+width.</p>
+<p>To pass this information to the backend, these options are encoded in module
+flags metadata, using the following key-value pairs:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="30%" />
+<col width="70%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Key</th>
+<th class="head">Value</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>short_wchar</td>
+<td><ul class="first last simple">
+<li>0 — sizeof(wchar_t) == 4</li>
+<li>1 — sizeof(wchar_t) == 2</li>
+</ul>
+</td>
+</tr>
+<tr class="row-odd"><td>short_enum</td>
+<td><ul class="first last simple">
+<li>0 — Enums are at least as large as an <tt class="docutils literal"><span class="pre">int</span></tt>.</li>
+<li>1 — Enums are stored in the smallest integer type which can
+represent all of its values.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+<p>For example, the following metadata section specifies that the module was
+compiled with a <tt class="docutils literal"><span class="pre">wchar_t</span></tt> width of 4 bytes, and the underlying type of an
+enum is the smallest type which can represent all of its values:</p>
+<div class="highlight-python"><pre>!llvm.module.flags = !{!0, !1}
+!0 = metadata !{i32 1, metadata !"short_wchar", i32 1}
+!1 = metadata !{i32 1, metadata !"short_enum", i32 0}</pre>
+</div>
+</div>
+</div>
+<div class="section" id="intrinsic-global-variables">
+<span id="intrinsicglobalvariables"></span><h2><a class="toc-backref" href="#id623">Intrinsic Global Variables</a><a class="headerlink" href="#intrinsic-global-variables" title="Permalink to this headline">¶</a></h2>
+<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 class="docutils literal"><span class="pre">llvm.metadata</span></tt>”. This section and all globals that start with
+“<tt class="docutils literal"><span class="pre">llvm.</span></tt>” are reserved for use by LLVM.</p>
+<div class="section" id="the-llvm-used-global-variable">
+<span id="gv-llvmused"></span><h3><a class="toc-backref" href="#id624">The ‘<tt class="docutils literal"><span class="pre">llvm.used</span></tt>‘ Global Variable</a><a class="headerlink" href="#the-llvm-used-global-variable" title="Permalink to this headline">¶</a></h3>
+<p>The <tt class="docutils literal"><span class="pre">@llvm.used</span></tt> global is an array which has
+<a class="reference internal" href="#linkage-appending"><em>appending linkage</em></a>. This array contains a list of
+pointers to named global variables, functions and aliases which may optionally
+have a pointer cast formed of bitcast or getelementptr. For example, a legal
+use of it is:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="vg">@X</span> <span class="p">=</span> <span class="k">global</span> <span class="k">i8</span> <span class="m">4</span>
+<span class="vg">@Y</span> <span class="p">=</span> <span class="k">global</span> <span class="k">i32</span> <span class="m">123</span>
+
+<span class="vg">@llvm.used</span> <span class="p">=</span> <span class="k">appending</span> <span class="k">global</span> <span class="p">[</span><span class="m">2</span> <span class="k">x</span> <span class="k">i8</span><span class="p">*]</span> <span class="p">[</span>
+   <span class="k">i8</span><span class="p">*</span> <span class="vg">@X</span><span class="p">,</span>
+   <span class="k">i8</span><span class="p">*</span> <span class="k">bitcast</span> <span class="p">(</span><span class="k">i32</span><span class="p">*</span> <span class="vg">@Y</span> <span class="k">to</span> <span class="k">i8</span><span class="p">*)</span>
+<span class="p">],</span> <span class="k">section</span> <span class="s">"llvm.metadata"</span>
+</pre></div>
+</div>
+<p>If a symbol appears in the <tt class="docutils literal"><span class="pre">@llvm.used</span></tt> list, then the compiler, assembler,
+and linker are required to treat the symbol as if there is a reference to the
+symbol that it cannot see (which is why they have to be named). For example, if
+a variable has internal linkage and no references other than that from the
+<tt class="docutils literal"><span class="pre">@llvm.used</span></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 “<tt class="docutils literal"><span class="pre">attribute((used))</span></tt>” 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>
+<div class="section" id="the-llvm-compiler-used-global-variable">
+<span id="gv-llvmcompilerused"></span><h3><a class="toc-backref" href="#id625">The ‘<tt class="docutils literal"><span class="pre">llvm.compiler.used</span></tt>‘ Global Variable</a><a class="headerlink" href="#the-llvm-compiler-used-global-variable" title="Permalink to this headline">¶</a></h3>
+<p>The <tt class="docutils literal"><span class="pre">@llvm.compiler.used</span></tt> directive is the same as the <tt class="docutils literal"><span class="pre">@llvm.used</span></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 class="docutils literal"><span class="pre">@llvm.used</span></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>
+<div class="section" id="the-llvm-global-ctors-global-variable">
+<span id="gv-llvmglobalctors"></span><h3><a class="toc-backref" href="#id626">The ‘<tt class="docutils literal"><span class="pre">llvm.global_ctors</span></tt>‘ Global Variable</a><a class="headerlink" href="#the-llvm-global-ctors-global-variable" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">%0</span> <span class="p">=</span> <span class="k">type</span> <span class="p">{</span> <span class="k">i32</span><span class="p">,</span> <span class="kt">void</span> <span class="p">()*,</span> <span class="k">i8</span><span class="p">*</span> <span class="p">}</span>
+<span class="vg">@llvm.global_ctors</span> <span class="p">=</span> <span class="k">appending</span> <span class="k">global</span> <span class="p">[</span><span class="m">1</span> <span class="k">x</span> <span class="nv-Anonymous">%0</span><span class="p">]</span> <span class="p">[</span><span class="nv-Anonymous">%0</span> <span class="p">{</span> <span class="k">i32</span> <span class="m">65535</span><span class="p">,</span> <span class="kt">void</span> <span class="p">()*</span> <span class="vg">@ctor</span><span class="p">,</span> <span class="k">i8</span><span class="p">*</span> <span class="vg">@data</span> <span class="p">}]</span>
+</pre></div>
+</div>
+<p>The <tt class="docutils literal"><span class="pre">@llvm.global_ctors</span></tt> array contains a list of constructor
+functions, priorities, and an optional associated global or function.
+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>
+<p>If the third field is present, non-null, and points to a global variable
+or function, the initializer function will only run if the associated
+data from the current module is not discarded.</p>
+</div>
+<div class="section" id="the-llvm-global-dtors-global-variable">
+<span id="llvmglobaldtors"></span><h3><a class="toc-backref" href="#id627">The ‘<tt class="docutils literal"><span class="pre">llvm.global_dtors</span></tt>‘ Global Variable</a><a class="headerlink" href="#the-llvm-global-dtors-global-variable" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv-Anonymous">%0</span> <span class="p">=</span> <span class="k">type</span> <span class="p">{</span> <span class="k">i32</span><span class="p">,</span> <span class="kt">void</span> <span class="p">()*,</span> <span class="k">i8</span><span class="p">*</span> <span class="p">}</span>
+<span class="vg">@llvm.global_dtors</span> <span class="p">=</span> <span class="k">appending</span> <span class="k">global</span> <span class="p">[</span><span class="m">1</span> <span class="k">x</span> <span class="nv-Anonymous">%0</span><span class="p">]</span> <span class="p">[</span><span class="nv-Anonymous">%0</span> <span class="p">{</span> <span class="k">i32</span> <span class="m">65535</span><span class="p">,</span> <span class="kt">void</span> <span class="p">()*</span> <span class="vg">@dtor</span><span class="p">,</span> <span class="k">i8</span><span class="p">*</span> <span class="vg">@data</span> <span class="p">}]</span>
+</pre></div>
+</div>
+<p>The <tt class="docutils literal"><span class="pre">@llvm.global_dtors</span></tt> array contains a list of destructor
+functions, priorities, and an optional associated global or function.
+The functions referenced by this array will be called in descending
+order of priority (i.e. highest first) when the module is unloaded. The
+order of functions with the same priority is not defined.</p>
+<p>If the third field is present, non-null, and points to a global variable
+or function, the destructor function will only run if the associated
+data from the current module is not discarded.</p>
+</div>
+</div>
+<div class="section" id="instruction-reference">
+<h2><a class="toc-backref" href="#id628">Instruction Reference</a><a class="headerlink" href="#instruction-reference" title="Permalink to this headline">¶</a></h2>
+<p>The LLVM instruction set consists of several different classifications
+of instructions: <a class="reference internal" href="#terminators"><em>terminator instructions</em></a>, <a class="reference internal" href="#binaryops"><em>binary
+instructions</em></a>, <a class="reference internal" href="#bitwiseops"><em>bitwise binary
+instructions</em></a>, <a class="reference internal" href="#memoryops"><em>memory instructions</em></a>, and
+<a class="reference internal" href="#otherops"><em>other instructions</em></a>.</p>
+<div class="section" id="terminator-instructions">
+<span id="terminators"></span><h3><a class="toc-backref" href="#id629">Terminator Instructions</a><a class="headerlink" href="#terminator-instructions" title="Permalink to this headline">¶</a></h3>
+<p>As mentioned <a class="reference internal" href="#functionstructure"><em>previously</em></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 class="docutils literal"><span class="pre">void</span></tt>‘ value: they produce
+control flow, not values (the one exception being the
+‘<a class="reference internal" href="#i-invoke"><em>invoke</em></a>‘ instruction).</p>
+<p>The terminator instructions are: ‘<a class="reference internal" href="#i-ret"><em>ret</em></a>‘,
+‘<a class="reference internal" href="#i-br"><em>br</em></a>‘, ‘<a class="reference internal" href="#i-switch"><em>switch</em></a>‘,
+‘<a class="reference internal" href="#i-indirectbr"><em>indirectbr</em></a>‘, ‘<a class="reference internal" href="#i-invoke"><em>invoke</em></a>‘,
+‘<a class="reference internal" href="#i-resume"><em>resume</em></a>‘, and ‘<a class="reference internal" href="#i-unreachable"><em>unreachable</em></a>‘.</p>
+<div class="section" id="ret-instruction">
+<span id="i-ret"></span><h4><a class="toc-backref" href="#id630">‘<tt class="docutils literal"><span class="pre">ret</span></tt>‘ Instruction</a><a class="headerlink" href="#ret-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="syntax">
+<h5><a class="toc-backref" href="#id631">Syntax:</a><a class="headerlink" href="#syntax" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>ret <type> <value>       ; Return a value from a non-void function
+ret void                 ; Return from void function</pre>
+</div>
+</div>
+<div class="section" id="overview">
+<h5><a class="toc-backref" href="#id632">Overview:</a><a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">ret</span></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 class="docutils literal"><span class="pre">ret</span></tt>‘ instruction: one that returns a
+value and then causes control flow, and one that just causes control
+flow to occur.</p>
+</div>
+<div class="section" id="arguments">
+<h5><a class="toc-backref" href="#id633">Arguments:</a><a class="headerlink" href="#arguments" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">ret</span></tt>‘ instruction optionally accepts a single argument, the
+return value. The type of the return value must be a ‘<a class="reference internal" href="#t-firstclass"><em>first
+class</em></a>‘ type.</p>
+<p>A function is not <a class="reference internal" href="#wellformed"><em>well formed</em></a> if it it has a non-void
+return type and contains a ‘<tt class="docutils literal"><span class="pre">ret</span></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 class="docutils literal"><span class="pre">ret</span></tt>‘ instruction with a return
+value.</p>
+</div>
+<div class="section" id="semantics">
+<h5><a class="toc-backref" href="#id634">Semantics:</a><a class="headerlink" href="#semantics" title="Permalink to this headline">¶</a></h5>
+<p>When the ‘<tt class="docutils literal"><span class="pre">ret</span></tt>‘ instruction is executed, control flow returns back to
+the calling function’s context. If the caller is a
+“<a class="reference internal" href="#i-call"><em>call</em></a>” instruction, execution continues at the
+instruction after the call. If the caller was an
+“<a class="reference internal" href="#i-invoke"><em>invoke</em></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>
+</div>
+<div class="section" id="example">
+<h5><a class="toc-backref" href="#id635">Example:</a><a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">ret</span> <span class="k">i32</span> <span class="m">5</span>                       <span class="c">; Return an integer value of 5</span>
+<span class="k">ret</span> <span class="kt">void</span>                        <span class="c">; Return from a void function</span>
+<span class="k">ret</span> <span class="p">{</span> <span class="k">i32</span><span class="p">,</span> <span class="k">i8</span> <span class="p">}</span> <span class="p">{</span> <span class="k">i32</span> <span class="m">4</span><span class="p">,</span> <span class="k">i8</span> <span class="m">2</span> <span class="p">}</span> <span class="c">; Return a struct of values 4 and 2</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="br-instruction">
+<span id="i-br"></span><h4><a class="toc-backref" href="#id636">‘<tt class="docutils literal"><span class="pre">br</span></tt>‘ Instruction</a><a class="headerlink" href="#br-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id4">
+<h5><a class="toc-backref" href="#id637">Syntax:</a><a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>br i1 <cond>, label <iftrue>, label <iffalse>
+br label <dest>          ; Unconditional branch</pre>
+</div>
+</div>
+<div class="section" id="id5">
+<h5><a class="toc-backref" href="#id638">Overview:</a><a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">br</span></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>
+</div>
+<div class="section" id="id6">
+<h5><a class="toc-backref" href="#id639">Arguments:</a><a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h5>
+<p>The conditional branch form of the ‘<tt class="docutils literal"><span class="pre">br</span></tt>‘ instruction takes a single
+‘<tt class="docutils literal"><span class="pre">i1</span></tt>‘ value and two ‘<tt class="docutils literal"><span class="pre">label</span></tt>‘ values. The unconditional form of the
+‘<tt class="docutils literal"><span class="pre">br</span></tt>‘ instruction takes a single ‘<tt class="docutils literal"><span class="pre">label</span></tt>‘ value as a target.</p>
+</div>
+<div class="section" id="id7">
+<h5><a class="toc-backref" href="#id640">Semantics:</a><a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h5>
+<p>Upon execution of a conditional ‘<tt class="docutils literal"><span class="pre">br</span></tt>‘ instruction, the ‘<tt class="docutils literal"><span class="pre">i1</span></tt>‘
+argument is evaluated. If the value is <tt class="docutils literal"><span class="pre">true</span></tt>, control flows to the
+‘<tt class="docutils literal"><span class="pre">iftrue</span></tt>‘ <tt class="docutils literal"><span class="pre">label</span></tt> argument. If “cond” is <tt class="docutils literal"><span class="pre">false</span></tt>, control flows
+to the ‘<tt class="docutils literal"><span class="pre">iffalse</span></tt>‘ <tt class="docutils literal"><span class="pre">label</span></tt> argument.</p>
+</div>
+<div class="section" id="id8">
+<h5><a class="toc-backref" href="#id641">Example:</a><a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nl">Test:</span>
+  <span class="nv">%cond</span> <span class="p">=</span> <span class="k">icmp</span> <span class="k">eq</span> <span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="nv">%b</span>
+  <span class="k">br</span> <span class="k">i1</span> <span class="nv">%cond</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%IfEqual</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%IfUnequal</span>
+<span class="nl">IfEqual:</span>
+  <span class="k">ret</span> <span class="k">i32</span> <span class="m">1</span>
+<span class="nl">IfUnequal:</span>
+  <span class="k">ret</span> <span class="k">i32</span> <span class="m">0</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="switch-instruction">
+<span id="i-switch"></span><h4><a class="toc-backref" href="#id642">‘<tt class="docutils literal"><span class="pre">switch</span></tt>‘ Instruction</a><a class="headerlink" href="#switch-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id9">
+<h5><a class="toc-backref" href="#id643">Syntax:</a><a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>switch <intty> <value>, label <defaultdest> [ <intty> <val>, label <dest> ... ]</pre>
+</div>
+</div>
+<div class="section" id="id10">
+<h5><a class="toc-backref" href="#id644">Overview:</a><a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">switch</span></tt>‘ instruction is used to transfer control flow to one of
+several different places. It is a generalization of the ‘<tt class="docutils literal"><span class="pre">br</span></tt>‘
+instruction, allowing a branch to occur to one of many possible
+destinations.</p>
+</div>
+<div class="section" id="id11">
+<h5><a class="toc-backref" href="#id645">Arguments:</a><a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">switch</span></tt>‘ instruction uses three parameters: an integer
+comparison value ‘<tt class="docutils literal"><span class="pre">value</span></tt>‘, a default ‘<tt class="docutils literal"><span class="pre">label</span></tt>‘ destination, and an
+array of pairs of comparison value constants and ‘<tt class="docutils literal"><span class="pre">label</span></tt>‘s. The table
+is not allowed to contain duplicate constant entries.</p>
+</div>
+<div class="section" id="id12">
+<h5><a class="toc-backref" href="#id646">Semantics:</a><a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h5>
+<p>The <tt class="docutils literal"><span class="pre">switch</span></tt> instruction specifies a table of values and destinations.
+When the ‘<tt class="docutils literal"><span class="pre">switch</span></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>
+</div>
+<div class="section" id="implementation">
+<h5><a class="toc-backref" href="#id647">Implementation:</a><a class="headerlink" href="#implementation" title="Permalink to this headline">¶</a></h5>
+<p>Depending on properties of the target machine and the particular
+<tt class="docutils literal"><span class="pre">switch</span></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>
+</div>
+<div class="section" id="id13">
+<h5><a class="toc-backref" href="#id648">Example:</a><a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="c">; Emulate a conditional br instruction</span>
+<span class="nv">%Val</span> <span class="p">=</span> <span class="k">zext</span> <span class="k">i1</span> <span class="nv">%value</span> <span class="k">to</span> <span class="k">i32</span>
+<span class="k">switch</span> <span class="k">i32</span> <span class="nv">%Val</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%truedest</span> <span class="p">[</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%falsedest</span> <span class="p">]</span>
+
+<span class="c">; Emulate an unconditional br instruction</span>
+<span class="k">switch</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%dest</span> <span class="p">[</span> <span class="p">]</span>
+
+<span class="c">; Implement a jump table:</span>
+<span class="k">switch</span> <span class="k">i32</span> <span class="nv">%val</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%otherwise</span> <span class="p">[</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%onzero</span>
+                                    <span class="k">i32</span> <span class="m">1</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%onone</span>
+                                    <span class="k">i32</span> <span class="m">2</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%ontwo</span> <span class="p">]</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="indirectbr-instruction">
+<span id="i-indirectbr"></span><h4><a class="toc-backref" href="#id649">‘<tt class="docutils literal"><span class="pre">indirectbr</span></tt>‘ Instruction</a><a class="headerlink" href="#indirectbr-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id14">
+<h5><a class="toc-backref" href="#id650">Syntax:</a><a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>indirectbr <somety>* <address>, [ label <dest1>, label <dest2>, ... ]</pre>
+</div>
+</div>
+<div class="section" id="id15">
+<h5><a class="toc-backref" href="#id651">Overview:</a><a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">indirectbr</span></tt>‘ instruction implements an indirect branch to a
+label within the current function, whose address is specified by
+“<tt class="docutils literal"><span class="pre">address</span></tt>”. Address must be derived from a
+<a class="reference internal" href="#blockaddress"><em>blockaddress</em></a> constant.</p>
+</div>
+<div class="section" id="id16">
+<h5><a class="toc-backref" href="#id652">Arguments:</a><a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">address</span></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>
+</div>
+<div class="section" id="id17">
+<h5><a class="toc-backref" href="#id653">Semantics:</a><a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id18">
+<h5><a class="toc-backref" href="#id654">Implementation:</a><a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h5>
+<p>This is typically implemented with a jump through a register.</p>
+</div>
+<div class="section" id="id19">
+<h5><a class="toc-backref" href="#id655">Example:</a><a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>indirectbr i8* %Addr, [ label %bb1, label %bb2, label %bb3 ]</pre>
+</div>
+</div>
+</div>
+<div class="section" id="invoke-instruction">
+<span id="i-invoke"></span><h4><a class="toc-backref" href="#id656">‘<tt class="docutils literal"><span class="pre">invoke</span></tt>‘ Instruction</a><a class="headerlink" href="#invoke-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id20">
+<h5><a class="toc-backref" href="#id657">Syntax:</a><a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = invoke [cconv] [ret attrs] <ptr to function ty> <function ptr val>(<function args>) [fn attrs]
+              to label <normal label> unwind label <exception label></pre>
+</div>
+</div>
+<div class="section" id="id21">
+<h5><a class="toc-backref" href="#id658">Overview:</a><a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">invoke</span></tt>‘ instruction causes control to transfer to a specified
+function, with the possibility of control flow transfer to either the
+‘<tt class="docutils literal"><span class="pre">normal</span></tt>‘ label or the ‘<tt class="docutils literal"><span class="pre">exception</span></tt>‘ label. If the callee function
+returns with the “<tt class="docutils literal"><span class="pre">ret</span></tt>” instruction, control flow will return to the
+“normal” label. If the callee (or any indirect callees) returns via the
+“<a class="reference internal" href="#i-resume"><em>resume</em></a>” instruction or other exception handling
+mechanism, control is interrupted and continued at the dynamically
+nearest “exception” label.</p>
+<p>The ‘<tt class="docutils literal"><span class="pre">exception</span></tt>‘ label is a <a class="reference external" href="ExceptionHandling.html#overview">landing
+pad</a> for the exception. As such,
+‘<tt class="docutils literal"><span class="pre">exception</span></tt>‘ label is required to have the
+“<a class="reference internal" href="#i-landingpad"><em>landingpad</em></a>” instruction, which contains the
+information about the behavior of the program after unwinding happens,
+as its first non-PHI instruction. The restrictions on the
+“<tt class="docutils literal"><span class="pre">landingpad</span></tt>” instruction’s tightly couples it to the “<tt class="docutils literal"><span class="pre">invoke</span></tt>”
+instruction, so that the important information contained within the
+“<tt class="docutils literal"><span class="pre">landingpad</span></tt>” instruction can’t be lost through normal code motion.</p>
+</div>
+<div class="section" id="id22">
+<h5><a class="toc-backref" href="#id659">Arguments:</a><a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h5>
+<p>This instruction requires several arguments:</p>
+<ol class="arabic simple">
+<li>The optional “cconv” marker indicates which <a class="reference internal" href="#callingconv"><em>calling
+convention</em></a> the call should use. If none is
+specified, the call defaults to using C calling conventions.</li>
+<li>The optional <a class="reference internal" href="#paramattrs"><em>Parameter Attributes</em></a> list for return
+values. Only ‘<tt class="docutils literal"><span class="pre">zeroext</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">signext</span></tt>‘, and ‘<tt class="docutils literal"><span class="pre">inreg</span></tt>‘ attributes
+are valid here.</li>
+<li>‘<tt class="docutils literal"><span class="pre">ptr</span> <span class="pre">to</span> <span class="pre">function</span> <span class="pre">ty</span></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 class="docutils literal"><span class="pre">invoke</span></tt>‘s are just as possible,
+branching off an arbitrary pointer to function value.</li>
+<li>‘<tt class="docutils literal"><span class="pre">function</span> <span class="pre">ptr</span> <span class="pre">val</span></tt>‘: An LLVM value containing a pointer to a
+function to be invoked.</li>
+<li>‘<tt class="docutils literal"><span class="pre">function</span> <span class="pre">args</span></tt>‘: argument list whose types match the function
+signature argument types and parameter attributes. All arguments must
+be of <a class="reference internal" href="#t-firstclass"><em>first class</em></a> type. If the function signature
+indicates the function accepts a variable number of arguments, the
+extra arguments can be specified.</li>
+<li>‘<tt class="docutils literal"><span class="pre">normal</span> <span class="pre">label</span></tt>‘: the label reached when the called function
+executes a ‘<tt class="docutils literal"><span class="pre">ret</span></tt>‘ instruction.</li>
+<li>‘<tt class="docutils literal"><span class="pre">exception</span> <span class="pre">label</span></tt>‘: the label reached when a callee returns via
+the <a class="reference internal" href="#i-resume"><em>resume</em></a> instruction or other exception handling
+mechanism.</li>
+<li>The optional <a class="reference internal" href="#fnattrs"><em>function attributes</em></a> list. Only
+‘<tt class="docutils literal"><span class="pre">noreturn</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">nounwind</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">readonly</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">readnone</span></tt>‘
+attributes are valid here.</li>
+</ol>
+</div>
+<div class="section" id="id23">
+<h5><a class="toc-backref" href="#id660">Semantics:</a><a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h5>
+<p>This instruction is designed to operate as a standard ‘<tt class="docutils literal"><span class="pre">call</span></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 class="docutils literal"><span class="pre">longjmp</span></tt> or a
+thrown exception. Additionally, this is important for implementation of
+‘<tt class="docutils literal"><span class="pre">catch</span></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 class="docutils literal"><span class="pre">invoke</span></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>
+</div>
+<div class="section" id="id24">
+<h5><a class="toc-backref" href="#id661">Example:</a><a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%retval</span> <span class="p">=</span> <span class="k">invoke</span> <span class="k">i32</span> <span class="vg">@Test</span><span class="p">(</span><span class="k">i32</span> <span class="m">15</span><span class="p">)</span> <span class="k">to</span> <span class="kt">label</span> <span class="nv">%Continue</span>
+            <span class="k">unwind</span> <span class="kt">label</span> <span class="nv">%TestCleanup</span>              <span class="c">; i32:retval set</span>
+<span class="nv">%retval</span> <span class="p">=</span> <span class="k">invoke</span> <span class="k">coldcc</span> <span class="k">i32</span> <span class="nv">%Testfnptr</span><span class="p">(</span><span class="k">i32</span> <span class="m">15</span><span class="p">)</span> <span class="k">to</span> <span class="kt">label</span> <span class="nv">%Continue</span>
+            <span class="k">unwind</span> <span class="kt">label</span> <span class="nv">%TestCleanup</span>              <span class="c">; i32:retval set</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="resume-instruction">
+<span id="i-resume"></span><h4><a class="toc-backref" href="#id662">‘<tt class="docutils literal"><span class="pre">resume</span></tt>‘ Instruction</a><a class="headerlink" href="#resume-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id25">
+<h5><a class="toc-backref" href="#id663">Syntax:</a><a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>resume <type> <value></pre>
+</div>
+</div>
+<div class="section" id="id26">
+<h5><a class="toc-backref" href="#id664">Overview:</a><a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">resume</span></tt>‘ instruction is a terminator instruction that has no
+successors.</p>
+</div>
+<div class="section" id="id27">
+<h5><a class="toc-backref" href="#id665">Arguments:</a><a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">resume</span></tt>‘ instruction requires one argument, which must have the
+same type as the result of any ‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction in the same
+function.</p>
+</div>
+<div class="section" id="id28">
+<h5><a class="toc-backref" href="#id666">Semantics:</a><a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">resume</span></tt>‘ instruction resumes propagation of an existing
+(in-flight) exception whose unwinding was interrupted with a
+<a class="reference internal" href="#i-landingpad"><em>landingpad</em></a> instruction.</p>
+</div>
+<div class="section" id="id29">
+<h5><a class="toc-backref" href="#id667">Example:</a><a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>resume { i8*, i32 } %exn</pre>
+</div>
+</div>
+</div>
+<div class="section" id="unreachable-instruction">
+<span id="i-unreachable"></span><h4><a class="toc-backref" href="#id668">‘<tt class="docutils literal"><span class="pre">unreachable</span></tt>‘ Instruction</a><a class="headerlink" href="#unreachable-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id30">
+<h5><a class="toc-backref" href="#id669">Syntax:</a><a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><div class="highlight"><pre><span class="n">unreachable</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="id31">
+<h5><a class="toc-backref" href="#id670">Overview:</a><a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">unreachable</span></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>
+</div>
+<div class="section" id="id32">
+<h5><a class="toc-backref" href="#id671">Semantics:</a><a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">unreachable</span></tt>‘ instruction has no defined semantics.</p>
+</div>
+</div>
+</div>
+<div class="section" id="binary-operations">
+<span id="binaryops"></span><h3><a class="toc-backref" href="#id672">Binary Operations</a><a class="headerlink" href="#binary-operations" title="Permalink to this headline">¶</a></h3>
+<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 class="reference internal" href="#t-vector"><em>vector</em></a> data type. The
+result value has the same type as its operands.</p>
+<p>There are several different binary operators:</p>
+<div class="section" id="add-instruction">
+<span id="i-add"></span><h4><a class="toc-backref" href="#id673">‘<tt class="docutils literal"><span class="pre">add</span></tt>‘ Instruction</a><a class="headerlink" href="#add-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id33">
+<h5><a class="toc-backref" href="#id674">Syntax:</a><a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = add <ty> <op1>, <op2>          ; yields ty:result
+<result> = add nuw <ty> <op1>, <op2>      ; yields ty:result
+<result> = add nsw <ty> <op1>, <op2>      ; yields ty:result
+<result> = add nuw nsw <ty> <op1>, <op2>  ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id34">
+<h5><a class="toc-backref" href="#id675">Overview:</a><a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">add</span></tt>‘ instruction returns the sum of its two operands.</p>
+</div>
+<div class="section" id="id35">
+<h5><a class="toc-backref" href="#id676">Arguments:</a><a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">add</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id36">
+<h5><a class="toc-backref" href="#id677">Semantics:</a><a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">nuw</span></tt> and <tt class="docutils literal"><span class="pre">nsw</span></tt> stand for “No Unsigned Wrap” and “No Signed Wrap”,
+respectively. If the <tt class="docutils literal"><span class="pre">nuw</span></tt> and/or <tt class="docutils literal"><span class="pre">nsw</span></tt> keywords are present, the
+result value of the <tt class="docutils literal"><span class="pre">add</span></tt> is a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if
+unsigned and/or signed overflow, respectively, occurs.</p>
+</div>
+<div class="section" id="id37">
+<h5><a class="toc-backref" href="#id678">Example:</a><a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = add i32 4, %var          ; yields i32:result = 4 + %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="fadd-instruction">
+<span id="i-fadd"></span><h4><a class="toc-backref" href="#id679">‘<tt class="docutils literal"><span class="pre">fadd</span></tt>‘ Instruction</a><a class="headerlink" href="#fadd-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id38">
+<h5><a class="toc-backref" href="#id680">Syntax:</a><a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fadd [fast-math flags]* <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id39">
+<h5><a class="toc-backref" href="#id681">Overview:</a><a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fadd</span></tt>‘ instruction returns the sum of its two operands.</p>
+</div>
+<div class="section" id="id40">
+<h5><a class="toc-backref" href="#id682">Arguments:</a><a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">fadd</span></tt>‘ instruction must be <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of floating point values.
+Both arguments must have identical types.</p>
+</div>
+<div class="section" id="id41">
+<h5><a class="toc-backref" href="#id683">Semantics:</a><a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h5>
+<p>The value produced is the floating point sum of the two operands. This
+instruction can also take any number of <a class="reference internal" href="#fastmath"><em>fast-math flags</em></a>,
+which are optimization hints to enable otherwise unsafe floating point
+optimizations:</p>
+</div>
+<div class="section" id="id42">
+<h5><a class="toc-backref" href="#id684">Example:</a><a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = fadd float 4.0, %var          ; yields float:result = 4.0 + %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="sub-instruction">
+<h4><a class="toc-backref" href="#id685">‘<tt class="docutils literal"><span class="pre">sub</span></tt>‘ Instruction</a><a class="headerlink" href="#sub-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id43">
+<h5><a class="toc-backref" href="#id686">Syntax:</a><a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = sub <ty> <op1>, <op2>          ; yields ty:result
+<result> = sub nuw <ty> <op1>, <op2>      ; yields ty:result
+<result> = sub nsw <ty> <op1>, <op2>      ; yields ty:result
+<result> = sub nuw nsw <ty> <op1>, <op2>  ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id44">
+<h5><a class="toc-backref" href="#id687">Overview:</a><a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sub</span></tt>‘ instruction returns the difference of its two operands.</p>
+<p>Note that the ‘<tt class="docutils literal"><span class="pre">sub</span></tt>‘ instruction is used to represent the ‘<tt class="docutils literal"><span class="pre">neg</span></tt>‘
+instruction present in most other intermediate representations.</p>
+</div>
+<div class="section" id="id45">
+<h5><a class="toc-backref" href="#id688">Arguments:</a><a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">sub</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id46">
+<h5><a class="toc-backref" href="#id689">Semantics:</a><a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">nuw</span></tt> and <tt class="docutils literal"><span class="pre">nsw</span></tt> stand for “No Unsigned Wrap” and “No Signed Wrap”,
+respectively. If the <tt class="docutils literal"><span class="pre">nuw</span></tt> and/or <tt class="docutils literal"><span class="pre">nsw</span></tt> keywords are present, the
+result value of the <tt class="docutils literal"><span class="pre">sub</span></tt> is a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if
+unsigned and/or signed overflow, respectively, occurs.</p>
+</div>
+<div class="section" id="id47">
+<h5><a class="toc-backref" href="#id690">Example:</a><a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = sub i32 4, %var          ; yields i32:result = 4 - %var
+<result> = sub i32 0, %val          ; yields i32:result = -%var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="fsub-instruction">
+<span id="i-fsub"></span><h4><a class="toc-backref" href="#id691">‘<tt class="docutils literal"><span class="pre">fsub</span></tt>‘ Instruction</a><a class="headerlink" href="#fsub-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id48">
+<h5><a class="toc-backref" href="#id692">Syntax:</a><a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fsub [fast-math flags]* <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id49">
+<h5><a class="toc-backref" href="#id693">Overview:</a><a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fsub</span></tt>‘ instruction returns the difference of its two operands.</p>
+<p>Note that the ‘<tt class="docutils literal"><span class="pre">fsub</span></tt>‘ instruction is used to represent the ‘<tt class="docutils literal"><span class="pre">fneg</span></tt>‘
+instruction present in most other intermediate representations.</p>
+</div>
+<div class="section" id="id50">
+<h5><a class="toc-backref" href="#id694">Arguments:</a><a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">fsub</span></tt>‘ instruction must be <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of floating point values.
+Both arguments must have identical types.</p>
+</div>
+<div class="section" id="id51">
+<h5><a class="toc-backref" href="#id695">Semantics:</a><a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h5>
+<p>The value produced is the floating point difference of the two operands.
+This instruction can also take any number of <a class="reference internal" href="#fastmath"><em>fast-math
+flags</em></a>, which are optimization hints to enable otherwise
+unsafe floating point optimizations:</p>
+</div>
+<div class="section" id="id52">
+<h5><a class="toc-backref" href="#id696">Example:</a><a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = fsub float 4.0, %var           ; yields float:result = 4.0 - %var
+<result> = fsub float -0.0, %val          ; yields float:result = -%var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="mul-instruction">
+<h4><a class="toc-backref" href="#id697">‘<tt class="docutils literal"><span class="pre">mul</span></tt>‘ Instruction</a><a class="headerlink" href="#mul-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id53">
+<h5><a class="toc-backref" href="#id698">Syntax:</a><a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = mul <ty> <op1>, <op2>          ; yields ty:result
+<result> = mul nuw <ty> <op1>, <op2>      ; yields ty:result
+<result> = mul nsw <ty> <op1>, <op2>      ; yields ty:result
+<result> = mul nuw nsw <ty> <op1>, <op2>  ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id54">
+<h5><a class="toc-backref" href="#id699">Overview:</a><a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">mul</span></tt>‘ instruction returns the product of its two operands.</p>
+</div>
+<div class="section" id="id55">
+<h5><a class="toc-backref" href="#id700">Arguments:</a><a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">mul</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id56">
+<h5><a class="toc-backref" href="#id701">Semantics:</a><a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i32</span></tt> * <tt class="docutils literal"><span class="pre">i32</span></tt> -> <tt class="docutils literal"><span class="pre">i64</span></tt>) is needed, the operands should be
+sign-extended or zero-extended as appropriate to the width of the full
+product.</p>
+<p><tt class="docutils literal"><span class="pre">nuw</span></tt> and <tt class="docutils literal"><span class="pre">nsw</span></tt> stand for “No Unsigned Wrap” and “No Signed Wrap”,
+respectively. If the <tt class="docutils literal"><span class="pre">nuw</span></tt> and/or <tt class="docutils literal"><span class="pre">nsw</span></tt> keywords are present, the
+result value of the <tt class="docutils literal"><span class="pre">mul</span></tt> is a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if
+unsigned and/or signed overflow, respectively, occurs.</p>
+</div>
+<div class="section" id="id57">
+<h5><a class="toc-backref" href="#id702">Example:</a><a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = mul i32 4, %var          ; yields i32:result = 4 * %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="fmul-instruction">
+<span id="i-fmul"></span><h4><a class="toc-backref" href="#id703">‘<tt class="docutils literal"><span class="pre">fmul</span></tt>‘ Instruction</a><a class="headerlink" href="#fmul-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id58">
+<h5><a class="toc-backref" href="#id704">Syntax:</a><a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fmul [fast-math flags]* <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id59">
+<h5><a class="toc-backref" href="#id705">Overview:</a><a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fmul</span></tt>‘ instruction returns the product of its two operands.</p>
+</div>
+<div class="section" id="id60">
+<h5><a class="toc-backref" href="#id706">Arguments:</a><a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">fmul</span></tt>‘ instruction must be <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of floating point values.
+Both arguments must have identical types.</p>
+</div>
+<div class="section" id="id61">
+<h5><a class="toc-backref" href="#id707">Semantics:</a><a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h5>
+<p>The value produced is the floating point product of the two operands.
+This instruction can also take any number of <a class="reference internal" href="#fastmath"><em>fast-math
+flags</em></a>, which are optimization hints to enable otherwise
+unsafe floating point optimizations:</p>
+</div>
+<div class="section" id="id62">
+<h5><a class="toc-backref" href="#id708">Example:</a><a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = fmul float 4.0, %var          ; yields float:result = 4.0 * %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="udiv-instruction">
+<h4><a class="toc-backref" href="#id709">‘<tt class="docutils literal"><span class="pre">udiv</span></tt>‘ Instruction</a><a class="headerlink" href="#udiv-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id63">
+<h5><a class="toc-backref" href="#id710">Syntax:</a><a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = udiv <ty> <op1>, <op2>         ; yields ty:result
+<result> = udiv exact <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id64">
+<h5><a class="toc-backref" href="#id711">Overview:</a><a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">udiv</span></tt>‘ instruction returns the quotient of its two operands.</p>
+</div>
+<div class="section" id="id65">
+<h5><a class="toc-backref" href="#id712">Arguments:</a><a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">udiv</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id66">
+<h5><a class="toc-backref" href="#id713">Semantics:</a><a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">sdiv</span></tt>‘.</p>
+<p>Division by zero leads to undefined behavior.</p>
+<p>If the <tt class="docutils literal"><span class="pre">exact</span></tt> keyword is present, the result value of the <tt class="docutils literal"><span class="pre">udiv</span></tt> is
+a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if %op1 is not a multiple of %op2 (as
+such, “((a udiv exact b) mul b) == a”).</p>
+</div>
+<div class="section" id="id67">
+<h5><a class="toc-backref" href="#id714">Example:</a><a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = udiv i32 4, %var          ; yields i32:result = 4 / %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="sdiv-instruction">
+<h4><a class="toc-backref" href="#id715">‘<tt class="docutils literal"><span class="pre">sdiv</span></tt>‘ Instruction</a><a class="headerlink" href="#sdiv-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id68">
+<h5><a class="toc-backref" href="#id716">Syntax:</a><a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = sdiv <ty> <op1>, <op2>         ; yields ty:result
+<result> = sdiv exact <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id69">
+<h5><a class="toc-backref" href="#id717">Overview:</a><a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sdiv</span></tt>‘ instruction returns the quotient of its two operands.</p>
+</div>
+<div class="section" id="id70">
+<h5><a class="toc-backref" href="#id718">Arguments:</a><a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">sdiv</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id71">
+<h5><a class="toc-backref" href="#id719">Semantics:</a><a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">udiv</span></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 class="docutils literal"><span class="pre">exact</span></tt> keyword is present, the result value of the <tt class="docutils literal"><span class="pre">sdiv</span></tt> is
+a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if the result would be rounded.</p>
+</div>
+<div class="section" id="id72">
+<h5><a class="toc-backref" href="#id720">Example:</a><a class="headerlink" href="#id72" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = sdiv i32 4, %var          ; yields i32:result = 4 / %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="fdiv-instruction">
+<span id="i-fdiv"></span><h4><a class="toc-backref" href="#id721">‘<tt class="docutils literal"><span class="pre">fdiv</span></tt>‘ Instruction</a><a class="headerlink" href="#fdiv-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id73">
+<h5><a class="toc-backref" href="#id722">Syntax:</a><a class="headerlink" href="#id73" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fdiv [fast-math flags]* <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id74">
+<h5><a class="toc-backref" href="#id723">Overview:</a><a class="headerlink" href="#id74" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fdiv</span></tt>‘ instruction returns the quotient of its two operands.</p>
+</div>
+<div class="section" id="id75">
+<h5><a class="toc-backref" href="#id724">Arguments:</a><a class="headerlink" href="#id75" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">fdiv</span></tt>‘ instruction must be <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of floating point values.
+Both arguments must have identical types.</p>
+</div>
+<div class="section" id="id76">
+<h5><a class="toc-backref" href="#id725">Semantics:</a><a class="headerlink" href="#id76" title="Permalink to this headline">¶</a></h5>
+<p>The value produced is the floating point quotient of the two operands.
+This instruction can also take any number of <a class="reference internal" href="#fastmath"><em>fast-math
+flags</em></a>, which are optimization hints to enable otherwise
+unsafe floating point optimizations:</p>
+</div>
+<div class="section" id="id77">
+<h5><a class="toc-backref" href="#id726">Example:</a><a class="headerlink" href="#id77" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = fdiv float 4.0, %var          ; yields float:result = 4.0 / %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="urem-instruction">
+<h4><a class="toc-backref" href="#id727">‘<tt class="docutils literal"><span class="pre">urem</span></tt>‘ Instruction</a><a class="headerlink" href="#urem-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id78">
+<h5><a class="toc-backref" href="#id728">Syntax:</a><a class="headerlink" href="#id78" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = urem <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id79">
+<h5><a class="toc-backref" href="#id729">Overview:</a><a class="headerlink" href="#id79" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">urem</span></tt>‘ instruction returns the remainder from the unsigned
+division of its two arguments.</p>
+</div>
+<div class="section" id="id80">
+<h5><a class="toc-backref" href="#id730">Arguments:</a><a class="headerlink" href="#id80" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">urem</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id81">
+<h5><a class="toc-backref" href="#id731">Semantics:</a><a class="headerlink" href="#id81" title="Permalink to this headline">¶</a></h5>
+<p>This instruction returns the unsigned integer <em>remainder</em> 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 class="docutils literal"><span class="pre">srem</span></tt>‘.</p>
+<p>Taking the remainder of a division by zero leads to undefined behavior.</p>
+</div>
+<div class="section" id="id82">
+<h5><a class="toc-backref" href="#id732">Example:</a><a class="headerlink" href="#id82" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = urem i32 4, %var          ; yields i32:result = 4 % %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="srem-instruction">
+<h4><a class="toc-backref" href="#id733">‘<tt class="docutils literal"><span class="pre">srem</span></tt>‘ Instruction</a><a class="headerlink" href="#srem-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id83">
+<h5><a class="toc-backref" href="#id734">Syntax:</a><a class="headerlink" href="#id83" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = srem <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id84">
+<h5><a class="toc-backref" href="#id735">Overview:</a><a class="headerlink" href="#id84" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">srem</span></tt>‘ instruction returns the remainder from the signed
+division of its two operands. This instruction can also take
+<a class="reference internal" href="#t-vector"><em>vector</em></a> versions of the values in which case the elements
+must be integers.</p>
+</div>
+<div class="section" id="id85">
+<h5><a class="toc-backref" href="#id736">Arguments:</a><a class="headerlink" href="#id85" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">srem</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id86">
+<h5><a class="toc-backref" href="#id737">Semantics:</a><a class="headerlink" href="#id86" title="Permalink to this headline">¶</a></h5>
+<p>This instruction returns the <em>remainder</em> of a division (where the result
+is either zero or has the same sign as the dividend, <tt class="docutils literal"><span class="pre">op1</span></tt>), not the
+<em>modulo</em> operator (where the result is either zero or has the same sign
+as the divisor, <tt class="docutils literal"><span class="pre">op2</span></tt>) of a value. For more information about the
+difference, see <a class="reference external" 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 class="reference external" 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 class="docutils literal"><span class="pre">urem</span></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>
+</div>
+<div class="section" id="id87">
+<h5><a class="toc-backref" href="#id738">Example:</a><a class="headerlink" href="#id87" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = srem i32 4, %var          ; yields i32:result = 4 % %var</pre>
+</div>
+</div>
+</div>
+<div class="section" id="frem-instruction">
+<span id="i-frem"></span><h4><a class="toc-backref" href="#id739">‘<tt class="docutils literal"><span class="pre">frem</span></tt>‘ Instruction</a><a class="headerlink" href="#frem-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id88">
+<h5><a class="toc-backref" href="#id740">Syntax:</a><a class="headerlink" href="#id88" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = frem [fast-math flags]* <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id89">
+<h5><a class="toc-backref" href="#id741">Overview:</a><a class="headerlink" href="#id89" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">frem</span></tt>‘ instruction returns the remainder from the division of
+its two operands.</p>
+</div>
+<div class="section" id="id90">
+<h5><a class="toc-backref" href="#id742">Arguments:</a><a class="headerlink" href="#id90" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">frem</span></tt>‘ instruction must be <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of floating point values.
+Both arguments must have identical types.</p>
+</div>
+<div class="section" id="id91">
+<h5><a class="toc-backref" href="#id743">Semantics:</a><a class="headerlink" href="#id91" title="Permalink to this headline">¶</a></h5>
+<p>This instruction returns the <em>remainder</em> of a division. The remainder
+has the same sign as the dividend. This instruction can also take any
+number of <a class="reference internal" href="#fastmath"><em>fast-math flags</em></a>, which are optimization hints
+to enable otherwise unsafe floating point optimizations:</p>
+</div>
+<div class="section" id="id92">
+<h5><a class="toc-backref" href="#id744">Example:</a><a class="headerlink" href="#id92" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = frem float 4.0, %var          ; yields float:result = 4.0 % %var</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="bitwise-binary-operations">
+<span id="bitwiseops"></span><h3><a class="toc-backref" href="#id745">Bitwise Binary Operations</a><a class="headerlink" href="#bitwise-binary-operations" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="section" id="shl-instruction">
+<h4><a class="toc-backref" href="#id746">‘<tt class="docutils literal"><span class="pre">shl</span></tt>‘ Instruction</a><a class="headerlink" href="#shl-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id93">
+<h5><a class="toc-backref" href="#id747">Syntax:</a><a class="headerlink" href="#id93" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = shl <ty> <op1>, <op2>           ; yields ty:result
+<result> = shl nuw <ty> <op1>, <op2>       ; yields ty:result
+<result> = shl nsw <ty> <op1>, <op2>       ; yields ty:result
+<result> = shl nuw nsw <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id94">
+<h5><a class="toc-backref" href="#id748">Overview:</a><a class="headerlink" href="#id94" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">shl</span></tt>‘ instruction returns the first operand shifted to the left
+a specified number of bits.</p>
+</div>
+<div class="section" id="id95">
+<h5><a class="toc-backref" href="#id749">Arguments:</a><a class="headerlink" href="#id95" title="Permalink to this headline">¶</a></h5>
+<p>Both arguments to the ‘<tt class="docutils literal"><span class="pre">shl</span></tt>‘ instruction must be the same
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer type.
+‘<tt class="docutils literal"><span class="pre">op2</span></tt>‘ is treated as an unsigned value.</p>
+</div>
+<div class="section" id="id96">
+<h5><a class="toc-backref" href="#id750">Semantics:</a><a class="headerlink" href="#id96" title="Permalink to this headline">¶</a></h5>
+<p>The value produced is <tt class="docutils literal"><span class="pre">op1</span></tt> * 2<sup>op2</sup> mod 2<sup>n</sup>,
+where <tt class="docutils literal"><span class="pre">n</span></tt> is the width of the result. If <tt class="docutils literal"><span class="pre">op2</span></tt> is (statically or
+dynamically) negative or equal to or larger than the number of bits in
+<tt class="docutils literal"><span class="pre">op1</span></tt>, the result is undefined. If the arguments are vectors, each
+vector element of <tt class="docutils literal"><span class="pre">op1</span></tt> is shifted by the corresponding shift amount
+in <tt class="docutils literal"><span class="pre">op2</span></tt>.</p>
+<p>If the <tt class="docutils literal"><span class="pre">nuw</span></tt> keyword is present, then the shift produces a <a class="reference internal" href="#poisonvalues"><em>poison
+value</em></a> if it shifts out any non-zero bits. If the
+<tt class="docutils literal"><span class="pre">nsw</span></tt> keyword is present, then the shift produces a <a class="reference internal" href="#poisonvalues"><em>poison
+value</em></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>
+</div>
+<div class="section" id="id97">
+<h5><a class="toc-backref" href="#id751">Example:</a><a class="headerlink" href="#id97" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = shl i32 4, %var   ; yields i32: 4 << %var
+<result> = shl i32 4, 2      ; yields i32: 16
+<result> = shl i32 1, 10     ; yields i32: 1024
+<result> = shl i32 1, 32     ; undefined
+<result> = shl <2 x i32> < i32 1, i32 1>, < i32 1, i32 2>   ; yields: result=<2 x i32> < i32 2, i32 4></pre>
+</div>
+</div>
+</div>
+<div class="section" id="lshr-instruction">
+<h4><a class="toc-backref" href="#id752">‘<tt class="docutils literal"><span class="pre">lshr</span></tt>‘ Instruction</a><a class="headerlink" href="#lshr-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id98">
+<h5><a class="toc-backref" href="#id753">Syntax:</a><a class="headerlink" href="#id98" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = lshr <ty> <op1>, <op2>         ; yields ty:result
+<result> = lshr exact <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id99">
+<h5><a class="toc-backref" href="#id754">Overview:</a><a class="headerlink" href="#id99" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">lshr</span></tt>‘ instruction (logical shift right) returns the first
+operand shifted to the right a specified number of bits with zero fill.</p>
+</div>
+<div class="section" id="id100">
+<h5><a class="toc-backref" href="#id755">Arguments:</a><a class="headerlink" href="#id100" title="Permalink to this headline">¶</a></h5>
+<p>Both arguments to the ‘<tt class="docutils literal"><span class="pre">lshr</span></tt>‘ instruction must be the same
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer type.
+‘<tt class="docutils literal"><span class="pre">op2</span></tt>‘ is treated as an unsigned value.</p>
+</div>
+<div class="section" id="id101">
+<h5><a class="toc-backref" href="#id756">Semantics:</a><a class="headerlink" href="#id101" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">op2</span></tt> is (statically or dynamically) equal to or larger
+than the number of bits in <tt class="docutils literal"><span class="pre">op1</span></tt>, the result is undefined. If the
+arguments are vectors, each vector element of <tt class="docutils literal"><span class="pre">op1</span></tt> is shifted by the
+corresponding shift amount in <tt class="docutils literal"><span class="pre">op2</span></tt>.</p>
+<p>If the <tt class="docutils literal"><span class="pre">exact</span></tt> keyword is present, the result value of the <tt class="docutils literal"><span class="pre">lshr</span></tt> is
+a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if any of the bits shifted out are
+non-zero.</p>
+</div>
+<div class="section" id="id102">
+<h5><a class="toc-backref" href="#id757">Example:</a><a class="headerlink" href="#id102" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = lshr i32 4, 1   ; yields i32:result = 2
+<result> = lshr i32 4, 2   ; yields i32:result = 1
+<result> = lshr i8  4, 3   ; yields i8:result = 0
+<result> = lshr i8 -2, 1   ; yields i8:result = 0x7F
+<result> = lshr i32 1, 32  ; undefined
+<result> = lshr <2 x i32> < i32 -2, i32 4>, < i32 1, i32 2>   ; yields: result=<2 x i32> < i32 0x7FFFFFFF, i32 1></pre>
+</div>
+</div>
+</div>
+<div class="section" id="ashr-instruction">
+<h4><a class="toc-backref" href="#id758">‘<tt class="docutils literal"><span class="pre">ashr</span></tt>‘ Instruction</a><a class="headerlink" href="#ashr-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id103">
+<h5><a class="toc-backref" href="#id759">Syntax:</a><a class="headerlink" href="#id103" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = ashr <ty> <op1>, <op2>         ; yields ty:result
+<result> = ashr exact <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id104">
+<h5><a class="toc-backref" href="#id760">Overview:</a><a class="headerlink" href="#id104" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">ashr</span></tt>‘ instruction (arithmetic shift right) returns the first
+operand shifted to the right a specified number of bits with sign
+extension.</p>
+</div>
+<div class="section" id="id105">
+<h5><a class="toc-backref" href="#id761">Arguments:</a><a class="headerlink" href="#id105" title="Permalink to this headline">¶</a></h5>
+<p>Both arguments to the ‘<tt class="docutils literal"><span class="pre">ashr</span></tt>‘ instruction must be the same
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer type.
+‘<tt class="docutils literal"><span class="pre">op2</span></tt>‘ is treated as an unsigned value.</p>
+</div>
+<div class="section" id="id106">
+<h5><a class="toc-backref" href="#id762">Semantics:</a><a class="headerlink" href="#id106" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">op1</span></tt>. If <tt class="docutils literal"><span class="pre">op2</span></tt> is (statically or dynamically) equal to or larger
+than the number of bits in <tt class="docutils literal"><span class="pre">op1</span></tt>, the result is undefined. If the
+arguments are vectors, each vector element of <tt class="docutils literal"><span class="pre">op1</span></tt> is shifted by the
+corresponding shift amount in <tt class="docutils literal"><span class="pre">op2</span></tt>.</p>
+<p>If the <tt class="docutils literal"><span class="pre">exact</span></tt> keyword is present, the result value of the <tt class="docutils literal"><span class="pre">ashr</span></tt> is
+a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if any of the bits shifted out are
+non-zero.</p>
+</div>
+<div class="section" id="id107">
+<h5><a class="toc-backref" href="#id763">Example:</a><a class="headerlink" href="#id107" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = ashr i32 4, 1   ; yields i32:result = 2
+<result> = ashr i32 4, 2   ; yields i32:result = 1
+<result> = ashr i8  4, 3   ; yields i8:result = 0
+<result> = ashr i8 -2, 1   ; yields i8:result = -1
+<result> = ashr i32 1, 32  ; undefined
+<result> = ashr <2 x i32> < i32 -2, i32 4>, < i32 1, i32 3>   ; yields: result=<2 x i32> < i32 -1, i32 0></pre>
+</div>
+</div>
+</div>
+<div class="section" id="and-instruction">
+<h4><a class="toc-backref" href="#id764">‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ Instruction</a><a class="headerlink" href="#and-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id108">
+<h5><a class="toc-backref" href="#id765">Syntax:</a><a class="headerlink" href="#id108" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = and <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id109">
+<h5><a class="toc-backref" href="#id766">Overview:</a><a class="headerlink" href="#id109" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ instruction returns the bitwise logical and of its two
+operands.</p>
+</div>
+<div class="section" id="id110">
+<h5><a class="toc-backref" href="#id767">Arguments:</a><a class="headerlink" href="#id110" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id111">
+<h5><a class="toc-backref" href="#id768">Semantics:</a><a class="headerlink" href="#id111" title="Permalink to this headline">¶</a></h5>
+<p>The truth table used for the ‘<tt class="docutils literal"><span class="pre">and</span></tt>‘ instruction is:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="33%" />
+<col width="33%" />
+<col width="33%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td>In0</td>
+<td>In1</td>
+<td>Out</td>
+</tr>
+<tr class="row-even"><td>0</td>
+<td>0</td>
+<td>0</td>
+</tr>
+<tr class="row-odd"><td>0</td>
+<td>1</td>
+<td>0</td>
+</tr>
+<tr class="row-even"><td>1</td>
+<td>0</td>
+<td>0</td>
+</tr>
+<tr class="row-odd"><td>1</td>
+<td>1</td>
+<td>1</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="id112">
+<h5><a class="toc-backref" href="#id769">Example:</a><a class="headerlink" href="#id112" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = and i32 4, %var         ; yields i32:result = 4 & %var
+<result> = and i32 15, 40          ; yields i32:result = 8
+<result> = and i32 4, 8            ; yields i32:result = 0</pre>
+</div>
+</div>
+</div>
+<div class="section" id="or-instruction">
+<h4><a class="toc-backref" href="#id770">‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ Instruction</a><a class="headerlink" href="#or-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id113">
+<h5><a class="toc-backref" href="#id771">Syntax:</a><a class="headerlink" href="#id113" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = or <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id114">
+<h5><a class="toc-backref" href="#id772">Overview:</a><a class="headerlink" href="#id114" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ instruction returns the bitwise logical inclusive or of its
+two operands.</p>
+</div>
+<div class="section" id="id115">
+<h5><a class="toc-backref" href="#id773">Arguments:</a><a class="headerlink" href="#id115" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id116">
+<h5><a class="toc-backref" href="#id774">Semantics:</a><a class="headerlink" href="#id116" title="Permalink to this headline">¶</a></h5>
+<p>The truth table used for the ‘<tt class="docutils literal"><span class="pre">or</span></tt>‘ instruction is:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="33%" />
+<col width="33%" />
+<col width="33%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td>In0</td>
+<td>In1</td>
+<td>Out</td>
+</tr>
+<tr class="row-even"><td>0</td>
+<td>0</td>
+<td>0</td>
+</tr>
+<tr class="row-odd"><td>0</td>
+<td>1</td>
+<td>1</td>
+</tr>
+<tr class="row-even"><td>1</td>
+<td>0</td>
+<td>1</td>
+</tr>
+<tr class="row-odd"><td>1</td>
+<td>1</td>
+<td>1</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="id117">
+<h5><a class="toc-backref" href="#id775">Example:</a><a class="headerlink" href="#id117" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = or i32 4, %var         ; yields i32:result = 4 | %var
+<result> = or i32 15, 40          ; yields i32:result = 47
+<result> = or i32 4, 8            ; yields i32:result = 12</pre>
+</div>
+</div>
+</div>
+<div class="section" id="xor-instruction">
+<h4><a class="toc-backref" href="#id776">‘<tt class="docutils literal"><span class="pre">xor</span></tt>‘ Instruction</a><a class="headerlink" href="#xor-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id118">
+<h5><a class="toc-backref" href="#id777">Syntax:</a><a class="headerlink" href="#id118" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = xor <ty> <op1>, <op2>   ; yields ty:result</pre>
+</div>
+</div>
+<div class="section" id="id119">
+<h5><a class="toc-backref" href="#id778">Overview:</a><a class="headerlink" href="#id119" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">xor</span></tt>‘ instruction returns the bitwise logical exclusive or of
+its two operands. The <tt class="docutils literal"><span class="pre">xor</span></tt> is used to implement the “one’s
+complement” operation, which is the “~” operator in C.</p>
+</div>
+<div class="section" id="id120">
+<h5><a class="toc-backref" href="#id779">Arguments:</a><a class="headerlink" href="#id120" title="Permalink to this headline">¶</a></h5>
+<p>The two arguments to the ‘<tt class="docutils literal"><span class="pre">xor</span></tt>‘ instruction must be
+<a class="reference internal" href="#t-integer"><em>integer</em></a> or <a class="reference internal" href="#t-vector"><em>vector</em></a> of integer values. Both
+arguments must have identical types.</p>
+</div>
+<div class="section" id="id121">
+<h5><a class="toc-backref" href="#id780">Semantics:</a><a class="headerlink" href="#id121" title="Permalink to this headline">¶</a></h5>
+<p>The truth table used for the ‘<tt class="docutils literal"><span class="pre">xor</span></tt>‘ instruction is:</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="33%" />
+<col width="33%" />
+<col width="33%" />
+</colgroup>
+<tbody valign="top">
+<tr class="row-odd"><td>In0</td>
+<td>In1</td>
+<td>Out</td>
+</tr>
+<tr class="row-even"><td>0</td>
+<td>0</td>
+<td>0</td>
+</tr>
+<tr class="row-odd"><td>0</td>
+<td>1</td>
+<td>1</td>
+</tr>
+<tr class="row-even"><td>1</td>
+<td>0</td>
+<td>1</td>
+</tr>
+<tr class="row-odd"><td>1</td>
+<td>1</td>
+<td>0</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="id122">
+<h5><a class="toc-backref" href="#id781">Example:</a><a class="headerlink" href="#id122" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = xor i32 4, %var         ; yields i32:result = 4 ^ %var
+<result> = xor i32 15, 40          ; yields i32:result = 39
+<result> = xor i32 4, 8            ; yields i32:result = 12
+<result> = xor i32 %V, -1          ; yields i32:result = ~%V</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="vector-operations">
+<h3><a class="toc-backref" href="#id782">Vector Operations</a><a class="headerlink" href="#vector-operations" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="section" id="extractelement-instruction">
+<span id="i-extractelement"></span><h4><a class="toc-backref" href="#id783">‘<tt class="docutils literal"><span class="pre">extractelement</span></tt>‘ Instruction</a><a class="headerlink" href="#extractelement-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id123">
+<h5><a class="toc-backref" href="#id784">Syntax:</a><a class="headerlink" href="#id123" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = extractelement <n x <ty>> <val>, <ty2> <idx>  ; yields <ty></pre>
+</div>
+</div>
+<div class="section" id="id124">
+<h5><a class="toc-backref" href="#id785">Overview:</a><a class="headerlink" href="#id124" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">extractelement</span></tt>‘ instruction extracts a single scalar element
+from a vector at a specified index.</p>
+</div>
+<div class="section" id="id125">
+<h5><a class="toc-backref" href="#id786">Arguments:</a><a class="headerlink" href="#id125" title="Permalink to this headline">¶</a></h5>
+<p>The first operand of an ‘<tt class="docutils literal"><span class="pre">extractelement</span></tt>‘ instruction is a value of
+<a class="reference internal" href="#t-vector"><em>vector</em></a> type. The second operand is an index indicating
+the position from which to extract the element. The index may be a
+variable of any integer type.</p>
+</div>
+<div class="section" id="id126">
+<h5><a class="toc-backref" href="#id787">Semantics:</a><a class="headerlink" href="#id126" title="Permalink to this headline">¶</a></h5>
+<p>The result is a scalar of the same type as the element type of <tt class="docutils literal"><span class="pre">val</span></tt>.
+Its value is the value at position <tt class="docutils literal"><span class="pre">idx</span></tt> of <tt class="docutils literal"><span class="pre">val</span></tt>. If <tt class="docutils literal"><span class="pre">idx</span></tt>
+exceeds the length of <tt class="docutils literal"><span class="pre">val</span></tt>, the results are undefined.</p>
+</div>
+<div class="section" id="id127">
+<h5><a class="toc-backref" href="#id788">Example:</a><a class="headerlink" href="#id127" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = extractelement <4 x i32> %vec, i32 0    ; yields i32</pre>
+</div>
+</div>
+</div>
+<div class="section" id="insertelement-instruction">
+<span id="i-insertelement"></span><h4><a class="toc-backref" href="#id789">‘<tt class="docutils literal"><span class="pre">insertelement</span></tt>‘ Instruction</a><a class="headerlink" href="#insertelement-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id128">
+<h5><a class="toc-backref" href="#id790">Syntax:</a><a class="headerlink" href="#id128" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = insertelement <n x <ty>> <val>, <ty> <elt>, <ty2> <idx>    ; yields <n x <ty>></pre>
+</div>
+</div>
+<div class="section" id="id129">
+<h5><a class="toc-backref" href="#id791">Overview:</a><a class="headerlink" href="#id129" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">insertelement</span></tt>‘ instruction inserts a scalar element into a
+vector at a specified index.</p>
+</div>
+<div class="section" id="id130">
+<h5><a class="toc-backref" href="#id792">Arguments:</a><a class="headerlink" href="#id130" title="Permalink to this headline">¶</a></h5>
+<p>The first operand of an ‘<tt class="docutils literal"><span class="pre">insertelement</span></tt>‘ instruction is a value of
+<a class="reference internal" href="#t-vector"><em>vector</em></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 of any integer type.</p>
+</div>
+<div class="section" id="id131">
+<h5><a class="toc-backref" href="#id793">Semantics:</a><a class="headerlink" href="#id131" title="Permalink to this headline">¶</a></h5>
+<p>The result is a vector of the same type as <tt class="docutils literal"><span class="pre">val</span></tt>. Its element values
+are those of <tt class="docutils literal"><span class="pre">val</span></tt> except at position <tt class="docutils literal"><span class="pre">idx</span></tt>, where it gets the value
+<tt class="docutils literal"><span class="pre">elt</span></tt>. If <tt class="docutils literal"><span class="pre">idx</span></tt> exceeds the length of <tt class="docutils literal"><span class="pre">val</span></tt>, the results are
+undefined.</p>
+</div>
+<div class="section" id="id132">
+<h5><a class="toc-backref" href="#id794">Example:</a><a class="headerlink" href="#id132" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = insertelement <4 x i32> %vec, i32 1, i32 0    ; yields <4 x i32></pre>
+</div>
+</div>
+</div>
+<div class="section" id="shufflevector-instruction">
+<span id="i-shufflevector"></span><h4><a class="toc-backref" href="#id795">‘<tt class="docutils literal"><span class="pre">shufflevector</span></tt>‘ Instruction</a><a class="headerlink" href="#shufflevector-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id133">
+<h5><a class="toc-backref" href="#id796">Syntax:</a><a class="headerlink" href="#id133" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = shufflevector <n x <ty>> <v1>, <n x <ty>> <v2>, <m x i32> <mask>    ; yields <m x <ty>></pre>
+</div>
+</div>
+<div class="section" id="id134">
+<h5><a class="toc-backref" href="#id797">Overview:</a><a class="headerlink" href="#id134" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">shufflevector</span></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>
+</div>
+<div class="section" id="id135">
+<h5><a class="toc-backref" href="#id798">Arguments:</a><a class="headerlink" href="#id135" title="Permalink to this headline">¶</a></h5>
+<p>The first two operands of a ‘<tt class="docutils literal"><span class="pre">shufflevector</span></tt>‘ instruction are vectors
+with the same type. 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>
+</div>
+<div class="section" id="id136">
+<h5><a class="toc-backref" href="#id799">Semantics:</a><a class="headerlink" href="#id136" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id137">
+<h5><a class="toc-backref" href="#id800">Example:</a><a class="headerlink" href="#id137" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = shufflevector <4 x i32> %v1, <4 x i32> %v2,
+                        <4 x i32> <i32 0, i32 4, i32 1, i32 5>  ; yields <4 x i32>
+<result> = shufflevector <4 x i32> %v1, <4 x i32> undef,
+                        <4 x i32> <i32 0, i32 1, i32 2, i32 3>  ; yields <4 x i32> - Identity shuffle.
+<result> = shufflevector <8 x i32> %v1, <8 x i32> undef,
+                        <4 x i32> <i32 0, i32 1, i32 2, i32 3>  ; yields <4 x i32>
+<result> = shufflevector <4 x i32> %v1, <4 x i32> %v2,
+                        <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7 >  ; yields <8 x i32></pre>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="aggregate-operations">
+<h3><a class="toc-backref" href="#id801">Aggregate Operations</a><a class="headerlink" href="#aggregate-operations" title="Permalink to this headline">¶</a></h3>
+<p>LLVM supports several instructions for working with
+<a class="reference internal" href="#t-aggregate"><em>aggregate</em></a> values.</p>
+<div class="section" id="extractvalue-instruction">
+<span id="i-extractvalue"></span><h4><a class="toc-backref" href="#id802">‘<tt class="docutils literal"><span class="pre">extractvalue</span></tt>‘ Instruction</a><a class="headerlink" href="#extractvalue-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id138">
+<h5><a class="toc-backref" href="#id803">Syntax:</a><a class="headerlink" href="#id138" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = extractvalue <aggregate type> <val>, <idx>{, <idx>}*</pre>
+</div>
+</div>
+<div class="section" id="id139">
+<h5><a class="toc-backref" href="#id804">Overview:</a><a class="headerlink" href="#id139" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">extractvalue</span></tt>‘ instruction extracts the value of a member field
+from an <a class="reference internal" href="#t-aggregate"><em>aggregate</em></a> value.</p>
+</div>
+<div class="section" id="id140">
+<h5><a class="toc-backref" href="#id805">Arguments:</a><a class="headerlink" href="#id140" title="Permalink to this headline">¶</a></h5>
+<p>The first operand of an ‘<tt class="docutils literal"><span class="pre">extractvalue</span></tt>‘ instruction is a value of
+<a class="reference internal" href="#t-struct"><em>struct</em></a> or <a class="reference internal" href="#t-array"><em>array</em></a> type. The operands are
+constant indices to specify which value to extract in a similar manner
+as indices in a ‘<tt class="docutils literal"><span class="pre">getelementptr</span></tt>‘ instruction.</p>
+<p>The major differences to <tt class="docutils literal"><span class="pre">getelementptr</span></tt> indexing are:</p>
+<ul class="simple">
+<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>
+</div>
+<div class="section" id="id141">
+<h5><a class="toc-backref" href="#id806">Semantics:</a><a class="headerlink" href="#id141" title="Permalink to this headline">¶</a></h5>
+<p>The result is the value at the position in the aggregate specified by
+the index operands.</p>
+</div>
+<div class="section" id="id142">
+<h5><a class="toc-backref" href="#id807">Example:</a><a class="headerlink" href="#id142" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = extractvalue {i32, float} %agg, 0    ; yields i32</pre>
+</div>
+</div>
+</div>
+<div class="section" id="insertvalue-instruction">
+<span id="i-insertvalue"></span><h4><a class="toc-backref" href="#id808">‘<tt class="docutils literal"><span class="pre">insertvalue</span></tt>‘ Instruction</a><a class="headerlink" href="#insertvalue-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id143">
+<h5><a class="toc-backref" href="#id809">Syntax:</a><a class="headerlink" href="#id143" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = insertvalue <aggregate type> <val>, <ty> <elt>, <idx>{, <idx>}*    ; yields <aggregate type></pre>
+</div>
+</div>
+<div class="section" id="id144">
+<h5><a class="toc-backref" href="#id810">Overview:</a><a class="headerlink" href="#id144" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">insertvalue</span></tt>‘ instruction inserts a value into a member field in
+an <a class="reference internal" href="#t-aggregate"><em>aggregate</em></a> value.</p>
+</div>
+<div class="section" id="id145">
+<h5><a class="toc-backref" href="#id811">Arguments:</a><a class="headerlink" href="#id145" title="Permalink to this headline">¶</a></h5>
+<p>The first operand of an ‘<tt class="docutils literal"><span class="pre">insertvalue</span></tt>‘ instruction is a value of
+<a class="reference internal" href="#t-struct"><em>struct</em></a> or <a class="reference internal" href="#t-array"><em>array</em></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 class="docutils literal"><span class="pre">extractvalue</span></tt>‘ instruction. The value
+to insert must have the same type as the value identified by the
+indices.</p>
+</div>
+<div class="section" id="id146">
+<h5><a class="toc-backref" href="#id812">Semantics:</a><a class="headerlink" href="#id146" title="Permalink to this headline">¶</a></h5>
+<p>The result is an aggregate of the same type as <tt class="docutils literal"><span class="pre">val</span></tt>. Its value is
+that of <tt class="docutils literal"><span class="pre">val</span></tt> except that the value at the position specified by the
+indices is that of <tt class="docutils literal"><span class="pre">elt</span></tt>.</p>
+</div>
+<div class="section" id="id147">
+<h5><a class="toc-backref" href="#id813">Example:</a><a class="headerlink" href="#id147" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%agg1</span> <span class="p">=</span> <span class="k">insertvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="kt">float</span><span class="p">}</span> <span class="k">undef</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span><span class="p">,</span> <span class="m">0</span>              <span class="c">; yields {i32 1, float undef}</span>
+<span class="nv">%agg2</span> <span class="p">=</span> <span class="k">insertvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="kt">float</span><span class="p">}</span> <span class="nv">%agg1</span><span class="p">,</span> <span class="kt">float</span> <span class="nv">%val</span><span class="p">,</span> <span class="m">1</span>         <span class="c">; yields {i32 1, float %val}</span>
+<span class="nv">%agg3</span> <span class="p">=</span> <span class="k">insertvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="p">{</span><span class="kt">float</span><span class="p">}}</span> <span class="nv">%agg1</span><span class="p">,</span> <span class="kt">float</span> <span class="nv">%val</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">0</span>    <span class="c">; yields {i32 1, float %val}</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="memory-access-and-addressing-operations">
+<span id="memoryops"></span><h3><a class="toc-backref" href="#id814">Memory Access and Addressing Operations</a><a class="headerlink" href="#memory-access-and-addressing-operations" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="section" id="alloca-instruction">
+<span id="i-alloca"></span><h4><a class="toc-backref" href="#id815">‘<tt class="docutils literal"><span class="pre">alloca</span></tt>‘ Instruction</a><a class="headerlink" href="#alloca-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id148">
+<h5><a class="toc-backref" href="#id816">Syntax:</a><a class="headerlink" href="#id148" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = alloca [inalloca] <type> [, <ty> <NumElements>] [, align <alignment>]     ; yields type*:result</pre>
+</div>
+</div>
+<div class="section" id="id149">
+<h5><a class="toc-backref" href="#id817">Overview:</a><a class="headerlink" href="#id149" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">alloca</span></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>
+</div>
+<div class="section" id="id150">
+<h5><a class="toc-backref" href="#id818">Arguments:</a><a class="headerlink" href="#id150" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">alloca</span></tt>‘ instruction allocates <tt class="docutils literal"><span class="pre">sizeof(<type>)*NumElements</span></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. The
+alignment may not be greater than <tt class="docutils literal"><span class="pre">1</span> <span class="pre"><<</span> <span class="pre">29</span></tt>. 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 class="docutils literal"><span class="pre">type</span></tt>‘ may be any sized type.</p>
+</div>
+<div class="section" id="id151">
+<h5><a class="toc-backref" href="#id819">Semantics:</a><a class="headerlink" href="#id151" title="Permalink to this headline">¶</a></h5>
+<p>Memory is allocated; a pointer is returned. The operation is undefined
+if there is insufficient stack space for the allocation. ‘<tt class="docutils literal"><span class="pre">alloca</span></tt>‘d
+memory is automatically released when the function returns. The
+‘<tt class="docutils literal"><span class="pre">alloca</span></tt>‘ instruction is commonly used to represent automatic
+variables that must have an address available. When the function returns
+(either with the <tt class="docutils literal"><span class="pre">ret</span></tt> or <tt class="docutils literal"><span class="pre">resume</span></tt> instructions), the memory is
+reclaimed. Allocating zero bytes is legal, but the result is undefined.
+The order in which memory is allocated (ie., which way the stack grows)
+is not specified.</p>
+</div>
+<div class="section" id="id152">
+<h5><a class="toc-backref" href="#id820">Example:</a><a class="headerlink" href="#id152" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%ptr</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i32</span>                             <span class="c">; yields i32*:ptr</span>
+<span class="nv">%ptr</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i32</span><span class="p">,</span> <span class="k">i32</span> <span class="m">4</span>                      <span class="c">; yields i32*:ptr</span>
+<span class="nv">%ptr</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i32</span><span class="p">,</span> <span class="k">i32</span> <span class="m">4</span><span class="p">,</span> <span class="k">align</span> <span class="m">1024</span>          <span class="c">; yields i32*:ptr</span>
+<span class="nv">%ptr</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i32</span><span class="p">,</span> <span class="k">align</span> <span class="m">1024</span>                 <span class="c">; yields i32*:ptr</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="load-instruction">
+<span id="i-load"></span><h4><a class="toc-backref" href="#id821">‘<tt class="docutils literal"><span class="pre">load</span></tt>‘ Instruction</a><a class="headerlink" href="#load-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id153">
+<h5><a class="toc-backref" href="#id822">Syntax:</a><a class="headerlink" href="#id153" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = load [volatile] <ty>* <pointer>[, align <alignment>][, !nontemporal !<index>][, !invariant.load !<index>]
+<result> = load atomic [volatile] <ty>* <pointer> [singlethread] <ordering>, align <alignment>
+!<index> = !{ i32 1 }</pre>
+</div>
+</div>
+<div class="section" id="id154">
+<h5><a class="toc-backref" href="#id823">Overview:</a><a class="headerlink" href="#id154" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">load</span></tt>‘ instruction is used to read from memory.</p>
+</div>
+<div class="section" id="id155">
+<h5><a class="toc-backref" href="#id824">Arguments:</a><a class="headerlink" href="#id155" title="Permalink to this headline">¶</a></h5>
+<p>The argument to the <tt class="docutils literal"><span class="pre">load</span></tt> instruction specifies the memory address
+from which to load. The pointer must point to a <a class="reference internal" href="#t-firstclass"><em>first
+class</em></a> type. If the <tt class="docutils literal"><span class="pre">load</span></tt> is marked as <tt class="docutils literal"><span class="pre">volatile</span></tt>,
+then the optimizer is not allowed to modify the number or order of
+execution of this <tt class="docutils literal"><span class="pre">load</span></tt> with other <a class="reference internal" href="#volatile"><em>volatile
+operations</em></a>.</p>
+<p>If the <tt class="docutils literal"><span class="pre">load</span></tt> is marked as <tt class="docutils literal"><span class="pre">atomic</span></tt>, it takes an extra
+<a class="reference internal" href="#ordering"><em>ordering</em></a> and optional <tt class="docutils literal"><span class="pre">singlethread</span></tt> argument. The
+<tt class="docutils literal"><span class="pre">release</span></tt> and <tt class="docutils literal"><span class="pre">acq_rel</span></tt> orderings are not valid on <tt class="docutils literal"><span class="pre">load</span></tt>
+instructions. Atomic loads produce <a class="reference internal" href="#memmodel"><em>defined</em></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.
+<tt class="docutils literal"><span class="pre">align</span></tt> 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. <tt class="docutils literal"><span class="pre">!nontemporal</span></tt> does not have
+any defined semantics for atomic loads.</p>
+<p>The optional constant <tt class="docutils literal"><span class="pre">align</span></tt> argument specifies the alignment of the
+operation (that is, the alignment of the memory address). A value of 0
+or an omitted <tt class="docutils literal"><span class="pre">align</span></tt> argument means that the operation has the ABI
+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. The
+maximum possible alignment is <tt class="docutils literal"><span class="pre">1</span> <span class="pre"><<</span> <span class="pre">29</span></tt>.</p>
+<p>The optional <tt class="docutils literal"><span class="pre">!nontemporal</span></tt> metadata must reference a single
+metadata name <tt class="docutils literal"><span class="pre"><index></span></tt> corresponding to a metadata node with one
+<tt class="docutils literal"><span class="pre">i32</span></tt> entry of value 1. The existence of the <tt class="docutils literal"><span class="pre">!nontemporal</span></tt>
+metadata 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 class="docutils literal"><span class="pre">MOVNT</span></tt> instruction on x86.</p>
+<p>The optional <tt class="docutils literal"><span class="pre">!invariant.load</span></tt> metadata must reference a single
+metadata name <tt class="docutils literal"><span class="pre"><index></span></tt> corresponding to a metadata node with no
+entries. The existence of the <tt class="docutils literal"><span class="pre">!invariant.load</span></tt> metadata on the
+instruction tells the optimizer and code generator that this load
+address points to memory which does not change value during program
+execution. The optimizer may then move this load around, for example, by
+hoisting it out of loops using loop invariant code motion.</p>
+</div>
+<div class="section" id="id156">
+<h5><a class="toc-backref" href="#id825">Semantics:</a><a class="headerlink" href="#id156" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i24</span></tt> reads at most three bytes. When loading a
+value of a type like <tt class="docutils literal"><span class="pre">i20</span></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>
+</div>
+<div class="section" id="id157">
+<h5><a class="toc-backref" href="#id826">Examples:</a><a class="headerlink" href="#id157" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%ptr</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i32</span>                               <span class="c">; yields i32*:ptr</span>
+<span class="k">store</span> <span class="k">i32</span> <span class="m">3</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%ptr</span>                          <span class="c">; yields void</span>
+<span class="nv">%val</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%ptr</span>                           <span class="c">; yields i32:val = i32 3</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="store-instruction">
+<span id="i-store"></span><h4><a class="toc-backref" href="#id827">‘<tt class="docutils literal"><span class="pre">store</span></tt>‘ Instruction</a><a class="headerlink" href="#store-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id158">
+<h5><a class="toc-backref" href="#id828">Syntax:</a><a class="headerlink" href="#id158" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>store [volatile] <ty> <value>, <ty>* <pointer>[, align <alignment>][, !nontemporal !<index>]        ; yields void
+store atomic [volatile] <ty> <value>, <ty>* <pointer> [singlethread] <ordering>, align <alignment>  ; yields void</pre>
+</div>
+</div>
+<div class="section" id="id159">
+<h5><a class="toc-backref" href="#id829">Overview:</a><a class="headerlink" href="#id159" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">store</span></tt>‘ instruction is used to write to memory.</p>
+</div>
+<div class="section" id="id160">
+<h5><a class="toc-backref" href="#id830">Arguments:</a><a class="headerlink" href="#id160" title="Permalink to this headline">¶</a></h5>
+<p>There are two arguments to the <tt class="docutils literal"><span class="pre">store</span></tt> instruction: a value to store
+and an address at which to store it. The type of the <tt class="docutils literal"><span class="pre"><pointer></span></tt>
+operand must be a pointer to the <a class="reference internal" href="#t-firstclass"><em>first class</em></a> type of
+the <tt class="docutils literal"><span class="pre"><value></span></tt> operand. If the <tt class="docutils literal"><span class="pre">store</span></tt> is marked as <tt class="docutils literal"><span class="pre">volatile</span></tt>,
+then the optimizer is not allowed to modify the number or order of
+execution of this <tt class="docutils literal"><span class="pre">store</span></tt> with other <a class="reference internal" href="#volatile"><em>volatile
+operations</em></a>.</p>
+<p>If the <tt class="docutils literal"><span class="pre">store</span></tt> is marked as <tt class="docutils literal"><span class="pre">atomic</span></tt>, it takes an extra
+<a class="reference internal" href="#ordering"><em>ordering</em></a> and optional <tt class="docutils literal"><span class="pre">singlethread</span></tt> argument. The
+<tt class="docutils literal"><span class="pre">acquire</span></tt> and <tt class="docutils literal"><span class="pre">acq_rel</span></tt> orderings aren’t valid on <tt class="docutils literal"><span class="pre">store</span></tt>
+instructions. Atomic loads produce <a class="reference internal" href="#memmodel"><em>defined</em></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.
+<tt class="docutils literal"><span class="pre">align</span></tt> 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. <tt class="docutils literal"><span class="pre">!nontemporal</span></tt> does not
+have any defined semantics for atomic stores.</p>
+<p>The optional constant <tt class="docutils literal"><span class="pre">align</span></tt> argument specifies the alignment of the
+operation (that is, the alignment of the memory address). A value of 0
+or an omitted <tt class="docutils literal"><span class="pre">align</span></tt> argument means that the operation has the ABI
+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. The maximum possible alignment is <tt class="docutils literal"><span class="pre">1</span> <span class="pre"><<</span> <span class="pre">29</span></tt>.</p>
+<p>The optional <tt class="docutils literal"><span class="pre">!nontemporal</span></tt> metadata must reference a single metadata
+name <tt class="docutils literal"><span class="pre"><index></span></tt> corresponding to a metadata node with one <tt class="docutils literal"><span class="pre">i32</span></tt> entry of
+value 1. The existence of the <tt class="docutils literal"><span class="pre">!nontemporal</span></tt> metadata 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>
+</div>
+<div class="section" id="id161">
+<h5><a class="toc-backref" href="#id831">Semantics:</a><a class="headerlink" href="#id161" title="Permalink to this headline">¶</a></h5>
+<p>The contents of memory are updated to contain <tt class="docutils literal"><span class="pre"><value></span></tt> at the
+location specified by the <tt class="docutils literal"><span class="pre"><pointer></span></tt> operand. If <tt class="docutils literal"><span class="pre"><value></span></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 class="docutils literal"><span class="pre">i24</span></tt> writes at most three bytes. When writing a
+value of a type like <tt class="docutils literal"><span class="pre">i20</span></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>
+</div>
+<div class="section" id="id162">
+<h5><a class="toc-backref" href="#id832">Example:</a><a class="headerlink" href="#id162" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%ptr</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i32</span>                               <span class="c">; yields i32*:ptr</span>
+<span class="k">store</span> <span class="k">i32</span> <span class="m">3</span><span class="p">,</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%ptr</span>                          <span class="c">; yields void</span>
+<span class="nv">%val</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%ptr</span>                           <span class="c">; yields i32:val = i32 3</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="fence-instruction">
+<span id="i-fence"></span><h4><a class="toc-backref" href="#id833">‘<tt class="docutils literal"><span class="pre">fence</span></tt>‘ Instruction</a><a class="headerlink" href="#fence-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id163">
+<h5><a class="toc-backref" href="#id834">Syntax:</a><a class="headerlink" href="#id163" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>fence [singlethread] <ordering>                   ; yields void</pre>
+</div>
+</div>
+<div class="section" id="id164">
+<h5><a class="toc-backref" href="#id835">Overview:</a><a class="headerlink" href="#id164" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fence</span></tt>‘ instruction is used to introduce happens-before edges
+between operations.</p>
+</div>
+<div class="section" id="id165">
+<h5><a class="toc-backref" href="#id836">Arguments:</a><a class="headerlink" href="#id165" title="Permalink to this headline">¶</a></h5>
+<p>‘<tt class="docutils literal"><span class="pre">fence</span></tt>‘ instructions take an <a class="reference internal" href="#ordering"><em>ordering</em></a> argument which
+defines what <em>synchronizes-with</em> edges they add. They can only be given
+<tt class="docutils literal"><span class="pre">acquire</span></tt>, <tt class="docutils literal"><span class="pre">release</span></tt>, <tt class="docutils literal"><span class="pre">acq_rel</span></tt>, and <tt class="docutils literal"><span class="pre">seq_cst</span></tt> orderings.</p>
+</div>
+<div class="section" id="id166">
+<h5><a class="toc-backref" href="#id837">Semantics:</a><a class="headerlink" href="#id166" title="Permalink to this headline">¶</a></h5>
+<p>A fence A which has (at least) <tt class="docutils literal"><span class="pre">release</span></tt> ordering semantics
+<em>synchronizes with</em> a fence B with (at least) <tt class="docutils literal"><span class="pre">acquire</span></tt> ordering
+semantics if and only if there exist atomic operations X and Y, both
+operating on some atomic object M, such that A is sequenced before X, X
+modifies M (either directly or through some side effect of a sequence
+headed by X), Y is sequenced before B, and Y observes M. This provides a
+<em>happens-before</em> dependency between A and B. Rather than an explicit
+<tt class="docutils literal"><span class="pre">fence</span></tt>, one (but not both) of the atomic operations X or Y might
+provide a <tt class="docutils literal"><span class="pre">release</span></tt> or <tt class="docutils literal"><span class="pre">acquire</span></tt> (resp.) ordering constraint and
+still <em>synchronize-with</em> the explicit <tt class="docutils literal"><span class="pre">fence</span></tt> and establish the
+<em>happens-before</em> edge.</p>
+<p>A <tt class="docutils literal"><span class="pre">fence</span></tt> which has <tt class="docutils literal"><span class="pre">seq_cst</span></tt> ordering, in addition to having both
+<tt class="docutils literal"><span class="pre">acquire</span></tt> and <tt class="docutils literal"><span class="pre">release</span></tt> semantics specified above, participates in
+the global program order of other <tt class="docutils literal"><span class="pre">seq_cst</span></tt> operations and/or fences.</p>
+<p>The optional “<a class="reference internal" href="#singlethread"><em>singlethread</em></a>” argument specifies
+that the fence only synchronizes with other fences in the same thread.
+(This is useful for interacting with signal handlers.)</p>
+</div>
+<div class="section" id="id167">
+<h5><a class="toc-backref" href="#id838">Example:</a><a class="headerlink" href="#id167" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>fence acquire                          ; yields void
+fence singlethread seq_cst             ; yields void</pre>
+</div>
+</div>
+</div>
+<div class="section" id="cmpxchg-instruction">
+<span id="i-cmpxchg"></span><h4><a class="toc-backref" href="#id839">‘<tt class="docutils literal"><span class="pre">cmpxchg</span></tt>‘ Instruction</a><a class="headerlink" href="#cmpxchg-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id168">
+<h5><a class="toc-backref" href="#id840">Syntax:</a><a class="headerlink" href="#id168" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>cmpxchg [weak] [volatile] <ty>* <pointer>, <ty> <cmp>, <ty> <new> [singlethread] <success ordering> <failure ordering> ; yields  { ty, i1 }</pre>
+</div>
+</div>
+<div class="section" id="id169">
+<h5><a class="toc-backref" href="#id841">Overview:</a><a class="headerlink" href="#id169" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">cmpxchg</span></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 tries to store a new value into the memory.</p>
+</div>
+<div class="section" id="id170">
+<h5><a class="toc-backref" href="#id842">Arguments:</a><a class="headerlink" href="#id170" title="Permalink to this headline">¶</a></h5>
+<p>There are three arguments to the ‘<tt class="docutils literal"><span class="pre">cmpxchg</span></tt>‘ 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 ‘<cmp>’ 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. ‘<cmp>’ and ‘<new>’ must have the same
+type, and the type of ‘<pointer>’ must be a pointer to that type. If the
+<tt class="docutils literal"><span class="pre">cmpxchg</span></tt> is marked as <tt class="docutils literal"><span class="pre">volatile</span></tt>, then the optimizer is not allowed
+to modify the number or order of execution of this <tt class="docutils literal"><span class="pre">cmpxchg</span></tt> with
+other <a class="reference internal" href="#volatile"><em>volatile operations</em></a>.</p>
+<p>The success and failure <a class="reference internal" href="#ordering"><em>ordering</em></a> arguments specify how this
+<tt class="docutils literal"><span class="pre">cmpxchg</span></tt> synchronizes with other atomic operations. Both ordering parameters
+must be at least <tt class="docutils literal"><span class="pre">monotonic</span></tt>, the ordering constraint on failure must be no
+stronger than that on success, and the failure ordering cannot be either
+<tt class="docutils literal"><span class="pre">release</span></tt> or <tt class="docutils literal"><span class="pre">acq_rel</span></tt>.</p>
+<p>The optional “<tt class="docutils literal"><span class="pre">singlethread</span></tt>” argument declares that the <tt class="docutils literal"><span class="pre">cmpxchg</span></tt>
+is only atomic with respect to code (usually signal handlers) running in
+the same thread as the <tt class="docutils literal"><span class="pre">cmpxchg</span></tt>. 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.</p>
+</div>
+<div class="section" id="id171">
+<h5><a class="toc-backref" href="#id843">Semantics:</a><a class="headerlink" href="#id171" title="Permalink to this headline">¶</a></h5>
+<p>The contents of memory at the location specified by the ‘<tt class="docutils literal"><span class="pre"><pointer></span></tt>‘ operand
+is read and compared to ‘<tt class="docutils literal"><span class="pre"><cmp></span></tt>‘; if the read value is the equal, the
+‘<tt class="docutils literal"><span class="pre"><new></span></tt>‘ is written. The original value at the location is returned, together
+with a flag indicating success (true) or failure (false).</p>
+<p>If the cmpxchg operation is marked as <tt class="docutils literal"><span class="pre">weak</span></tt> then a spurious failure is
+permitted: the operation may not write <tt class="docutils literal"><span class="pre"><new></span></tt> even if the comparison
+matched.</p>
+<p>If the cmpxchg operation is strong (the default), the i1 value is 1 if and only
+if the value loaded equals <tt class="docutils literal"><span class="pre">cmp</span></tt>.</p>
+<p>A successful <tt class="docutils literal"><span class="pre">cmpxchg</span></tt> is a read-modify-write instruction for the purpose of
+identifying release sequences. A failed <tt class="docutils literal"><span class="pre">cmpxchg</span></tt> is equivalent to an atomic
+load with an ordering parameter determined the second ordering parameter.</p>
+</div>
+<div class="section" id="id172">
+<h5><a class="toc-backref" href="#id844">Example:</a><a class="headerlink" href="#id172" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>entry:
+  %orig = atomic load i32* %ptr unordered                   ; yields i32
+  br label %loop
+
+loop:
+  %cmp = phi i32 [ %orig, %entry ], [%old, %loop]
+  %squared = mul i32 %cmp, %cmp
+  %val_success = cmpxchg i32* %ptr, i32 %cmp, i32 %squared acq_rel monotonic ; yields  { i32, i1 }
+  %value_loaded = extractvalue { i32, i1 } %val_success, 0
+  %success = extractvalue { i32, i1 } %val_success, 1
+  br i1 %success, label %done, label %loop
+
+done:
+  ...</pre>
+</div>
+</div>
+</div>
+<div class="section" id="atomicrmw-instruction">
+<span id="i-atomicrmw"></span><h4><a class="toc-backref" href="#id845">‘<tt class="docutils literal"><span class="pre">atomicrmw</span></tt>‘ Instruction</a><a class="headerlink" href="#atomicrmw-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id173">
+<h5><a class="toc-backref" href="#id846">Syntax:</a><a class="headerlink" href="#id173" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>atomicrmw [volatile] <operation> <ty>* <pointer>, <ty> <value> [singlethread] <ordering>                   ; yields ty</pre>
+</div>
+</div>
+<div class="section" id="id174">
+<h5><a class="toc-backref" href="#id847">Overview:</a><a class="headerlink" href="#id174" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">atomicrmw</span></tt>‘ instruction is used to atomically modify memory.</p>
+</div>
+<div class="section" id="id175">
+<h5><a class="toc-backref" href="#id848">Arguments:</a><a class="headerlink" href="#id175" title="Permalink to this headline">¶</a></h5>
+<p>There are three arguments to the ‘<tt class="docutils literal"><span class="pre">atomicrmw</span></tt>‘ 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 class="simple">
+<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 ‘<value>’ 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 ‘<tt class="docutils literal"><span class="pre"><pointer></span></tt>‘ operand must
+be a pointer to that type. If the <tt class="docutils literal"><span class="pre">atomicrmw</span></tt> is marked as
+<tt class="docutils literal"><span class="pre">volatile</span></tt>, then the optimizer is not allowed to modify the number or
+order of execution of this <tt class="docutils literal"><span class="pre">atomicrmw</span></tt> with other <a class="reference internal" href="#volatile"><em>volatile
+operations</em></a>.</p>
+</div>
+<div class="section" id="id176">
+<h5><a class="toc-backref" href="#id849">Semantics:</a><a class="headerlink" href="#id176" title="Permalink to this headline">¶</a></h5>
+<p>The contents of memory at the location specified by the ‘<tt class="docutils literal"><span class="pre"><pointer></span></tt>‘
+operand are atomically read, modified, and written back. The original
+value at the location is returned. The modification is specified by the
+operation argument:</p>
+<ul class="simple">
+<li>xchg: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">val</span></tt></li>
+<li>add: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">+</span> <span class="pre">val</span></tt></li>
+<li>sub: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">-</span> <span class="pre">val</span></tt></li>
+<li>and: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">&</span> <span class="pre">val</span></tt></li>
+<li>nand: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">~(*ptr</span> <span class="pre">&</span> <span class="pre">val)</span></tt></li>
+<li>or: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">|</span> <span class="pre">val</span></tt></li>
+<li>xor: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">^</span> <span class="pre">val</span></tt></li>
+<li>max: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">></span> <span class="pre">val</span> <span class="pre">?</span> <span class="pre">*ptr</span> <span class="pre">:</span> <span class="pre">val</span></tt> (using a signed comparison)</li>
+<li>min: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre"><</span> <span class="pre">val</span> <span class="pre">?</span> <span class="pre">*ptr</span> <span class="pre">:</span> <span class="pre">val</span></tt> (using a signed comparison)</li>
+<li>umax: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre">></span> <span class="pre">val</span> <span class="pre">?</span> <span class="pre">*ptr</span> <span class="pre">:</span> <span class="pre">val</span></tt> (using an unsigned
+comparison)</li>
+<li>umin: <tt class="docutils literal"><span class="pre">*ptr</span> <span class="pre">=</span> <span class="pre">*ptr</span> <span class="pre"><</span> <span class="pre">val</span> <span class="pre">?</span> <span class="pre">*ptr</span> <span class="pre">:</span> <span class="pre">val</span></tt> (using an unsigned
+comparison)</li>
+</ul>
+</div>
+<div class="section" id="id177">
+<h5><a class="toc-backref" href="#id850">Example:</a><a class="headerlink" href="#id177" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>%old = atomicrmw add i32* %ptr, i32 1 acquire                        ; yields i32</pre>
+</div>
+</div>
+</div>
+<div class="section" id="getelementptr-instruction">
+<span id="i-getelementptr"></span><h4><a class="toc-backref" href="#id851">‘<tt class="docutils literal"><span class="pre">getelementptr</span></tt>‘ Instruction</a><a class="headerlink" href="#getelementptr-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id178">
+<h5><a class="toc-backref" href="#id852">Syntax:</a><a class="headerlink" href="#id178" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = getelementptr <pty>* <ptrval>{, <ty> <idx>}*
+<result> = getelementptr inbounds <pty>* <ptrval>{, <ty> <idx>}*
+<result> = getelementptr <ptr vector> ptrval, <vector index type> idx</pre>
+</div>
+</div>
+<div class="section" id="id179">
+<h5><a class="toc-backref" href="#id853">Overview:</a><a class="headerlink" href="#id179" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">getelementptr</span></tt>‘ instruction is used to get the address of a
+subelement of an <a class="reference internal" href="#t-aggregate"><em>aggregate</em></a> data structure. It performs
+address calculation only and does not access memory.</p>
+</div>
+<div class="section" id="id180">
+<h5><a class="toc-backref" href="#id854">Arguments:</a><a class="headerlink" href="#id180" title="Permalink to this headline">¶</a></h5>
+<p>The first argument is always a pointer or a vector of pointers, 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 class="docutils literal"><span class="pre">i32</span></tt> integer
+<strong>constants</strong> are allowed (when using a vector of indices they must all
+be the <strong>same</strong> <tt class="docutils literal"><span class="pre">i32</span></tt> integer constant). 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>
+<div class="highlight-c"><div class="highlight"><pre><span class="k">struct</span> <span class="n">RT</span> <span class="p">{</span>
+  <span class="kt">char</span> <span class="n">A</span><span class="p">;</span>
+  <span class="kt">int</span> <span class="n">B</span><span class="p">[</span><span class="mi">10</span><span class="p">][</span><span class="mi">20</span><span class="p">];</span>
+  <span class="kt">char</span> <span class="n">C</span><span class="p">;</span>
+<span class="p">};</span>
+<span class="k">struct</span> <span class="n">ST</span> <span class="p">{</span>
+  <span class="kt">int</span> <span class="n">X</span><span class="p">;</span>
+  <span class="kt">double</span> <span class="n">Y</span><span class="p">;</span>
+  <span class="k">struct</span> <span class="n">RT</span> <span class="n">Z</span><span class="p">;</span>
+<span class="p">};</span>
+
+<span class="kt">int</span> <span class="o">*</span><span class="nf">foo</span><span class="p">(</span><span class="k">struct</span> <span class="n">ST</span> <span class="o">*</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span>
+  <span class="k">return</span> <span class="o">&</span><span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">Z</span><span class="p">.</span><span class="n">B</span><span class="p">[</span><span class="mi">5</span><span class="p">][</span><span class="mi">13</span><span class="p">];</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>The LLVM code generated by Clang is:</p>
+<div class="highlight-llvm"><pre>%struct.RT = type { i8, [10 x [20 x i32]], i8 }
+%struct.ST = type { i32, double, %struct.RT }
+
+define i32* @foo(%struct.ST* %s) nounwind uwtable readnone optsize ssp {
+entry:
+  %arrayidx = getelementptr inbounds %struct.ST* %s, i64 1, i32 2, i32 1, i64 5, i64 13
+  ret i32* %arrayidx
+}</pre>
+</div>
+</div>
+<div class="section" id="id181">
+<h5><a class="toc-backref" href="#id855">Semantics:</a><a class="headerlink" href="#id181" title="Permalink to this headline">¶</a></h5>
+<p>In the example above, the first index is indexing into the
+‘<tt class="docutils literal"><span class="pre">%struct.ST*</span></tt>‘ type, which is a pointer, yielding a ‘<tt class="docutils literal"><span class="pre">%struct.ST</span></tt>‘
+= ‘<tt class="docutils literal"><span class="pre">{</span> <span class="pre">i32,</span> <span class="pre">double,</span> <span class="pre">%struct.RT</span> <span class="pre">}</span></tt>‘ type, a structure. The second index
+indexes into the third element of the structure, yielding a
+‘<tt class="docutils literal"><span class="pre">%struct.RT</span></tt>‘ = ‘<tt class="docutils literal"><span class="pre">{</span> <span class="pre">i8</span> <span class="pre">,</span> <span class="pre">[10</span> <span class="pre">x</span> <span class="pre">[20</span> <span class="pre">x</span> <span class="pre">i32]],</span> <span class="pre">i8</span> <span class="pre">}</span></tt>‘ type, another
+structure. The third index indexes into the second element of the
+structure, yielding a ‘<tt class="docutils literal"><span class="pre">[10</span> <span class="pre">x</span> <span class="pre">[20</span> <span class="pre">x</span> <span class="pre">i32]]</span></tt>‘ type, an array. The two
+dimensions of the array are subscripted into, yielding an ‘<tt class="docutils literal"><span class="pre">i32</span></tt>‘
+type. The ‘<tt class="docutils literal"><span class="pre">getelementptr</span></tt>‘ instruction returns a pointer to this
+element, thus computing a value of ‘<tt class="docutils literal"><span class="pre">i32*</span></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>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">define</span> <span class="k">i32</span><span class="p">*</span> <span class="vg">@foo</span><span class="p">(</span><span class="nv">%struct.ST</span><span class="p">*</span> <span class="nv">%s</span><span class="p">)</span> <span class="p">{</span>
+  <span class="nv">%t1</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="nv">%struct.ST</span><span class="p">*</span> <span class="nv">%s</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span>                 <span class="c">; yields %struct.ST*:%t1</span>
+  <span class="nv">%t2</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="nv">%struct.ST</span><span class="p">*</span> <span class="nv">%t1</span><span class="p">,</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">2</span>         <span class="c">; yields %struct.RT*:%t2</span>
+  <span class="nv">%t3</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="nv">%struct.RT</span><span class="p">*</span> <span class="nv">%t2</span><span class="p">,</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span>         <span class="c">; yields [10 x [20 x i32]]*:%t3</span>
+  <span class="nv">%t4</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">[</span><span class="m">10</span> <span class="k">x</span> <span class="p">[</span><span class="m">20</span> <span class="k">x</span> <span class="k">i32</span><span class="p">]]*</span> <span class="nv">%t3</span><span class="p">,</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">5</span>  <span class="c">; yields [20 x i32]*:%t4</span>
+  <span class="nv">%t5</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">[</span><span class="m">20</span> <span class="k">x</span> <span class="k">i32</span><span class="p">]*</span> <span class="nv">%t4</span><span class="p">,</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">13</span>        <span class="c">; yields i32*:%t5</span>
+  <span class="k">ret</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%t5</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>If the <tt class="docutils literal"><span class="pre">inbounds</span></tt> keyword is present, the result value of the
+<tt class="docutils literal"><span class="pre">getelementptr</span></tt> is a <a class="reference internal" href="#poisonvalues"><em>poison value</em></a> if the base
+pointer is not an <em>in bounds</em> 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 <em>in bounds</em> address of that
+allocated object. The <em>in bounds</em> addresses for an allocated object are
+all the addresses that point into the object, plus the address one byte
+past the end. In cases where the base is a vector of pointers the
+<tt class="docutils literal"><span class="pre">inbounds</span></tt> keyword applies to each of the computations element-wise.</p>
+<p>If the <tt class="docutils literal"><span class="pre">inbounds</span></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 class="docutils literal"><span class="pre">getelementptr</span></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 class="reference internal" href="#pointeraliasing"><em>Pointer Aliasing Rules</em></a> section for more
+information.</p>
+<p>The getelementptr instruction is often confusing. For some more insight
+into how it works, see <a class="reference internal" href="GetElementPtr.html"><em>the getelementptr FAQ</em></a>.</p>
+</div>
+<div class="section" id="id182">
+<h5><a class="toc-backref" href="#id856">Example:</a><a class="headerlink" href="#id182" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="c">; yields [12 x i8]*:aptr</span>
+<span class="nv">%aptr</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="p">[</span><span class="m">12</span> <span class="k">x</span> <span class="k">i8</span><span class="p">]}*</span> <span class="nv">%saptr</span><span class="p">,</span> <span class="k">i64</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span>
+<span class="c">; yields i8*:vptr</span>
+<span class="nv">%vptr</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i8</span><span class="p">>}*</span> <span class="nv">%svptr</span><span class="p">,</span> <span class="k">i64</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span>
+<span class="c">; yields i8*:eptr</span>
+<span class="nv">%eptr</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">[</span><span class="m">12</span> <span class="k">x</span> <span class="k">i8</span><span class="p">]*</span> <span class="nv">%aptr</span><span class="p">,</span> <span class="k">i64</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">1</span>
+<span class="c">; yields i32*:iptr</span>
+<span class="nv">%iptr</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">[</span><span class="m">10</span> <span class="k">x</span> <span class="k">i32</span><span class="p">]*</span> <span class="vg">@arr</span><span class="p">,</span> <span class="k">i16</span> <span class="m">0</span><span class="p">,</span> <span class="k">i16</span> <span class="m">0</span>
+</pre></div>
+</div>
+<p>In cases where the pointer argument is a vector of pointers, each index
+must be a vector with the same number of elements. For example:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%A</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p"><</span><span class="m">4</span> <span class="k">x</span> <span class="k">i8</span><span class="p">*></span> <span class="nv">%ptrs</span><span class="p">,</span> <span class="p"><</span><span class="m">4</span> <span class="k">x</span> <span class="k">i64</span><span class="p">></span> <span class="nv">%offsets</span><span class="p">,</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="conversion-operations">
+<h3><a class="toc-backref" href="#id857">Conversion Operations</a><a class="headerlink" href="#conversion-operations" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="section" id="trunc-to-instruction">
+<h4><a class="toc-backref" href="#id858">‘<tt class="docutils literal"><span class="pre">trunc</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#trunc-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id183">
+<h5><a class="toc-backref" href="#id859">Syntax:</a><a class="headerlink" href="#id183" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = trunc <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id184">
+<h5><a class="toc-backref" href="#id860">Overview:</a><a class="headerlink" href="#id184" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">trunc</span></tt>‘ instruction truncates its operand to the type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id185">
+<h5><a class="toc-backref" href="#id861">Arguments:</a><a class="headerlink" href="#id185" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">trunc</span></tt>‘ instruction takes a value to trunc, and a type to trunc
+it to. Both types must be of <a class="reference internal" href="#t-integer"><em>integer</em></a> types, or vectors
+of the same number of integers. The bit size of the <tt class="docutils literal"><span class="pre">value</span></tt> must be
+larger than the bit size of the destination type, <tt class="docutils literal"><span class="pre">ty2</span></tt>. Equal sized
+types are not allowed.</p>
+</div>
+<div class="section" id="id186">
+<h5><a class="toc-backref" href="#id862">Semantics:</a><a class="headerlink" href="#id186" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">trunc</span></tt>‘ instruction truncates the high order bits in <tt class="docutils literal"><span class="pre">value</span></tt>
+and converts the remaining bits to <tt class="docutils literal"><span class="pre">ty2</span></tt>. Since the source size must
+be larger than the destination size, <tt class="docutils literal"><span class="pre">trunc</span></tt> cannot be a <em>no-op cast</em>.
+It will always truncate bits.</p>
+</div>
+<div class="section" id="id187">
+<h5><a class="toc-backref" href="#id863">Example:</a><a class="headerlink" href="#id187" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">trunc</span> <span class="k">i32</span> <span class="m">257</span> <span class="k">to</span> <span class="k">i8</span>                        <span class="c">; yields i8:1</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">trunc</span> <span class="k">i32</span> <span class="m">123</span> <span class="k">to</span> <span class="k">i1</span>                        <span class="c">; yields i1:true</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">trunc</span> <span class="k">i32</span> <span class="m">122</span> <span class="k">to</span> <span class="k">i1</span>                        <span class="c">; yields i1:false</span>
+<span class="nv">%W</span> <span class="p">=</span> <span class="k">trunc</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i16</span><span class="p">></span> <span class="p"><</span><span class="k">i16</span> <span class="m">8</span><span class="p">,</span> <span class="k">i16</span> <span class="m">7</span><span class="p">></span> <span class="k">to</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i8</span><span class="p">></span> <span class="c">; yields <i8 8, i8 7></span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="zext-to-instruction">
+<h4><a class="toc-backref" href="#id864">‘<tt class="docutils literal"><span class="pre">zext</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#zext-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id188">
+<h5><a class="toc-backref" href="#id865">Syntax:</a><a class="headerlink" href="#id188" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = zext <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id189">
+<h5><a class="toc-backref" href="#id866">Overview:</a><a class="headerlink" href="#id189" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">zext</span></tt>‘ instruction zero extends its operand to type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id190">
+<h5><a class="toc-backref" href="#id867">Arguments:</a><a class="headerlink" href="#id190" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">zext</span></tt>‘ instruction takes a value to cast, and a type to cast it
+to. Both types must be of <a class="reference internal" href="#t-integer"><em>integer</em></a> types, or vectors of
+the same number of integers. The bit size of the <tt class="docutils literal"><span class="pre">value</span></tt> must be
+smaller than the bit size of the destination type, <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id191">
+<h5><a class="toc-backref" href="#id868">Semantics:</a><a class="headerlink" href="#id191" title="Permalink to this headline">¶</a></h5>
+<p>The <tt class="docutils literal"><span class="pre">zext</span></tt> fills the high order bits of the <tt class="docutils literal"><span class="pre">value</span></tt> with zero bits
+until it reaches the size of the destination type, <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+<p>When zero extending from i1, the result will always be either 0 or 1.</p>
+</div>
+<div class="section" id="id192">
+<h5><a class="toc-backref" href="#id869">Example:</a><a class="headerlink" href="#id192" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">zext</span> <span class="k">i32</span> <span class="m">257</span> <span class="k">to</span> <span class="k">i64</span>              <span class="c">; yields i64:257</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">zext</span> <span class="k">i1</span> <span class="k">true</span> <span class="k">to</span> <span class="k">i32</span>              <span class="c">; yields i32:1</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">zext</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i16</span><span class="p">></span> <span class="p"><</span><span class="k">i16</span> <span class="m">8</span><span class="p">,</span> <span class="k">i16</span> <span class="m">7</span><span class="p">></span> <span class="k">to</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i32</span><span class="p">></span> <span class="c">; yields <i32 8, i32 7></span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="sext-to-instruction">
+<h4><a class="toc-backref" href="#id870">‘<tt class="docutils literal"><span class="pre">sext</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#sext-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id193">
+<h5><a class="toc-backref" href="#id871">Syntax:</a><a class="headerlink" href="#id193" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = sext <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id194">
+<h5><a class="toc-backref" href="#id872">Overview:</a><a class="headerlink" href="#id194" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sext</span></tt>‘ sign extends <tt class="docutils literal"><span class="pre">value</span></tt> to the type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id195">
+<h5><a class="toc-backref" href="#id873">Arguments:</a><a class="headerlink" href="#id195" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sext</span></tt>‘ instruction takes a value to cast, and a type to cast it
+to. Both types must be of <a class="reference internal" href="#t-integer"><em>integer</em></a> types, or vectors of
+the same number of integers. The bit size of the <tt class="docutils literal"><span class="pre">value</span></tt> must be
+smaller than the bit size of the destination type, <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id196">
+<h5><a class="toc-backref" href="#id874">Semantics:</a><a class="headerlink" href="#id196" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sext</span></tt>‘ instruction performs a sign extension by copying the sign
+bit (highest order bit) of the <tt class="docutils literal"><span class="pre">value</span></tt> until it reaches the bit size
+of the type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+<p>When sign extending from i1, the extension always results in -1 or 0.</p>
+</div>
+<div class="section" id="id197">
+<h5><a class="toc-backref" href="#id875">Example:</a><a class="headerlink" href="#id197" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">sext</span> <span class="k">i8</span>  <span class="m">-1</span> <span class="k">to</span> <span class="k">i16</span>              <span class="c">; yields i16   :65535</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">sext</span> <span class="k">i1</span> <span class="k">true</span> <span class="k">to</span> <span class="k">i32</span>             <span class="c">; yields i32:-1</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">sext</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i16</span><span class="p">></span> <span class="p"><</span><span class="k">i16</span> <span class="m">8</span><span class="p">,</span> <span class="k">i16</span> <span class="m">7</span><span class="p">></span> <span class="k">to</span> <span class="p"><</span><span class="m">2</span> <span class="k">x</span> <span class="k">i32</span><span class="p">></span> <span class="c">; yields <i32 8, i32 7></span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="fptrunc-to-instruction">
+<h4><a class="toc-backref" href="#id876">‘<tt class="docutils literal"><span class="pre">fptrunc</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#fptrunc-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id198">
+<h5><a class="toc-backref" href="#id877">Syntax:</a><a class="headerlink" href="#id198" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fptrunc <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id199">
+<h5><a class="toc-backref" href="#id878">Overview:</a><a class="headerlink" href="#id199" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptrunc</span></tt>‘ instruction truncates <tt class="docutils literal"><span class="pre">value</span></tt> to type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id200">
+<h5><a class="toc-backref" href="#id879">Arguments:</a><a class="headerlink" href="#id200" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptrunc</span></tt>‘ instruction takes a <a class="reference internal" href="#t-floating"><em>floating point</em></a>
+value to cast and a <a class="reference internal" href="#t-floating"><em>floating point</em></a> type to cast it to.
+The size of <tt class="docutils literal"><span class="pre">value</span></tt> must be larger than the size of <tt class="docutils literal"><span class="pre">ty2</span></tt>. This
+implies that <tt class="docutils literal"><span class="pre">fptrunc</span></tt> cannot be used to make a <em>no-op cast</em>.</p>
+</div>
+<div class="section" id="id201">
+<h5><a class="toc-backref" href="#id880">Semantics:</a><a class="headerlink" href="#id201" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptrunc</span></tt>‘ instruction truncates a <tt class="docutils literal"><span class="pre">value</span></tt> from a larger
+<a class="reference internal" href="#t-floating"><em>floating point</em></a> type to a smaller <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> type. If the value cannot fit within the
+destination type, <tt class="docutils literal"><span class="pre">ty2</span></tt>, then the results are undefined.</p>
+</div>
+<div class="section" id="id202">
+<h5><a class="toc-backref" href="#id881">Example:</a><a class="headerlink" href="#id202" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">fptrunc</span> <span class="kt">double</span> <span class="m">123.0</span> <span class="k">to</span> <span class="kt">float</span>         <span class="c">; yields float:123.0</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">fptrunc</span> <span class="kt">double</span> <span class="m">1.0E+300</span> <span class="k">to</span> <span class="kt">float</span>      <span class="c">; yields undefined</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="fpext-to-instruction">
+<h4><a class="toc-backref" href="#id882">‘<tt class="docutils literal"><span class="pre">fpext</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#fpext-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id203">
+<h5><a class="toc-backref" href="#id883">Syntax:</a><a class="headerlink" href="#id203" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fpext <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id204">
+<h5><a class="toc-backref" href="#id884">Overview:</a><a class="headerlink" href="#id204" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fpext</span></tt>‘ extends a floating point <tt class="docutils literal"><span class="pre">value</span></tt> to a larger floating
+point value.</p>
+</div>
+<div class="section" id="id205">
+<h5><a class="toc-backref" href="#id885">Arguments:</a><a class="headerlink" href="#id205" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fpext</span></tt>‘ instruction takes a <a class="reference internal" href="#t-floating"><em>floating point</em></a>
+<tt class="docutils literal"><span class="pre">value</span></tt> to cast, and a <a class="reference internal" href="#t-floating"><em>floating point</em></a> type to cast it
+to. The source type must be smaller than the destination type.</p>
+</div>
+<div class="section" id="id206">
+<h5><a class="toc-backref" href="#id886">Semantics:</a><a class="headerlink" href="#id206" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fpext</span></tt>‘ instruction extends the <tt class="docutils literal"><span class="pre">value</span></tt> from a smaller
+<a class="reference internal" href="#t-floating"><em>floating point</em></a> type to a larger <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> type. The <tt class="docutils literal"><span class="pre">fpext</span></tt> cannot be used to make a
+<em>no-op cast</em> because it always changes bits. Use <tt class="docutils literal"><span class="pre">bitcast</span></tt> to make a
+<em>no-op cast</em> for a floating point cast.</p>
+</div>
+<div class="section" id="id207">
+<h5><a class="toc-backref" href="#id887">Example:</a><a class="headerlink" href="#id207" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">fpext</span> <span class="kt">float</span> <span class="m">3.125</span> <span class="k">to</span> <span class="kt">double</span>         <span class="c">; yields double:3.125000e+00</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">fpext</span> <span class="kt">double</span> <span class="nv">%X</span> <span class="k">to</span> <span class="kt">fp128</span>            <span class="c">; yields fp128:0xL00000000000000004000900000000000</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="fptoui-to-instruction">
+<h4><a class="toc-backref" href="#id888">‘<tt class="docutils literal"><span class="pre">fptoui</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#fptoui-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id208">
+<h5><a class="toc-backref" href="#id889">Syntax:</a><a class="headerlink" href="#id208" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fptoui <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id209">
+<h5><a class="toc-backref" href="#id890">Overview:</a><a class="headerlink" href="#id209" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptoui</span></tt>‘ converts a floating point <tt class="docutils literal"><span class="pre">value</span></tt> to its unsigned
+integer equivalent of type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id210">
+<h5><a class="toc-backref" href="#id891">Arguments:</a><a class="headerlink" href="#id210" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptoui</span></tt>‘ instruction takes a value to cast, which must be a
+scalar or vector <a class="reference internal" href="#t-floating"><em>floating point</em></a> value, and a type to
+cast it to <tt class="docutils literal"><span class="pre">ty2</span></tt>, which must be an <a class="reference internal" href="#t-integer"><em>integer</em></a> type. If
+<tt class="docutils literal"><span class="pre">ty</span></tt> is a vector floating point type, <tt class="docutils literal"><span class="pre">ty2</span></tt> must be a vector integer
+type with the same number of elements as <tt class="docutils literal"><span class="pre">ty</span></tt></p>
+</div>
+<div class="section" id="id211">
+<h5><a class="toc-backref" href="#id892">Semantics:</a><a class="headerlink" href="#id211" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptoui</span></tt>‘ instruction converts its <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> operand into the nearest (rounding towards zero)
+unsigned integer value. If the value cannot fit in <tt class="docutils literal"><span class="pre">ty2</span></tt>, the results
+are undefined.</p>
+</div>
+<div class="section" id="id212">
+<h5><a class="toc-backref" href="#id893">Example:</a><a class="headerlink" href="#id212" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>%X = fptoui double 123.0 to i32      ; yields i32:123
+%Y = fptoui float 1.0E+300 to i1     ; yields undefined:1
+%Z = fptoui float 1.04E+17 to i8     ; yields undefined:1</pre>
+</div>
+</div>
+</div>
+<div class="section" id="fptosi-to-instruction">
+<h4><a class="toc-backref" href="#id894">‘<tt class="docutils literal"><span class="pre">fptosi</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#fptosi-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id213">
+<h5><a class="toc-backref" href="#id895">Syntax:</a><a class="headerlink" href="#id213" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fptosi <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id214">
+<h5><a class="toc-backref" href="#id896">Overview:</a><a class="headerlink" href="#id214" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptosi</span></tt>‘ instruction converts <a class="reference internal" href="#t-floating"><em>floating point</em></a>
+<tt class="docutils literal"><span class="pre">value</span></tt> to type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id215">
+<h5><a class="toc-backref" href="#id897">Arguments:</a><a class="headerlink" href="#id215" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptosi</span></tt>‘ instruction takes a value to cast, which must be a
+scalar or vector <a class="reference internal" href="#t-floating"><em>floating point</em></a> value, and a type to
+cast it to <tt class="docutils literal"><span class="pre">ty2</span></tt>, which must be an <a class="reference internal" href="#t-integer"><em>integer</em></a> type. If
+<tt class="docutils literal"><span class="pre">ty</span></tt> is a vector floating point type, <tt class="docutils literal"><span class="pre">ty2</span></tt> must be a vector integer
+type with the same number of elements as <tt class="docutils literal"><span class="pre">ty</span></tt></p>
+</div>
+<div class="section" id="id216">
+<h5><a class="toc-backref" href="#id898">Semantics:</a><a class="headerlink" href="#id216" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fptosi</span></tt>‘ instruction converts its <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> operand into the nearest (rounding towards zero)
+signed integer value. If the value cannot fit in <tt class="docutils literal"><span class="pre">ty2</span></tt>, the results
+are undefined.</p>
+</div>
+<div class="section" id="id217">
+<h5><a class="toc-backref" href="#id899">Example:</a><a class="headerlink" href="#id217" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>%X = fptosi double -123.0 to i32      ; yields i32:-123
+%Y = fptosi float 1.0E-247 to i1      ; yields undefined:1
+%Z = fptosi float 1.04E+17 to i8      ; yields undefined:1</pre>
+</div>
+</div>
+</div>
+<div class="section" id="uitofp-to-instruction">
+<h4><a class="toc-backref" href="#id900">‘<tt class="docutils literal"><span class="pre">uitofp</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#uitofp-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id218">
+<h5><a class="toc-backref" href="#id901">Syntax:</a><a class="headerlink" href="#id218" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = uitofp <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id219">
+<h5><a class="toc-backref" href="#id902">Overview:</a><a class="headerlink" href="#id219" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">uitofp</span></tt>‘ instruction regards <tt class="docutils literal"><span class="pre">value</span></tt> as an unsigned integer
+and converts that value to the <tt class="docutils literal"><span class="pre">ty2</span></tt> type.</p>
+</div>
+<div class="section" id="id220">
+<h5><a class="toc-backref" href="#id903">Arguments:</a><a class="headerlink" href="#id220" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">uitofp</span></tt>‘ instruction takes a value to cast, which must be a
+scalar or vector <a class="reference internal" href="#t-integer"><em>integer</em></a> value, and a type to cast it to
+<tt class="docutils literal"><span class="pre">ty2</span></tt>, which must be an <a class="reference internal" href="#t-floating"><em>floating point</em></a> type. If
+<tt class="docutils literal"><span class="pre">ty</span></tt> is a vector integer type, <tt class="docutils literal"><span class="pre">ty2</span></tt> must be a vector floating point
+type with the same number of elements as <tt class="docutils literal"><span class="pre">ty</span></tt></p>
+</div>
+<div class="section" id="id221">
+<h5><a class="toc-backref" href="#id904">Semantics:</a><a class="headerlink" href="#id221" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">uitofp</span></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>
+</div>
+<div class="section" id="id222">
+<h5><a class="toc-backref" href="#id905">Example:</a><a class="headerlink" href="#id222" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">uitofp</span> <span class="k">i32</span> <span class="m">257</span> <span class="k">to</span> <span class="kt">float</span>         <span class="c">; yields float:257.0</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">uitofp</span> <span class="k">i8</span> <span class="m">-1</span> <span class="k">to</span> <span class="kt">double</span>          <span class="c">; yields double:255.0</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="sitofp-to-instruction">
+<h4><a class="toc-backref" href="#id906">‘<tt class="docutils literal"><span class="pre">sitofp</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#sitofp-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id223">
+<h5><a class="toc-backref" href="#id907">Syntax:</a><a class="headerlink" href="#id223" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = sitofp <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id224">
+<h5><a class="toc-backref" href="#id908">Overview:</a><a class="headerlink" href="#id224" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sitofp</span></tt>‘ instruction regards <tt class="docutils literal"><span class="pre">value</span></tt> as a signed integer and
+converts that value to the <tt class="docutils literal"><span class="pre">ty2</span></tt> type.</p>
+</div>
+<div class="section" id="id225">
+<h5><a class="toc-backref" href="#id909">Arguments:</a><a class="headerlink" href="#id225" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sitofp</span></tt>‘ instruction takes a value to cast, which must be a
+scalar or vector <a class="reference internal" href="#t-integer"><em>integer</em></a> value, and a type to cast it to
+<tt class="docutils literal"><span class="pre">ty2</span></tt>, which must be an <a class="reference internal" href="#t-floating"><em>floating point</em></a> type. If
+<tt class="docutils literal"><span class="pre">ty</span></tt> is a vector integer type, <tt class="docutils literal"><span class="pre">ty2</span></tt> must be a vector floating point
+type with the same number of elements as <tt class="docutils literal"><span class="pre">ty</span></tt></p>
+</div>
+<div class="section" id="id226">
+<h5><a class="toc-backref" href="#id910">Semantics:</a><a class="headerlink" href="#id226" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">sitofp</span></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>
+</div>
+<div class="section" id="id227">
+<h5><a class="toc-backref" href="#id911">Example:</a><a class="headerlink" href="#id227" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">sitofp</span> <span class="k">i32</span> <span class="m">257</span> <span class="k">to</span> <span class="kt">float</span>         <span class="c">; yields float:257.0</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">sitofp</span> <span class="k">i8</span> <span class="m">-1</span> <span class="k">to</span> <span class="kt">double</span>          <span class="c">; yields double:-1.0</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="ptrtoint-to-instruction">
+<span id="i-ptrtoint"></span><h4><a class="toc-backref" href="#id912">‘<tt class="docutils literal"><span class="pre">ptrtoint</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#ptrtoint-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id228">
+<h5><a class="toc-backref" href="#id913">Syntax:</a><a class="headerlink" href="#id228" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = ptrtoint <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id229">
+<h5><a class="toc-backref" href="#id914">Overview:</a><a class="headerlink" href="#id229" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">ptrtoint</span></tt>‘ instruction converts the pointer or a vector of
+pointers <tt class="docutils literal"><span class="pre">value</span></tt> to the integer (or vector of integers) type <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id230">
+<h5><a class="toc-backref" href="#id915">Arguments:</a><a class="headerlink" href="#id230" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">ptrtoint</span></tt>‘ instruction takes a <tt class="docutils literal"><span class="pre">value</span></tt> to cast, which must be
+a a value of type <a class="reference internal" href="#t-pointer"><em>pointer</em></a> or a vector of pointers, and a
+type to cast it to <tt class="docutils literal"><span class="pre">ty2</span></tt>, which must be an <a class="reference internal" href="#t-integer"><em>integer</em></a> or
+a vector of integers type.</p>
+</div>
+<div class="section" id="id231">
+<h5><a class="toc-backref" href="#id916">Semantics:</a><a class="headerlink" href="#id231" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">ptrtoint</span></tt>‘ instruction converts <tt class="docutils literal"><span class="pre">value</span></tt> to integer type
+<tt class="docutils literal"><span class="pre">ty2</span></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 class="docutils literal"><span class="pre">value</span></tt> is smaller than <tt class="docutils literal"><span class="pre">ty2</span></tt> then a zero extension is done. If
+<tt class="docutils literal"><span class="pre">value</span></tt> is larger than <tt class="docutils literal"><span class="pre">ty2</span></tt> then a truncation is done. If they are
+the same size, then nothing is done (<em>no-op cast</em>) other than a type
+change.</p>
+</div>
+<div class="section" id="id232">
+<h5><a class="toc-backref" href="#id917">Example:</a><a class="headerlink" href="#id232" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">ptrtoint</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%P</span> <span class="k">to</span> <span class="k">i8</span>                         <span class="c">; yields truncation on 32-bit architecture</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">ptrtoint</span> <span class="k">i32</span><span class="p">*</span> <span class="nv">%P</span> <span class="k">to</span> <span class="k">i64</span>                        <span class="c">; yields zero extension on 32-bit architecture</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">ptrtoint</span> <span class="p"><</span><span class="m">4</span> <span class="k">x</span> <span class="k">i32</span><span class="p">*></span> <span class="nv">%P</span> <span class="k">to</span> <span class="p"><</span><span class="m">4</span> <span class="k">x</span> <span class="k">i64</span><span class="p">></span><span class="c">; yields vector zero extension for a vector of addresses on 32-bit architecture</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="inttoptr-to-instruction">
+<span id="i-inttoptr"></span><h4><a class="toc-backref" href="#id918">‘<tt class="docutils literal"><span class="pre">inttoptr</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#inttoptr-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id233">
+<h5><a class="toc-backref" href="#id919">Syntax:</a><a class="headerlink" href="#id233" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = inttoptr <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id234">
+<h5><a class="toc-backref" href="#id920">Overview:</a><a class="headerlink" href="#id234" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">inttoptr</span></tt>‘ instruction converts an integer <tt class="docutils literal"><span class="pre">value</span></tt> to a
+pointer type, <tt class="docutils literal"><span class="pre">ty2</span></tt>.</p>
+</div>
+<div class="section" id="id235">
+<h5><a class="toc-backref" href="#id921">Arguments:</a><a class="headerlink" href="#id235" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">inttoptr</span></tt>‘ instruction takes an <a class="reference internal" href="#t-integer"><em>integer</em></a> value to
+cast, and a type to cast it to, which must be a <a class="reference internal" href="#t-pointer"><em>pointer</em></a>
+type.</p>
+</div>
+<div class="section" id="id236">
+<h5><a class="toc-backref" href="#id922">Semantics:</a><a class="headerlink" href="#id236" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">inttoptr</span></tt>‘ instruction converts <tt class="docutils literal"><span class="pre">value</span></tt> to type <tt class="docutils literal"><span class="pre">ty2</span></tt> by
+applying either a zero extension or a truncation depending on the size
+of the integer <tt class="docutils literal"><span class="pre">value</span></tt>. If <tt class="docutils literal"><span class="pre">value</span></tt> is larger than the size of a
+pointer then a truncation is done. If <tt class="docutils literal"><span class="pre">value</span></tt> is smaller than the size
+of a pointer then a zero extension is done. If they are the same size,
+nothing is done (<em>no-op cast</em>).</p>
+</div>
+<div class="section" id="id237">
+<h5><a class="toc-backref" href="#id923">Example:</a><a class="headerlink" href="#id237" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">inttoptr</span> <span class="k">i32</span> <span class="m">255</span> <span class="k">to</span> <span class="k">i32</span><span class="p">*</span>          <span class="c">; yields zero extension on 64-bit architecture</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">inttoptr</span> <span class="k">i32</span> <span class="m">255</span> <span class="k">to</span> <span class="k">i32</span><span class="p">*</span>          <span class="c">; yields no-op on 32-bit architecture</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">inttoptr</span> <span class="k">i64</span> <span class="m">0</span> <span class="k">to</span> <span class="k">i32</span><span class="p">*</span>            <span class="c">; yields truncation on 32-bit architecture</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">inttoptr</span> <span class="p"><</span><span class="m">4</span> <span class="k">x</span> <span class="k">i32</span><span class="p">></span> <span class="nv">%G</span> <span class="k">to</span> <span class="p"><</span><span class="m">4</span> <span class="k">x</span> <span class="k">i8</span><span class="p">*></span><span class="c">; yields truncation of vector G to four pointers</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="bitcast-to-instruction">
+<span id="i-bitcast"></span><h4><a class="toc-backref" href="#id924">‘<tt class="docutils literal"><span class="pre">bitcast</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#bitcast-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id238">
+<h5><a class="toc-backref" href="#id925">Syntax:</a><a class="headerlink" href="#id238" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = bitcast <ty> <value> to <ty2>             ; yields ty2</pre>
+</div>
+</div>
+<div class="section" id="id239">
+<h5><a class="toc-backref" href="#id926">Overview:</a><a class="headerlink" href="#id239" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">bitcast</span></tt>‘ instruction converts <tt class="docutils literal"><span class="pre">value</span></tt> to type <tt class="docutils literal"><span class="pre">ty2</span></tt> without
+changing any bits.</p>
+</div>
+<div class="section" id="id240">
+<h5><a class="toc-backref" href="#id927">Arguments:</a><a class="headerlink" href="#id240" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">bitcast</span></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 class="reference internal" href="#t-firstclass"><em>first class</em></a> type. The
+bit sizes of <tt class="docutils literal"><span class="pre">value</span></tt> and the destination type, <tt class="docutils literal"><span class="pre">ty2</span></tt>, must be
+identical.  If the source type is a pointer, the destination type must
+also be a pointer of the same size. This instruction supports bitwise
+conversion of vectors to integers and to vectors of other types (as
+long as they have the same size).</p>
+</div>
+<div class="section" id="id241">
+<h5><a class="toc-backref" href="#id928">Semantics:</a><a class="headerlink" href="#id241" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">bitcast</span></tt>‘ instruction converts <tt class="docutils literal"><span class="pre">value</span></tt> to type <tt class="docutils literal"><span class="pre">ty2</span></tt>. It
+is always a <em>no-op cast</em> because no bits change with this
+conversion. The conversion is done as if the <tt class="docutils literal"><span class="pre">value</span></tt> had been stored
+to memory and read back as type <tt class="docutils literal"><span class="pre">ty2</span></tt>. Pointer (or vector of
+pointers) types may only be converted to other pointer (or vector of
+pointers) types with the same address space through this instruction.
+To convert pointers to other types, use the <a class="reference internal" href="#i-inttoptr"><em>inttoptr</em></a>
+or <a class="reference internal" href="#i-ptrtoint"><em>ptrtoint</em></a> instructions first.</p>
+</div>
+<div class="section" id="id242">
+<h5><a class="toc-backref" href="#id929">Example:</a><a class="headerlink" href="#id242" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>%X = bitcast i8 255 to i8              ; yields i8 :-1
+%Y = bitcast i32* %x to sint*          ; yields sint*:%x
+%Z = bitcast <2 x int> %V to i64;        ; yields i64: %V
+%Z = bitcast <2 x i32*> %V to <2 x i64*> ; yields <2 x i64*></pre>
+</div>
+</div>
+</div>
+<div class="section" id="addrspacecast-to-instruction">
+<span id="i-addrspacecast"></span><h4><a class="toc-backref" href="#id930">‘<tt class="docutils literal"><span class="pre">addrspacecast</span> <span class="pre">..</span> <span class="pre">to</span></tt>‘ Instruction</a><a class="headerlink" href="#addrspacecast-to-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id243">
+<h5><a class="toc-backref" href="#id931">Syntax:</a><a class="headerlink" href="#id243" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = addrspacecast <pty> <ptrval> to <pty2>       ; yields pty2</pre>
+</div>
+</div>
+<div class="section" id="id244">
+<h5><a class="toc-backref" href="#id932">Overview:</a><a class="headerlink" href="#id244" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">addrspacecast</span></tt>‘ instruction converts <tt class="docutils literal"><span class="pre">ptrval</span></tt> from <tt class="docutils literal"><span class="pre">pty</span></tt> in
+address space <tt class="docutils literal"><span class="pre">n</span></tt> to type <tt class="docutils literal"><span class="pre">pty2</span></tt> in address space <tt class="docutils literal"><span class="pre">m</span></tt>.</p>
+</div>
+<div class="section" id="id245">
+<h5><a class="toc-backref" href="#id933">Arguments:</a><a class="headerlink" href="#id245" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">addrspacecast</span></tt>‘ instruction takes a pointer or vector of pointer value
+to cast and a pointer type to cast it to, which must have a different
+address space.</p>
+</div>
+<div class="section" id="id246">
+<h5><a class="toc-backref" href="#id934">Semantics:</a><a class="headerlink" href="#id246" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">addrspacecast</span></tt>‘ instruction converts the pointer value
+<tt class="docutils literal"><span class="pre">ptrval</span></tt> to type <tt class="docutils literal"><span class="pre">pty2</span></tt>. It can be a <em>no-op cast</em> or a complex
+value modification, depending on the target and the address space
+pair. Pointer conversions within the same address space must be
+performed with the <tt class="docutils literal"><span class="pre">bitcast</span></tt> instruction. Note that if the address space
+conversion is legal then both result and operand refer to the same memory
+location.</p>
+</div>
+<div class="section" id="id247">
+<h5><a class="toc-backref" href="#id935">Example:</a><a class="headerlink" href="#id247" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre>%X = addrspacecast i32* %x to i32 addrspace(1)*    ; yields i32 addrspace(1)*:%x
+%Y = addrspacecast i32 addrspace(1)* %y to i64 addrspace(2)*    ; yields i64 addrspace(2)*:%y
+%Z = addrspacecast <4 x i32*> %z to <4 x float addrspace(3)*>   ; yields <4 x float addrspace(3)*>:%z</pre>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="other-operations">
+<span id="otherops"></span><h3><a class="toc-backref" href="#id936">Other Operations</a><a class="headerlink" href="#other-operations" title="Permalink to this headline">¶</a></h3>
+<p>The instructions in this category are the “miscellaneous” instructions,
+which defy better classification.</p>
+<div class="section" id="icmp-instruction">
+<span id="i-icmp"></span><h4><a class="toc-backref" href="#id937">‘<tt class="docutils literal"><span class="pre">icmp</span></tt>‘ Instruction</a><a class="headerlink" href="#icmp-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id248">
+<h5><a class="toc-backref" href="#id938">Syntax:</a><a class="headerlink" href="#id248" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = icmp <cond> <ty> <op1>, <op2>   ; yields i1 or <N x i1>:result</pre>
+</div>
+</div>
+<div class="section" id="id249">
+<h5><a class="toc-backref" href="#id939">Overview:</a><a class="headerlink" href="#id249" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">icmp</span></tt>‘ instruction returns a boolean value or a vector of
+boolean values based on comparison of its two integer, integer vector,
+pointer, or pointer vector operands.</p>
+</div>
+<div class="section" id="id250">
+<h5><a class="toc-backref" href="#id940">Arguments:</a><a class="headerlink" href="#id250" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">icmp</span></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 class="arabic simple">
+<li><tt class="docutils literal"><span class="pre">eq</span></tt>: equal</li>
+<li><tt class="docutils literal"><span class="pre">ne</span></tt>: not equal</li>
+<li><tt class="docutils literal"><span class="pre">ugt</span></tt>: unsigned greater than</li>
+<li><tt class="docutils literal"><span class="pre">uge</span></tt>: unsigned greater or equal</li>
+<li><tt class="docutils literal"><span class="pre">ult</span></tt>: unsigned less than</li>
+<li><tt class="docutils literal"><span class="pre">ule</span></tt>: unsigned less or equal</li>
+<li><tt class="docutils literal"><span class="pre">sgt</span></tt>: signed greater than</li>
+<li><tt class="docutils literal"><span class="pre">sge</span></tt>: signed greater or equal</li>
+<li><tt class="docutils literal"><span class="pre">slt</span></tt>: signed less than</li>
+<li><tt class="docutils literal"><span class="pre">sle</span></tt>: signed less or equal</li>
+</ol>
+<p>The remaining two arguments must be <a class="reference internal" href="#t-integer"><em>integer</em></a> or
+<a class="reference internal" href="#t-pointer"><em>pointer</em></a> or integer <a class="reference internal" href="#t-vector"><em>vector</em></a> typed. They
+must also be identical types.</p>
+</div>
+<div class="section" id="id251">
+<h5><a class="toc-backref" href="#id941">Semantics:</a><a class="headerlink" href="#id251" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">icmp</span></tt>‘ compares <tt class="docutils literal"><span class="pre">op1</span></tt> and <tt class="docutils literal"><span class="pre">op2</span></tt> according to the condition
+code given as <tt class="docutils literal"><span class="pre">cond</span></tt>. The comparison performed always yields either an
+<a class="reference internal" href="#t-integer"><em>i1</em></a> or vector of <tt class="docutils literal"><span class="pre">i1</span></tt> result, as follows:</p>
+<ol class="arabic simple">
+<li><tt class="docutils literal"><span class="pre">eq</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if the operands are equal, <tt class="docutils literal"><span class="pre">false</span></tt>
+otherwise. No sign interpretation is necessary or performed.</li>
+<li><tt class="docutils literal"><span class="pre">ne</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if the operands are unequal, <tt class="docutils literal"><span class="pre">false</span></tt>
+otherwise. No sign interpretation is necessary or performed.</li>
+<li><tt class="docutils literal"><span class="pre">ugt</span></tt>: interprets the operands as unsigned values and yields
+<tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">op1</span></tt> is greater than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">uge</span></tt>: interprets the operands as unsigned values and yields
+<tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">op1</span></tt> is greater than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ult</span></tt>: interprets the operands as unsigned values and yields
+<tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">op1</span></tt> is less than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ule</span></tt>: interprets the operands as unsigned values and yields
+<tt class="docutils literal"><span class="pre">true</span></tt> if <tt class="docutils literal"><span class="pre">op1</span></tt> is less than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">sgt</span></tt>: interprets the operands as signed values and yields <tt class="docutils literal"><span class="pre">true</span></tt>
+if <tt class="docutils literal"><span class="pre">op1</span></tt> is greater than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">sge</span></tt>: interprets the operands as signed values and yields <tt class="docutils literal"><span class="pre">true</span></tt>
+if <tt class="docutils literal"><span class="pre">op1</span></tt> is greater than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">slt</span></tt>: interprets the operands as signed values and yields <tt class="docutils literal"><span class="pre">true</span></tt>
+if <tt class="docutils literal"><span class="pre">op1</span></tt> is less than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">sle</span></tt>: interprets the operands as signed values and yields <tt class="docutils literal"><span class="pre">true</span></tt>
+if <tt class="docutils literal"><span class="pre">op1</span></tt> is less than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+</ol>
+<p>If the operands are <a class="reference internal" href="#t-pointer"><em>pointer</em></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 class="docutils literal"><span class="pre">i1</span></tt> vector with the same number of elements
+as the values being compared. Otherwise, the result is an <tt class="docutils literal"><span class="pre">i1</span></tt>.</p>
+</div>
+<div class="section" id="id252">
+<h5><a class="toc-backref" href="#id942">Example:</a><a class="headerlink" href="#id252" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = icmp eq i32 4, 5          ; yields: result=false
+<result> = icmp ne float* %X, %X     ; yields: result=false
+<result> = icmp ult i16  4, 5        ; yields: result=true
+<result> = icmp sgt i16  4, 5        ; yields: result=false
+<result> = icmp ule i16 -4, 5        ; yields: result=false
+<result> = icmp sge i16  4, 5        ; yields: result=false</pre>
+</div>
+<p>Note that the code generator does not yet support vector types with the
+<tt class="docutils literal"><span class="pre">icmp</span></tt> instruction.</p>
+</div>
+</div>
+<div class="section" id="fcmp-instruction">
+<span id="i-fcmp"></span><h4><a class="toc-backref" href="#id943">‘<tt class="docutils literal"><span class="pre">fcmp</span></tt>‘ Instruction</a><a class="headerlink" href="#fcmp-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id253">
+<h5><a class="toc-backref" href="#id944">Syntax:</a><a class="headerlink" href="#id253" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = fcmp <cond> <ty> <op1>, <op2>     ; yields i1 or <N x i1>:result</pre>
+</div>
+</div>
+<div class="section" id="id254">
+<h5><a class="toc-backref" href="#id945">Overview:</a><a class="headerlink" href="#id254" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fcmp</span></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 class="reference internal" href="#t-integer"><em>i1</em></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>
+</div>
+<div class="section" id="id255">
+<h5><a class="toc-backref" href="#id946">Arguments:</a><a class="headerlink" href="#id255" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fcmp</span></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 class="arabic simple">
+<li><tt class="docutils literal"><span class="pre">false</span></tt>: no comparison, always returns false</li>
+<li><tt class="docutils literal"><span class="pre">oeq</span></tt>: ordered and equal</li>
+<li><tt class="docutils literal"><span class="pre">ogt</span></tt>: ordered and greater than</li>
+<li><tt class="docutils literal"><span class="pre">oge</span></tt>: ordered and greater than or equal</li>
+<li><tt class="docutils literal"><span class="pre">olt</span></tt>: ordered and less than</li>
+<li><tt class="docutils literal"><span class="pre">ole</span></tt>: ordered and less than or equal</li>
+<li><tt class="docutils literal"><span class="pre">one</span></tt>: ordered and not equal</li>
+<li><tt class="docutils literal"><span class="pre">ord</span></tt>: ordered (no nans)</li>
+<li><tt class="docutils literal"><span class="pre">ueq</span></tt>: unordered or equal</li>
+<li><tt class="docutils literal"><span class="pre">ugt</span></tt>: unordered or greater than</li>
+<li><tt class="docutils literal"><span class="pre">uge</span></tt>: unordered or greater than or equal</li>
+<li><tt class="docutils literal"><span class="pre">ult</span></tt>: unordered or less than</li>
+<li><tt class="docutils literal"><span class="pre">ule</span></tt>: unordered or less than or equal</li>
+<li><tt class="docutils literal"><span class="pre">une</span></tt>: unordered or not equal</li>
+<li><tt class="docutils literal"><span class="pre">uno</span></tt>: unordered (either nans)</li>
+<li><tt class="docutils literal"><span class="pre">true</span></tt>: no comparison, always returns true</li>
+</ol>
+<p><em>Ordered</em> means that neither operand is a QNAN while <em>unordered</em> means
+that either operand may be a QNAN.</p>
+<p>Each of <tt class="docutils literal"><span class="pre">val1</span></tt> and <tt class="docutils literal"><span class="pre">val2</span></tt> arguments must be either a <a class="reference internal" href="#t-floating"><em>floating
+point</em></a> type or a <a class="reference internal" href="#t-vector"><em>vector</em></a> of floating point
+type. They must have identical types.</p>
+</div>
+<div class="section" id="id256">
+<h5><a class="toc-backref" href="#id947">Semantics:</a><a class="headerlink" href="#id256" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">fcmp</span></tt>‘ instruction compares <tt class="docutils literal"><span class="pre">op1</span></tt> and <tt class="docutils literal"><span class="pre">op2</span></tt> according to the
+condition code given as <tt class="docutils literal"><span class="pre">cond</span></tt>. If the operands are vectors, then the
+vectors are compared element by element. Each comparison performed
+always yields an <a class="reference internal" href="#t-integer"><em>i1</em></a> result, as follows:</p>
+<ol class="arabic simple">
+<li><tt class="docutils literal"><span class="pre">false</span></tt>: always yields <tt class="docutils literal"><span class="pre">false</span></tt>, regardless of operands.</li>
+<li><tt class="docutils literal"><span class="pre">oeq</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN and <tt class="docutils literal"><span class="pre">op1</span></tt>
+is equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ogt</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN and <tt class="docutils literal"><span class="pre">op1</span></tt>
+is greater than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">oge</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN and <tt class="docutils literal"><span class="pre">op1</span></tt>
+is greater than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">olt</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN and <tt class="docutils literal"><span class="pre">op1</span></tt>
+is less than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ole</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN and <tt class="docutils literal"><span class="pre">op1</span></tt>
+is less than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">one</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN and <tt class="docutils literal"><span class="pre">op1</span></tt>
+is not equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ord</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if both operands are not a QNAN.</li>
+<li><tt class="docutils literal"><span class="pre">ueq</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN or <tt class="docutils literal"><span class="pre">op1</span></tt> is
+equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ugt</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN or <tt class="docutils literal"><span class="pre">op1</span></tt> is
+greater than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">uge</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN or <tt class="docutils literal"><span class="pre">op1</span></tt> is
+greater than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ult</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN or <tt class="docutils literal"><span class="pre">op1</span></tt> is
+less than <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">ule</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN or <tt class="docutils literal"><span class="pre">op1</span></tt> is
+less than or equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">une</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN or <tt class="docutils literal"><span class="pre">op1</span></tt> is
+not equal to <tt class="docutils literal"><span class="pre">op2</span></tt>.</li>
+<li><tt class="docutils literal"><span class="pre">uno</span></tt>: yields <tt class="docutils literal"><span class="pre">true</span></tt> if either operand is a QNAN.</li>
+<li><tt class="docutils literal"><span class="pre">true</span></tt>: always yields <tt class="docutils literal"><span class="pre">true</span></tt>, regardless of operands.</li>
+</ol>
+</div>
+<div class="section" id="id257">
+<h5><a class="toc-backref" href="#id948">Example:</a><a class="headerlink" href="#id257" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><pre><result> = fcmp oeq float 4.0, 5.0    ; yields: result=false
+<result> = fcmp one float 4.0, 5.0    ; yields: result=true
+<result> = fcmp olt float 4.0, 5.0    ; yields: result=true
+<result> = fcmp ueq double 1.0, 2.0   ; yields: result=false</pre>
+</div>
+<p>Note that the code generator does not yet support vector types with the
+<tt class="docutils literal"><span class="pre">fcmp</span></tt> instruction.</p>
+</div>
+</div>
+<div class="section" id="phi-instruction">
+<span id="i-phi"></span><h4><a class="toc-backref" href="#id949">‘<tt class="docutils literal"><span class="pre">phi</span></tt>‘ Instruction</a><a class="headerlink" href="#phi-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id258">
+<h5><a class="toc-backref" href="#id950">Syntax:</a><a class="headerlink" href="#id258" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = phi <ty> [ <val0>, <label0>], ...</pre>
+</div>
+</div>
+<div class="section" id="id259">
+<h5><a class="toc-backref" href="#id951">Overview:</a><a class="headerlink" href="#id259" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">phi</span></tt>‘ instruction is used to implement the φ node in the SSA
+graph representing the function.</p>
+</div>
+<div class="section" id="id260">
+<h5><a class="toc-backref" href="#id952">Arguments:</a><a class="headerlink" href="#id260" title="Permalink to this headline">¶</a></h5>
+<p>The type of the incoming values is specified with the first type field.
+After this, the ‘<tt class="docutils literal"><span class="pre">phi</span></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 class="reference internal" href="#t-firstclass"><em>first class</em></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 class="docutils literal"><span class="pre">invoke</span></tt>‘
+instruction’s return value on the same edge).</p>
+</div>
+<div class="section" id="id261">
+<h5><a class="toc-backref" href="#id953">Semantics:</a><a class="headerlink" href="#id261" title="Permalink to this headline">¶</a></h5>
+<p>At runtime, the ‘<tt class="docutils literal"><span class="pre">phi</span></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>
+</div>
+<div class="section" id="id262">
+<h5><a class="toc-backref" href="#id954">Example:</a><a class="headerlink" href="#id262" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nl">Loop:</span>       <span class="c">; Infinite loop that counts from 0 on up...</span>
+  <span class="nv">%indvar</span> <span class="p">=</span> <span class="k">phi</span> <span class="k">i32</span> <span class="p">[</span> <span class="m">0</span><span class="p">,</span> <span class="nv">%LoopHeader</span> <span class="p">],</span> <span class="p">[</span> <span class="nv">%nextindvar</span><span class="p">,</span> <span class="nv">%Loop</span> <span class="p">]</span>
+  <span class="nv">%nextindvar</span> <span class="p">=</span> <span class="k">add</span> <span class="k">i32</span> <span class="nv">%indvar</span><span class="p">,</span> <span class="m">1</span>
+  <span class="k">br</span> <span class="kt">label</span> <span class="nv">%Loop</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="select-instruction">
+<span id="i-select"></span><h4><a class="toc-backref" href="#id955">‘<tt class="docutils literal"><span class="pre">select</span></tt>‘ Instruction</a><a class="headerlink" href="#select-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id263">
+<h5><a class="toc-backref" href="#id956">Syntax:</a><a class="headerlink" href="#id263" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = select selty <cond>, <ty> <val1>, <ty> <val2>             ; yields ty
+
+selty is either i1 or {<N x i1>}</pre>
+</div>
+</div>
+<div class="section" id="id264">
+<h5><a class="toc-backref" href="#id957">Overview:</a><a class="headerlink" href="#id264" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">select</span></tt>‘ instruction is used to choose one value based on a
+condition, without IR-level branching.</p>
+</div>
+<div class="section" id="id265">
+<h5><a class="toc-backref" href="#id958">Arguments:</a><a class="headerlink" href="#id265" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">select</span></tt>‘ instruction requires an ‘i1’ value or a vector of ‘i1’
+values indicating the condition, and two values of the same <a class="reference internal" href="#t-firstclass"><em>first
+class</em></a> type. If the val1/val2 are vectors and the
+condition is a scalar, then entire vectors are selected, not individual
+elements.</p>
+</div>
+<div class="section" id="id266">
+<h5><a class="toc-backref" href="#id959">Semantics:</a><a class="headerlink" href="#id266" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id267">
+<h5><a class="toc-backref" href="#id960">Example:</a><a class="headerlink" href="#id267" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%X</span> <span class="p">=</span> <span class="k">select</span> <span class="k">i1</span> <span class="k">true</span><span class="p">,</span> <span class="k">i8</span> <span class="m">17</span><span class="p">,</span> <span class="k">i8</span> <span class="m">42</span>          <span class="c">; yields i8:17</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="call-instruction">
+<span id="i-call"></span><h4><a class="toc-backref" href="#id961">‘<tt class="docutils literal"><span class="pre">call</span></tt>‘ Instruction</a><a class="headerlink" href="#call-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id268">
+<h5><a class="toc-backref" href="#id962">Syntax:</a><a class="headerlink" href="#id268" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><result> = [tail | musttail] call [cconv] [ret attrs] <ty> [<fnty>*] <fnptrval>(<function args>) [fn attrs]</pre>
+</div>
+</div>
+<div class="section" id="id269">
+<h5><a class="toc-backref" href="#id963">Overview:</a><a class="headerlink" href="#id269" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">call</span></tt>‘ instruction represents a simple function call.</p>
+</div>
+<div class="section" id="id270">
+<h5><a class="toc-backref" href="#id964">Arguments:</a><a class="headerlink" href="#id270" title="Permalink to this headline">¶</a></h5>
+<p>This instruction requires several arguments:</p>
+<ol class="arabic">
+<li><p class="first">The optional <tt class="docutils literal"><span class="pre">tail</span></tt> and <tt class="docutils literal"><span class="pre">musttail</span></tt> markers indicate that the optimizers
+should perform tail call optimization.  The <tt class="docutils literal"><span class="pre">tail</span></tt> marker is a hint that
+<a class="reference external" href="CodeGenerator.html#sibcallopt">can be ignored</a>.  The <tt class="docutils literal"><span class="pre">musttail</span></tt> marker
+means that the call must be tail call optimized in order for the program to
+be correct.  The <tt class="docutils literal"><span class="pre">musttail</span></tt> marker provides these guarantees:</p>
+<ol class="arabic simple">
+<li>The call will not cause unbounded stack growth if it is part of a
+recursive cycle in the call graph.</li>
+<li>Arguments with the <a class="reference internal" href="#attr-inalloca"><em>inalloca</em></a> attribute are
+forwarded in place.</li>
+</ol>
+<p>Both markers imply that the callee does not access allocas or varargs from
+the caller.  Calls marked <tt class="docutils literal"><span class="pre">musttail</span></tt> must obey the following additional
+rules:</p>
+<ul class="simple">
+<li>The call must immediately precede a <a class="reference internal" href="#i-ret"><em>ret</em></a> instruction,
+or a pointer bitcast followed by a ret instruction.</li>
+<li>The ret instruction must return the (possibly bitcasted) value
+produced by the call or void.</li>
+<li>The caller and callee prototypes must match.  Pointer types of
+parameters or return types may differ in pointee type, but not
+in address space.</li>
+<li>The calling conventions of the caller and callee must match.</li>
+<li>All ABI-impacting function attributes, such as sret, byval, inreg,
+returned, and inalloca, must match.</li>
+</ul>
+<p>Tail call optimization for calls marked <tt class="docutils literal"><span class="pre">tail</span></tt> is guaranteed to occur if
+the following conditions are met:</p>
+<ul class="simple">
+<li>Caller and callee both have the calling convention <tt class="docutils literal"><span class="pre">fastcc</span></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 class="docutils literal"><span class="pre">-tailcallopt</span></tt> is enabled, or
+<tt class="docutils literal"><span class="pre">llvm::GuaranteedTailCallOpt</span></tt> is <tt class="docutils literal"><span class="pre">true</span></tt>.</li>
+<li><a class="reference external" href="CodeGenerator.html#tailcallopt">Platform-specific constraints are
+met.</a></li>
+</ul>
+</li>
+<li><p class="first">The optional “cconv” marker indicates which <a class="reference internal" href="#callingconv"><em>calling
+convention</em></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.</p>
+</li>
+<li><p class="first">The optional <a class="reference internal" href="#paramattrs"><em>Parameter Attributes</em></a> list for return
+values. Only ‘<tt class="docutils literal"><span class="pre">zeroext</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">signext</span></tt>‘, and ‘<tt class="docutils literal"><span class="pre">inreg</span></tt>‘ attributes
+are valid here.</p>
+</li>
+<li><p class="first">‘<tt class="docutils literal"><span class="pre">ty</span></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 class="docutils literal"><span class="pre">void</span></tt>.</p>
+</li>
+<li><p class="first">‘<tt class="docutils literal"><span class="pre">fnty</span></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.</p>
+</li>
+<li><p class="first">‘<tt class="docutils literal"><span class="pre">fnptrval</span></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 class="docutils literal"><span class="pre">call</span></tt>‘s are just as possible, calling an arbitrary pointer
+to function value.</p>
+</li>
+<li><p class="first">‘<tt class="docutils literal"><span class="pre">function</span> <span class="pre">args</span></tt>‘: argument list whose types match the function
+signature argument types and parameter attributes. All arguments must
+be of <a class="reference internal" href="#t-firstclass"><em>first class</em></a> type. If the function signature
+indicates the function accepts a variable number of arguments, the
+extra arguments can be specified.</p>
+</li>
+<li><p class="first">The optional <a class="reference internal" href="#fnattrs"><em>function attributes</em></a> list. Only
+‘<tt class="docutils literal"><span class="pre">noreturn</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">nounwind</span></tt>‘, ‘<tt class="docutils literal"><span class="pre">readonly</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">readnone</span></tt>‘
+attributes are valid here.</p>
+</li>
+</ol>
+</div>
+<div class="section" id="id271">
+<h5><a class="toc-backref" href="#id965">Semantics:</a><a class="headerlink" href="#id271" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">call</span></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 class="docutils literal"><span class="pre">ret</span></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>
+</div>
+<div class="section" id="id272">
+<h5><a class="toc-backref" href="#id966">Example:</a><a class="headerlink" href="#id272" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%retval</span> <span class="p">=</span> <span class="k">call</span> <span class="k">i32</span> <span class="vg">@test</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%argc</span><span class="p">)</span>
+<span class="k">call</span> <span class="k">i32</span> <span class="p">(</span><span class="k">i8</span><span class="p">*,</span> <span class="p">...)*</span> <span class="vg">@printf</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%msg</span><span class="p">,</span> <span class="k">i32</span> <span class="m">12</span><span class="p">,</span> <span class="k">i8</span> <span class="m">42</span><span class="p">)</span>        <span class="c">; yields i32</span>
+<span class="nv">%X</span> <span class="p">=</span> <span class="k">tail</span> <span class="k">call</span> <span class="k">i32</span> <span class="vg">@foo</span><span class="p">()</span>                                    <span class="c">; yields i32</span>
+<span class="nv">%Y</span> <span class="p">=</span> <span class="k">tail</span> <span class="k">call</span> <span class="k">fastcc</span> <span class="k">i32</span> <span class="vg">@foo</span><span class="p">()</span>  <span class="c">; yields i32</span>
+<span class="k">call</span> <span class="kt">void</span> <span class="nv">%foo</span><span class="p">(</span><span class="k">i8</span> <span class="m">97</span> <span class="k">signext</span><span class="p">)</span>
+
+<span class="nv">%struct.A</span> <span class="p">=</span> <span class="k">type</span> <span class="p">{</span> <span class="k">i32</span><span class="p">,</span> <span class="k">i8</span> <span class="p">}</span>
+<span class="nv">%r</span> <span class="p">=</span> <span class="k">call</span> <span class="nv">%struct.A</span> <span class="vg">@foo</span><span class="p">()</span>                        <span class="c">; yields { i32, i8 }</span>
+<span class="nv">%gr</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="nv">%struct.A</span> <span class="nv">%r</span><span class="p">,</span> <span class="m">0</span>                <span class="c">; yields i32</span>
+<span class="nv">%gr1</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="nv">%struct.A</span> <span class="nv">%r</span><span class="p">,</span> <span class="m">1</span>               <span class="c">; yields i8</span>
+<span class="nv">%Z</span> <span class="p">=</span> <span class="k">call</span> <span class="kt">void</span> <span class="vg">@foo</span><span class="p">()</span> <span class="k">noreturn</span>                    <span class="c">; indicates that %foo never returns normally</span>
+<span class="nv">%ZZ</span> <span class="p">=</span> <span class="k">call</span> <span class="k">zeroext</span> <span class="k">i32</span> <span class="vg">@bar</span><span class="p">()</span>                     <span class="c">; Return value is %zero extended</span>
+</pre></div>
+</div>
+<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>
+</div>
+<div class="section" id="va-arg-instruction">
+<span id="i-va-arg"></span><h4><a class="toc-backref" href="#id967">‘<tt class="docutils literal"><span class="pre">va_arg</span></tt>‘ Instruction</a><a class="headerlink" href="#va-arg-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id273">
+<h5><a class="toc-backref" href="#id968">Syntax:</a><a class="headerlink" href="#id273" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><resultval> = va_arg <va_list*> <arglist>, <argty></pre>
+</div>
+</div>
+<div class="section" id="id274">
+<h5><a class="toc-backref" href="#id969">Overview:</a><a class="headerlink" href="#id274" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">va_arg</span></tt>‘ instruction is used to access arguments passed through
+the “variable argument” area of a function call. It is used to implement
+the <tt class="docutils literal"><span class="pre">va_arg</span></tt> macro in C.</p>
+</div>
+<div class="section" id="id275">
+<h5><a class="toc-backref" href="#id970">Arguments:</a><a class="headerlink" href="#id275" title="Permalink to this headline">¶</a></h5>
+<p>This instruction takes a <tt class="docutils literal"><span class="pre">va_list*</span></tt> value and the type of the
+argument. It returns a value of the specified argument type and
+increments the <tt class="docutils literal"><span class="pre">va_list</span></tt> to point to the next argument. The actual
+type of <tt class="docutils literal"><span class="pre">va_list</span></tt> is target specific.</p>
+</div>
+<div class="section" id="id276">
+<h5><a class="toc-backref" href="#id971">Semantics:</a><a class="headerlink" href="#id276" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">va_arg</span></tt>‘ instruction loads an argument of the specified type
+from the specified <tt class="docutils literal"><span class="pre">va_list</span></tt> and causes the <tt class="docutils literal"><span class="pre">va_list</span></tt> to point to
+the next argument. For more information, see the variable argument
+handling <a class="reference internal" href="#int-varargs"><em>Intrinsic Functions</em></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 class="docutils literal"><span class="pre">vfprintf</span></tt>
+function.</p>
+<p><tt class="docutils literal"><span class="pre">va_arg</span></tt> is an LLVM instruction instead of an <a class="reference internal" href="#intrinsics"><em>intrinsic
+function</em></a> because it takes a type as an argument.</p>
+</div>
+<div class="section" id="id277">
+<h5><a class="toc-backref" href="#id972">Example:</a><a class="headerlink" href="#id277" title="Permalink to this headline">¶</a></h5>
+<p>See the <a class="reference internal" href="#int-varargs"><em>variable argument processing</em></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>
+</div>
+<div class="section" id="landingpad-instruction">
+<span id="i-landingpad"></span><h4><a class="toc-backref" href="#id973">‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ Instruction</a><a class="headerlink" href="#landingpad-instruction" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id278">
+<h5><a class="toc-backref" href="#id974">Syntax:</a><a class="headerlink" href="#id278" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre><resultval> = landingpad <resultty> personality <type> <pers_fn> <clause>+
+<resultval> = landingpad <resultty> personality <type> <pers_fn> cleanup <clause>*
+
+<clause> := catch <type> <value>
+<clause> := filter <array constant type> <array constant></pre>
+</div>
+</div>
+<div class="section" id="id279">
+<h5><a class="toc-backref" href="#id975">Overview:</a><a class="headerlink" href="#id279" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction is used by <a class="reference external" href="ExceptionHandling.html#overview">LLVM’s exception handling
+system</a> to specify that a basic block
+is a landing pad — one where the exception lands, and corresponds to the
+code found in the <tt class="docutils literal"><span class="pre">catch</span></tt> portion of a <tt class="docutils literal"><span class="pre">try</span></tt>/<tt class="docutils literal"><span class="pre">catch</span></tt> sequence. It
+defines values supplied by the personality function (<tt class="docutils literal"><span class="pre">pers_fn</span></tt>) upon
+re-entry to the function. The <tt class="docutils literal"><span class="pre">resultval</span></tt> has the type <tt class="docutils literal"><span class="pre">resultty</span></tt>.</p>
+</div>
+<div class="section" id="id280">
+<h5><a class="toc-backref" href="#id976">Arguments:</a><a class="headerlink" href="#id280" title="Permalink to this headline">¶</a></h5>
+<p>This instruction takes a <tt class="docutils literal"><span class="pre">pers_fn</span></tt> value. This is the personality
+function associated with the unwinding mechanism. The optional
+<tt class="docutils literal"><span class="pre">cleanup</span></tt> flag indicates that the landing pad block is a cleanup.</p>
+<p>A <tt class="docutils literal"><span class="pre">clause</span></tt> begins with the clause type — <tt class="docutils literal"><span class="pre">catch</span></tt> or <tt class="docutils literal"><span class="pre">filter</span></tt> — and
+contains the global variable representing the “type” that may be caught
+or filtered respectively. Unlike the <tt class="docutils literal"><span class="pre">catch</span></tt> clause, the <tt class="docutils literal"><span class="pre">filter</span></tt>
+clause takes an array constant as its argument. Use
+“<tt class="docutils literal"><span class="pre">[0</span> <span class="pre">x</span> <span class="pre">i8**]</span> <span class="pre">undef</span></tt>” for a filter which cannot throw. The
+‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction must contain <em>at least</em> one <tt class="docutils literal"><span class="pre">clause</span></tt> or
+the <tt class="docutils literal"><span class="pre">cleanup</span></tt> flag.</p>
+</div>
+<div class="section" id="id281">
+<h5><a class="toc-backref" href="#id977">Semantics:</a><a class="headerlink" href="#id281" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction defines the values which are set by the
+personality function (<tt class="docutils literal"><span class="pre">pers_fn</span></tt>) upon re-entry to the function, and
+therefore the “result type” of the <tt class="docutils literal"><span class="pre">landingpad</span></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 class="docutils literal"><span class="pre">landingpad</span></tt> instructions are merged together through inlining, the
+clauses from the calling function are appended to the list of clauses.
+When the call stack is being unwound due to an exception being thrown,
+the exception is compared against each <tt class="docutils literal"><span class="pre">clause</span></tt> in turn. If it doesn’t
+match any of the clauses, and the <tt class="docutils literal"><span class="pre">cleanup</span></tt> flag is not set, then
+unwinding continues further up the call stack.</p>
+<p>The <tt class="docutils literal"><span class="pre">landingpad</span></tt> instruction has several restrictions:</p>
+<ul class="simple">
+<li>A landing pad block is a basic block which is the unwind destination
+of an ‘<tt class="docutils literal"><span class="pre">invoke</span></tt>‘ instruction.</li>
+<li>A landing pad block must have a ‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction as its
+first non-PHI instruction.</li>
+<li>There can be only one ‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction within the landing
+pad block.</li>
+<li>A basic block that is not a landing pad block may not include a
+‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instruction.</li>
+<li>All ‘<tt class="docutils literal"><span class="pre">landingpad</span></tt>‘ instructions in a function must have the same
+personality function.</li>
+</ul>
+</div>
+<div class="section" id="id282">
+<h5><a class="toc-backref" href="#id978">Example:</a><a class="headerlink" href="#id282" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><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>
+</div>
+</div>
+<div class="section" id="intrinsic-functions">
+<span id="intrinsics"></span><h2><a class="toc-backref" href="#id979">Intrinsic Functions</a><a class="headerlink" href="#intrinsic-functions" title="Permalink to this headline">¶</a></h2>
+<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 class="docutils literal"><span class="pre">llvm.</span></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 class="docutils literal"><span class="pre">llvm.ctpop</span></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 class="docutils literal"><span class="pre">i8</span> <span class="pre">@llvm.ctpop.i8(i8</span> <span class="pre">%val)</span></tt> and
+<tt class="docutils literal"><span class="pre">i29</span> <span class="pre">@llvm.ctpop.i29(i29</span> <span class="pre">%val)</span></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 class="reference external" href="ExtendingLLVM.html">Extending
+LLVM Guide</a>.</p>
+<div class="section" id="variable-argument-handling-intrinsics">
+<span id="int-varargs"></span><h3><a class="toc-backref" href="#id980">Variable Argument Handling Intrinsics</a><a class="headerlink" href="#variable-argument-handling-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>Variable argument support is defined in LLVM with the
+<a class="reference internal" href="#i-va-arg"><em>va_arg</em></a> instruction and these three intrinsic
+functions. These functions are related to the similarly named macros
+defined in the <tt class="docutils literal"><span class="pre"><stdarg.h></span></tt> header file.</p>
+<p>All of these functions operate on arguments that use a target-specific
+value type “<tt class="docutils literal"><span class="pre">va_list</span></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 class="reference internal" href="#i-va-arg"><em>va_arg</em></a> instruction and the
+variable argument handling intrinsic functions are used.</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="k">define</span> <span class="k">i32</span> <span class="vg">@test</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%X</span><span class="p">,</span> <span class="p">...)</span> <span class="p">{</span>
+  <span class="c">; Initialize variable argument processing</span>
+  <span class="nv">%ap</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i8</span><span class="p">*</span>
+  <span class="nv">%ap2</span> <span class="p">=</span> <span class="k">bitcast</span> <span class="k">i8</span><span class="p">**</span> <span class="nv">%ap</span> <span class="k">to</span> <span class="k">i8</span><span class="p">*</span>
+  <span class="k">call</span> <span class="kt">void</span> <span class="vg">@llvm.va_start</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%ap2</span><span class="p">)</span>
+
+  <span class="c">; Read a single integer argument</span>
+  <span class="nv">%tmp</span> <span class="p">=</span> <span class="k">va_arg</span> <span class="k">i8</span><span class="p">**</span> <span class="nv">%ap</span><span class="p">,</span> <span class="k">i32</span>
+
+  <span class="c">; Demonstrate usage of llvm.va_copy and llvm.va_end</span>
+  <span class="nv">%aq</span> <span class="p">=</span> <span class="k">alloca</span> <span class="k">i8</span><span class="p">*</span>
+  <span class="nv">%aq2</span> <span class="p">=</span> <span class="k">bitcast</span> <span class="k">i8</span><span class="p">**</span> <span class="nv">%aq</span> <span class="k">to</span> <span class="k">i8</span><span class="p">*</span>
+  <span class="k">call</span> <span class="kt">void</span> <span class="vg">@llvm.va_copy</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%aq2</span><span class="p">,</span> <span class="k">i8</span><span class="p">*</span> <span class="nv">%ap2</span><span class="p">)</span>
+  <span class="k">call</span> <span class="kt">void</span> <span class="vg">@llvm.va_end</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%aq2</span><span class="p">)</span>
+
+  <span class="c">; Stop processing of arguments.</span>
+  <span class="k">call</span> <span class="kt">void</span> <span class="vg">@llvm.va_end</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%ap2</span><span class="p">)</span>
+  <span class="k">ret</span> <span class="k">i32</span> <span class="nv">%tmp</span>
+<span class="p">}</span>
+
+<span class="k">declare</span> <span class="kt">void</span> <span class="vg">@llvm.va_start</span><span class="p">(</span><span class="k">i8</span><span class="p">*)</span>
+<span class="k">declare</span> <span class="kt">void</span> <span class="vg">@llvm.va_copy</span><span class="p">(</span><span class="k">i8</span><span class="p">*,</span> <span class="k">i8</span><span class="p">*)</span>
+<span class="k">declare</span> <span class="kt">void</span> <span class="vg">@llvm.va_end</span><span class="p">(</span><span class="k">i8</span><span class="p">*)</span>
+</pre></div>
+</div>
+<div class="section" id="llvm-va-start-intrinsic">
+<span id="int-va-start"></span><h4><a class="toc-backref" href="#id981">‘<tt class="docutils literal"><span class="pre">llvm.va_start</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-va-start-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id283">
+<h5><a class="toc-backref" href="#id982">Syntax:</a><a class="headerlink" href="#id283" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.va_start(i8* <arglist>)</pre>
+</div>
+</div>
+<div class="section" id="id284">
+<h5><a class="toc-backref" href="#id983">Overview:</a><a class="headerlink" href="#id284" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.va_start</span></tt>‘ intrinsic initializes <tt class="docutils literal"><span class="pre">*<arglist></span></tt> for
+subsequent use by <tt class="docutils literal"><span class="pre">va_arg</span></tt>.</p>
+</div>
+<div class="section" id="id285">
+<h5><a class="toc-backref" href="#id984">Arguments:</a><a class="headerlink" href="#id285" title="Permalink to this headline">¶</a></h5>
+<p>The argument is a pointer to a <tt class="docutils literal"><span class="pre">va_list</span></tt> element to initialize.</p>
+</div>
+<div class="section" id="id286">
+<h5><a class="toc-backref" href="#id985">Semantics:</a><a class="headerlink" href="#id286" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.va_start</span></tt>‘ intrinsic works just like the <tt class="docutils literal"><span class="pre">va_start</span></tt> macro
+available in C. In a target-dependent way, it initializes the
+<tt class="docutils literal"><span class="pre">va_list</span></tt> element to which the argument points, so that the next call
+to <tt class="docutils literal"><span class="pre">va_arg</span></tt> will produce the first variable argument passed to the
+function. Unlike the C <tt class="docutils literal"><span class="pre">va_start</span></tt> macro, this intrinsic does not need
+to know the last argument of the function as the compiler can figure
+that out.</p>
+</div>
+</div>
+<div class="section" id="llvm-va-end-intrinsic">
+<h4><a class="toc-backref" href="#id986">‘<tt class="docutils literal"><span class="pre">llvm.va_end</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-va-end-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id287">
+<h5><a class="toc-backref" href="#id987">Syntax:</a><a class="headerlink" href="#id287" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.va_end(i8* <arglist>)</pre>
+</div>
+</div>
+<div class="section" id="id288">
+<h5><a class="toc-backref" href="#id988">Overview:</a><a class="headerlink" href="#id288" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.va_end</span></tt>‘ intrinsic destroys <tt class="docutils literal"><span class="pre">*<arglist></span></tt>, which has been
+initialized previously with <tt class="docutils literal"><span class="pre">llvm.va_start</span></tt> or <tt class="docutils literal"><span class="pre">llvm.va_copy</span></tt>.</p>
+</div>
+<div class="section" id="id289">
+<h5><a class="toc-backref" href="#id989">Arguments:</a><a class="headerlink" href="#id289" title="Permalink to this headline">¶</a></h5>
+<p>The argument is a pointer to a <tt class="docutils literal"><span class="pre">va_list</span></tt> to destroy.</p>
+</div>
+<div class="section" id="id290">
+<h5><a class="toc-backref" href="#id990">Semantics:</a><a class="headerlink" href="#id290" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.va_end</span></tt>‘ intrinsic works just like the <tt class="docutils literal"><span class="pre">va_end</span></tt> macro
+available in C. In a target-dependent way, it destroys the <tt class="docutils literal"><span class="pre">va_list</span></tt>
+element to which the argument points. Calls to
+<a class="reference internal" href="#int-va-start"><em>llvm.va_start</em></a> and
+<a class="reference internal" href="#int-va-copy"><em>llvm.va_copy</em></a> must be matched exactly with calls to
+<tt class="docutils literal"><span class="pre">llvm.va_end</span></tt>.</p>
+</div>
+</div>
+<div class="section" id="llvm-va-copy-intrinsic">
+<span id="int-va-copy"></span><h4><a class="toc-backref" href="#id991">‘<tt class="docutils literal"><span class="pre">llvm.va_copy</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-va-copy-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id291">
+<h5><a class="toc-backref" href="#id992">Syntax:</a><a class="headerlink" href="#id291" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.va_copy(i8* <destarglist>, i8* <srcarglist>)</pre>
+</div>
+</div>
+<div class="section" id="id292">
+<h5><a class="toc-backref" href="#id993">Overview:</a><a class="headerlink" href="#id292" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.va_copy</span></tt>‘ intrinsic copies the current argument position
+from the source argument list to the destination argument list.</p>
+</div>
+<div class="section" id="id293">
+<h5><a class="toc-backref" href="#id994">Arguments:</a><a class="headerlink" href="#id293" title="Permalink to this headline">¶</a></h5>
+<p>The first argument is a pointer to a <tt class="docutils literal"><span class="pre">va_list</span></tt> element to initialize.
+The second argument is a pointer to a <tt class="docutils literal"><span class="pre">va_list</span></tt> element to copy from.</p>
+</div>
+<div class="section" id="id294">
+<h5><a class="toc-backref" href="#id995">Semantics:</a><a class="headerlink" href="#id294" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.va_copy</span></tt>‘ intrinsic works just like the <tt class="docutils literal"><span class="pre">va_copy</span></tt> macro
+available in C. In a target-dependent way, it copies the source
+<tt class="docutils literal"><span class="pre">va_list</span></tt> element into the destination <tt class="docutils literal"><span class="pre">va_list</span></tt> element. This
+intrinsic is necessary because the `` llvm.va_start`` intrinsic may be
+arbitrarily complex and require, for example, memory allocation.</p>
+</div>
+</div>
+</div>
+<div class="section" id="accurate-garbage-collection-intrinsics">
+<h3><a class="toc-backref" href="#id996">Accurate Garbage Collection Intrinsics</a><a class="headerlink" href="#accurate-garbage-collection-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>LLVM support for <a class="reference external" href="GarbageCollection.html">Accurate Garbage Collection</a>
+(GC) requires the implementation and generation of these intrinsics.
+These intrinsics allow identification of <a class="reference internal" href="#int-gcroot"><em>GC roots on the
+stack</em></a>, as well as garbage collector implementations that
+require <a class="reference internal" href="#int-gcread"><em>read</em></a> and <a class="reference internal" href="#int-gcwrite"><em>write</em></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 class="reference external" 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>
+<div class="section" id="llvm-gcroot-intrinsic">
+<span id="int-gcroot"></span><h4><a class="toc-backref" href="#id997">‘<tt class="docutils literal"><span class="pre">llvm.gcroot</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-gcroot-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id295">
+<h5><a class="toc-backref" href="#id998">Syntax:</a><a class="headerlink" href="#id295" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.gcroot(i8** %ptrloc, i8* %metadata)</pre>
+</div>
+</div>
+<div class="section" id="id296">
+<h5><a class="toc-backref" href="#id999">Overview:</a><a class="headerlink" href="#id296" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.gcroot</span></tt>‘ intrinsic declares the existence of a GC root to
+the code generator, and allows some metadata to be associated with it.</p>
+</div>
+<div class="section" id="id297">
+<h5><a class="toc-backref" href="#id1000">Arguments:</a><a class="headerlink" href="#id297" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id298">
+<h5><a class="toc-backref" href="#id1001">Semantics:</a><a class="headerlink" href="#id298" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">llvm.gcroot</span></tt>‘ intrinsic may only be used in a function which
+<a class="reference internal" href="#gc"><em>specifies a GC algorithm</em></a>.</p>
+</div>
+</div>
+<div class="section" id="llvm-gcread-intrinsic">
+<span id="int-gcread"></span><h4><a class="toc-backref" href="#id1002">‘<tt class="docutils literal"><span class="pre">llvm.gcread</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-gcread-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id299">
+<h5><a class="toc-backref" href="#id1003">Syntax:</a><a class="headerlink" href="#id299" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i8* @llvm.gcread(i8* %ObjPtr, i8** %Ptr)</pre>
+</div>
+</div>
+<div class="section" id="id300">
+<h5><a class="toc-backref" href="#id1004">Overview:</a><a class="headerlink" href="#id300" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.gcread</span></tt>‘ intrinsic identifies reads of references from heap
+locations, allowing garbage collector implementations that require read
+barriers.</p>
+</div>
+<div class="section" id="id301">
+<h5><a class="toc-backref" href="#id1005">Arguments:</a><a class="headerlink" href="#id301" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id302">
+<h5><a class="toc-backref" href="#id1006">Semantics:</a><a class="headerlink" href="#id302" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.gcread</span></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 class="docutils literal"><span class="pre">llvm.gcread</span></tt>‘
+intrinsic may only be used in a function which <a class="reference internal" href="#gc"><em>specifies a GC
+algorithm</em></a>.</p>
+</div>
+</div>
+<div class="section" id="llvm-gcwrite-intrinsic">
+<span id="int-gcwrite"></span><h4><a class="toc-backref" href="#id1007">‘<tt class="docutils literal"><span class="pre">llvm.gcwrite</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-gcwrite-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id303">
+<h5><a class="toc-backref" href="#id1008">Syntax:</a><a class="headerlink" href="#id303" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.gcwrite(i8* %P1, i8* %Obj, i8** %P2)</pre>
+</div>
+</div>
+<div class="section" id="id304">
+<h5><a class="toc-backref" href="#id1009">Overview:</a><a class="headerlink" href="#id304" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.gcwrite</span></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>
+</div>
+<div class="section" id="id305">
+<h5><a class="toc-backref" href="#id1010">Arguments:</a><a class="headerlink" href="#id305" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id306">
+<h5><a class="toc-backref" href="#id1011">Semantics:</a><a class="headerlink" href="#id306" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.gcwrite</span></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 class="docutils literal"><span class="pre">llvm.gcwrite</span></tt>‘
+intrinsic may only be used in a function which <a class="reference internal" href="#gc"><em>specifies a GC
+algorithm</em></a>.</p>
+</div>
+</div>
+</div>
+<div class="section" id="code-generator-intrinsics">
+<h3><a class="toc-backref" href="#id1012">Code Generator Intrinsics</a><a class="headerlink" href="#code-generator-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>These intrinsics are provided by LLVM to expose special features that
+may only be implemented with code generator support.</p>
+<div class="section" id="llvm-returnaddress-intrinsic">
+<h4><a class="toc-backref" href="#id1013">‘<tt class="docutils literal"><span class="pre">llvm.returnaddress</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-returnaddress-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id307">
+<h5><a class="toc-backref" href="#id1014">Syntax:</a><a class="headerlink" href="#id307" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i8  *@llvm.returnaddress(i32 <level>)</pre>
+</div>
+</div>
+<div class="section" id="id308">
+<h5><a class="toc-backref" href="#id1015">Overview:</a><a class="headerlink" href="#id308" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.returnaddress</span></tt>‘ intrinsic attempts to compute a
+target-specific value indicating the return address of the current
+function or one of its callers.</p>
+</div>
+<div class="section" id="id309">
+<h5><a class="toc-backref" href="#id1016">Arguments:</a><a class="headerlink" href="#id309" title="Permalink to this headline">¶</a></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 <strong>required</strong> to be a constant integer
+value.</p>
+</div>
+<div class="section" id="id310">
+<h5><a class="toc-backref" href="#id1017">Semantics:</a><a class="headerlink" href="#id310" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.returnaddress</span></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>
+</div>
+<div class="section" id="llvm-frameaddress-intrinsic">
+<h4><a class="toc-backref" href="#id1018">‘<tt class="docutils literal"><span class="pre">llvm.frameaddress</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-frameaddress-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id311">
+<h5><a class="toc-backref" href="#id1019">Syntax:</a><a class="headerlink" href="#id311" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i8* @llvm.frameaddress(i32 <level>)</pre>
+</div>
+</div>
+<div class="section" id="id312">
+<h5><a class="toc-backref" href="#id1020">Overview:</a><a class="headerlink" href="#id312" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.frameaddress</span></tt>‘ intrinsic attempts to return the
+target-specific frame pointer value for the specified stack frame.</p>
+</div>
+<div class="section" id="id313">
+<h5><a class="toc-backref" href="#id1021">Arguments:</a><a class="headerlink" href="#id313" title="Permalink to this headline">¶</a></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 <strong>required</strong> to be a constant integer
+value.</p>
+</div>
+<div class="section" id="id314">
+<h5><a class="toc-backref" href="#id1022">Semantics:</a><a class="headerlink" href="#id314" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.frameaddress</span></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>
+</div>
+<div class="section" id="llvm-read-register-and-llvm-write-register-intrinsics">
+<span id="int-write-register"></span><span id="int-read-register"></span><h4><a class="toc-backref" href="#id1023">‘<tt class="docutils literal"><span class="pre">llvm.read_register</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">llvm.write_register</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-read-register-and-llvm-write-register-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id315">
+<h5><a class="toc-backref" href="#id1024">Syntax:</a><a class="headerlink" href="#id315" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i32 @llvm.read_register.i32(metadata)
+declare i64 @llvm.read_register.i64(metadata)
+declare void @llvm.write_register.i32(metadata, i32 @value)
+declare void @llvm.write_register.i64(metadata, i64 @value)
+!0 = metadata !{metadata !"sp\00"}</pre>
+</div>
+</div>
+<div class="section" id="id316">
+<h5><a class="toc-backref" href="#id1025">Overview:</a><a class="headerlink" href="#id316" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.read_register</span></tt>‘ and ‘<tt class="docutils literal"><span class="pre">llvm.write_register</span></tt>‘ intrinsics
+provides access to the named register. The register must be valid on
+the architecture being compiled to. The type needs to be compatible
+with the register being read.</p>
+</div>
+<div class="section" id="id317">
+<h5><a class="toc-backref" href="#id1026">Semantics:</a><a class="headerlink" href="#id317" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.read_register</span></tt>‘ intrinsic returns the current value of the
+register, where possible. The ‘<tt class="docutils literal"><span class="pre">llvm.write_register</span></tt>‘ intrinsic sets
+the current value of the register, where possible.</p>
+<p>This is useful to implement named register global variables that need
+to always be mapped to a specific register, as is common practice on
+bare-metal programs including OS kernels.</p>
+<p>The compiler doesn’t check for register availability or use of the used
+register in surrounding code, including inline assembly. Because of that,
+allocatable registers are not supported.</p>
+<p>Warning: So far it only works with the stack pointer on selected
+architectures (ARM, AArch64, PowerPC and x86_64). Significant amount of
+work is needed to support other registers and even more so, allocatable
+registers.</p>
+</div>
+</div>
+<div class="section" id="llvm-stacksave-intrinsic">
+<span id="int-stacksave"></span><h4><a class="toc-backref" href="#id1027">‘<tt class="docutils literal"><span class="pre">llvm.stacksave</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-stacksave-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id318">
+<h5><a class="toc-backref" href="#id1028">Syntax:</a><a class="headerlink" href="#id318" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i8* @llvm.stacksave()</pre>
+</div>
+</div>
+<div class="section" id="id319">
+<h5><a class="toc-backref" href="#id1029">Overview:</a><a class="headerlink" href="#id319" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.stacksave</span></tt>‘ intrinsic is used to remember the current state
+of the function stack, for use with
+<a class="reference internal" href="#int-stackrestore"><em>llvm.stackrestore</em></a>. This is useful for
+implementing language features like scoped automatic variable sized
+arrays in C99.</p>
+</div>
+<div class="section" id="id320">
+<h5><a class="toc-backref" href="#id1030">Semantics:</a><a class="headerlink" href="#id320" title="Permalink to this headline">¶</a></h5>
+<p>This intrinsic returns a opaque pointer value that can be passed to
+<a class="reference internal" href="#int-stackrestore"><em>llvm.stackrestore</em></a>. When an
+<tt class="docutils literal"><span class="pre">llvm.stackrestore</span></tt> intrinsic is executed with a value saved from
+<tt class="docutils literal"><span class="pre">llvm.stacksave</span></tt>, it effectively restores the state of the stack to
+the state it was in when the <tt class="docutils literal"><span class="pre">llvm.stacksave</span></tt> intrinsic executed. In
+practice, this pops any <a class="reference internal" href="#i-alloca"><em>alloca</em></a> blocks from the stack that
+were allocated after the <tt class="docutils literal"><span class="pre">llvm.stacksave</span></tt> was executed.</p>
+</div>
+</div>
+<div class="section" id="llvm-stackrestore-intrinsic">
+<span id="int-stackrestore"></span><h4><a class="toc-backref" href="#id1031">‘<tt class="docutils literal"><span class="pre">llvm.stackrestore</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-stackrestore-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id321">
+<h5><a class="toc-backref" href="#id1032">Syntax:</a><a class="headerlink" href="#id321" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.stackrestore(i8* %ptr)</pre>
+</div>
+</div>
+<div class="section" id="id322">
+<h5><a class="toc-backref" href="#id1033">Overview:</a><a class="headerlink" href="#id322" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.stackrestore</span></tt>‘ intrinsic is used to restore the state of
+the function stack to the state it was in when the corresponding
+<a class="reference internal" href="#int-stacksave"><em>llvm.stacksave</em></a> intrinsic executed. This is
+useful for implementing language features like scoped automatic variable
+sized arrays in C99.</p>
+</div>
+<div class="section" id="id323">
+<h5><a class="toc-backref" href="#id1034">Semantics:</a><a class="headerlink" href="#id323" title="Permalink to this headline">¶</a></h5>
+<p>See the description for <a class="reference internal" href="#int-stacksave"><em>llvm.stacksave</em></a>.</p>
+</div>
+</div>
+<div class="section" id="llvm-prefetch-intrinsic">
+<h4><a class="toc-backref" href="#id1035">‘<tt class="docutils literal"><span class="pre">llvm.prefetch</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-prefetch-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id324">
+<h5><a class="toc-backref" href="#id1036">Syntax:</a><a class="headerlink" href="#id324" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.prefetch(i8* <address>, i32 <rw>, i32 <locality>, i32 <cache type>)</pre>
+</div>
+</div>
+<div class="section" id="id325">
+<h5><a class="toc-backref" href="#id1037">Overview:</a><a class="headerlink" href="#id325" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.prefetch</span></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>
+</div>
+<div class="section" id="id326">
+<h5><a class="toc-backref" href="#id1038">Arguments:</a><a class="headerlink" href="#id326" title="Permalink to this headline">¶</a></h5>
+<p><tt class="docutils literal"><span class="pre">address</span></tt> is the address to be prefetched, <tt class="docutils literal"><span class="pre">rw</span></tt> is the specifier
+determining if the fetch should be for a read (0) or write (1), and
+<tt class="docutils literal"><span class="pre">locality</span></tt> is a temporal locality specifier ranging from (0) - no
+locality, to (3) - extremely local keep in cache. The <tt class="docutils literal"><span class="pre">cache</span> <span class="pre">type</span></tt>
+specifies whether the prefetch is performed on the data (1) or
+instruction (0) cache. The <tt class="docutils literal"><span class="pre">rw</span></tt>, <tt class="docutils literal"><span class="pre">locality</span></tt> and <tt class="docutils literal"><span class="pre">cache</span> <span class="pre">type</span></tt>
+arguments must be constant integers.</p>
+</div>
+<div class="section" id="id327">
+<h5><a class="toc-backref" href="#id1039">Semantics:</a><a class="headerlink" href="#id327" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="llvm-pcmarker-intrinsic">
+<h4><a class="toc-backref" href="#id1040">‘<tt class="docutils literal"><span class="pre">llvm.pcmarker</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-pcmarker-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id328">
+<h5><a class="toc-backref" href="#id1041">Syntax:</a><a class="headerlink" href="#id328" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.pcmarker(i32 <id>)</pre>
+</div>
+</div>
+<div class="section" id="id329">
+<h5><a class="toc-backref" href="#id1042">Overview:</a><a class="headerlink" href="#id329" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.pcmarker</span></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>
+</div>
+<div class="section" id="id330">
+<h5><a class="toc-backref" href="#id1043">Arguments:</a><a class="headerlink" href="#id330" title="Permalink to this headline">¶</a></h5>
+<p><tt class="docutils literal"><span class="pre">id</span></tt> is a numerical id identifying the marker.</p>
+</div>
+<div class="section" id="id331">
+<h5><a class="toc-backref" href="#id1044">Semantics:</a><a class="headerlink" href="#id331" title="Permalink to this headline">¶</a></h5>
+<p>This intrinsic does not modify the behavior of the program. Backends
+that do not support this intrinsic may ignore it.</p>
+</div>
+</div>
+<div class="section" id="llvm-readcyclecounter-intrinsic">
+<h4><a class="toc-backref" href="#id1045">‘<tt class="docutils literal"><span class="pre">llvm.readcyclecounter</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-readcyclecounter-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id332">
+<h5><a class="toc-backref" href="#id1046">Syntax:</a><a class="headerlink" href="#id332" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i64 @llvm.readcyclecounter()</pre>
+</div>
+</div>
+<div class="section" id="id333">
+<h5><a class="toc-backref" href="#id1047">Overview:</a><a class="headerlink" href="#id333" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.readcyclecounter</span></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>
+</div>
+<div class="section" id="id334">
+<h5><a class="toc-backref" href="#id1048">Semantics:</a><a class="headerlink" href="#id334" title="Permalink to this headline">¶</a></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>
+<p>Note that runtime support may be conditional on the privilege-level code is
+running at and the host platform.</p>
+</div>
+</div>
+<div class="section" id="llvm-clear-cache-intrinsic">
+<h4><a class="toc-backref" href="#id1049">‘<tt class="docutils literal"><span class="pre">llvm.clear_cache</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-clear-cache-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id335">
+<h5><a class="toc-backref" href="#id1050">Syntax:</a><a class="headerlink" href="#id335" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare void @llvm.clear_cache(i8*, i8*)</pre>
+</div>
+</div>
+<div class="section" id="id336">
+<h5><a class="toc-backref" href="#id1051">Overview:</a><a class="headerlink" href="#id336" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.clear_cache</span></tt>‘ intrinsic ensures visibility of modifications
+in the specified range to the execution unit of the processor. On
+targets with non-unified instruction and data cache, the implementation
+flushes the instruction cache.</p>
+</div>
+<div class="section" id="id337">
+<h5><a class="toc-backref" href="#id1052">Semantics:</a><a class="headerlink" href="#id337" title="Permalink to this headline">¶</a></h5>
+<p>On platforms with coherent instruction and data caches (e.g. x86), this
+intrinsic is a nop. On platforms with non-coherent instruction and data
+cache (e.g. ARM, MIPS), the intrinsic is lowered either to appropriate
+instructions or a system call, if cache flushing requires special
+privileges.</p>
+<p>The default behavior is to emit a call to <tt class="docutils literal"><span class="pre">__clear_cache</span></tt> from the run
+time library.</p>
+<p>This instrinsic does <em>not</em> empty the instruction pipeline. Modifications
+of the current function are outside the scope of the intrinsic.</p>
+</div>
+</div>
+</div>
+<div class="section" id="standard-c-library-intrinsics">
+<h3><a class="toc-backref" href="#id1053">Standard C Library Intrinsics</a><a class="headerlink" href="#standard-c-library-intrinsics" title="Permalink to this headline">¶</a></h3>
+<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>
+<div class="section" id="llvm-memcpy-intrinsic">
+<span id="int-memcpy"></span><h4><a class="toc-backref" href="#id1054">‘<tt class="docutils literal"><span class="pre">llvm.memcpy</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-memcpy-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id338">
+<h5><a class="toc-backref" href="#id1055">Syntax:</a><a class="headerlink" href="#id338" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.memcpy</span></tt> on any
+integer bit width and for different address spaces. Not all targets
+support all bit widths however.</p>
+<div class="highlight-python"><pre>declare void @llvm.memcpy.p0i8.p0i8.i32(i8* <dest>, i8* <src>,
+                                        i32 <len>, i32 <align>, i1 <isvolatile>)
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* <dest>, i8* <src>,
+                                        i64 <len>, i32 <align>, i1 <isvolatile>)</pre>
+</div>
+</div>
+<div class="section" id="id339">
+<h5><a class="toc-backref" href="#id1056">Overview:</a><a class="headerlink" href="#id339" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.memcpy.*</span></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 class="docutils literal"><span class="pre">llvm.memcpy.*</span></tt>
+intrinsics do not return a value, takes extra alignment/isvolatile
+arguments and the pointers can be in specified address spaces.</p>
+</div>
+<div class="section" id="id340">
+<h5><a class="toc-backref" href="#id1057">Arguments:</a><a class="headerlink" href="#id340" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">isvolatile</span></tt> parameter is <tt class="docutils literal"><span class="pre">true</span></tt>, the <tt class="docutils literal"><span class="pre">llvm.memcpy</span></tt> call is
+a <a class="reference internal" href="#volatile"><em>volatile operation</em></a>. The detailed access behavior is not
+very cleanly specified and it is unwise to depend on it.</p>
+</div>
+<div class="section" id="id341">
+<h5><a class="toc-backref" href="#id1058">Semantics:</a><a class="headerlink" href="#id341" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.memcpy.*</span></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 (both meaning no alignment).</p>
+</div>
+</div>
+<div class="section" id="llvm-memmove-intrinsic">
+<h4><a class="toc-backref" href="#id1059">‘<tt class="docutils literal"><span class="pre">llvm.memmove</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-memmove-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id342">
+<h5><a class="toc-backref" href="#id1060">Syntax:</a><a class="headerlink" href="#id342" title="Permalink to this headline">¶</a></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>
+<div class="highlight-python"><pre>declare void @llvm.memmove.p0i8.p0i8.i32(i8* <dest>, i8* <src>,
+                                         i32 <len>, i32 <align>, i1 <isvolatile>)
+declare void @llvm.memmove.p0i8.p0i8.i64(i8* <dest>, i8* <src>,
+                                         i64 <len>, i32 <align>, i1 <isvolatile>)</pre>
+</div>
+</div>
+<div class="section" id="id343">
+<h5><a class="toc-backref" href="#id1061">Overview:</a><a class="headerlink" href="#id343" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.memmove.*</span></tt>‘ intrinsics move a block of memory from the
+source location to the destination location. It is similar to the
+‘<tt class="docutils literal"><span class="pre">llvm.memcpy</span></tt>‘ intrinsic but allows the two memory locations to
+overlap.</p>
+<p>Note that, unlike the standard libc function, the <tt class="docutils literal"><span class="pre">llvm.memmove.*</span></tt>
+intrinsics do not return a value, takes extra alignment/isvolatile
+arguments and the pointers can be in specified address spaces.</p>
+</div>
+<div class="section" id="id344">
+<h5><a class="toc-backref" href="#id1062">Arguments:</a><a class="headerlink" href="#id344" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">isvolatile</span></tt> parameter is <tt class="docutils literal"><span class="pre">true</span></tt>, the <tt class="docutils literal"><span class="pre">llvm.memmove</span></tt> call
+is a <a class="reference internal" href="#volatile"><em>volatile operation</em></a>. The detailed access behavior is
+not very cleanly specified and it is unwise to depend on it.</p>
+</div>
+<div class="section" id="id345">
+<h5><a class="toc-backref" href="#id1063">Semantics:</a><a class="headerlink" href="#id345" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.memmove.*</span></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 (both meaning no alignment).</p>
+</div>
+</div>
+<div class="section" id="llvm-memset-intrinsics">
+<h4><a class="toc-backref" href="#id1064">‘<tt class="docutils literal"><span class="pre">llvm.memset.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-memset-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id346">
+<h5><a class="toc-backref" href="#id1065">Syntax:</a><a class="headerlink" href="#id346" title="Permalink to this headline">¶</a></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>
+<div class="highlight-python"><pre>declare void @llvm.memset.p0i8.i32(i8* <dest>, i8 <val>,
+                                   i32 <len>, i32 <align>, i1 <isvolatile>)
+declare void @llvm.memset.p0i8.i64(i8* <dest>, i8 <val>,
+                                   i64 <len>, i32 <align>, i1 <isvolatile>)</pre>
+</div>
+</div>
+<div class="section" id="id347">
+<h5><a class="toc-backref" href="#id1066">Overview:</a><a class="headerlink" href="#id347" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.memset.*</span></tt>‘ intrinsics fill a block of memory with a
+particular byte value.</p>
+<p>Note that, unlike the standard libc function, the <tt class="docutils literal"><span class="pre">llvm.memset</span></tt>
+intrinsic does not return a value and takes extra alignment/volatile
+arguments. Also, the destination can be in an arbitrary address space.</p>
+</div>
+<div class="section" id="id348">
+<h5><a class="toc-backref" href="#id1067">Arguments:</a><a class="headerlink" href="#id348" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">isvolatile</span></tt> parameter is <tt class="docutils literal"><span class="pre">true</span></tt>, the <tt class="docutils literal"><span class="pre">llvm.memset</span></tt> call is
+a <a class="reference internal" href="#volatile"><em>volatile operation</em></a>. The detailed access behavior is not
+very cleanly specified and it is unwise to depend on it.</p>
+</div>
+<div class="section" id="id349">
+<h5><a class="toc-backref" href="#id1068">Semantics:</a><a class="headerlink" href="#id349" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.memset.*</span></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 (both meaning no alignment).</p>
+</div>
+</div>
+<div class="section" id="llvm-sqrt-intrinsic">
+<h4><a class="toc-backref" href="#id1069">‘<tt class="docutils literal"><span class="pre">llvm.sqrt.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-sqrt-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id350">
+<h5><a class="toc-backref" href="#id1070">Syntax:</a><a class="headerlink" href="#id350" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.sqrt</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id351">
+<h5><a class="toc-backref" href="#id1071">Overview:</a><a class="headerlink" href="#id351" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.sqrt</span></tt>‘ intrinsics return the sqrt of the specified operand,
+returning the same value as the libm ‘<tt class="docutils literal"><span class="pre">sqrt</span></tt>‘ functions would. Unlike
+<tt class="docutils literal"><span class="pre">sqrt</span></tt> in libm, however, <tt class="docutils literal"><span class="pre">llvm.sqrt</span></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 class="docutils literal"><span class="pre">llvm.sqrt(-0.0)</span></tt> is defined to return -0.0 like IEEE sqrt.</p>
+</div>
+<div class="section" id="id352">
+<h5><a class="toc-backref" href="#id1072">Arguments:</a><a class="headerlink" href="#id352" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id353">
+<h5><a class="toc-backref" href="#id1073">Semantics:</a><a class="headerlink" href="#id353" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the sqrt of the specified operand if it is a
+nonnegative floating point number.</p>
+</div>
+</div>
+<div class="section" id="llvm-powi-intrinsic">
+<h4><a class="toc-backref" href="#id1074">‘<tt class="docutils literal"><span class="pre">llvm.powi.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-powi-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id354">
+<h5><a class="toc-backref" href="#id1075">Syntax:</a><a class="headerlink" href="#id354" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.powi</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id355">
+<h5><a class="toc-backref" href="#id1076">Overview:</a><a class="headerlink" href="#id355" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.powi.*</span></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>
+</div>
+<div class="section" id="id356">
+<h5><a class="toc-backref" href="#id1077">Arguments:</a><a class="headerlink" href="#id356" title="Permalink to this headline">¶</a></h5>
+<p>The second argument is an integer power, and the first is a value to
+raise to that power.</p>
+</div>
+<div class="section" id="id357">
+<h5><a class="toc-backref" href="#id1078">Semantics:</a><a class="headerlink" href="#id357" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the first value raised to the second power with an
+unspecified sequence of rounding operations.</p>
+</div>
+</div>
+<div class="section" id="llvm-sin-intrinsic">
+<h4><a class="toc-backref" href="#id1079">‘<tt class="docutils literal"><span class="pre">llvm.sin.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-sin-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id358">
+<h5><a class="toc-backref" href="#id1080">Syntax:</a><a class="headerlink" href="#id358" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.sin</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id359">
+<h5><a class="toc-backref" href="#id1081">Overview:</a><a class="headerlink" href="#id359" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.sin.*</span></tt>‘ intrinsics return the sine of the operand.</p>
+</div>
+<div class="section" id="id360">
+<h5><a class="toc-backref" href="#id1082">Arguments:</a><a class="headerlink" href="#id360" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id361">
+<h5><a class="toc-backref" href="#id1083">Semantics:</a><a class="headerlink" href="#id361" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the sine of the specified operand, returning the
+same values as the libm <tt class="docutils literal"><span class="pre">sin</span></tt> functions would, and handles error
+conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-cos-intrinsic">
+<h4><a class="toc-backref" href="#id1084">‘<tt class="docutils literal"><span class="pre">llvm.cos.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-cos-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id362">
+<h5><a class="toc-backref" href="#id1085">Syntax:</a><a class="headerlink" href="#id362" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.cos</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id363">
+<h5><a class="toc-backref" href="#id1086">Overview:</a><a class="headerlink" href="#id363" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.cos.*</span></tt>‘ intrinsics return the cosine of the operand.</p>
+</div>
+<div class="section" id="id364">
+<h5><a class="toc-backref" href="#id1087">Arguments:</a><a class="headerlink" href="#id364" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id365">
+<h5><a class="toc-backref" href="#id1088">Semantics:</a><a class="headerlink" href="#id365" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the cosine of the specified operand, returning the
+same values as the libm <tt class="docutils literal"><span class="pre">cos</span></tt> functions would, and handles error
+conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-pow-intrinsic">
+<h4><a class="toc-backref" href="#id1089">‘<tt class="docutils literal"><span class="pre">llvm.pow.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-pow-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id366">
+<h5><a class="toc-backref" href="#id1090">Syntax:</a><a class="headerlink" href="#id366" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.pow</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id367">
+<h5><a class="toc-backref" href="#id1091">Overview:</a><a class="headerlink" href="#id367" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.pow.*</span></tt>‘ intrinsics return the first operand raised to the
+specified (positive or negative) power.</p>
+</div>
+<div class="section" id="id368">
+<h5><a class="toc-backref" href="#id1092">Arguments:</a><a class="headerlink" href="#id368" title="Permalink to this headline">¶</a></h5>
+<p>The second argument is a floating point power, and the first is a value
+to raise to that power.</p>
+</div>
+<div class="section" id="id369">
+<h5><a class="toc-backref" href="#id1093">Semantics:</a><a class="headerlink" href="#id369" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the first value raised to the second power,
+returning the same values as the libm <tt class="docutils literal"><span class="pre">pow</span></tt> functions would, and
+handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-exp-intrinsic">
+<h4><a class="toc-backref" href="#id1094">‘<tt class="docutils literal"><span class="pre">llvm.exp.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-exp-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id370">
+<h5><a class="toc-backref" href="#id1095">Syntax:</a><a class="headerlink" href="#id370" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.exp</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id371">
+<h5><a class="toc-backref" href="#id1096">Overview:</a><a class="headerlink" href="#id371" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.exp.*</span></tt>‘ intrinsics perform the exp function.</p>
+</div>
+<div class="section" id="id372">
+<h5><a class="toc-backref" href="#id1097">Arguments:</a><a class="headerlink" href="#id372" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id373">
+<h5><a class="toc-backref" href="#id1098">Semantics:</a><a class="headerlink" href="#id373" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">exp</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-exp2-intrinsic">
+<h4><a class="toc-backref" href="#id1099">‘<tt class="docutils literal"><span class="pre">llvm.exp2.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-exp2-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id374">
+<h5><a class="toc-backref" href="#id1100">Syntax:</a><a class="headerlink" href="#id374" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.exp2</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.exp2.f32(float  %Val)
+declare double    @llvm.exp2.f64(double %Val)
+declare x86_fp80  @llvm.exp2.f80(x86_fp80  %Val)
+declare fp128     @llvm.exp2.f128(fp128 %Val)
+declare ppc_fp128 @llvm.exp2.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id375">
+<h5><a class="toc-backref" href="#id1101">Overview:</a><a class="headerlink" href="#id375" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.exp2.*</span></tt>‘ intrinsics perform the exp2 function.</p>
+</div>
+<div class="section" id="id376">
+<h5><a class="toc-backref" href="#id1102">Arguments:</a><a class="headerlink" href="#id376" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id377">
+<h5><a class="toc-backref" href="#id1103">Semantics:</a><a class="headerlink" href="#id377" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">exp2</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-log-intrinsic">
+<h4><a class="toc-backref" href="#id1104">‘<tt class="docutils literal"><span class="pre">llvm.log.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-log-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id378">
+<h5><a class="toc-backref" href="#id1105">Syntax:</a><a class="headerlink" href="#id378" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.log</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id379">
+<h5><a class="toc-backref" href="#id1106">Overview:</a><a class="headerlink" href="#id379" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.log.*</span></tt>‘ intrinsics perform the log function.</p>
+</div>
+<div class="section" id="id380">
+<h5><a class="toc-backref" href="#id1107">Arguments:</a><a class="headerlink" href="#id380" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id381">
+<h5><a class="toc-backref" href="#id1108">Semantics:</a><a class="headerlink" href="#id381" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">log</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-log10-intrinsic">
+<h4><a class="toc-backref" href="#id1109">‘<tt class="docutils literal"><span class="pre">llvm.log10.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-log10-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id382">
+<h5><a class="toc-backref" href="#id1110">Syntax:</a><a class="headerlink" href="#id382" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.log10</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.log10.f32(float  %Val)
+declare double    @llvm.log10.f64(double %Val)
+declare x86_fp80  @llvm.log10.f80(x86_fp80  %Val)
+declare fp128     @llvm.log10.f128(fp128 %Val)
+declare ppc_fp128 @llvm.log10.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id383">
+<h5><a class="toc-backref" href="#id1111">Overview:</a><a class="headerlink" href="#id383" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.log10.*</span></tt>‘ intrinsics perform the log10 function.</p>
+</div>
+<div class="section" id="id384">
+<h5><a class="toc-backref" href="#id1112">Arguments:</a><a class="headerlink" href="#id384" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id385">
+<h5><a class="toc-backref" href="#id1113">Semantics:</a><a class="headerlink" href="#id385" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">log10</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-log2-intrinsic">
+<h4><a class="toc-backref" href="#id1114">‘<tt class="docutils literal"><span class="pre">llvm.log2.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-log2-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id386">
+<h5><a class="toc-backref" href="#id1115">Syntax:</a><a class="headerlink" href="#id386" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.log2</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.log2.f32(float  %Val)
+declare double    @llvm.log2.f64(double %Val)
+declare x86_fp80  @llvm.log2.f80(x86_fp80  %Val)
+declare fp128     @llvm.log2.f128(fp128 %Val)
+declare ppc_fp128 @llvm.log2.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id387">
+<h5><a class="toc-backref" href="#id1116">Overview:</a><a class="headerlink" href="#id387" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.log2.*</span></tt>‘ intrinsics perform the log2 function.</p>
+</div>
+<div class="section" id="id388">
+<h5><a class="toc-backref" href="#id1117">Arguments:</a><a class="headerlink" href="#id388" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id389">
+<h5><a class="toc-backref" href="#id1118">Semantics:</a><a class="headerlink" href="#id389" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">log2</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-fma-intrinsic">
+<h4><a class="toc-backref" href="#id1119">‘<tt class="docutils literal"><span class="pre">llvm.fma.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-fma-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id390">
+<h5><a class="toc-backref" href="#id1120">Syntax:</a><a class="headerlink" href="#id390" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.fma</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id391">
+<h5><a class="toc-backref" href="#id1121">Overview:</a><a class="headerlink" href="#id391" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.fma.*</span></tt>‘ intrinsics perform the fused multiply-add
+operation.</p>
+</div>
+<div class="section" id="id392">
+<h5><a class="toc-backref" href="#id1122">Arguments:</a><a class="headerlink" href="#id392" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id393">
+<h5><a class="toc-backref" href="#id1123">Semantics:</a><a class="headerlink" href="#id393" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">fma</span></tt> functions
+would, and does not set errno.</p>
+</div>
+</div>
+<div class="section" id="llvm-fabs-intrinsic">
+<h4><a class="toc-backref" href="#id1124">‘<tt class="docutils literal"><span class="pre">llvm.fabs.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-fabs-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id394">
+<h5><a class="toc-backref" href="#id1125">Syntax:</a><a class="headerlink" href="#id394" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.fabs</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.fabs.f32(float  %Val)
+declare double    @llvm.fabs.f64(double %Val)
+declare x86_fp80  @llvm.fabs.f80(x86_fp80  %Val)
+declare fp128     @llvm.fabs.f128(fp128 %Val)
+declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id395">
+<h5><a class="toc-backref" href="#id1126">Overview:</a><a class="headerlink" href="#id395" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.fabs.*</span></tt>‘ intrinsics return the absolute value of the
+operand.</p>
+</div>
+<div class="section" id="id396">
+<h5><a class="toc-backref" href="#id1127">Arguments:</a><a class="headerlink" href="#id396" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id397">
+<h5><a class="toc-backref" href="#id1128">Semantics:</a><a class="headerlink" href="#id397" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">fabs</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-copysign-intrinsic">
+<h4><a class="toc-backref" href="#id1129">‘<tt class="docutils literal"><span class="pre">llvm.copysign.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-copysign-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id398">
+<h5><a class="toc-backref" href="#id1130">Syntax:</a><a class="headerlink" href="#id398" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.copysign</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.copysign.f32(float  %Mag, float  %Sgn)
+declare double    @llvm.copysign.f64(double %Mag, double %Sgn)
+declare x86_fp80  @llvm.copysign.f80(x86_fp80  %Mag, x86_fp80  %Sgn)
+declare fp128     @llvm.copysign.f128(fp128 %Mag, fp128 %Sgn)
+declare ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128  %Mag, ppc_fp128  %Sgn)</pre>
+</div>
+</div>
+<div class="section" id="id399">
+<h5><a class="toc-backref" href="#id1131">Overview:</a><a class="headerlink" href="#id399" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.copysign.*</span></tt>‘ intrinsics return a value with the magnitude of the
+first operand and the sign of the second operand.</p>
+</div>
+<div class="section" id="id400">
+<h5><a class="toc-backref" href="#id1132">Arguments:</a><a class="headerlink" href="#id400" title="Permalink to this headline">¶</a></h5>
+<p>The arguments and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id401">
+<h5><a class="toc-backref" href="#id1133">Semantics:</a><a class="headerlink" href="#id401" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">copysign</span></tt>
+functions would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-floor-intrinsic">
+<h4><a class="toc-backref" href="#id1134">‘<tt class="docutils literal"><span class="pre">llvm.floor.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-floor-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id402">
+<h5><a class="toc-backref" href="#id1135">Syntax:</a><a class="headerlink" href="#id402" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.floor</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.floor.f32(float  %Val)
+declare double    @llvm.floor.f64(double %Val)
+declare x86_fp80  @llvm.floor.f80(x86_fp80  %Val)
+declare fp128     @llvm.floor.f128(fp128 %Val)
+declare ppc_fp128 @llvm.floor.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id403">
+<h5><a class="toc-backref" href="#id1136">Overview:</a><a class="headerlink" href="#id403" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.floor.*</span></tt>‘ intrinsics return the floor of the operand.</p>
+</div>
+<div class="section" id="id404">
+<h5><a class="toc-backref" href="#id1137">Arguments:</a><a class="headerlink" href="#id404" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id405">
+<h5><a class="toc-backref" href="#id1138">Semantics:</a><a class="headerlink" href="#id405" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">floor</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-ceil-intrinsic">
+<h4><a class="toc-backref" href="#id1139">‘<tt class="docutils literal"><span class="pre">llvm.ceil.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-ceil-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id406">
+<h5><a class="toc-backref" href="#id1140">Syntax:</a><a class="headerlink" href="#id406" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.ceil</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.ceil.f32(float  %Val)
+declare double    @llvm.ceil.f64(double %Val)
+declare x86_fp80  @llvm.ceil.f80(x86_fp80  %Val)
+declare fp128     @llvm.ceil.f128(fp128 %Val)
+declare ppc_fp128 @llvm.ceil.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id407">
+<h5><a class="toc-backref" href="#id1141">Overview:</a><a class="headerlink" href="#id407" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ceil.*</span></tt>‘ intrinsics return the ceiling of the operand.</p>
+</div>
+<div class="section" id="id408">
+<h5><a class="toc-backref" href="#id1142">Arguments:</a><a class="headerlink" href="#id408" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id409">
+<h5><a class="toc-backref" href="#id1143">Semantics:</a><a class="headerlink" href="#id409" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">ceil</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-trunc-intrinsic">
+<h4><a class="toc-backref" href="#id1144">‘<tt class="docutils literal"><span class="pre">llvm.trunc.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-trunc-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id410">
+<h5><a class="toc-backref" href="#id1145">Syntax:</a><a class="headerlink" href="#id410" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.trunc</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.trunc.f32(float  %Val)
+declare double    @llvm.trunc.f64(double %Val)
+declare x86_fp80  @llvm.trunc.f80(x86_fp80  %Val)
+declare fp128     @llvm.trunc.f128(fp128 %Val)
+declare ppc_fp128 @llvm.trunc.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id411">
+<h5><a class="toc-backref" href="#id1146">Overview:</a><a class="headerlink" href="#id411" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.trunc.*</span></tt>‘ intrinsics returns the operand rounded to the
+nearest integer not larger in magnitude than the operand.</p>
+</div>
+<div class="section" id="id412">
+<h5><a class="toc-backref" href="#id1147">Arguments:</a><a class="headerlink" href="#id412" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id413">
+<h5><a class="toc-backref" href="#id1148">Semantics:</a><a class="headerlink" href="#id413" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">trunc</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-rint-intrinsic">
+<h4><a class="toc-backref" href="#id1149">‘<tt class="docutils literal"><span class="pre">llvm.rint.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-rint-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id414">
+<h5><a class="toc-backref" href="#id1150">Syntax:</a><a class="headerlink" href="#id414" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.rint</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.rint.f32(float  %Val)
+declare double    @llvm.rint.f64(double %Val)
+declare x86_fp80  @llvm.rint.f80(x86_fp80  %Val)
+declare fp128     @llvm.rint.f128(fp128 %Val)
+declare ppc_fp128 @llvm.rint.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id415">
+<h5><a class="toc-backref" href="#id1151">Overview:</a><a class="headerlink" href="#id415" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.rint.*</span></tt>‘ intrinsics returns the operand rounded to the
+nearest integer. It may raise an inexact floating-point exception if the
+operand isn’t an integer.</p>
+</div>
+<div class="section" id="id416">
+<h5><a class="toc-backref" href="#id1152">Arguments:</a><a class="headerlink" href="#id416" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id417">
+<h5><a class="toc-backref" href="#id1153">Semantics:</a><a class="headerlink" href="#id417" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">rint</span></tt> functions
+would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-nearbyint-intrinsic">
+<h4><a class="toc-backref" href="#id1154">‘<tt class="docutils literal"><span class="pre">llvm.nearbyint.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-nearbyint-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id418">
+<h5><a class="toc-backref" href="#id1155">Syntax:</a><a class="headerlink" href="#id418" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.nearbyint</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.nearbyint.f32(float  %Val)
+declare double    @llvm.nearbyint.f64(double %Val)
+declare x86_fp80  @llvm.nearbyint.f80(x86_fp80  %Val)
+declare fp128     @llvm.nearbyint.f128(fp128 %Val)
+declare ppc_fp128 @llvm.nearbyint.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id419">
+<h5><a class="toc-backref" href="#id1156">Overview:</a><a class="headerlink" href="#id419" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.nearbyint.*</span></tt>‘ intrinsics returns the operand rounded to the
+nearest integer.</p>
+</div>
+<div class="section" id="id420">
+<h5><a class="toc-backref" href="#id1157">Arguments:</a><a class="headerlink" href="#id420" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id421">
+<h5><a class="toc-backref" href="#id1158">Semantics:</a><a class="headerlink" href="#id421" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">nearbyint</span></tt>
+functions would, and handles error conditions in the same way.</p>
+</div>
+</div>
+<div class="section" id="llvm-round-intrinsic">
+<h4><a class="toc-backref" href="#id1159">‘<tt class="docutils literal"><span class="pre">llvm.round.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-round-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id422">
+<h5><a class="toc-backref" href="#id1160">Syntax:</a><a class="headerlink" href="#id422" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.round</span></tt> on any
+floating point or vector of floating point type. Not all targets support
+all types however.</p>
+<div class="highlight-python"><pre>declare float     @llvm.round.f32(float  %Val)
+declare double    @llvm.round.f64(double %Val)
+declare x86_fp80  @llvm.round.f80(x86_fp80  %Val)
+declare fp128     @llvm.round.f128(fp128 %Val)
+declare ppc_fp128 @llvm.round.ppcf128(ppc_fp128  %Val)</pre>
+</div>
+</div>
+<div class="section" id="id423">
+<h5><a class="toc-backref" href="#id1161">Overview:</a><a class="headerlink" href="#id423" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.round.*</span></tt>‘ intrinsics returns the operand rounded to the
+nearest integer.</p>
+</div>
+<div class="section" id="id424">
+<h5><a class="toc-backref" href="#id1162">Arguments:</a><a class="headerlink" href="#id424" title="Permalink to this headline">¶</a></h5>
+<p>The argument and return value are floating point numbers of the same
+type.</p>
+</div>
+<div class="section" id="id425">
+<h5><a class="toc-backref" href="#id1163">Semantics:</a><a class="headerlink" href="#id425" title="Permalink to this headline">¶</a></h5>
+<p>This function returns the same values as the libm <tt class="docutils literal"><span class="pre">round</span></tt>
+functions would, and handles error conditions in the same way.</p>
+</div>
+</div>
+</div>
+<div class="section" id="bit-manipulation-intrinsics">
+<h3><a class="toc-backref" href="#id1164">Bit Manipulation Intrinsics</a><a class="headerlink" href="#bit-manipulation-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>LLVM provides intrinsics for a few important bit manipulation
+operations. These allow efficient code generation for some algorithms.</p>
+<div class="section" id="llvm-bswap-intrinsics">
+<h4><a class="toc-backref" href="#id1165">‘<tt class="docutils literal"><span class="pre">llvm.bswap.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-bswap-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id426">
+<h5><a class="toc-backref" href="#id1166">Syntax:</a><a class="headerlink" href="#id426" title="Permalink to this headline">¶</a></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>
+<div class="highlight-python"><pre>declare i16 @llvm.bswap.i16(i16 <id>)
+declare i32 @llvm.bswap.i32(i32 <id>)
+declare i64 @llvm.bswap.i64(i64 <id>)</pre>
+</div>
+</div>
+<div class="section" id="id427">
+<h5><a class="toc-backref" href="#id1167">Overview:</a><a class="headerlink" href="#id427" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.bswap</span></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>
+</div>
+<div class="section" id="id428">
+<h5><a class="toc-backref" href="#id1168">Semantics:</a><a class="headerlink" href="#id428" title="Permalink to this headline">¶</a></h5>
+<p>The <tt class="docutils literal"><span class="pre">llvm.bswap.i16</span></tt> intrinsic returns an i16 value that has the high
+and low byte of the input i16 swapped. Similarly, the <tt class="docutils literal"><span class="pre">llvm.bswap.i32</span></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 class="docutils literal"><span class="pre">llvm.bswap.i48</span></tt>, <tt class="docutils literal"><span class="pre">llvm.bswap.i64</span></tt> and other intrinsics extend this
+concept to additional even-byte lengths (6 bytes, 8 bytes and more,
+respectively).</p>
+</div>
+</div>
+<div class="section" id="llvm-ctpop-intrinsic">
+<h4><a class="toc-backref" href="#id1169">‘<tt class="docutils literal"><span class="pre">llvm.ctpop.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-ctpop-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id429">
+<h5><a class="toc-backref" href="#id1170">Syntax:</a><a class="headerlink" href="#id429" title="Permalink to this headline">¶</a></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>
+<div class="highlight-python"><pre>declare i8 @llvm.ctpop.i8(i8  <src>)
+declare i16 @llvm.ctpop.i16(i16 <src>)
+declare i32 @llvm.ctpop.i32(i32 <src>)
+declare i64 @llvm.ctpop.i64(i64 <src>)
+declare i256 @llvm.ctpop.i256(i256 <src>)
+declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32> <src>)</pre>
+</div>
+</div>
+<div class="section" id="id430">
+<h5><a class="toc-backref" href="#id1171">Overview:</a><a class="headerlink" href="#id430" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ctpop</span></tt>‘ family of intrinsics counts the number of bits set
+in a value.</p>
+</div>
+<div class="section" id="id431">
+<h5><a class="toc-backref" href="#id1172">Arguments:</a><a class="headerlink" href="#id431" title="Permalink to this headline">¶</a></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>
+</div>
+<div class="section" id="id432">
+<h5><a class="toc-backref" href="#id1173">Semantics:</a><a class="headerlink" href="#id432" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ctpop</span></tt>‘ intrinsic counts the 1’s in a variable, or within
+each element of a vector.</p>
+</div>
+</div>
+<div class="section" id="llvm-ctlz-intrinsic">
+<h4><a class="toc-backref" href="#id1174">‘<tt class="docutils literal"><span class="pre">llvm.ctlz.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-ctlz-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id433">
+<h5><a class="toc-backref" href="#id1175">Syntax:</a><a class="headerlink" href="#id433" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.ctlz</span></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>
+<div class="highlight-python"><pre>declare i8   @llvm.ctlz.i8  (i8   <src>, i1 <is_zero_undef>)
+declare i16  @llvm.ctlz.i16 (i16  <src>, i1 <is_zero_undef>)
+declare i32  @llvm.ctlz.i32 (i32  <src>, i1 <is_zero_undef>)
+declare i64  @llvm.ctlz.i64 (i64  <src>, i1 <is_zero_undef>)
+declare i256 @llvm.ctlz.i256(i256 <src>, i1 <is_zero_undef>)
+declase <2 x i32> @llvm.ctlz.v2i32(<2 x i32> <src>, i1 <is_zero_undef>)</pre>
+</div>
+</div>
+<div class="section" id="id434">
+<h5><a class="toc-backref" href="#id1176">Overview:</a><a class="headerlink" href="#id434" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ctlz</span></tt>‘ family of intrinsic functions counts the number of
+leading zeros in a variable.</p>
+</div>
+<div class="section" id="id435">
+<h5><a class="toc-backref" href="#id1177">Arguments:</a><a class="headerlink" href="#id435" title="Permalink to this headline">¶</a></h5>
+<p>The first argument is the value to be counted. This argument may be of
+any integer type, or a vectory with integer element type. The return
+type must match the first argument type.</p>
+<p>The second argument must be a constant and is a flag to indicate whether
+the intrinsic should ensure that a zero as the first argument produces a
+defined result. Historically some architectures did not provide a
+defined result for zero values as efficiently, and many algorithms are
+now predicated on avoiding zero-value inputs.</p>
+</div>
+<div class="section" id="id436">
+<h5><a class="toc-backref" href="#id1178">Semantics:</a><a class="headerlink" href="#id436" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ctlz</span></tt>‘ intrinsic counts the leading (most significant)
+zeros in a variable, or within each element of the vector. If
+<tt class="docutils literal"><span class="pre">src</span> <span class="pre">==</span> <span class="pre">0</span></tt> then the result is the size in bits of the type of <tt class="docutils literal"><span class="pre">src</span></tt>
+if <tt class="docutils literal"><span class="pre">is_zero_undef</span> <span class="pre">==</span> <span class="pre">0</span></tt> and <tt class="docutils literal"><span class="pre">undef</span></tt> otherwise. For example,
+<tt class="docutils literal"><span class="pre">llvm.ctlz(i32</span> <span class="pre">2)</span> <span class="pre">=</span> <span class="pre">30</span></tt>.</p>
+</div>
+</div>
+<div class="section" id="llvm-cttz-intrinsic">
+<h4><a class="toc-backref" href="#id1179">‘<tt class="docutils literal"><span class="pre">llvm.cttz.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-cttz-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id437">
+<h5><a class="toc-backref" href="#id1180">Syntax:</a><a class="headerlink" href="#id437" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.cttz</span></tt> on any
+integer bit width, or any vector of integer elements. Not all targets
+support all bit widths or vector types, however.</p>
+<div class="highlight-python"><pre>declare i8   @llvm.cttz.i8  (i8   <src>, i1 <is_zero_undef>)
+declare i16  @llvm.cttz.i16 (i16  <src>, i1 <is_zero_undef>)
+declare i32  @llvm.cttz.i32 (i32  <src>, i1 <is_zero_undef>)
+declare i64  @llvm.cttz.i64 (i64  <src>, i1 <is_zero_undef>)
+declare i256 @llvm.cttz.i256(i256 <src>, i1 <is_zero_undef>)
+declase <2 x i32> @llvm.cttz.v2i32(<2 x i32> <src>, i1 <is_zero_undef>)</pre>
+</div>
+</div>
+<div class="section" id="id438">
+<h5><a class="toc-backref" href="#id1181">Overview:</a><a class="headerlink" href="#id438" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.cttz</span></tt>‘ family of intrinsic functions counts the number of
+trailing zeros.</p>
+</div>
+<div class="section" id="id439">
+<h5><a class="toc-backref" href="#id1182">Arguments:</a><a class="headerlink" href="#id439" title="Permalink to this headline">¶</a></h5>
+<p>The first argument is the value to be counted. This argument may be of
+any integer type, or a vectory with integer element type. The return
+type must match the first argument type.</p>
+<p>The second argument must be a constant and is a flag to indicate whether
+the intrinsic should ensure that a zero as the first argument produces a
+defined result. Historically some architectures did not provide a
+defined result for zero values as efficiently, and many algorithms are
+now predicated on avoiding zero-value inputs.</p>
+</div>
+<div class="section" id="id440">
+<h5><a class="toc-backref" href="#id1183">Semantics:</a><a class="headerlink" href="#id440" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.cttz</span></tt>‘ intrinsic counts the trailing (least significant)
+zeros in a variable, or within each element of a vector. If <tt class="docutils literal"><span class="pre">src</span> <span class="pre">==</span> <span class="pre">0</span></tt>
+then the result is the size in bits of the type of <tt class="docutils literal"><span class="pre">src</span></tt> if
+<tt class="docutils literal"><span class="pre">is_zero_undef</span> <span class="pre">==</span> <span class="pre">0</span></tt> and <tt class="docutils literal"><span class="pre">undef</span></tt> otherwise. For example,
+<tt class="docutils literal"><span class="pre">llvm.cttz(2)</span> <span class="pre">=</span> <span class="pre">1</span></tt>.</p>
+</div>
+</div>
+</div>
+<div class="section" id="arithmetic-with-overflow-intrinsics">
+<h3><a class="toc-backref" href="#id1184">Arithmetic with Overflow Intrinsics</a><a class="headerlink" href="#arithmetic-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>LLVM provides intrinsics for some arithmetic with overflow operations.</p>
+<div class="section" id="llvm-sadd-with-overflow-intrinsics">
+<h4><a class="toc-backref" href="#id1185">‘<tt class="docutils literal"><span class="pre">llvm.sadd.with.overflow.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-sadd-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id441">
+<h5><a class="toc-backref" href="#id1186">Syntax:</a><a class="headerlink" href="#id441" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.sadd.with.overflow</span></tt>
+on any integer bit width.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id442">
+<h5><a class="toc-backref" href="#id1187">Overview:</a><a class="headerlink" href="#id442" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.sadd.with.overflow</span></tt>‘ family of intrinsic functions perform
+a signed addition of the two arguments, and indicate whether an overflow
+occurred during the signed summation.</p>
+</div>
+<div class="section" id="id443">
+<h5><a class="toc-backref" href="#id1188">Arguments:</a><a class="headerlink" href="#id443" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i1</span></tt>. <tt class="docutils literal"><span class="pre">%a</span></tt> and <tt class="docutils literal"><span class="pre">%b</span></tt> are the two values that will undergo signed
+addition.</p>
+</div>
+<div class="section" id="id444">
+<h5><a class="toc-backref" href="#id1189">Semantics:</a><a class="headerlink" href="#id444" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.sadd.with.overflow</span></tt>‘ family of intrinsic functions perform
+a signed addition of the two variables. They return a structure — 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>
+</div>
+<div class="section" id="id445">
+<h5><a class="toc-backref" href="#id1190">Examples:</a><a class="headerlink" href="#id445" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="vg">@llvm.sadd.with.overflow.i32</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%b</span><span class="p">)</span>
+<span class="nv">%sum</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">0</span>
+<span class="nv">%obit</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">1</span>
+<span class="k">br</span> <span class="k">i1</span> <span class="nv">%obit</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%overflow</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%normal</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="llvm-uadd-with-overflow-intrinsics">
+<h4><a class="toc-backref" href="#id1191">‘<tt class="docutils literal"><span class="pre">llvm.uadd.with.overflow.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-uadd-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id446">
+<h5><a class="toc-backref" href="#id1192">Syntax:</a><a class="headerlink" href="#id446" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.uadd.with.overflow</span></tt>
+on any integer bit width.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id447">
+<h5><a class="toc-backref" href="#id1193">Overview:</a><a class="headerlink" href="#id447" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.uadd.with.overflow</span></tt>‘ family of intrinsic functions perform
+an unsigned addition of the two arguments, and indicate whether a carry
+occurred during the unsigned summation.</p>
+</div>
+<div class="section" id="id448">
+<h5><a class="toc-backref" href="#id1194">Arguments:</a><a class="headerlink" href="#id448" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i1</span></tt>. <tt class="docutils literal"><span class="pre">%a</span></tt> and <tt class="docutils literal"><span class="pre">%b</span></tt> are the two values that will undergo unsigned
+addition.</p>
+</div>
+<div class="section" id="id449">
+<h5><a class="toc-backref" href="#id1195">Semantics:</a><a class="headerlink" href="#id449" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.uadd.with.overflow</span></tt>‘ family of intrinsic functions perform
+an unsigned addition of the two arguments. They return a structure — 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>
+</div>
+<div class="section" id="id450">
+<h5><a class="toc-backref" href="#id1196">Examples:</a><a class="headerlink" href="#id450" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="vg">@llvm.uadd.with.overflow.i32</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%b</span><span class="p">)</span>
+<span class="nv">%sum</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">0</span>
+<span class="nv">%obit</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">1</span>
+<span class="k">br</span> <span class="k">i1</span> <span class="nv">%obit</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%carry</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%normal</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="llvm-ssub-with-overflow-intrinsics">
+<h4><a class="toc-backref" href="#id1197">‘<tt class="docutils literal"><span class="pre">llvm.ssub.with.overflow.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-ssub-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id451">
+<h5><a class="toc-backref" href="#id1198">Syntax:</a><a class="headerlink" href="#id451" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.ssub.with.overflow</span></tt>
+on any integer bit width.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id452">
+<h5><a class="toc-backref" href="#id1199">Overview:</a><a class="headerlink" href="#id452" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ssub.with.overflow</span></tt>‘ family of intrinsic functions perform
+a signed subtraction of the two arguments, and indicate whether an
+overflow occurred during the signed subtraction.</p>
+</div>
+<div class="section" id="id453">
+<h5><a class="toc-backref" href="#id1200">Arguments:</a><a class="headerlink" href="#id453" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i1</span></tt>. <tt class="docutils literal"><span class="pre">%a</span></tt> and <tt class="docutils literal"><span class="pre">%b</span></tt> are the two values that will undergo signed
+subtraction.</p>
+</div>
+<div class="section" id="id454">
+<h5><a class="toc-backref" href="#id1201">Semantics:</a><a class="headerlink" href="#id454" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.ssub.with.overflow</span></tt>‘ family of intrinsic functions perform
+a signed subtraction of the two arguments. They return a structure — 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>
+</div>
+<div class="section" id="id455">
+<h5><a class="toc-backref" href="#id1202">Examples:</a><a class="headerlink" href="#id455" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="vg">@llvm.ssub.with.overflow.i32</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%b</span><span class="p">)</span>
+<span class="nv">%sum</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">0</span>
+<span class="nv">%obit</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">1</span>
+<span class="k">br</span> <span class="k">i1</span> <span class="nv">%obit</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%overflow</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%normal</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="llvm-usub-with-overflow-intrinsics">
+<h4><a class="toc-backref" href="#id1203">‘<tt class="docutils literal"><span class="pre">llvm.usub.with.overflow.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-usub-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id456">
+<h5><a class="toc-backref" href="#id1204">Syntax:</a><a class="headerlink" href="#id456" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.usub.with.overflow</span></tt>
+on any integer bit width.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id457">
+<h5><a class="toc-backref" href="#id1205">Overview:</a><a class="headerlink" href="#id457" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.usub.with.overflow</span></tt>‘ family of intrinsic functions perform
+an unsigned subtraction of the two arguments, and indicate whether an
+overflow occurred during the unsigned subtraction.</p>
+</div>
+<div class="section" id="id458">
+<h5><a class="toc-backref" href="#id1206">Arguments:</a><a class="headerlink" href="#id458" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i1</span></tt>. <tt class="docutils literal"><span class="pre">%a</span></tt> and <tt class="docutils literal"><span class="pre">%b</span></tt> are the two values that will undergo unsigned
+subtraction.</p>
+</div>
+<div class="section" id="id459">
+<h5><a class="toc-backref" href="#id1207">Semantics:</a><a class="headerlink" href="#id459" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.usub.with.overflow</span></tt>‘ family of intrinsic functions perform
+an unsigned subtraction of the two arguments. They return a structure —
+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>
+</div>
+<div class="section" id="id460">
+<h5><a class="toc-backref" href="#id1208">Examples:</a><a class="headerlink" href="#id460" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="vg">@llvm.usub.with.overflow.i32</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%b</span><span class="p">)</span>
+<span class="nv">%sum</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">0</span>
+<span class="nv">%obit</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">1</span>
+<span class="k">br</span> <span class="k">i1</span> <span class="nv">%obit</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%overflow</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%normal</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="llvm-smul-with-overflow-intrinsics">
+<h4><a class="toc-backref" href="#id1209">‘<tt class="docutils literal"><span class="pre">llvm.smul.with.overflow.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-smul-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id461">
+<h5><a class="toc-backref" href="#id1210">Syntax:</a><a class="headerlink" href="#id461" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.smul.with.overflow</span></tt>
+on any integer bit width.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id462">
+<h5><a class="toc-backref" href="#id1211">Overview:</a><a class="headerlink" href="#id462" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.smul.with.overflow</span></tt>‘ family of intrinsic functions perform
+a signed multiplication of the two arguments, and indicate whether an
+overflow occurred during the signed multiplication.</p>
+</div>
+<div class="section" id="id463">
+<h5><a class="toc-backref" href="#id1212">Arguments:</a><a class="headerlink" href="#id463" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i1</span></tt>. <tt class="docutils literal"><span class="pre">%a</span></tt> and <tt class="docutils literal"><span class="pre">%b</span></tt> are the two values that will undergo signed
+multiplication.</p>
+</div>
+<div class="section" id="id464">
+<h5><a class="toc-backref" href="#id1213">Semantics:</a><a class="headerlink" href="#id464" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.smul.with.overflow</span></tt>‘ family of intrinsic functions perform
+a signed multiplication of the two arguments. They return a structure —
+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>
+</div>
+<div class="section" id="id465">
+<h5><a class="toc-backref" href="#id1214">Examples:</a><a class="headerlink" href="#id465" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="vg">@llvm.smul.with.overflow.i32</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%b</span><span class="p">)</span>
+<span class="nv">%sum</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">0</span>
+<span class="nv">%obit</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">1</span>
+<span class="k">br</span> <span class="k">i1</span> <span class="nv">%obit</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%overflow</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%normal</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="llvm-umul-with-overflow-intrinsics">
+<h4><a class="toc-backref" href="#id1215">‘<tt class="docutils literal"><span class="pre">llvm.umul.with.overflow.*</span></tt>‘ Intrinsics</a><a class="headerlink" href="#llvm-umul-with-overflow-intrinsics" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id466">
+<h5><a class="toc-backref" href="#id1216">Syntax:</a><a class="headerlink" href="#id466" title="Permalink to this headline">¶</a></h5>
+<p>This is an overloaded intrinsic. You can use <tt class="docutils literal"><span class="pre">llvm.umul.with.overflow</span></tt>
+on any integer bit width.</p>
+<div class="highlight-python"><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>
+</div>
+</div>
+<div class="section" id="id467">
+<h5><a class="toc-backref" href="#id1217">Overview:</a><a class="headerlink" href="#id467" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.umul.with.overflow</span></tt>‘ family of intrinsic functions perform
+a unsigned multiplication of the two arguments, and indicate whether an
+overflow occurred during the unsigned multiplication.</p>
+</div>
+<div class="section" id="id468">
+<h5><a class="toc-backref" href="#id1218">Arguments:</a><a class="headerlink" href="#id468" title="Permalink to this headline">¶</a></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 class="docutils literal"><span class="pre">i1</span></tt>. <tt class="docutils literal"><span class="pre">%a</span></tt> and <tt class="docutils literal"><span class="pre">%b</span></tt> are the two values that will undergo unsigned
+multiplication.</p>
+</div>
+<div class="section" id="id469">
+<h5><a class="toc-backref" href="#id1219">Semantics:</a><a class="headerlink" href="#id469" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.umul.with.overflow</span></tt>‘ family of intrinsic functions perform
+an unsigned multiplication of the two arguments. They return a structure —
+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>
+</div>
+<div class="section" id="id470">
+<h5><a class="toc-backref" href="#id1220">Examples:</a><a class="headerlink" href="#id470" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="vg">@llvm.umul.with.overflow.i32</span><span class="p">(</span><span class="k">i32</span> <span class="nv">%a</span><span class="p">,</span> <span class="k">i32</span> <span class="nv">%b</span><span class="p">)</span>
+<span class="nv">%sum</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">0</span>
+<span class="nv">%obit</span> <span class="p">=</span> <span class="k">extractvalue</span> <span class="p">{</span><span class="k">i32</span><span class="p">,</span> <span class="k">i1</span><span class="p">}</span> <span class="nv">%res</span><span class="p">,</span> <span class="m">1</span>
+<span class="k">br</span> <span class="k">i1</span> <span class="nv">%obit</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%overflow</span><span class="p">,</span> <span class="kt">label</span> <span class="nv">%normal</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="specialised-arithmetic-intrinsics">
+<h3><a class="toc-backref" href="#id1221">Specialised Arithmetic Intrinsics</a><a class="headerlink" href="#specialised-arithmetic-intrinsics" title="Permalink to this headline">¶</a></h3>
+<div class="section" id="llvm-fmuladd-intrinsic">
+<h4><a class="toc-backref" href="#id1222">‘<tt class="docutils literal"><span class="pre">llvm.fmuladd.*</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-fmuladd-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id471">
+<h5><a class="toc-backref" href="#id1223">Syntax:</a><a class="headerlink" href="#id471" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare float @llvm.fmuladd.f32(float %a, float %b, float %c)
+declare double @llvm.fmuladd.f64(double %a, double %b, double %c)</pre>
+</div>
+</div>
+<div class="section" id="id472">
+<h5><a class="toc-backref" href="#id1224">Overview:</a><a class="headerlink" href="#id472" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.fmuladd.*</span></tt>‘ intrinsic functions represent multiply-add
+expressions that can be fused if the code generator determines that (a) the
+target instruction set has support for a fused operation, and (b) that the
+fused operation is more efficient than the equivalent, separate pair of mul
+and add instructions.</p>
+</div>
+<div class="section" id="id473">
+<h5><a class="toc-backref" href="#id1225">Arguments:</a><a class="headerlink" href="#id473" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.fmuladd.*</span></tt>‘ intrinsics each take three arguments: two
+multiplicands, a and b, and an addend c.</p>
+</div>
+<div class="section" id="id474">
+<h5><a class="toc-backref" href="#id1226">Semantics:</a><a class="headerlink" href="#id474" title="Permalink to this headline">¶</a></h5>
+<p>The expression:</p>
+<div class="highlight-python"><pre>%0 = call float @llvm.fmuladd.f32(%a, %b, %c)</pre>
+</div>
+<p>is equivalent to the expression a * b + c, except that rounding will
+not be performed between the multiplication and addition steps if the
+code generator fuses the operations. Fusion is not guaranteed, even if
+the target platform supports it. If a fused multiply-add is required the
+corresponding llvm.fma.* intrinsic function should be used
+instead. This never sets errno, just as ‘<tt class="docutils literal"><span class="pre">llvm.fma.*</span></tt>‘.</p>
+</div>
+<div class="section" id="id475">
+<h5><a class="toc-backref" href="#id1227">Examples:</a><a class="headerlink" href="#id475" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%r2</span> <span class="p">=</span> <span class="k">call</span> <span class="kt">float</span> <span class="vg">@llvm.fmuladd.f32</span><span class="p">(</span><span class="kt">float</span> <span class="nv">%a</span><span class="p">,</span> <span class="kt">float</span> <span class="nv">%b</span><span class="p">,</span> <span class="kt">float</span> <span class="nv">%c</span><span class="p">)</span> <span class="c">; yields float:r2 = (a * b) + c</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="half-precision-floating-point-intrinsics">
+<h3><a class="toc-backref" href="#id1228">Half Precision Floating Point Intrinsics</a><a class="headerlink" href="#half-precision-floating-point-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>For most target platforms, 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 class="reference internal" href="#int-convert-from-fp16"><em>llvm.convert.from.fp16</em></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 class="reference internal" href="#int-convert-to-fp16"><em>llvm.convert.to.fp16</em></a>, then storing as an
+i16 value.</p>
+<div class="section" id="llvm-convert-to-fp16-intrinsic">
+<span id="int-convert-to-fp16"></span><h4><a class="toc-backref" href="#id1229">‘<tt class="docutils literal"><span class="pre">llvm.convert.to.fp16</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-convert-to-fp16-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id476">
+<h5><a class="toc-backref" href="#id1230">Syntax:</a><a class="headerlink" href="#id476" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare i16 @llvm.convert.to.fp16.f32(float %a)
+declare i16 @llvm.convert.to.fp16.f64(double %a)</pre>
+</div>
+</div>
+<div class="section" id="id477">
+<h5><a class="toc-backref" href="#id1231">Overview:</a><a class="headerlink" href="#id477" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.convert.to.fp16</span></tt>‘ intrinsic function performs a conversion from a
+conventional floating point type to half precision floating point format.</p>
+</div>
+<div class="section" id="id478">
+<h5><a class="toc-backref" href="#id1232">Arguments:</a><a class="headerlink" href="#id478" title="Permalink to this headline">¶</a></h5>
+<p>The intrinsic function contains single argument - the value to be
+converted.</p>
+</div>
+<div class="section" id="id479">
+<h5><a class="toc-backref" href="#id1233">Semantics:</a><a class="headerlink" href="#id479" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.convert.to.fp16</span></tt>‘ intrinsic function performs a conversion from a
+conventional floating point format to half precision floating point format. The
+return value is an <tt class="docutils literal"><span class="pre">i16</span></tt> which contains the converted number.</p>
+</div>
+<div class="section" id="id480">
+<h5><a class="toc-backref" href="#id1234">Examples:</a><a class="headerlink" href="#id480" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="k">i16</span> <span class="vg">@llvm.convert.to.fp16.f32</span><span class="p">(</span><span class="kt">float</span> <span class="nv">%a</span><span class="p">)</span>
+<span class="k">store</span> <span class="k">i16</span> <span class="nv">%res</span><span class="p">,</span> <span class="k">i16</span><span class="p">*</span> <span class="vg">@x</span><span class="p">,</span> <span class="k">align</span> <span class="m">2</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="llvm-convert-from-fp16-intrinsic">
+<span id="int-convert-from-fp16"></span><h4><a class="toc-backref" href="#id1235">‘<tt class="docutils literal"><span class="pre">llvm.convert.from.fp16</span></tt>‘ Intrinsic</a><a class="headerlink" href="#llvm-convert-from-fp16-intrinsic" title="Permalink to this headline">¶</a></h4>
+<div class="section" id="id481">
+<h5><a class="toc-backref" href="#id1236">Syntax:</a><a class="headerlink" href="#id481" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-python"><pre>declare float @llvm.convert.from.fp16.f32(i16 %a)
+declare double @llvm.convert.from.fp16.f64(i16 %a)</pre>
+</div>
+</div>
+<div class="section" id="id482">
+<h5><a class="toc-backref" href="#id1237">Overview:</a><a class="headerlink" href="#id482" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.convert.from.fp16</span></tt>‘ intrinsic function performs a
+conversion from half precision floating point format to single precision
+floating point format.</p>
+</div>
+<div class="section" id="id483">
+<h5><a class="toc-backref" href="#id1238">Arguments:</a><a class="headerlink" href="#id483" title="Permalink to this headline">¶</a></h5>
+<p>The intrinsic function contains single argument - the value to be
+converted.</p>
+</div>
+<div class="section" id="id484">
+<h5><a class="toc-backref" href="#id1239">Semantics:</a><a class="headerlink" href="#id484" title="Permalink to this headline">¶</a></h5>
+<p>The ‘<tt class="docutils literal"><span class="pre">llvm.convert.from.fp16</span></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 class="docutils literal"><span class="pre">i16</span></tt> value.</p>
+</div>
+<div class="section" id="id485">
+<h5><a class="toc-backref" href="#id1240">Examples:</a><a class="headerlink" href="#id485" title="Permalink to this headline">¶</a></h5>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%a</span> <span class="p">=</span> <span class="k">load</span> <span class="k">i16</span><span class="p">*</span> <span class="vg">@x</span><span class="p">,</span> <span class="k">align</span> <span class="m">2</span>
+<span class="nv">%res</span> <span class="p">=</span> <span class="k">call</span> <span class="kt">float</span> <span class="vg">@llvm.convert.from.fp16</span><span class="p">(</span><span class="k">i16</span> <span class="nv">%a</span><span class="p">)</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="debugger-intrinsics">
+<h3><a class="toc-backref" href="#id1241">Debugger Intrinsics</a><a class="headerlink" href="#debugger-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>The LLVM debugger intrinsics (which all start with <tt class="docutils literal"><span class="pre">llvm.dbg.</span></tt>
+prefix), are described in the <a class="reference external" href="SourceLevelDebugging.html#format_common_intrinsics">LLVM Source Level
+Debugging</a>
+document.</p>
+</div>
+<div class="section" id="exception-handling-intrinsics">
+<h3><a class="toc-backref" href="#id1242">Exception Handling Intrinsics</a><a class="headerlink" href="#exception-handling-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>The LLVM exception handling intrinsics (which all start with
+<tt class="docutils literal"><span class="pre">llvm.eh.</span></tt> prefix), are described in the <a class="reference external" href="ExceptionHandling.html#format_common_intrinsics">LLVM Exception
+Handling</a> document.</p>
+</div>
+<div class="section" id="trampoline-intrinsics">
+<span id="int-trampoline"></span><h3><a class="toc-backref" href="#id1243">Trampoline Intrinsics</a><a class="headerlink" href="#trampoline-intrinsics" title="Permalink to this headline">¶</a></h3>
+<p>These intrinsics make it possible to excise one parameter, marked with
+the <a class="reference internal" href="#nest"><em>nest</em></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 class="docutils literal"><span class="pre">i32</span> <span class="pre">f(i8*</span> <span class="pre">nest</span> <span class="pre">%c,</span> <span class="pre">i32</span> <span class="pre">%x,</span> <span class="pre">i32</span> <span class="pre">%y)</span></tt>
+then the resulting function pointer has signature <tt class="docutils literal"><span class="pre">i32</span> <span class="pre">(i32,</span> <span class="pre">i32)*</span></tt>.
+It can be created as follows:</p>
+<div class="highlight-llvm"><div class="highlight"><pre><span class="nv">%tramp</span> <span class="p">=</span> <span class="k">alloca</span> <span class="p">[</span><span class="m">10</span> <span class="k">x</span> <span class="k">i8</span><span class="p">],</span> <span class="k">align</span> <span class="m">4</span> <span class="c">; size and alignment only correct for X86</span>
+<span class="nv">%tramp1</span> <span class="p">=</span> <span class="k">getelementptr</span> <span class="p">[</span><span class="m">10</span> <span class="k">x</span> <span class="k">i8</span><span class="p">]*</span> <span class="nv">%tramp</span><span class="p">,</span> <span class="k">i32</span> <span class="m">0</span><span class="p">,</span> <span class="k">i32</span> <span class="m">0</span>
+<span class="k">call</span> <span class="k">i8</span><span class="p">*</span> <span class="vg">@llvm.init.trampoline</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%tramp1</span><span class="p">,</span> <span class="k">i8</span><span class="p">*</span> <span class="k">bitcast</span> <span class="p">(</span><span class="k">i32</span> <span class="p">(</span><span class="k">i8</span><span class="p">*,</span> <span class="k">i32</span><span class="p">,</span> <span class="k">i32</span><span class="p">)*</span> <span class="vg">@f</span> <span class="k">to</span> <span class="k">i8</span><span class="p">*),</span> <span class="k">i8</span><span class="p">*</span> <span class="nv">%nval</span><span class="p">)</span>
+<span class="nv">%p</span> <span class="p">=</span> <span class="k">call</span> <span class="k">i8</span><span class="p">*</span> <span class="vg">@llvm.adjust.trampoline</span><span class="p">(</span><span class="k">i8</span><span class="p">*</span> <span class="nv">%tramp1</span><span class="p">)</span>
+<span class="nv">%fp</span> <span class="p">=</span> <span class="k">bitcast</span> <span class="k">i8</span><span class="p">*</span> <span class="nv">%p</span> <span class="k">to</span> <span class="k">i32</span> <span class="p">(</span><span class="k">i32</span><span class="p">,</span> <span class="k">i32</span><span class="p">)*</span>
+</pre></div>
+</div>
+<p>The call <tt class="docutils literal"><span class="pre">%val</span> <span class="pre">=</span> <span class="pre">call</span> <span class="pre">i32</span> <span class="pre">%fp(i32</span> <span class="pre">%x,</span> <span class="pre">i32</span> <span class="pre">%y)</span></tt> is then equivalent to
+<tt class="docutils literal"><span class="pre">%val</span> <span class="pre">=</span> <span class="pre">call</span> <span class="pre">i32</span> <span class="pre">%f(i8*</span> <span class="pre">%nval,</span> <span class="pre">i32</span> <span class="pre">%x,</span> <span class="pre">i32</span> <span c