[llvm-commits] [www-releases] r170845 [14/55] - in /www-releases/trunk/3.2/docs: ./ CommandGuide/ HistoricalNotes/ _static/ _templates/ _themes/ _themes/llvm-theme/ _themes/llvm-theme/static/ doxygen/ doxygen/html/ llvm-theme/ llvm-theme/static/ tutorial/

Tanya Lattner tonic at nondot.org
Thu Dec 20 22:58:17 PST 2012


Added: www-releases/trunk/3.2/docs/doxygen/html/ImmutableSet_8h_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/ImmutableSet_8h_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/ImmutableSet_8h_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/ImmutableSet_8h_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,1279 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: ImmutableSet.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_25acc6571c4e3a053ee4203146b47a61.html">include</a>      </li>
+      <li class="navelem"><a class="el" href="dir_fd2d7b5ce83b1c1657cd6600d8cb39fa.html">llvm</a>      </li>
+      <li class="navelem"><a class="el" href="dir_5760af5717174facf3d4fa63878994a9.html">ADT</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">ImmutableSet.h</div>  </div>
+</div>
+<div class="contents">
+<a href="ImmutableSet_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===--- ImmutableSet.h - Immutable (functional) set interface --*- C++ -*-===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// This file defines the ImutAVLTree and ImmutableSet classes.</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00012"></a>00012 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00013"></a>00013 
+<a name="l00014"></a>00014 <span class="preprocessor">#ifndef LLVM_ADT_IMSET_H</span>
+<a name="l00015"></a>00015 <span class="preprocessor"></span><span class="preprocessor">#define LLVM_ADT_IMSET_H</span>
+<a name="l00016"></a>00016 <span class="preprocessor"></span>
+<a name="l00017"></a>00017 <span class="preprocessor">#include "<a class="code" href="Allocator_8h.html">llvm/Support/Allocator.h</a>"</span>
+<a name="l00018"></a>00018 <span class="preprocessor">#include "<a class="code" href="DenseMap_8h.html">llvm/ADT/DenseMap.h</a>"</span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "<a class="code" href="FoldingSet_8h.html">llvm/ADT/FoldingSet.h</a>"</span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "<a class="code" href="DataTypes_8h.html">llvm/Support/DataTypes.h</a>"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include "<a class="code" href="ErrorHandling_8h.html">llvm/Support/ErrorHandling.h</a>"</span>
+<a name="l00022"></a>00022 <span class="preprocessor">#include <cassert></span>
+<a name="l00023"></a>00023 <span class="preprocessor">#include <functional></span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include <vector></span>
+<a name="l00025"></a>00025 
+<a name="l00026"></a>00026 <span class="keyword">namespace </span>llvm {
+<a name="l00027"></a>00027 
+<a name="l00028"></a>00028 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00029"></a>00029 <span class="comment">// Immutable AVL-Tree Definition.</span>
+<a name="l00030"></a>00030 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00031"></a>00031 
+<a name="l00032"></a>00032 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo> <span class="keyword">class </span>ImutAVLFactory;
+<a name="l00033"></a>00033 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo> <span class="keyword">class </span>ImutIntervalAVLFactory;
+<a name="l00034"></a>00034 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo> <span class="keyword">class </span>ImutAVLTreeInOrderIterator;
+<a name="l00035"></a>00035 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo> <span class="keyword">class </span>ImutAVLTreeGenericIterator;
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo >
+<a name="l00038"></a><a class="code" href="classllvm_1_1ImutAVLTree.html">00038</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> {
+<a name="l00039"></a>00039 <span class="keyword">public</span>:
+<a name="l00040"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a6bc42bceb3167802edeb0b050ed2889b">00040</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ImutInfo::key_type_ref   <a class="code" href="classllvm_1_1ImutAVLTree.html#a6bc42bceb3167802edeb0b050ed2889b">key_type_ref</a>;
+<a name="l00041"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#ad38ee9e58db9127cb700d13f5a694284">00041</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ImutInfo::value_type     <a class="code" href="classllvm_1_1ImutAVLTree.html#ad38ee9e58db9127cb700d13f5a694284">value_type</a>;
+<a name="l00042"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#aec6b52f3657c679b5abac2edcd66216d">00042</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ImutInfo::value_type_ref <a class="code" href="classllvm_1_1ImutAVLTree.html#aec6b52f3657c679b5abac2edcd66216d">value_type_ref</a>;
+<a name="l00043"></a>00043 
+<a name="l00044"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a3fc730f5723bb0d746a2528c0106faa5">00044</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html">ImutAVLFactory<ImutInfo></a>          <a class="code" href="classllvm_1_1ImutAVLTree.html#a3fc730f5723bb0d746a2528c0106faa5">Factory</a>;
+<a name="l00045"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a54ad730c6d75f4884253381996509fea">00045</a>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLFactory.html">ImutAVLFactory</a><ImutInfo>;
+<a name="l00046"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a35115bd2fa58159d363fbb3bd07d9456">00046</a>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutIntervalAVLFactory.html">ImutIntervalAVLFactory</a><ImutInfo>;
+<a name="l00047"></a>00047 
+<a name="l00048"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a20af87bd1dc06a8ebbbcd83e8d96d07b">00048</a>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html">ImutAVLTreeGenericIterator</a><ImutInfo>;
+<a name="l00049"></a>00049 
+<a name="l00050"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#abef4451482d9b528b928e21eb6bb6fec">00050</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">ImutAVLTreeInOrderIterator<ImutInfo></a>  <a class="code" href="classllvm_1_1ImutAVLTree.html#abef4451482d9b528b928e21eb6bb6fec">iterator</a>;
+<a name="l00051"></a>00051 
+<a name="l00052"></a>00052   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00053"></a>00053   <span class="comment">// Public Interface.</span>
+<a name="l00054"></a>00054   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00055"></a>00055 <span class="comment"></span>
+<a name="l00056"></a>00056 <span class="comment">  /// Return a pointer to the left subtree.  This value</span>
+<a name="l00057"></a>00057 <span class="comment">  ///  is NULL if there is no left subtree.</span>
+<a name="l00058"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">00058</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *<a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> left; }
+<a name="l00059"></a>00059 <span class="comment"></span>
+<a name="l00060"></a>00060 <span class="comment">  /// Return a pointer to the right subtree.  This value is</span>
+<a name="l00061"></a>00061 <span class="comment">  ///  NULL if there is no right subtree.</span>
+<a name="l00062"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">00062</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *<a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> right; }
+<a name="l00063"></a>00063 <span class="comment"></span>
+<a name="l00064"></a>00064 <span class="comment">  /// getHeight - Returns the height of the tree.  A tree with no subtrees</span>
+<a name="l00065"></a>00065 <span class="comment">  ///  has a height of 1.</span>
+<a name="l00066"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">00066</a> <span class="comment"></span>  <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">getHeight</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> height; }
+<a name="l00067"></a>00067 <span class="comment"></span>
+<a name="l00068"></a>00068 <span class="comment">  /// getValue - Returns the data value associated with the tree node.</span>
+<a name="l00069"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc">00069</a> <span class="comment"></span>  <span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#ad38ee9e58db9127cb700d13f5a694284">value_type</a>& <a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> value; }
+<a name="l00070"></a>00070 <span class="comment"></span>
+<a name="l00071"></a>00071 <span class="comment">  /// find - Finds the subtree associated with the specified key value.</span>
+<a name="l00072"></a>00072 <span class="comment">  ///  This method returns NULL if no matching subtree is found.</span>
+<a name="l00073"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#ab249c463c093a5c345979cdc3067fe64">00073</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* <a class="code" href="classllvm_1_1ImutAVLTree.html#ab249c463c093a5c345979cdc3067fe64">find</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html#a6bc42bceb3167802edeb0b050ed2889b">key_type_ref</a> K) {
+<a name="l00074"></a>00074     <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *T = <span class="keyword">this</span>;
+<a name="l00075"></a>00075     <span class="keywordflow">while</span> (T) {
+<a name="l00076"></a>00076       <a class="code" href="classllvm_1_1ImutAVLTree.html#a6bc42bceb3167802edeb0b050ed2889b">key_type_ref</a> CurrentKey = ImutInfo::KeyOfValue(T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>());
+<a name="l00077"></a>00077       <span class="keywordflow">if</span> (ImutInfo::isEqual(K,CurrentKey))
+<a name="l00078"></a>00078         <span class="keywordflow">return</span> T;
+<a name="l00079"></a>00079       <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ImutInfo::isLess(K,CurrentKey))
+<a name="l00080"></a>00080         T = T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>();
+<a name="l00081"></a>00081       <span class="keywordflow">else</span>
+<a name="l00082"></a>00082         T = T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>();
+<a name="l00083"></a>00083     }
+<a name="l00084"></a>00084     <span class="keywordflow">return</span> NULL;
+<a name="l00085"></a>00085   }
+<a name="l00086"></a>00086 <span class="comment"></span>
+<a name="l00087"></a>00087 <span class="comment">  /// getMaxElement - Find the subtree associated with the highest ranged</span>
+<a name="l00088"></a>00088 <span class="comment">  ///  key value.</span>
+<a name="l00089"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a23c0d45da78fc2aeaaaf0097797867d5">00089</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* <a class="code" href="classllvm_1_1ImutAVLTree.html#a23c0d45da78fc2aeaaaf0097797867d5">getMaxElement</a>() {
+<a name="l00090"></a>00090     <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *T = <span class="keyword">this</span>;
+<a name="l00091"></a>00091     <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *Right = T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>();
+<a name="l00092"></a>00092     <span class="keywordflow">while</span> (Right) { T = Right; Right = T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>(); }
+<a name="l00093"></a>00093     <span class="keywordflow">return</span> T;
+<a name="l00094"></a>00094   }
+<a name="l00095"></a>00095 <span class="comment"></span>
+<a name="l00096"></a>00096 <span class="comment">  /// size - Returns the number of nodes in the tree, which includes</span>
+<a name="l00097"></a>00097 <span class="comment">  ///  both leaves and non-leaf nodes.</span>
+<a name="l00098"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a5963ea86bd18a8d6119302c1a9932c02">00098</a> <span class="comment"></span>  <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a5963ea86bd18a8d6119302c1a9932c02">size</a>()<span class="keyword"> const </span>{
+<a name="l00099"></a>00099     <span class="keywordtype">unsigned</span> n = 1;
+<a name="l00100"></a>00100     <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* L = <a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>())
+<a name="l00101"></a>00101       n += L->size();
+<a name="l00102"></a>00102     <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* R = <a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>())
+<a name="l00103"></a>00103       n += R->size();
+<a name="l00104"></a>00104     <span class="keywordflow">return</span> n;
+<a name="l00105"></a>00105   }
+<a name="l00106"></a>00106 <span class="comment"></span>
+<a name="l00107"></a>00107 <span class="comment">  /// begin - Returns an iterator that iterates over the nodes of the tree</span>
+<a name="l00108"></a>00108 <span class="comment">  ///  in an inorder traversal.  The returned iterator thus refers to the</span>
+<a name="l00109"></a>00109 <span class="comment">  ///  the tree node with the minimum data element.</span>
+<a name="l00110"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#af4ffb5f5f08d8386d3f1bee0b6165b07">00110</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">iterator</a> <a class="code" href="classllvm_1_1ImutAVLTree.html#af4ffb5f5f08d8386d3f1bee0b6165b07">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#abef4451482d9b528b928e21eb6bb6fec">iterator</a>(<span class="keyword">this</span>); }
+<a name="l00111"></a>00111 <span class="comment"></span>
+<a name="l00112"></a>00112 <span class="comment">  /// end - Returns an iterator for the tree that denotes the end of an</span>
+<a name="l00113"></a>00113 <span class="comment">  ///  inorder traversal.</span>
+<a name="l00114"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#ae6ba2ef411609f9679229f4365f14fe4">00114</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">iterator</a> <a class="code" href="classllvm_1_1ImutAVLTree.html#ae6ba2ef411609f9679229f4365f14fe4">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#abef4451482d9b528b928e21eb6bb6fec">iterator</a>(); }
+<a name="l00115"></a>00115 
+<a name="l00116"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a77762e5de1836120f6970c168b0388b5">00116</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a77762e5de1836120f6970c168b0388b5">isElementEqual</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html#aec6b52f3657c679b5abac2edcd66216d">value_type_ref</a> V)<span class="keyword"> const </span>{
+<a name="l00117"></a>00117     <span class="comment">// Compare the keys.</span>
+<a name="l00118"></a>00118     <span class="keywordflow">if</span> (!ImutInfo::isEqual(ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()),
+<a name="l00119"></a>00119                            ImutInfo::KeyOfValue(V)))
+<a name="l00120"></a>00120       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00121"></a>00121 
+<a name="l00122"></a>00122     <span class="comment">// Also compare the data values.</span>
+<a name="l00123"></a>00123     <span class="keywordflow">if</span> (!ImutInfo::isDataEqual(ImutInfo::DataOfValue(<a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()),
+<a name="l00124"></a>00124                                ImutInfo::DataOfValue(V)))
+<a name="l00125"></a>00125       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00126"></a>00126 
+<a name="l00127"></a>00127     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00128"></a>00128   }
+<a name="l00129"></a>00129 
+<a name="l00130"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#acd57d74b4bc92c0c4cc156c26fec7193">00130</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#acd57d74b4bc92c0c4cc156c26fec7193">isElementEqual</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* RHS)<span class="keyword"> const </span>{
+<a name="l00131"></a>00131     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a77762e5de1836120f6970c168b0388b5">isElementEqual</a>(RHS-><a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>());
+<a name="l00132"></a>00132   }
+<a name="l00133"></a>00133 <span class="comment"></span>
+<a name="l00134"></a>00134 <span class="comment">  /// isEqual - Compares two trees for structural equality and returns true</span>
+<a name="l00135"></a>00135 <span class="comment">  ///   if they are equal.  This worst case performance of this operation is</span>
+<a name="l00136"></a>00136 <span class="comment"></span>  <span class="comment">//    linear in the sizes of the trees.</span>
+<a name="l00137"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a6577770be6a6b0877352b248d6ce4715">00137</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a6577770be6a6b0877352b248d6ce4715">isEqual</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>& RHS)<span class="keyword"> const </span>{
+<a name="l00138"></a>00138     <span class="keywordflow">if</span> (&RHS == <span class="keyword">this</span>)
+<a name="l00139"></a>00139       <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00140"></a>00140 
+<a name="l00141"></a>00141     <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">iterator</a> LItr = <a class="code" href="classllvm_1_1ImutAVLTree.html#af4ffb5f5f08d8386d3f1bee0b6165b07">begin</a>(), LEnd = <a class="code" href="classllvm_1_1ImutAVLTree.html#ae6ba2ef411609f9679229f4365f14fe4">end</a>();
+<a name="l00142"></a>00142     <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">iterator</a> RItr = RHS.<a class="code" href="classllvm_1_1ImutAVLTree.html#af4ffb5f5f08d8386d3f1bee0b6165b07">begin</a>(), REnd = RHS.<a class="code" href="classllvm_1_1ImutAVLTree.html#ae6ba2ef411609f9679229f4365f14fe4">end</a>();
+<a name="l00143"></a>00143 
+<a name="l00144"></a>00144     <span class="keywordflow">while</span> (LItr != LEnd && RItr != REnd) {
+<a name="l00145"></a>00145       <span class="keywordflow">if</span> (*LItr == *RItr) {
+<a name="l00146"></a>00146         LItr.<a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a04c8d12e4d5a695aefa1ac8498a46b1a">skipSubTree</a>();
+<a name="l00147"></a>00147         RItr.<a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a04c8d12e4d5a695aefa1ac8498a46b1a">skipSubTree</a>();
+<a name="l00148"></a>00148         <span class="keywordflow">continue</span>;
+<a name="l00149"></a>00149       }
+<a name="l00150"></a>00150 
+<a name="l00151"></a>00151       <span class="keywordflow">if</span> (!LItr->isElementEqual(*RItr))
+<a name="l00152"></a>00152         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00153"></a>00153 
+<a name="l00154"></a>00154       ++LItr;
+<a name="l00155"></a>00155       ++RItr;
+<a name="l00156"></a>00156     }
+<a name="l00157"></a>00157 
+<a name="l00158"></a>00158     <span class="keywordflow">return</span> LItr == LEnd && RItr == REnd;
+<a name="l00159"></a>00159   }
+<a name="l00160"></a>00160 <span class="comment"></span>
+<a name="l00161"></a>00161 <span class="comment">  /// isNotEqual - Compares two trees for structural inequality.  Performance</span>
+<a name="l00162"></a>00162 <span class="comment">  ///  is the same is isEqual.</span>
+<a name="l00163"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#aee20e730e8dd355f60fb68e38a107ede">00163</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#aee20e730e8dd355f60fb68e38a107ede">isNotEqual</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>& RHS)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classllvm_1_1ImutAVLTree.html#a6577770be6a6b0877352b248d6ce4715">isEqual</a>(RHS); }
+<a name="l00164"></a>00164 <span class="comment"></span>
+<a name="l00165"></a>00165 <span class="comment">  /// contains - Returns true if this tree contains a subtree (node) that</span>
+<a name="l00166"></a>00166 <span class="comment">  ///  has an data element that matches the specified key.  Complexity</span>
+<a name="l00167"></a>00167 <span class="comment">  ///  is logarithmic in the size of the tree.</span>
+<a name="l00168"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#acde18b3919ed6ba89a66c67beff53229">00168</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#acde18b3919ed6ba89a66c67beff53229">contains</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html#a6bc42bceb3167802edeb0b050ed2889b">key_type_ref</a> K) { <span class="keywordflow">return</span> (<span class="keywordtype">bool</span>) <a class="code" href="classllvm_1_1ImutAVLTree.html#ab249c463c093a5c345979cdc3067fe64">find</a>(K); }
+<a name="l00169"></a>00169 <span class="comment"></span>
+<a name="l00170"></a>00170 <span class="comment">  /// foreach - A member template the accepts invokes operator() on a functor</span>
+<a name="l00171"></a>00171 <span class="comment">  ///  object (specifed by Callback) for every node/subtree in the tree.</span>
+<a name="l00172"></a>00172 <span class="comment">  ///  Nodes are visited using an inorder traversal.</span>
+<a name="l00173"></a>00173 <span class="comment"></span>  <span class="keyword">template</span> <<span class="keyword">typename</span> Callback>
+<a name="l00174"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a6bd643417e35b25c25e4b6c7f92b409f">00174</a>   <span class="keywordtype">void</span> <span class="keywordflow">foreach</span>(Callback& <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974afd841a49aec1539bc88abc8ff9e170fb">C</a>) {
+<a name="l00175"></a>00175     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* L = <a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>())
+<a name="l00176"></a>00176       L->foreach(C);
+<a name="l00177"></a>00177 
+<a name="l00178"></a>00178     <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974afd841a49aec1539bc88abc8ff9e170fb">C</a>(value);
+<a name="l00179"></a>00179 
+<a name="l00180"></a>00180     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* R = <a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>())
+<a name="l00181"></a>00181       R->foreach(C);
+<a name="l00182"></a>00182   }
+<a name="l00183"></a>00183 <span class="comment"></span>
+<a name="l00184"></a>00184 <span class="comment">  /// validateTree - A utility method that checks that the balancing and</span>
+<a name="l00185"></a>00185 <span class="comment">  ///  ordering invariants of the tree are satisifed.  It is a recursive</span>
+<a name="l00186"></a>00186 <span class="comment">  ///  method that returns the height of the tree, which is then consumed</span>
+<a name="l00187"></a>00187 <span class="comment">  ///  by the enclosing validateTree call.  External callers should ignore the</span>
+<a name="l00188"></a>00188 <span class="comment">  ///  return value.  An invalid tree will cause an assertion to fire in</span>
+<a name="l00189"></a>00189 <span class="comment">  ///  a debug build.</span>
+<a name="l00190"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a7e04391de44c91f61a1f08a37e7fad8a">00190</a> <span class="comment"></span>  <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a7e04391de44c91f61a1f08a37e7fad8a">validateTree</a>()<span class="keyword"> const </span>{
+<a name="l00191"></a>00191     <span class="keywordtype">unsigned</span> HL = <a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>() ? <a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>()-><a class="code" href="classllvm_1_1ImutAVLTree.html#a7e04391de44c91f61a1f08a37e7fad8a">validateTree</a>() : 0;
+<a name="l00192"></a>00192     <span class="keywordtype">unsigned</span> HR = <a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>() ? <a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>()-><a class="code" href="classllvm_1_1ImutAVLTree.html#a7e04391de44c91f61a1f08a37e7fad8a">validateTree</a>() : 0;
+<a name="l00193"></a>00193     (void) HL;
+<a name="l00194"></a>00194     (void) HR;
+<a name="l00195"></a>00195 
+<a name="l00196"></a>00196     assert(<a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">getHeight</a>() == ( HL > HR ? HL : HR ) + 1
+<a name="l00197"></a>00197             && <span class="stringliteral">"Height calculation wrong"</span>);
+<a name="l00198"></a>00198 
+<a name="l00199"></a>00199     assert((HL > HR ? HL-HR : HR-HL) <= 2
+<a name="l00200"></a>00200            && <span class="stringliteral">"Balancing invariant violated"</span>);
+<a name="l00201"></a>00201 
+<a name="l00202"></a>00202     assert((!<a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>() ||
+<a name="l00203"></a>00203             ImutInfo::isLess(ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>()-><a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()),
+<a name="l00204"></a>00204                              ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()))) &&
+<a name="l00205"></a>00205            <span class="stringliteral">"Value in left child is not less that current value"</span>);
+<a name="l00206"></a>00206 
+<a name="l00207"></a>00207 
+<a name="l00208"></a>00208     assert(!(<a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>() ||
+<a name="l00209"></a>00209              ImutInfo::isLess(ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()),
+<a name="l00210"></a>00210                               ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>()-><a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>()))) &&
+<a name="l00211"></a>00211            <span class="stringliteral">"Current value is not less that value of right child"</span>);
+<a name="l00212"></a>00212 
+<a name="l00213"></a>00213     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">getHeight</a>();
+<a name="l00214"></a>00214   }
+<a name="l00215"></a>00215 
+<a name="l00216"></a>00216   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00217"></a>00217   <span class="comment">// Internal values.</span>
+<a name="l00218"></a>00218   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00219"></a>00219 
+<a name="l00220"></a>00220 <span class="keyword">private</span>:
+<a name="l00221"></a>00221   <a class="code" href="classllvm_1_1ImutAVLTree.html#a3fc730f5723bb0d746a2528c0106faa5">Factory</a> *factory;
+<a name="l00222"></a>00222   <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *left;
+<a name="l00223"></a>00223   <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *right;
+<a name="l00224"></a>00224   <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *prev;
+<a name="l00225"></a>00225   <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a> *<a class="code" href="namespacellvm.html#aa1704159f75e6eacd595962ea6d93ffe">next</a>;
+<a name="l00226"></a>00226 
+<a name="l00227"></a>00227   <span class="keywordtype">unsigned</span> height         : 28;
+<a name="l00228"></a>00228   <span class="keywordtype">unsigned</span> IsMutable      : 1;
+<a name="l00229"></a>00229   <span class="keywordtype">unsigned</span> IsDigestCached : 1;
+<a name="l00230"></a>00230   <span class="keywordtype">unsigned</span> IsCanonicalized : 1;
+<a name="l00231"></a>00231 
+<a name="l00232"></a>00232   <a class="code" href="classllvm_1_1ImutAVLTree.html#ad38ee9e58db9127cb700d13f5a694284">value_type</a> value;
+<a name="l00233"></a>00233   uint32_t digest;
+<a name="l00234"></a>00234   uint32_t refCount;
+<a name="l00235"></a>00235 
+<a name="l00236"></a>00236   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00237"></a>00237   <span class="comment">// Internal methods (node manipulation; used by Factory).</span>
+<a name="l00238"></a>00238   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00239"></a>00239 
+<a name="l00240"></a>00240 <span class="keyword">private</span>:<span class="comment"></span>
+<a name="l00241"></a>00241 <span class="comment">  /// ImutAVLTree - Internal constructor that is only called by</span>
+<a name="l00242"></a>00242 <span class="comment">  ///   ImutAVLFactory.</span>
+<a name="l00243"></a>00243 <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html#a3fc730f5723bb0d746a2528c0106faa5">Factory</a> *f, <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* l, <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a>* r, <a class="code" href="classllvm_1_1ImutAVLTree.html#aec6b52f3657c679b5abac2edcd66216d">value_type_ref</a> v,
+<a name="l00244"></a>00244               <span class="keywordtype">unsigned</span> height)
+<a name="l00245"></a>00245     : factory(f), left(l), right(r), prev(0), <a class="code" href="namespacellvm.html#aa1704159f75e6eacd595962ea6d93ffe">next</a>(0), height(height),
+<a name="l00246"></a>00246       IsMutable(<a class="code" href="BasicAliasAnalysis_8cpp.html#a80603f23207dd836075c078e6264204a">true</a>), IsDigestCached(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>), IsCanonicalized(0),
+<a name="l00247"></a>00247       value(v), digest(0), refCount(0)
+<a name="l00248"></a>00248   {
+<a name="l00249"></a>00249     <span class="keywordflow">if</span> (left) left-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>();
+<a name="l00250"></a>00250     <span class="keywordflow">if</span> (right) right-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>();
+<a name="l00251"></a>00251   }
+<a name="l00252"></a>00252 <span class="comment"></span>
+<a name="l00253"></a>00253 <span class="comment">  /// isMutable - Returns true if the left and right subtree references</span>
+<a name="l00254"></a>00254 <span class="comment">  ///  (as well as height) can be changed.  If this method returns false,</span>
+<a name="l00255"></a>00255 <span class="comment">  ///  the tree is truly immutable.  Trees returned from an ImutAVLFactory</span>
+<a name="l00256"></a>00256 <span class="comment">  ///  object should always have this method return true.  Further, if this</span>
+<a name="l00257"></a>00257 <span class="comment">  ///  method returns false for an instance of ImutAVLTree, all subtrees</span>
+<a name="l00258"></a>00258 <span class="comment">  ///  will also have this method return false.  The converse is not true.</span>
+<a name="l00259"></a>00259 <span class="comment"></span>  <span class="keywordtype">bool</span> isMutable()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> IsMutable; }
+<a name="l00260"></a>00260 <span class="comment"></span>
+<a name="l00261"></a>00261 <span class="comment">  /// hasCachedDigest - Returns true if the digest for this tree is cached.</span>
+<a name="l00262"></a>00262 <span class="comment">  ///  This can only be true if the tree is immutable.</span>
+<a name="l00263"></a>00263 <span class="comment"></span>  <span class="keywordtype">bool</span> hasCachedDigest()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> IsDigestCached; }
+<a name="l00264"></a>00264 
+<a name="l00265"></a>00265   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00266"></a>00266   <span class="comment">// Mutating operations.  A tree root can be manipulated as</span>
+<a name="l00267"></a>00267   <span class="comment">// long as its reference has not "escaped" from internal</span>
+<a name="l00268"></a>00268   <span class="comment">// methods of a factory object (see below).  When a tree</span>
+<a name="l00269"></a>00269   <span class="comment">// pointer is externally viewable by client code, the</span>
+<a name="l00270"></a>00270   <span class="comment">// internal "mutable bit" is cleared to mark the tree</span>
+<a name="l00271"></a>00271   <span class="comment">// immutable.  Note that a tree that still has its mutable</span>
+<a name="l00272"></a>00272   <span class="comment">// bit set may have children (subtrees) that are themselves</span>
+<a name="l00273"></a>00273   <span class="comment">// immutable.</span>
+<a name="l00274"></a>00274   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00275"></a>00275 <span class="comment"></span>
+<a name="l00276"></a>00276 <span class="comment">  /// markImmutable - Clears the mutable flag for a tree.  After this happens,</span>
+<a name="l00277"></a>00277 <span class="comment">  ///   it is an error to call setLeft(), setRight(), and setHeight().</span>
+<a name="l00278"></a>00278 <span class="comment"></span>  <span class="keywordtype">void</span> markImmutable() {
+<a name="l00279"></a>00279     assert(isMutable() && <span class="stringliteral">"Mutable flag already removed."</span>);
+<a name="l00280"></a>00280     IsMutable = <span class="keyword">false</span>;
+<a name="l00281"></a>00281   }
+<a name="l00282"></a>00282 <span class="comment"></span>
+<a name="l00283"></a>00283 <span class="comment">  /// markedCachedDigest - Clears the NoCachedDigest flag for a tree.</span>
+<a name="l00284"></a>00284 <span class="comment"></span>  <span class="keywordtype">void</span> markedCachedDigest() {
+<a name="l00285"></a>00285     assert(!hasCachedDigest() && <span class="stringliteral">"NoCachedDigest flag already removed."</span>);
+<a name="l00286"></a>00286     IsDigestCached = <span class="keyword">true</span>;
+<a name="l00287"></a>00287   }
+<a name="l00288"></a>00288 <span class="comment"></span>
+<a name="l00289"></a>00289 <span class="comment">  /// setHeight - Changes the height of the tree.  Used internally by</span>
+<a name="l00290"></a>00290 <span class="comment">  ///  ImutAVLFactory.</span>
+<a name="l00291"></a>00291 <span class="comment"></span>  <span class="keywordtype">void</span> setHeight(<span class="keywordtype">unsigned</span> h) {
+<a name="l00292"></a>00292     assert(isMutable() && <span class="stringliteral">"Only a mutable tree can have its height changed."</span>);
+<a name="l00293"></a>00293     height = h;
+<a name="l00294"></a>00294   }
+<a name="l00295"></a>00295 
+<a name="l00296"></a>00296   <span class="keyword">static</span> <span class="keyword">inline</span>
+<a name="l00297"></a>00297   uint32_t computeDigest(ImutAVLTree* L, ImutAVLTree* R, <a class="code" href="classllvm_1_1ImutAVLTree.html#aec6b52f3657c679b5abac2edcd66216d">value_type_ref</a> V) {
+<a name="l00298"></a>00298     uint32_t digest = 0;
+<a name="l00299"></a>00299 
+<a name="l00300"></a>00300     <span class="keywordflow">if</span> (L)
+<a name="l00301"></a>00301       digest += L->computeDigest();
+<a name="l00302"></a>00302 
+<a name="l00303"></a>00303     <span class="comment">// Compute digest of stored data.</span>
+<a name="l00304"></a>00304     FoldingSetNodeID <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974" title="LLVM Calling Convention Representation.">ID</a>;
+<a name="l00305"></a>00305     ImutInfo::Profile(ID,V);
+<a name="l00306"></a>00306     digest += ID.ComputeHash();
+<a name="l00307"></a>00307 
+<a name="l00308"></a>00308     <span class="keywordflow">if</span> (R)
+<a name="l00309"></a>00309       digest += R->computeDigest();
+<a name="l00310"></a>00310 
+<a name="l00311"></a>00311     <span class="keywordflow">return</span> digest;
+<a name="l00312"></a>00312   }
+<a name="l00313"></a>00313 
+<a name="l00314"></a>00314   <span class="keyword">inline</span> uint32_t computeDigest() {
+<a name="l00315"></a>00315     <span class="comment">// Check the lowest bit to determine if digest has actually been</span>
+<a name="l00316"></a>00316     <span class="comment">// pre-computed.</span>
+<a name="l00317"></a>00317     <span class="keywordflow">if</span> (hasCachedDigest())
+<a name="l00318"></a>00318       <span class="keywordflow">return</span> digest;
+<a name="l00319"></a>00319 
+<a name="l00320"></a>00320     uint32_t <a class="code" href="namespacellvm.html#a6569d00d31a5d74e563e2f39f82271ab">X</a> = computeDigest(<a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>(), <a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>(), <a class="code" href="classllvm_1_1ImutAVLTree.html#a324da3e9190a83ee11cae9d7e7f411cc" title="getValue - Returns the data value associated with the tree node.">getValue</a>());
+<a name="l00321"></a>00321     digest = <a class="code" href="namespacellvm.html#a6569d00d31a5d74e563e2f39f82271ab">X</a>;
+<a name="l00322"></a>00322     markedCachedDigest();
+<a name="l00323"></a>00323     <span class="keywordflow">return</span> <a class="code" href="namespacellvm.html#a6569d00d31a5d74e563e2f39f82271ab">X</a>;
+<a name="l00324"></a>00324   }
+<a name="l00325"></a>00325 
+<a name="l00326"></a>00326   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00327"></a>00327   <span class="comment">// Reference count operations.</span>
+<a name="l00328"></a>00328   <span class="comment">//===----------------------------------------------------===//</span>
+<a name="l00329"></a>00329 
+<a name="l00330"></a>00330 <span class="keyword">public</span>:
+<a name="l00331"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">00331</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>() { ++refCount; }
+<a name="l00332"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">00332</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>() {
+<a name="l00333"></a>00333     assert(refCount > 0);
+<a name="l00334"></a>00334     <span class="keywordflow">if</span> (--refCount == 0)
+<a name="l00335"></a>00335       <a class="code" href="classllvm_1_1ImutAVLTree.html#a167f747ec79ce41b2121359192284ecd">destroy</a>();
+<a name="l00336"></a>00336   }
+<a name="l00337"></a><a class="code" href="classllvm_1_1ImutAVLTree.html#a167f747ec79ce41b2121359192284ecd">00337</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a167f747ec79ce41b2121359192284ecd">destroy</a>() {
+<a name="l00338"></a>00338     <span class="keywordflow">if</span> (left)
+<a name="l00339"></a>00339       left-><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>();
+<a name="l00340"></a>00340     <span class="keywordflow">if</span> (right)
+<a name="l00341"></a>00341       right-><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>();
+<a name="l00342"></a>00342     <span class="keywordflow">if</span> (IsCanonicalized) {
+<a name="l00343"></a>00343       <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#aa1704159f75e6eacd595962ea6d93ffe">next</a>)
+<a name="l00344"></a>00344         <a class="code" href="namespacellvm.html#aa1704159f75e6eacd595962ea6d93ffe">next</a>->prev = prev;
+<a name="l00345"></a>00345 
+<a name="l00346"></a>00346       <span class="keywordflow">if</span> (prev)
+<a name="l00347"></a>00347         prev->next = <a class="code" href="namespacellvm.html#aa1704159f75e6eacd595962ea6d93ffe">next</a>;
+<a name="l00348"></a>00348       <span class="keywordflow">else</span>
+<a name="l00349"></a>00349         factory->Cache[factory-><a class="code" href="classllvm_1_1ImutAVLFactory.html#a14372ae02621f4b7d2d0e44f91fc6766">maskCacheIndex</a>(computeDigest())] = <a class="code" href="namespacellvm.html#aa1704159f75e6eacd595962ea6d93ffe">next</a>;
+<a name="l00350"></a>00350     }
+<a name="l00351"></a>00351 
+<a name="l00352"></a>00352     <span class="comment">// We need to clear the mutability bit in case we are</span>
+<a name="l00353"></a>00353     <span class="comment">// destroying the node as part of a sweep in ImutAVLFactory::recoverNodes().</span>
+<a name="l00354"></a>00354     IsMutable = <span class="keyword">false</span>;
+<a name="l00355"></a>00355     factory->freeNodes.push_back(<span class="keyword">this</span>);
+<a name="l00356"></a>00356   }
+<a name="l00357"></a>00357 };
+<a name="l00358"></a>00358 
+<a name="l00359"></a>00359 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00360"></a>00360 <span class="comment">// Immutable AVL-Tree Factory class.</span>
+<a name="l00361"></a>00361 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00362"></a>00362 
+<a name="l00363"></a>00363 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo >
+<a name="l00364"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html">00364</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLFactory.html">ImutAVLFactory</a> {
+<a name="l00365"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#adfcd91046ec4afdfdcde35ae97617b7a">00365</a>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree</a><ImutInfo>;
+<a name="l00366"></a>00366   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree<ImutInfo></a> <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>;
+<a name="l00367"></a>00367   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#aec6b52f3657c679b5abac2edcd66216d">TreeTy::value_type_ref</a> value_type_ref;
+<a name="l00368"></a>00368   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTree.html#a6bc42bceb3167802edeb0b050ed2889b">TreeTy::key_type_ref</a>   key_type_ref;
+<a name="l00369"></a>00369 
+<a name="l00370"></a>00370   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1DenseMap.html">DenseMap<unsigned, TreeTy*></a> <a class="code" href="classllvm_1_1DenseMap.html">CacheTy</a>;
+<a name="l00371"></a>00371 
+<a name="l00372"></a>00372   <a class="code" href="classllvm_1_1DenseMap.html">CacheTy</a> Cache;
+<a name="l00373"></a>00373   uintptr_t Allocator;
+<a name="l00374"></a>00374   std::vector<TreeTy*> createdNodes;
+<a name="l00375"></a>00375   std::vector<TreeTy*> freeNodes;
+<a name="l00376"></a>00376 
+<a name="l00377"></a>00377   <span class="keywordtype">bool</span> ownsAllocator()<span class="keyword"> const </span>{
+<a name="l00378"></a>00378     <span class="keywordflow">return</span> Allocator & 0x1 ? <span class="keyword">false</span> : <span class="keyword">true</span>;
+<a name="l00379"></a>00379   }
+<a name="l00380"></a>00380 
+<a name="l00381"></a>00381   <a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>& getAllocator()<span class="keyword"> const </span>{
+<a name="l00382"></a>00382     <span class="keywordflow">return</span> *<span class="keyword">reinterpret_cast<</span><a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>*<span class="keyword">></span>(Allocator & ~0x1);
+<a name="l00383"></a>00383   }
+<a name="l00384"></a>00384 
+<a name="l00385"></a>00385   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l00386"></a>00386   <span class="comment">// Public interface.</span>
+<a name="l00387"></a>00387   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l00388"></a>00388 
+<a name="l00389"></a>00389 <span class="keyword">public</span>:
+<a name="l00390"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a60faad75dae080f5619b1544a8a026af">00390</a>   <a class="code" href="classllvm_1_1ImutAVLFactory.html#a60faad75dae080f5619b1544a8a026af">ImutAVLFactory</a>()
+<a name="l00391"></a>00391     : Allocator(reinterpret_cast<uintptr_t>(new <a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>())) {}
+<a name="l00392"></a>00392 
+<a name="l00393"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a31e11a2072e6b73db4b640b5956e9d52">00393</a>   <a class="code" href="classllvm_1_1ImutAVLFactory.html#a60faad75dae080f5619b1544a8a026af">ImutAVLFactory</a>(<a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>& Alloc)
+<a name="l00394"></a>00394     : Allocator(reinterpret_cast<uintptr_t>(&Alloc) | 0x1) {}
+<a name="l00395"></a>00395 
+<a name="l00396"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#adc24f478e08602aa51d9aed91b891d6d">00396</a>   <a class="code" href="classllvm_1_1ImutAVLFactory.html#adc24f478e08602aa51d9aed91b891d6d">~ImutAVLFactory</a>() {
+<a name="l00397"></a>00397     <span class="keywordflow">if</span> (ownsAllocator()) <span class="keyword">delete</span> &getAllocator();
+<a name="l00398"></a>00398   }
+<a name="l00399"></a>00399 
+<a name="l00400"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a82a14e085fc5b4007790f70a01b76222">00400</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#a82a14e085fc5b4007790f70a01b76222">add</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T, value_type_ref V) {
+<a name="l00401"></a>00401     T = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a323c65697e41a49fd8f7782c769ccd98">add_internal</a>(V,T);
+<a name="l00402"></a>00402     <a class="code" href="classllvm_1_1ImutAVLFactory.html#ae16f801c7e64e4557295f1c02623a15e">markImmutable</a>(T);
+<a name="l00403"></a>00403     <a class="code" href="classllvm_1_1ImutAVLFactory.html#ade6cf254863ac87b2447630781be56a9">recoverNodes</a>();
+<a name="l00404"></a>00404     <span class="keywordflow">return</span> T;
+<a name="l00405"></a>00405   }
+<a name="l00406"></a>00406 
+<a name="l00407"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a91b65702c20741c1ac050893c4a42dd5">00407</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <span class="keyword">remove</span>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T, key_type_ref V) {
+<a name="l00408"></a>00408     T = <a class="code" href="classllvm_1_1ImutAVLFactory.html#adde61d0dfc48c183fb1075b6b0aa4a58">remove_internal</a>(V,T);
+<a name="l00409"></a>00409     <a class="code" href="classllvm_1_1ImutAVLFactory.html#ae16f801c7e64e4557295f1c02623a15e">markImmutable</a>(T);
+<a name="l00410"></a>00410     <a class="code" href="classllvm_1_1ImutAVLFactory.html#ade6cf254863ac87b2447630781be56a9">recoverNodes</a>();
+<a name="l00411"></a>00411     <span class="keywordflow">return</span> T;
+<a name="l00412"></a>00412   }
+<a name="l00413"></a>00413 
+<a name="l00414"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a3b802d3e246330382a91eb00d42aca1c">00414</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#a3b802d3e246330382a91eb00d42aca1c">getEmptyTree</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> NULL; }
+<a name="l00415"></a>00415 
+<a name="l00416"></a>00416 <span class="keyword">protected</span>:
+<a name="l00417"></a>00417 
+<a name="l00418"></a>00418   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l00419"></a>00419   <span class="comment">// A bunch of quick helper functions used for reasoning</span>
+<a name="l00420"></a>00420   <span class="comment">// about the properties of trees and their children.</span>
+<a name="l00421"></a>00421   <span class="comment">// These have succinct names so that the balancing code</span>
+<a name="l00422"></a>00422   <span class="comment">// is as terse (and readable) as possible.</span>
+<a name="l00423"></a>00423   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l00424"></a>00424 
+<a name="l00425"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">00425</a>   <span class="keywordtype">bool</span>            <a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !T; }
+<a name="l00426"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">00426</a>   <span class="keywordtype">unsigned</span>        <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> T ? T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">getHeight</a>() : 0; }
+<a name="l00427"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">00427</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*         <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>(); }
+<a name="l00428"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">00428</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*         <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> T-><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>(); }
+<a name="l00429"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">00429</a>   value_type_ref  <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> T->value; }
+<a name="l00430"></a>00430 
+<a name="l00431"></a>00431   <span class="comment">// Make sure the index is not the Tombstone or Entry key of the DenseMap.</span>
+<a name="l00432"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a14372ae02621f4b7d2d0e44f91fc6766">00432</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a14372ae02621f4b7d2d0e44f91fc6766">maskCacheIndex</a>(<span class="keywordtype">unsigned</span> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>) {
+<a name="l00433"></a>00433     <span class="keywordflow">return</span> (I & ~0x02);
+<a name="l00434"></a>00434   }
+<a name="l00435"></a>00435 
+<a name="l00436"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#ab1272b7f58f8b43c106866b60d956b52">00436</a>   <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab1272b7f58f8b43c106866b60d956b52">incrementHeight</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* L, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R)<span class="keyword"> const </span>{
+<a name="l00437"></a>00437     <span class="keywordtype">unsigned</span> hl = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(L);
+<a name="l00438"></a>00438     <span class="keywordtype">unsigned</span> hr = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(R);
+<a name="l00439"></a>00439     <span class="keywordflow">return</span> (hl > hr ? hl : hr) + 1;
+<a name="l00440"></a>00440   }
+<a name="l00441"></a>00441 
+<a name="l00442"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a521d15ab1c2b3a5e89bcccdc54427520">00442</a>   <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a521d15ab1c2b3a5e89bcccdc54427520">compareTreeWithSection</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T,
+<a name="l00443"></a>00443                                      <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">TreeTy::iterator</a>& TI,
+<a name="l00444"></a>00444                                      <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">TreeTy::iterator</a>& TE) {
+<a name="l00445"></a>00445     <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">TreeTy::iterator</a> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = T-><a class="code" href="classllvm_1_1ImutAVLTree.html#af4ffb5f5f08d8386d3f1bee0b6165b07">begin</a>(), E = T-><a class="code" href="classllvm_1_1ImutAVLTree.html#ae6ba2ef411609f9679229f4365f14fe4">end</a>();
+<a name="l00446"></a>00446     <span class="keywordflow">for</span> ( ; I!=E ; ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>, ++TI) {
+<a name="l00447"></a>00447       <span class="keywordflow">if</span> (TI == TE || !I->isElementEqual(*TI))
+<a name="l00448"></a>00448         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00449"></a>00449     }
+<a name="l00450"></a>00450     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00451"></a>00451   }
+<a name="l00452"></a>00452 
+<a name="l00453"></a>00453   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l00454"></a>00454   <span class="comment">// "createNode" is used to generate new tree roots that link</span>
+<a name="l00455"></a>00455   <span class="comment">// to other trees.  The functon may also simply move links</span>
+<a name="l00456"></a>00456   <span class="comment">// in an existing root if that root is still marked mutable.</span>
+<a name="l00457"></a>00457   <span class="comment">// This is necessary because otherwise our balancing code</span>
+<a name="l00458"></a>00458   <span class="comment">// would leak memory as it would create nodes that are</span>
+<a name="l00459"></a>00459   <span class="comment">// then discarded later before the finished tree is</span>
+<a name="l00460"></a>00460   <span class="comment">// returned to the caller.</span>
+<a name="l00461"></a>00461   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l00462"></a>00462 
+<a name="l00463"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">00463</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* L, value_type_ref V, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R) {
+<a name="l00464"></a>00464     <a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>& <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11bad9577456b5bb7a03b7f42a710e122ab5">A</a> = getAllocator();
+<a name="l00465"></a>00465     <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T;
+<a name="l00466"></a>00466     <span class="keywordflow">if</span> (!freeNodes.empty()) {
+<a name="l00467"></a>00467       T = freeNodes.back();
+<a name="l00468"></a>00468       freeNodes.pop_back();
+<a name="l00469"></a>00469       assert(T != L);
+<a name="l00470"></a>00470       assert(T != R);
+<a name="l00471"></a>00471     } <span class="keywordflow">else</span> {
+<a name="l00472"></a>00472       T = (<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*) A.<a class="code" href="classllvm_1_1BumpPtrAllocator.html#a77df739db3a1603903dfa595e214a84b">Allocate</a><<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>>();
+<a name="l00473"></a>00473     }
+<a name="l00474"></a>00474     <span class="keyword">new</span> (T) <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>(<span class="keyword">this</span>, L, R, V, <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab1272b7f58f8b43c106866b60d956b52">incrementHeight</a>(L,R));
+<a name="l00475"></a>00475     createdNodes.push_back(T);
+<a name="l00476"></a>00476     <span class="keywordflow">return</span> T;
+<a name="l00477"></a>00477   }
+<a name="l00478"></a>00478 
+<a name="l00479"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a3cf7fced65ed6266ff57476c4c71a65d">00479</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#a3cf7fced65ed6266ff57476c4c71a65d">createNode</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* newLeft, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* oldTree, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* newRight) {
+<a name="l00480"></a>00480     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(newLeft, <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(oldTree), newRight);
+<a name="l00481"></a>00481   }
+<a name="l00482"></a>00482 
+<a name="l00483"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#ade6cf254863ac87b2447630781be56a9">00483</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#ade6cf254863ac87b2447630781be56a9">recoverNodes</a>() {
+<a name="l00484"></a>00484     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, n = createdNodes.size(); i < n; ++i) {
+<a name="l00485"></a>00485       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *<a class="code" href="regcomp_8c.html#a0240ac851181b84ac374872dc5434ee4">N</a> = createdNodes[i];
+<a name="l00486"></a>00486       <span class="keywordflow">if</span> (N->isMutable() && N->refCount == 0)
+<a name="l00487"></a>00487         N-><a class="code" href="classllvm_1_1ImutAVLTree.html#a167f747ec79ce41b2121359192284ecd">destroy</a>();
+<a name="l00488"></a>00488     }
+<a name="l00489"></a>00489     createdNodes.clear();
+<a name="l00490"></a>00490   }
+<a name="l00491"></a>00491 <span class="comment"></span>
+<a name="l00492"></a>00492 <span class="comment">  /// balanceTree - Used by add_internal and remove_internal to</span>
+<a name="l00493"></a>00493 <span class="comment">  ///  balance a newly created tree.</span>
+<a name="l00494"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">00494</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* L, value_type_ref V, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R) {
+<a name="l00495"></a>00495     <span class="keywordtype">unsigned</span> hl = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(L);
+<a name="l00496"></a>00496     <span class="keywordtype">unsigned</span> hr = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(R);
+<a name="l00497"></a>00497 
+<a name="l00498"></a>00498     <span class="keywordflow">if</span> (hl > hr + 2) {
+<a name="l00499"></a>00499       assert(!<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(L) && <span class="stringliteral">"Left tree cannot be empty to have a height >= 2"</span>);
+<a name="l00500"></a>00500 
+<a name="l00501"></a>00501       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *LL = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(L);
+<a name="l00502"></a>00502       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *LR = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(L);
+<a name="l00503"></a>00503 
+<a name="l00504"></a>00504       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(LL) >= <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(LR))
+<a name="l00505"></a>00505         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(LL, L, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(LR,V,R));
+<a name="l00506"></a>00506 
+<a name="l00507"></a>00507       assert(!<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(LR) && <span class="stringliteral">"LR cannot be empty because it has a height >= 1"</span>);
+<a name="l00508"></a>00508 
+<a name="l00509"></a>00509       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *LRL = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(LR);
+<a name="l00510"></a>00510       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *LRR = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(LR);
+<a name="l00511"></a>00511 
+<a name="l00512"></a>00512       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(LL,L,LRL), LR, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(LRR,V,R));
+<a name="l00513"></a>00513     }
+<a name="l00514"></a>00514 
+<a name="l00515"></a>00515     <span class="keywordflow">if</span> (hr > hl + 2) {
+<a name="l00516"></a>00516       assert(!<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(R) && <span class="stringliteral">"Right tree cannot be empty to have a height >= 2"</span>);
+<a name="l00517"></a>00517 
+<a name="l00518"></a>00518       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *RL = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(R);
+<a name="l00519"></a>00519       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *RR = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(R);
+<a name="l00520"></a>00520 
+<a name="l00521"></a>00521       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(RR) >= <a class="code" href="classllvm_1_1ImutAVLFactory.html#a42f7af57712df99a806ee31143e94091">getHeight</a>(RL))
+<a name="l00522"></a>00522         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(L,V,RL), R, RR);
+<a name="l00523"></a>00523 
+<a name="l00524"></a>00524       assert(!<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(RL) && <span class="stringliteral">"RL cannot be empty because it has a height >= 1"</span>);
+<a name="l00525"></a>00525 
+<a name="l00526"></a>00526       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *RLL = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(RL);
+<a name="l00527"></a>00527       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *RLR = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(RL);
+<a name="l00528"></a>00528 
+<a name="l00529"></a>00529       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(L,V,RLL), RL, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(RLR,R,RR));
+<a name="l00530"></a>00530     }
+<a name="l00531"></a>00531 
+<a name="l00532"></a>00532     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(L,V,R);
+<a name="l00533"></a>00533   }
+<a name="l00534"></a>00534 <span class="comment"></span>
+<a name="l00535"></a>00535 <span class="comment">  /// add_internal - Creates a new tree that includes the specified</span>
+<a name="l00536"></a>00536 <span class="comment">  ///  data and the data from the original tree.  If the original tree</span>
+<a name="l00537"></a>00537 <span class="comment">  ///  already contained the data item, the original tree is returned.</span>
+<a name="l00538"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a323c65697e41a49fd8f7782c769ccd98">00538</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#a323c65697e41a49fd8f7782c769ccd98">add_internal</a>(value_type_ref V, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T) {
+<a name="l00539"></a>00539     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(T))
+<a name="l00540"></a>00540       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(T, V, T);
+<a name="l00541"></a>00541     assert(!T->isMutable());
+<a name="l00542"></a>00542 
+<a name="l00543"></a>00543     key_type_ref K = ImutInfo::KeyOfValue(V);
+<a name="l00544"></a>00544     key_type_ref KCurrent = ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T));
+<a name="l00545"></a>00545 
+<a name="l00546"></a>00546     <span class="keywordflow">if</span> (ImutInfo::isEqual(K,KCurrent))
+<a name="l00547"></a>00547       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a7de6e85c6c258c6712e9a04f70a48383">createNode</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T), V, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T));
+<a name="l00548"></a>00548     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ImutInfo::isLess(K,KCurrent))
+<a name="l00549"></a>00549       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a323c65697e41a49fd8f7782c769ccd98">add_internal</a>(V, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T)), <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T));
+<a name="l00550"></a>00550     <span class="keywordflow">else</span>
+<a name="l00551"></a>00551       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#a323c65697e41a49fd8f7782c769ccd98">add_internal</a>(V, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T)));
+<a name="l00552"></a>00552   }
+<a name="l00553"></a>00553 <span class="comment"></span>
+<a name="l00554"></a>00554 <span class="comment">  /// remove_internal - Creates a new tree that includes all the data</span>
+<a name="l00555"></a>00555 <span class="comment">  ///  from the original tree except the specified data.  If the</span>
+<a name="l00556"></a>00556 <span class="comment">  ///  specified data did not exist in the original tree, the original</span>
+<a name="l00557"></a>00557 <span class="comment">  ///  tree is returned.</span>
+<a name="l00558"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#adde61d0dfc48c183fb1075b6b0aa4a58">00558</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#adde61d0dfc48c183fb1075b6b0aa4a58">remove_internal</a>(key_type_ref K, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T) {
+<a name="l00559"></a>00559     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(T))
+<a name="l00560"></a>00560       <span class="keywordflow">return</span> T;
+<a name="l00561"></a>00561 
+<a name="l00562"></a>00562     assert(!T->isMutable());
+<a name="l00563"></a>00563 
+<a name="l00564"></a>00564     key_type_ref KCurrent = ImutInfo::KeyOfValue(<a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T));
+<a name="l00565"></a>00565 
+<a name="l00566"></a>00566     <span class="keywordflow">if</span> (ImutInfo::isEqual(K,KCurrent)) {
+<a name="l00567"></a>00567       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#aaf5c6a602a1522bcd5dcea16f0f2ab24">combineTrees</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T));
+<a name="l00568"></a>00568     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ImutInfo::isLess(K,KCurrent)) {
+<a name="l00569"></a>00569       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#adde61d0dfc48c183fb1075b6b0aa4a58">remove_internal</a>(K, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T)),
+<a name="l00570"></a>00570                                             <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T));
+<a name="l00571"></a>00571     } <span class="keywordflow">else</span> {
+<a name="l00572"></a>00572       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T),
+<a name="l00573"></a>00573                          <a class="code" href="classllvm_1_1ImutAVLFactory.html#adde61d0dfc48c183fb1075b6b0aa4a58">remove_internal</a>(K, <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T)));
+<a name="l00574"></a>00574     }
+<a name="l00575"></a>00575   }
+<a name="l00576"></a>00576 
+<a name="l00577"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#aaf5c6a602a1522bcd5dcea16f0f2ab24">00577</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#aaf5c6a602a1522bcd5dcea16f0f2ab24">combineTrees</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* L, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R) {
+<a name="l00578"></a>00578     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(L))
+<a name="l00579"></a>00579       <span class="keywordflow">return</span> R;
+<a name="l00580"></a>00580     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(R))
+<a name="l00581"></a>00581       <span class="keywordflow">return</span> L;
+<a name="l00582"></a>00582     <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* OldNode;
+<a name="l00583"></a>00583     <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* newRight = <a class="code" href="classllvm_1_1ImutAVLFactory.html#a0c4b354a2916328f3232bc7ecbee97e2">removeMinBinding</a>(R,OldNode);
+<a name="l00584"></a>00584     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(L, <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(OldNode), newRight);
+<a name="l00585"></a>00585   }
+<a name="l00586"></a>00586 
+<a name="l00587"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a0c4b354a2916328f3232bc7ecbee97e2">00587</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLFactory.html#a0c4b354a2916328f3232bc7ecbee97e2">removeMinBinding</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T, <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*& Noderemoved) {
+<a name="l00588"></a>00588     assert(!<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(T));
+<a name="l00589"></a>00589     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLFactory.html#a2080f7dac6d946e5b784b33bbd72ac23">isEmpty</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T))) {
+<a name="l00590"></a>00590       Noderemoved = T;
+<a name="l00591"></a>00591       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T);
+<a name="l00592"></a>00592     }
+<a name="l00593"></a>00593     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#adcabc2c56d93d6529876b3d188d6fbdc">balanceTree</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a0c4b354a2916328f3232bc7ecbee97e2">removeMinBinding</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T), Noderemoved),
+<a name="l00594"></a>00594                        <a class="code" href="classllvm_1_1ImutAVLFactory.html#ab63ca11c6b8b8846352d577bd120ae24">getValue</a>(T), <a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T));
+<a name="l00595"></a>00595   }
+<a name="l00596"></a>00596 <span class="comment"></span>
+<a name="l00597"></a>00597 <span class="comment">  /// markImmutable - Clears the mutable bits of a root and all of its</span>
+<a name="l00598"></a>00598 <span class="comment">  ///  descendants.</span>
+<a name="l00599"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#ae16f801c7e64e4557295f1c02623a15e">00599</a> <span class="comment"></span>  <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html#ae16f801c7e64e4557295f1c02623a15e">markImmutable</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* T) {
+<a name="l00600"></a>00600     <span class="keywordflow">if</span> (!T || !T->isMutable())
+<a name="l00601"></a>00601       <span class="keywordflow">return</span>;
+<a name="l00602"></a>00602     T->markImmutable();
+<a name="l00603"></a>00603     <a class="code" href="classllvm_1_1ImutAVLFactory.html#ae16f801c7e64e4557295f1c02623a15e">markImmutable</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a4a3b24b29998273a386ccc1333b1c1fe">getLeft</a>(T));
+<a name="l00604"></a>00604     <a class="code" href="classllvm_1_1ImutAVLFactory.html#ae16f801c7e64e4557295f1c02623a15e">markImmutable</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html#a684ff1e0ed894a35347c1f9ac9acbc21">getRight</a>(T));
+<a name="l00605"></a>00605   }
+<a name="l00606"></a>00606 
+<a name="l00607"></a>00607 <span class="keyword">public</span>:
+<a name="l00608"></a><a class="code" href="classllvm_1_1ImutAVLFactory.html#a9bddfc31770b6a82bf224ac2f4cb5543">00608</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *<a class="code" href="classllvm_1_1ImutAVLFactory.html#a9bddfc31770b6a82bf224ac2f4cb5543">getCanonicalTree</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *TNew) {
+<a name="l00609"></a>00609     <span class="keywordflow">if</span> (!TNew)
+<a name="l00610"></a>00610       <span class="keywordflow">return</span> 0;
+<a name="l00611"></a>00611 
+<a name="l00612"></a>00612     <span class="keywordflow">if</span> (TNew->IsCanonicalized)
+<a name="l00613"></a>00613       <span class="keywordflow">return</span> TNew;
+<a name="l00614"></a>00614 
+<a name="l00615"></a>00615     <span class="comment">// Search the hashtable for another tree with the same digest, and</span>
+<a name="l00616"></a>00616     <span class="comment">// if find a collision compare those trees by their contents.</span>
+<a name="l00617"></a>00617     <span class="keywordtype">unsigned</span> digest = TNew->computeDigest();
+<a name="l00618"></a>00618     <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *&entry = Cache[<a class="code" href="classllvm_1_1ImutAVLFactory.html#a14372ae02621f4b7d2d0e44f91fc6766">maskCacheIndex</a>(digest)];
+<a name="l00619"></a>00619     <span class="keywordflow">do</span> {
+<a name="l00620"></a>00620       <span class="keywordflow">if</span> (!entry)
+<a name="l00621"></a>00621         <span class="keywordflow">break</span>;
+<a name="l00622"></a>00622       <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *T = entry ; T != 0; T = T->next) {
+<a name="l00623"></a>00623         <span class="comment">// Compare the Contents('T') with Contents('TNew')</span>
+<a name="l00624"></a>00624         <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">TreeTy::iterator</a> TI = T->begin(), TE = T->end();
+<a name="l00625"></a>00625         <span class="keywordflow">if</span> (!<a class="code" href="classllvm_1_1ImutAVLFactory.html#a521d15ab1c2b3a5e89bcccdc54427520">compareTreeWithSection</a>(TNew, TI, TE))
+<a name="l00626"></a>00626           <span class="keywordflow">continue</span>;
+<a name="l00627"></a>00627         <span class="keywordflow">if</span> (TI != TE)
+<a name="l00628"></a>00628           <span class="keywordflow">continue</span>; <span class="comment">// T has more contents than TNew.</span>
+<a name="l00629"></a>00629         <span class="comment">// Trees did match!  Return 'T'.</span>
+<a name="l00630"></a>00630         <span class="keywordflow">if</span> (TNew->refCount == 0)
+<a name="l00631"></a>00631           TNew-><a class="code" href="classllvm_1_1ImutAVLTree.html#a167f747ec79ce41b2121359192284ecd">destroy</a>();
+<a name="l00632"></a>00632         <span class="keywordflow">return</span> T;
+<a name="l00633"></a>00633       }
+<a name="l00634"></a>00634       entry->prev = TNew;
+<a name="l00635"></a>00635       TNew->next = entry;
+<a name="l00636"></a>00636     }
+<a name="l00637"></a>00637     <span class="keywordflow">while</span> (<span class="keyword">false</span>);
+<a name="l00638"></a>00638 
+<a name="l00639"></a>00639     entry = TNew;
+<a name="l00640"></a>00640     TNew->IsCanonicalized = <span class="keyword">true</span>;
+<a name="l00641"></a>00641     <span class="keywordflow">return</span> TNew;
+<a name="l00642"></a>00642   }
+<a name="l00643"></a>00643 };
+<a name="l00644"></a>00644 
+<a name="l00645"></a>00645 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00646"></a>00646 <span class="comment">// Immutable AVL-Tree Iterators.</span>
+<a name="l00647"></a>00647 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00648"></a>00648 
+<a name="l00649"></a>00649 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo>
+<a name="l00650"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html">00650</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html">ImutAVLTreeGenericIterator</a> {
+<a name="l00651"></a>00651   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<uintptr_t,20></a> stack;
+<a name="l00652"></a>00652 <span class="keyword">public</span>:
+<a name="l00653"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74d">00653</a>   <span class="keyword">enum</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74d">VisitFlag</a> { <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da6e52e64f41fdf005955b9bc70bbd9b98">VisitedNone</a>=0x0, <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>=0x1, <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>=0x3,
+<a name="l00654"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">00654</a>                    <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>=0x3 };
+<a name="l00655"></a>00655 
+<a name="l00656"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a24823062b30a85f98b578e5e7ced0b88">00656</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree<ImutInfo></a> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a24823062b30a85f98b578e5e7ced0b88">TreeTy</a>;
+<a name="l00657"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3362873f8fe1f33a0b3a8bfc24b58727">00657</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html">ImutAVLTreeGenericIterator<ImutInfo></a> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3362873f8fe1f33a0b3a8bfc24b58727">_Self</a>;
+<a name="l00658"></a>00658 
+<a name="l00659"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a754073fe08515cd915bf89125ac2f37a">00659</a>   <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a754073fe08515cd915bf89125ac2f37a">ImutAVLTreeGenericIterator</a>() {}
+<a name="l00660"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aa5ab9554a60d6db8efbc7745500aa9a8">00660</a>   <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aa5ab9554a60d6db8efbc7745500aa9a8">ImutAVLTreeGenericIterator</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* Root) {
+<a name="l00661"></a>00661     <span class="keywordflow">if</span> (Root) stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(reinterpret_cast<uintptr_t>(Root));
+<a name="l00662"></a>00662   }
+<a name="l00663"></a>00663 
+<a name="l00664"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#abfe23aed359bbc6cd4f1d1f8db310e88">00664</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#abfe23aed359bbc6cd4f1d1f8db310e88">operator*</a>()<span class="keyword"> const </span>{
+<a name="l00665"></a>00665     assert(!stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00666"></a>00666     <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*<span class="keyword">></span>(stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() & ~<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>);
+<a name="l00667"></a>00667   }
+<a name="l00668"></a>00668 
+<a name="l00669"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aaf32d46abd2e748239554921474c1b34">00669</a>   uintptr_t <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aaf32d46abd2e748239554921474c1b34">getVisitState</a>()<span class="keyword"> const </span>{
+<a name="l00670"></a>00670     assert(!stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00671"></a>00671     <span class="keywordflow">return</span> stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() & <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>;
+<a name="l00672"></a>00672   }
+<a name="l00673"></a>00673 
+<a name="l00674"></a>00674 
+<a name="l00675"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#abde5d4d5fcf03584f34e5b3992091e6d">00675</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#abde5d4d5fcf03584f34e5b3992091e6d">atEnd</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>(); }
+<a name="l00676"></a>00676 
+<a name="l00677"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a24d4df20a5d9df3188f30cf0baa98b70">00677</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a24d4df20a5d9df3188f30cf0baa98b70">atBeginning</a>()<span class="keyword"> const </span>{
+<a name="l00678"></a>00678     <span class="keywordflow">return</span> stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>() == 1 && <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aaf32d46abd2e748239554921474c1b34">getVisitState</a>() == <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da6e52e64f41fdf005955b9bc70bbd9b98">VisitedNone</a>;
+<a name="l00679"></a>00679   }
+<a name="l00680"></a>00680 
+<a name="l00681"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a46b083af091f14850716b2d42dec4ff2">00681</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a46b083af091f14850716b2d42dec4ff2">skipToParent</a>() {
+<a name="l00682"></a>00682     assert(!stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00683"></a>00683     stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#a1f2303df9bbee2233c11d61c2f6f7930">pop_back</a>();
+<a name="l00684"></a>00684     <span class="keywordflow">if</span> (stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>())
+<a name="l00685"></a>00685       <span class="keywordflow">return</span>;
+<a name="l00686"></a>00686     <span class="keywordflow">switch</span> (<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aaf32d46abd2e748239554921474c1b34">getVisitState</a>()) {
+<a name="l00687"></a>00687       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da6e52e64f41fdf005955b9bc70bbd9b98">VisitedNone</a>:
+<a name="l00688"></a>00688         stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() |= <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>;
+<a name="l00689"></a>00689         <span class="keywordflow">break</span>;
+<a name="l00690"></a>00690       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>:
+<a name="l00691"></a>00691         stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() |= <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>;
+<a name="l00692"></a>00692         <span class="keywordflow">break</span>;
+<a name="l00693"></a>00693       <span class="keywordflow">default</span>:
+<a name="l00694"></a>00694         <a class="code" href="ErrorHandling_8h.html#ace243f5c25697a1107cce46626b3dc94">llvm_unreachable</a>(<span class="stringliteral">"Unreachable."</span>);
+<a name="l00695"></a>00695     }
+<a name="l00696"></a>00696   }
+<a name="l00697"></a>00697 
+<a name="l00698"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a591e755cc02a4ace159099984e26475e">00698</a>   <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a591e755cc02a4ace159099984e26475e">operator==</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3362873f8fe1f33a0b3a8bfc24b58727">_Self</a>& x)<span class="keyword"> const </span>{
+<a name="l00699"></a>00699     <span class="keywordflow">if</span> (stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>() != x.stack.size())
+<a name="l00700"></a>00700       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00701"></a>00701     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0 ; i < stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); i++)
+<a name="l00702"></a>00702       <span class="keywordflow">if</span> (stack[i] != x.stack[i])
+<a name="l00703"></a>00703         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00704"></a>00704     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00705"></a>00705   }
+<a name="l00706"></a>00706 
+<a name="l00707"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3dd15a12ec8da8f3894ce6b33be43b32">00707</a>   <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3dd15a12ec8da8f3894ce6b33be43b32">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3362873f8fe1f33a0b3a8bfc24b58727">_Self</a>& x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a591e755cc02a4ace159099984e26475e">operator==</a>(x); }
+<a name="l00708"></a>00708 
+<a name="l00709"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#abea5054c67dd77ec9ada636f101f618c">00709</a>   <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3362873f8fe1f33a0b3a8bfc24b58727">_Self</a>& <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#abea5054c67dd77ec9ada636f101f618c">operator++</a>() {
+<a name="l00710"></a>00710     assert(!stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00711"></a>00711     <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* Current = <span class="keyword">reinterpret_cast<</span><a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*<span class="keyword">></span>(stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() & ~<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>);
+<a name="l00712"></a>00712     assert(Current);
+<a name="l00713"></a>00713     <span class="keywordflow">switch</span> (<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aaf32d46abd2e748239554921474c1b34">getVisitState</a>()) {
+<a name="l00714"></a>00714       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da6e52e64f41fdf005955b9bc70bbd9b98">VisitedNone</a>:
+<a name="l00715"></a>00715         <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* L = Current-><a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>())
+<a name="l00716"></a>00716           stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(reinterpret_cast<uintptr_t>(L));
+<a name="l00717"></a>00717         <span class="keywordflow">else</span>
+<a name="l00718"></a>00718           stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() |= <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>;
+<a name="l00719"></a>00719         <span class="keywordflow">break</span>;
+<a name="l00720"></a>00720       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>:
+<a name="l00721"></a>00721         <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R = Current-><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>())
+<a name="l00722"></a>00722           stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(reinterpret_cast<uintptr_t>(R));
+<a name="l00723"></a>00723         <span class="keywordflow">else</span>
+<a name="l00724"></a>00724           stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() |= <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>;
+<a name="l00725"></a>00725         <span class="keywordflow">break</span>;
+<a name="l00726"></a>00726       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>:
+<a name="l00727"></a>00727         <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a46b083af091f14850716b2d42dec4ff2">skipToParent</a>();
+<a name="l00728"></a>00728         <span class="keywordflow">break</span>;
+<a name="l00729"></a>00729       <span class="keywordflow">default</span>:
+<a name="l00730"></a>00730         <a class="code" href="ErrorHandling_8h.html#ace243f5c25697a1107cce46626b3dc94">llvm_unreachable</a>(<span class="stringliteral">"Unreachable."</span>);
+<a name="l00731"></a>00731     }
+<a name="l00732"></a>00732     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00733"></a>00733   }
+<a name="l00734"></a>00734 
+<a name="l00735"></a><a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#afebc554299f938f4d7da838d4aebd436">00735</a>   <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#a3362873f8fe1f33a0b3a8bfc24b58727">_Self</a>& <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#afebc554299f938f4d7da838d4aebd436">operator--</a>() {
+<a name="l00736"></a>00736     assert(!stack.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00737"></a>00737     <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* Current = <span class="keyword">reinterpret_cast<</span><a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>*<span class="keyword">></span>(stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() & ~<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>);
+<a name="l00738"></a>00738     assert(Current);
+<a name="l00739"></a>00739     <span class="keywordflow">switch</span> (<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#aaf32d46abd2e748239554921474c1b34">getVisitState</a>()) {
+<a name="l00740"></a>00740       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da6e52e64f41fdf005955b9bc70bbd9b98">VisitedNone</a>:
+<a name="l00741"></a>00741         stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#a1f2303df9bbee2233c11d61c2f6f7930">pop_back</a>();
+<a name="l00742"></a>00742         <span class="keywordflow">break</span>;
+<a name="l00743"></a>00743       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>:
+<a name="l00744"></a>00744         stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() &= ~<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>; <span class="comment">// Set state to "VisitedNone."</span>
+<a name="l00745"></a>00745         <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* L = Current-><a class="code" href="classllvm_1_1ImutAVLTree.html#a0248586d7ce77f65d93b9dcccf9c02d9">getLeft</a>())
+<a name="l00746"></a>00746           stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(reinterpret_cast<uintptr_t>(L) | <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>);
+<a name="l00747"></a>00747         <span class="keywordflow">break</span>;
+<a name="l00748"></a>00748       <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>:
+<a name="l00749"></a>00749         stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() &= ~<a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da9236fddb1a6fc722ba31037c7e3cd06b">Flags</a>;
+<a name="l00750"></a>00750         stack.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>() |= <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74dad67afe37f3183875821b43d8157e0d81">VisitedLeft</a>;
+<a name="l00751"></a>00751         <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R = Current-><a class="code" href="classllvm_1_1ImutAVLTree.html#a95e38c2f04e7ca55f9adfd5ba1a1432b">getRight</a>())
+<a name="l00752"></a>00752           stack.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(reinterpret_cast<uintptr_t>(R) | <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html#ac7c944de94b3b915203290c0660ab74da1aa019b1493a573cf32ec5b369932dcd">VisitedRight</a>);
+<a name="l00753"></a>00753         <span class="keywordflow">break</span>;
+<a name="l00754"></a>00754       <span class="keywordflow">default</span>:
+<a name="l00755"></a>00755         <a class="code" href="ErrorHandling_8h.html#ace243f5c25697a1107cce46626b3dc94">llvm_unreachable</a>(<span class="stringliteral">"Unreachable."</span>);
+<a name="l00756"></a>00756     }
+<a name="l00757"></a>00757     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00758"></a>00758   }
+<a name="l00759"></a>00759 };
+<a name="l00760"></a>00760 
+<a name="l00761"></a>00761 <span class="keyword">template</span> <<span class="keyword">typename</span> ImutInfo>
+<a name="l00762"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">00762</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">ImutAVLTreeInOrderIterator</a> {
+<a name="l00763"></a>00763   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTreeGenericIterator.html">ImutAVLTreeGenericIterator<ImutInfo></a> InternalIteratorTy;
+<a name="l00764"></a>00764   InternalIteratorTy InternalItr;
+<a name="l00765"></a>00765 
+<a name="l00766"></a>00766 <span class="keyword">public</span>:
+<a name="l00767"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#ac7bdbd0995045e4c104dc96deaecfe47">00767</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree<ImutInfo></a> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#ac7bdbd0995045e4c104dc96deaecfe47">TreeTy</a>;
+<a name="l00768"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a9882aa1b2104a9039ba62a392147387f">00768</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">ImutAVLTreeInOrderIterator<ImutInfo></a> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a9882aa1b2104a9039ba62a392147387f">_Self</a>;
+<a name="l00769"></a>00769 
+<a name="l00770"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aafee5c39a20098f962d3cdf317d18a71">00770</a>   <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aafee5c39a20098f962d3cdf317d18a71">ImutAVLTreeInOrderIterator</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* Root) : InternalItr(Root) {
+<a name="l00771"></a>00771     <span class="keywordflow">if</span> (Root) <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a06631a98c0f7619a72597e8e0dd0218b">operator++</a>(); <span class="comment">// Advance to first element.</span>
+<a name="l00772"></a>00772   }
+<a name="l00773"></a>00773 
+<a name="l00774"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a890fc6673edcff23937442ba35eb1d7b">00774</a>   <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a890fc6673edcff23937442ba35eb1d7b">ImutAVLTreeInOrderIterator</a>() : InternalItr() {}
+<a name="l00775"></a>00775 
+<a name="l00776"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aad32256015a09b4bf4882501721ff932">00776</a>   <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aad32256015a09b4bf4882501721ff932">operator==</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">_Self</a>& x)<span class="keyword"> const </span>{
+<a name="l00777"></a>00777     <span class="keywordflow">return</span> InternalItr == x.InternalItr;
+<a name="l00778"></a>00778   }
+<a name="l00779"></a>00779 
+<a name="l00780"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aa24425fa91a851748f4f0f53f1380ba8">00780</a>   <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aa24425fa91a851748f4f0f53f1380ba8">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">_Self</a>& x)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !<a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#aad32256015a09b4bf4882501721ff932">operator==</a>(x); }
+<a name="l00781"></a>00781 
+<a name="l00782"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#ac5e91112bdc43579a061aa95850d6f74">00782</a>   <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#ac5e91112bdc43579a061aa95850d6f74">operator*</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *InternalItr; }
+<a name="l00783"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a8582494c8cd740933890fc6ae322c89a">00783</a>   <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a8582494c8cd740933890fc6ae322c89a">operator-></a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *InternalItr; }
+<a name="l00784"></a>00784 
+<a name="l00785"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a06631a98c0f7619a72597e8e0dd0218b">00785</a>   <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">_Self</a>& <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a06631a98c0f7619a72597e8e0dd0218b">operator++</a>() {
+<a name="l00786"></a>00786     <span class="keywordflow">do</span> ++InternalItr;
+<a name="l00787"></a>00787     <span class="keywordflow">while</span> (!InternalItr.atEnd() &&
+<a name="l00788"></a>00788            InternalItr.getVisitState() != InternalIteratorTy::VisitedLeft);
+<a name="l00789"></a>00789 
+<a name="l00790"></a>00790     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00791"></a>00791   }
+<a name="l00792"></a>00792 
+<a name="l00793"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a1825b71755d0c9ae79df88b452747b7a">00793</a>   <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">_Self</a>& <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a1825b71755d0c9ae79df88b452747b7a">operator--</a>() {
+<a name="l00794"></a>00794     <span class="keywordflow">do</span> --InternalItr;
+<a name="l00795"></a>00795     <span class="keywordflow">while</span> (!InternalItr.atBeginning() &&
+<a name="l00796"></a>00796            InternalItr.getVisitState() != InternalIteratorTy::VisitedLeft);
+<a name="l00797"></a>00797 
+<a name="l00798"></a>00798     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00799"></a>00799   }
+<a name="l00800"></a>00800 
+<a name="l00801"></a><a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a04c8d12e4d5a695aefa1ac8498a46b1a">00801</a>   <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html#a04c8d12e4d5a695aefa1ac8498a46b1a">skipSubTree</a>() {
+<a name="l00802"></a>00802     InternalItr.skipToParent();
+<a name="l00803"></a>00803 
+<a name="l00804"></a>00804     <span class="keywordflow">while</span> (!InternalItr.atEnd() &&
+<a name="l00805"></a>00805            InternalItr.getVisitState() != InternalIteratorTy::VisitedLeft)
+<a name="l00806"></a>00806       ++InternalItr;
+<a name="l00807"></a>00807   }
+<a name="l00808"></a>00808 };
+<a name="l00809"></a>00809 
+<a name="l00810"></a>00810 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00811"></a>00811 <span class="comment">// Trait classes for Profile information.</span>
+<a name="l00812"></a>00812 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00813"></a>00813 <span class="comment"></span>
+<a name="l00814"></a>00814 <span class="comment">/// Generic profile template.  The default behavior is to invoke the</span>
+<a name="l00815"></a>00815 <span class="comment">/// profile method of an object.  Specializations for primitive integers</span>
+<a name="l00816"></a>00816 <span class="comment">/// and generic handling of pointers is done below.</span>
+<a name="l00817"></a>00817 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00818"></a><a class="code" href="structllvm_1_1ImutProfileInfo.html">00818</a> <span class="keyword">struct </span><a class="code" href="structllvm_1_1ImutProfileInfo.html">ImutProfileInfo</a> {
+<a name="l00819"></a><a class="code" href="structllvm_1_1ImutProfileInfo.html#af025e18c460843f52aa0a4c6f3782637">00819</a>   <span class="keyword">typedef</span> <span class="keyword">const</span> T  <a class="code" href="structllvm_1_1ImutProfileInfo.html#af025e18c460843f52aa0a4c6f3782637">value_type</a>;
+<a name="l00820"></a><a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">00820</a>   <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">value_type_ref</a>;
+<a name="l00821"></a>00821 
+<a name="l00822"></a><a class="code" href="structllvm_1_1ImutProfileInfo.html#a7bbfa0126adfabf4e26ebd5829944e38">00822</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7bbfa0126adfabf4e26ebd5829944e38">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a>& ID, <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">value_type_ref</a> X) {
+<a name="l00823"></a>00823     <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7bbfa0126adfabf4e26ebd5829944e38">FoldingSetTrait<T>::Profile</a>(X,ID);
+<a name="l00824"></a>00824   }
+<a name="l00825"></a>00825 };
+<a name="l00826"></a>00826 <span class="comment"></span>
+<a name="l00827"></a>00827 <span class="comment">/// Profile traits for integers.</span>
+<a name="l00828"></a>00828 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00829"></a><a class="code" href="structllvm_1_1ImutProfileInteger.html">00829</a> <span class="keyword">struct </span><a class="code" href="structllvm_1_1ImutProfileInteger.html" title="Profile traits for integers.">ImutProfileInteger</a> {
+<a name="l00830"></a><a class="code" href="structllvm_1_1ImutProfileInteger.html#a97964377daf0b8f5573f94ba46d18dcd">00830</a>   <span class="keyword">typedef</span> <span class="keyword">const</span> T  <a class="code" href="structllvm_1_1ImutProfileInteger.html#a97964377daf0b8f5573f94ba46d18dcd">value_type</a>;
+<a name="l00831"></a><a class="code" href="structllvm_1_1ImutProfileInteger.html#a14ee70556bcb1c9006bbdc74094ea9ed">00831</a>   <span class="keyword">typedef</span> <span class="keyword">const</span> T& <a class="code" href="structllvm_1_1ImutProfileInteger.html#a14ee70556bcb1c9006bbdc74094ea9ed">value_type_ref</a>;
+<a name="l00832"></a>00832 
+<a name="l00833"></a><a class="code" href="structllvm_1_1ImutProfileInteger.html#a04ebbc018a2121bc683cb276337650ef">00833</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structllvm_1_1ImutProfileInteger.html#a04ebbc018a2121bc683cb276337650ef">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a>& ID, <a class="code" href="structllvm_1_1ImutProfileInteger.html#a14ee70556bcb1c9006bbdc74094ea9ed">value_type_ref</a> X) {
+<a name="l00834"></a>00834     ID.<a class="code" href="classllvm_1_1FoldingSetNodeID.html#a1012a025613336baf7ad36a46d18ac36">AddInteger</a>(X);
+<a name="l00835"></a>00835   }
+<a name="l00836"></a>00836 };
+<a name="l00837"></a>00837 
+<a name="l00838"></a><a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">00838</a> <span class="preprocessor">#define PROFILE_INTEGER_INFO(X)\</span>
+<a name="l00839"></a>00839 <span class="preprocessor">template<> struct ImutProfileInfo<X> : ImutProfileInteger<X> {};</span>
+<a name="l00840"></a>00840 <span class="preprocessor"></span>
+<a name="l00841"></a>00841 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">char</span>)
+<a name="l00842"></a>00842 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)
+<a name="l00843"></a>00843 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">short</span>)
+<a name="l00844"></a>00844 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span>)
+<a name="l00845"></a>00845 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">unsigned</span>)
+<a name="l00846"></a>00846 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">signed</span>)
+<a name="l00847"></a>00847 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">long</span>)
+<a name="l00848"></a>00848 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)
+<a name="l00849"></a>00849 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">long</span> <span class="keywordtype">long</span>)
+<a name="l00850"></a>00850 <a class="code" href="ImmutableSet_8h.html#a294889cba4117e66b6e05f607acec5c8">PROFILE_INTEGER_INFO</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <span class="keywordtype">long</span>)
+<a name="l00851"></a>00851 
+<a name="l00852"></a>00852 <span class="preprocessor">#undef PROFILE_INTEGER_INFO</span>
+<a name="l00853"></a>00853 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00854"></a>00854 <span class="comment">/// Generic profile trait for pointer types.  We treat pointers as</span>
+<a name="l00855"></a>00855 <span class="comment">/// references to unique objects.</span>
+<a name="l00856"></a>00856 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00857"></a><a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html">00857</a> <span class="keyword">struct </span><a class="code" href="structllvm_1_1ImutProfileInfo.html">ImutProfileInfo</a><T*> {
+<a name="l00858"></a><a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html#a9077b6d57d0559de2f502b6dfd8b2dea">00858</a>   <span class="keyword">typedef</span> <span class="keyword">const</span> T*   <a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html#a9077b6d57d0559de2f502b6dfd8b2dea">value_type</a>;
+<a name="l00859"></a><a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html#a5624dbe552413d969f3942824e8e34bd">00859</a>   <span class="keyword">typedef</span> value_type <a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html#a5624dbe552413d969f3942824e8e34bd">value_type_ref</a>;
+<a name="l00860"></a>00860 
+<a name="l00861"></a><a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html#a3b924b9165edfa8831cc395076f05d73">00861</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html#a3b924b9165edfa8831cc395076f05d73">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a> &ID, value_type_ref X) {
+<a name="l00862"></a>00862     ID.<a class="code" href="classllvm_1_1FoldingSetNodeID.html#a626e5a2c04c89e2ddd697e424ec68391">AddPointer</a>(X);
+<a name="l00863"></a>00863   }
+<a name="l00864"></a>00864 };
+<a name="l00865"></a>00865 
+<a name="l00866"></a>00866 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00867"></a>00867 <span class="comment">// Trait classes that contain element comparison operators and type</span>
+<a name="l00868"></a>00868 <span class="comment">//  definitions used by ImutAVLTree, ImmutableSet, and ImmutableMap.  These</span>
+<a name="l00869"></a>00869 <span class="comment">//  inherit from the profile traits (ImutProfileInfo) to include operations</span>
+<a name="l00870"></a>00870 <span class="comment">//  for element profiling.</span>
+<a name="l00871"></a>00871 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00872"></a>00872 
+<a name="l00873"></a>00873 <span class="comment"></span>
+<a name="l00874"></a>00874 <span class="comment">/// ImutContainerInfo - Generic definition of comparison operations for</span>
+<a name="l00875"></a>00875 <span class="comment">///   elements of immutable containers that defaults to using</span>
+<a name="l00876"></a>00876 <span class="comment">///   std::equal_to<> and std::less<> to perform comparison of elements.</span>
+<a name="l00877"></a>00877 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00878"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html">00878</a> <span class="keyword">struct </span><a class="code" href="structllvm_1_1ImutContainerInfo.html">ImutContainerInfo</a> : <span class="keyword">public</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html">ImutProfileInfo</a><T> {
+<a name="l00879"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#aea481bc1a917d6ba6146265ea58f1dee">00879</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#af025e18c460843f52aa0a4c6f3782637">ImutProfileInfo<T>::value_type</a>      <a class="code" href="structllvm_1_1ImutContainerInfo.html#aea481bc1a917d6ba6146265ea58f1dee">value_type</a>;
+<a name="l00880"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#ae3ba0d41c117f034844852c9a226d0fb">00880</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">ImutProfileInfo<T>::value_type_ref</a>  <a class="code" href="structllvm_1_1ImutContainerInfo.html#ae3ba0d41c117f034844852c9a226d0fb">value_type_ref</a>;
+<a name="l00881"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#aee1e905aa7aee7e8834dc1a718f4fc18">00881</a>   <span class="keyword">typedef</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#af025e18c460843f52aa0a4c6f3782637">value_type</a>      <a class="code" href="structllvm_1_1ImutContainerInfo.html#aee1e905aa7aee7e8834dc1a718f4fc18">key_type</a>;
+<a name="l00882"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">00882</a>   <span class="keyword">typedef</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">value_type_ref</a>  <a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">key_type_ref</a>;
+<a name="l00883"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#ad0dd155a722bebadd246d1b0ac3d3c59">00883</a>   <span class="keyword">typedef</span> <span class="keywordtype">bool</span>            <a class="code" href="structllvm_1_1ImutContainerInfo.html#ad0dd155a722bebadd246d1b0ac3d3c59">data_type</a>;
+<a name="l00884"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a3de84d7327ff471b208de794a01f596a">00884</a>   <span class="keyword">typedef</span> <span class="keywordtype">bool</span>            <a class="code" href="structllvm_1_1ImutContainerInfo.html#a3de84d7327ff471b208de794a01f596a">data_type_ref</a>;
+<a name="l00885"></a>00885 
+<a name="l00886"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a7fb76f3c86a6d2eb36ad5d0fcbd422e5">00886</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">key_type_ref</a> <a class="code" href="structllvm_1_1ImutContainerInfo.html#a7fb76f3c86a6d2eb36ad5d0fcbd422e5">KeyOfValue</a>(<a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">value_type_ref</a> D) { <span class="keywordflow">return</span> D; }
+<a name="l00887"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a5fc39c4c77d43fc1bea4a32b18a56c9b">00887</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="classint8__t.html">data_type_ref</a> <a class="code" href="structllvm_1_1ImutContainerInfo.html#a5fc39c4c77d43fc1bea4a32b18a56c9b">DataOfValue</a>(<a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">value_type_ref</a>) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00888"></a>00888 
+<a name="l00889"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a5b06b26491c1dd416f34edef9b12d331">00889</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1ImutContainerInfo.html#a5b06b26491c1dd416f34edef9b12d331">isEqual</a>(<a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">key_type_ref</a> LHS, <a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">key_type_ref</a> RHS) {
+<a name="l00890"></a>00890     <span class="keywordflow">return</span> std::equal_to<key_type>()(LHS,RHS);
+<a name="l00891"></a>00891   }
+<a name="l00892"></a>00892 
+<a name="l00893"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a054627b5517aa25f7edcdc694ae99991">00893</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1ImutContainerInfo.html#a054627b5517aa25f7edcdc694ae99991">isLess</a>(<a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">key_type_ref</a> LHS, <a class="code" href="structllvm_1_1ImutContainerInfo.html#a199191c0fba2e12d861d217d947cd93e">key_type_ref</a> RHS) {
+<a name="l00894"></a>00894     <span class="keywordflow">return</span> std::less<key_type>()(LHS,RHS);
+<a name="l00895"></a>00895   }
+<a name="l00896"></a>00896 
+<a name="l00897"></a><a class="code" href="structllvm_1_1ImutContainerInfo.html#a5e3153843e74522359d284e21b9834b3">00897</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1ImutContainerInfo.html#a5e3153843e74522359d284e21b9834b3">isDataEqual</a>(<a class="code" href="classint8__t.html">data_type_ref</a>,<a class="code" href="classint8__t.html">data_type_ref</a>) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00898"></a>00898 };
+<a name="l00899"></a>00899 <span class="comment"></span>
+<a name="l00900"></a>00900 <span class="comment">/// ImutContainerInfo - Specialization for pointer values to treat pointers</span>
+<a name="l00901"></a>00901 <span class="comment">///  as references to unique objects.  Pointers are thus compared by</span>
+<a name="l00902"></a>00902 <span class="comment">///  their addresses.</span>
+<a name="l00903"></a>00903 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">typename</span> T>
+<a name="l00904"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html">00904</a> <span class="keyword">struct </span><a class="code" href="structllvm_1_1ImutContainerInfo.html">ImutContainerInfo</a><T*> : <span class="keyword">public</span> <a class="code" href="structllvm_1_1ImutProfileInfo_3_01T_01_5_01_4.html">ImutProfileInfo<T*></a> {
+<a name="l00905"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a91170009f9bd82ac25401a60f2e562ed">00905</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#af025e18c460843f52aa0a4c6f3782637">ImutProfileInfo<T*>::value_type</a>      <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a91170009f9bd82ac25401a60f2e562ed">value_type</a>;
+<a name="l00906"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a6d5c1518794a5701ddd27be34d1ad079">00906</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="structllvm_1_1ImutProfileInfo.html#a7095306e66050d4af000dfff24174258">ImutProfileInfo<T*>::value_type_ref</a>  <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a6d5c1518794a5701ddd27be34d1ad079">value_type_ref</a>;
+<a name="l00907"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#ad53c119be9d269571bcd550d32b7bed1">00907</a>   <span class="keyword">typedef</span> value_type      <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#ad53c119be9d269571bcd550d32b7bed1">key_type</a>;
+<a name="l00908"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a4cfcb53b530f5a09b01aa8d3cd4b87db">00908</a>   <span class="keyword">typedef</span> value_type_ref  <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a4cfcb53b530f5a09b01aa8d3cd4b87db">key_type_ref</a>;
+<a name="l00909"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a6088e08a262a4b1bed87c9fa3fb57836">00909</a>   <span class="keyword">typedef</span> <span class="keywordtype">bool</span>            <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a6088e08a262a4b1bed87c9fa3fb57836">data_type</a>;
+<a name="l00910"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a14a96a469b461a728f969b7cda00e5fe">00910</a>   <span class="keyword">typedef</span> <span class="keywordtype">bool</span>            <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a14a96a469b461a728f969b7cda00e5fe">data_type_ref</a>;
+<a name="l00911"></a>00911 
+<a name="l00912"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a1d64087c7621e04f505781a7a14e5f21">00912</a>   <span class="keyword">static</span> <span class="keyword">inline</span> key_type_ref <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a1d64087c7621e04f505781a7a14e5f21">KeyOfValue</a>(value_type_ref D) { <span class="keywordflow">return</span> D; }
+<a name="l00913"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#aba52d4c5b6cfa9edf6cc15369a78cb2b">00913</a>   <span class="keyword">static</span> <span class="keyword">inline</span> data_type_ref <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#aba52d4c5b6cfa9edf6cc15369a78cb2b">DataOfValue</a>(value_type_ref) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00914"></a>00914 
+<a name="l00915"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a43fb0ff22f46d8624bf63d6935b33993">00915</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a43fb0ff22f46d8624bf63d6935b33993">isEqual</a>(key_type_ref LHS, key_type_ref RHS) {
+<a name="l00916"></a>00916     <span class="keywordflow">return</span> LHS == RHS;
+<a name="l00917"></a>00917   }
+<a name="l00918"></a>00918 
+<a name="l00919"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#afd50b528796b1d93e98f4b827134a1ec">00919</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#afd50b528796b1d93e98f4b827134a1ec">isLess</a>(key_type_ref LHS, key_type_ref RHS) {
+<a name="l00920"></a>00920     <span class="keywordflow">return</span> LHS < RHS;
+<a name="l00921"></a>00921   }
+<a name="l00922"></a>00922 
+<a name="l00923"></a><a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a00dc8b59524dd4e7da67242239e601a8">00923</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1ImutContainerInfo_3_01T_01_5_01_4.html#a00dc8b59524dd4e7da67242239e601a8">isDataEqual</a>(data_type_ref,data_type_ref) { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
+<a name="l00924"></a>00924 };
+<a name="l00925"></a>00925 
+<a name="l00926"></a>00926 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00927"></a>00927 <span class="comment">// Immutable Set</span>
+<a name="l00928"></a>00928 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00929"></a>00929 
+<a name="l00930"></a>00930 <span class="keyword">template</span> <<span class="keyword">typename</span> ValT, <span class="keyword">typename</span> ValInfo = ImutContainerInfo<ValT> >
+<a name="l00931"></a><a class="code" href="classllvm_1_1ImmutableSet.html">00931</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> {
+<a name="l00932"></a>00932 <span class="keyword">public</span>:
+<a name="l00933"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a253939e3ff972c78f5b5070eff81d1f4">00933</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ValInfo::value_type      <a class="code" href="classllvm_1_1ImmutableSet.html#a253939e3ff972c78f5b5070eff81d1f4">value_type</a>;
+<a name="l00934"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a5477f9d1402af58f45729c3104b638cc">00934</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ValInfo::value_type_ref  <a class="code" href="classllvm_1_1ImmutableSet.html#a5477f9d1402af58f45729c3104b638cc">value_type_ref</a>;
+<a name="l00935"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a0ef0c452cb22c202650686a6ba7214ae">00935</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree<ValInfo></a> <a class="code" href="classllvm_1_1ImmutableSet.html#a0ef0c452cb22c202650686a6ba7214ae">TreeTy</a>;
+<a name="l00936"></a>00936 
+<a name="l00937"></a>00937 <span class="keyword">private</span>:
+<a name="l00938"></a>00938   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *Root;
+<a name="l00939"></a>00939 
+<a name="l00940"></a>00940 <span class="keyword">public</span>:<span class="comment"></span>
+<a name="l00941"></a>00941 <span class="comment">  /// Constructs a set from a pointer to a tree root.  In general one</span>
+<a name="l00942"></a>00942 <span class="comment">  /// should use a Factory object to create sets instead of directly</span>
+<a name="l00943"></a>00943 <span class="comment">  /// invoking the constructor, but there are cases where make this</span>
+<a name="l00944"></a>00944 <span class="comment">  /// constructor public is useful.</span>
+<a name="l00945"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a577937683fc13ab01a50897993da60af">00945</a> <span class="comment"></span>  <span class="keyword">explicit</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a577937683fc13ab01a50897993da60af">ImmutableSet</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R) : Root(R) {
+<a name="l00946"></a>00946     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l00947"></a>00947   }
+<a name="l00948"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a3dbca9570419be7133be698f4343dfb0">00948</a>   <a class="code" href="classllvm_1_1ImmutableSet.html#a3dbca9570419be7133be698f4343dfb0">ImmutableSet</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> &X) : Root(X.Root) {
+<a name="l00949"></a>00949     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l00950"></a>00950   }
+<a name="l00951"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a79f15a04c719782c992aa07b1397371b">00951</a>   <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> &<a class="code" href="classllvm_1_1ImmutableSet.html#a79f15a04c719782c992aa07b1397371b">operator=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> &X) {
+<a name="l00952"></a>00952     <span class="keywordflow">if</span> (Root != X.Root) {
+<a name="l00953"></a>00953       <span class="keywordflow">if</span> (X.Root) { X.Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l00954"></a>00954       <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>(); }
+<a name="l00955"></a>00955       Root = X.Root;
+<a name="l00956"></a>00956     }
+<a name="l00957"></a>00957     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l00958"></a>00958   }
+<a name="l00959"></a><a class="code" href="classllvm_1_1ImmutableSet.html#abf1cb11f46e632db89a93c8fcde1d1eb">00959</a>   <a class="code" href="classllvm_1_1ImmutableSet.html#abf1cb11f46e632db89a93c8fcde1d1eb">~ImmutableSet</a>() {
+<a name="l00960"></a>00960     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>(); }
+<a name="l00961"></a>00961   }
+<a name="l00962"></a>00962 
+<a name="l00963"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html">00963</a>   <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html">Factory</a> {
+<a name="l00964"></a>00964     <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html">TreeTy::Factory</a> F;
+<a name="l00965"></a>00965     <span class="keyword">const</span> <span class="keywordtype">bool</span> Canonicalize;
+<a name="l00966"></a>00966 
+<a name="l00967"></a>00967   <span class="keyword">public</span>:
+<a name="l00968"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ae7c3f1fbf3b5b7f18eebea5efd90a1ef">00968</a>     <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ae7c3f1fbf3b5b7f18eebea5efd90a1ef">Factory</a>(<span class="keywordtype">bool</span> <a class="code" href="namespacellvm_1_1sys_1_1fs.html#ac81340f79222ebe6143d9e86257a09eb" title="Canonicalize path.">canonicalize</a> = <span class="keyword">true</span>)
+<a name="l00969"></a>00969       : Canonicalize(<a class="code" href="namespacellvm_1_1sys_1_1fs.html#ac81340f79222ebe6143d9e86257a09eb" title="Canonicalize path.">canonicalize</a>) {}
+<a name="l00970"></a>00970 
+<a name="l00971"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ab11838abd08ffa0a0fc64edded64981e">00971</a>     <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ae7c3f1fbf3b5b7f18eebea5efd90a1ef">Factory</a>(<a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>& Alloc, <span class="keywordtype">bool</span> <a class="code" href="namespacellvm_1_1sys_1_1fs.html#ac81340f79222ebe6143d9e86257a09eb" title="Canonicalize path.">canonicalize</a> = <span class="keyword">true</span>)
+<a name="l00972"></a>00972       : F(Alloc), Canonicalize(<a class="code" href="namespacellvm_1_1sys_1_1fs.html#ac81340f79222ebe6143d9e86257a09eb" title="Canonicalize path.">canonicalize</a>) {}
+<a name="l00973"></a>00973 <span class="comment"></span>
+<a name="l00974"></a>00974 <span class="comment">    /// getEmptySet - Returns an immutable set that contains no elements.</span>
+<a name="l00975"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ad51e2cd257a3ee2c43a879fc311d621d">00975</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ad51e2cd257a3ee2c43a879fc311d621d" title="getEmptySet - Returns an immutable set that contains no elements.">getEmptySet</a>() {
+<a name="l00976"></a>00976       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a577937683fc13ab01a50897993da60af">ImmutableSet</a>(F.<a class="code" href="classllvm_1_1ImutAVLFactory.html#a3b802d3e246330382a91eb00d42aca1c">getEmptyTree</a>());
+<a name="l00977"></a>00977     }
+<a name="l00978"></a>00978 <span class="comment"></span>
+<a name="l00979"></a>00979 <span class="comment">    /// add - Creates a new immutable set that contains all of the values</span>
+<a name="l00980"></a>00980 <span class="comment">    ///  of the original set with the addition of the specified value.  If</span>
+<a name="l00981"></a>00981 <span class="comment">    ///  the original set already included the value, then the original set is</span>
+<a name="l00982"></a>00982 <span class="comment">    ///  returned and no memory is allocated.  The time and space complexity</span>
+<a name="l00983"></a>00983 <span class="comment">    ///  of this operation is logarithmic in the size of the original set.</span>
+<a name="l00984"></a>00984 <span class="comment">    ///  The memory allocated to represent the set is released when the</span>
+<a name="l00985"></a>00985 <span class="comment">    ///  factory object that created the set is destroyed.</span>
+<a name="l00986"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#afbc2f64a137fe78f0be7a6b1254bd42d">00986</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#afbc2f64a137fe78f0be7a6b1254bd42d">add</a>(<a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> Old, <a class="code" href="classllvm_1_1ImmutableSet.html#a5477f9d1402af58f45729c3104b638cc">value_type_ref</a> V) {
+<a name="l00987"></a>00987       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *NewT = F.<a class="code" href="classllvm_1_1ImutAVLFactory.html#a82a14e085fc5b4007790f70a01b76222">add</a>(Old.Root, V);
+<a name="l00988"></a>00988       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a577937683fc13ab01a50897993da60af">ImmutableSet</a>(Canonicalize ? F.<a class="code" href="classllvm_1_1ImutAVLFactory.html#a9bddfc31770b6a82bf224ac2f4cb5543">getCanonicalTree</a>(NewT) : NewT);
+<a name="l00989"></a>00989     }
+<a name="l00990"></a>00990 <span class="comment"></span>
+<a name="l00991"></a>00991 <span class="comment">    /// remove - Creates a new immutable set that contains all of the values</span>
+<a name="l00992"></a>00992 <span class="comment">    ///  of the original set with the exception of the specified value.  If</span>
+<a name="l00993"></a>00993 <span class="comment">    ///  the original set did not contain the value, the original set is</span>
+<a name="l00994"></a>00994 <span class="comment">    ///  returned and no memory is allocated.  The time and space complexity</span>
+<a name="l00995"></a>00995 <span class="comment">    ///  of this operation is logarithmic in the size of the original set.</span>
+<a name="l00996"></a>00996 <span class="comment">    ///  The memory allocated to represent the set is released when the</span>
+<a name="l00997"></a>00997 <span class="comment">    ///  factory object that created the set is destroyed.</span>
+<a name="l00998"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#afb1072e635625a2c8613ddb9610ee41d">00998</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> <span class="keyword">remove</span>(<a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> Old, <a class="code" href="classllvm_1_1ImmutableSet.html#a5477f9d1402af58f45729c3104b638cc">value_type_ref</a> V) {
+<a name="l00999"></a>00999       <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *NewT = F.<a class="code" href="classllvm_1_1ImutAVLFactory.html#a91b65702c20741c1ac050893c4a42dd5">remove</a>(Old.Root, V);
+<a name="l01000"></a>01000       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a577937683fc13ab01a50897993da60af">ImmutableSet</a>(Canonicalize ? F.<a class="code" href="classllvm_1_1ImutAVLFactory.html#a9bddfc31770b6a82bf224ac2f4cb5543">getCanonicalTree</a>(NewT) : NewT);
+<a name="l01001"></a>01001     }
+<a name="l01002"></a>01002 
+<a name="l01003"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#a5b68c4266db4c0c23e70beccdd013d32">01003</a>     <a class="code" href="classllvm_1_1BumpPtrAllocator.html">BumpPtrAllocator</a>& <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#a5b68c4266db4c0c23e70beccdd013d32">getAllocator</a>() { <span class="keywordflow">return</span> F.getAllocator(); }
+<a name="l01004"></a>01004 
+<a name="l01005"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#a6dba66d02d52e68f3a617ee92a3dd190">01005</a>     <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html">TreeTy::Factory</a> *<a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#a6dba66d02d52e68f3a617ee92a3dd190">getTreeFactory</a>()<span class="keyword"> const </span>{
+<a name="l01006"></a>01006       <span class="keywordflow">return</span> <span class="keyword">const_cast<</span>typename <a class="code" href="classllvm_1_1ImutAVLFactory.html">TreeTy::Factory</a> *<span class="keyword">></span>(&F);
+<a name="l01007"></a>01007     }
+<a name="l01008"></a>01008 
+<a name="l01009"></a>01009   <span class="keyword">private</span>:
+<a name="l01010"></a>01010     <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html#ae7c3f1fbf3b5b7f18eebea5efd90a1ef">Factory</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html">Factory</a>& RHS) <a class="code" href="Compiler_8h.html#aacca75352b8e153274310c374564eb01">LLVM_DELETED_FUNCTION</a>;
+<a name="l01011"></a>01011     <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html">Factory</a>& RHS) <a class="code" href="Compiler_8h.html#aacca75352b8e153274310c374564eb01">LLVM_DELETED_FUNCTION</a>;
+<a name="l01012"></a>01012   };
+<a name="l01013"></a>01013 
+<a name="l01014"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a328c093d609680cca505905c6d49901a">01014</a>   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSet_1_1Factory.html">Factory</a>;
+<a name="l01015"></a>01015 <span class="comment"></span>
+<a name="l01016"></a>01016 <span class="comment">  /// Returns true if the set contains the specified value.</span>
+<a name="l01017"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a3f45c70d208c6fa40175ba68f477f6f8">01017</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a3f45c70d208c6fa40175ba68f477f6f8" title="Returns true if the set contains the specified value.">contains</a>(<a class="code" href="classllvm_1_1ImmutableSet.html#a5477f9d1402af58f45729c3104b638cc">value_type_ref</a> V)<span class="keyword"> const </span>{
+<a name="l01018"></a>01018     <span class="keywordflow">return</span> Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#acde18b3919ed6ba89a66c67beff53229">contains</a>(V) : <span class="keyword">false</span>;
+<a name="l01019"></a>01019   }
+<a name="l01020"></a>01020 
+<a name="l01021"></a><a class="code" href="classllvm_1_1ImmutableSet.html#af15963254ae9cfa67a4ac974ad7b031e">01021</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet.html#af15963254ae9cfa67a4ac974ad7b031e">operator==</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> &RHS)<span class="keyword"> const </span>{
+<a name="l01022"></a>01022     <span class="keywordflow">return</span> Root && RHS.Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6577770be6a6b0877352b248d6ce4715">isEqual</a>(*RHS.Root) : Root == RHS.Root;
+<a name="l01023"></a>01023   }
+<a name="l01024"></a>01024 
+<a name="l01025"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a18b54c1fc7194d2bf88e311cb842a150">01025</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a18b54c1fc7194d2bf88e311cb842a150">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a> &RHS)<span class="keyword"> const </span>{
+<a name="l01026"></a>01026     <span class="keywordflow">return</span> Root && RHS.Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#aee20e730e8dd355f60fb68e38a107ede">isNotEqual</a>(*RHS.Root) : Root != RHS.Root;
+<a name="l01027"></a>01027   }
+<a name="l01028"></a>01028 
+<a name="l01029"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a27e9713129d5d212bed6478599f36ddf">01029</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *<a class="code" href="classllvm_1_1ImmutableSet.html#a27e9713129d5d212bed6478599f36ddf">getRoot</a>() {
+<a name="l01030"></a>01030     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l01031"></a>01031     <span class="keywordflow">return</span> Root;
+<a name="l01032"></a>01032   }
+<a name="l01033"></a>01033 
+<a name="l01034"></a><a class="code" href="classllvm_1_1ImmutableSet.html#ad5a1c83e6b3ec78eb3767dfd5018aff9">01034</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *<a class="code" href="classllvm_1_1ImmutableSet.html#ad5a1c83e6b3ec78eb3767dfd5018aff9">getRootWithoutRetain</a>()<span class="keyword"> const </span>{
+<a name="l01035"></a>01035     <span class="keywordflow">return</span> Root;
+<a name="l01036"></a>01036   }
+<a name="l01037"></a>01037 <span class="comment"></span>
+<a name="l01038"></a>01038 <span class="comment">  /// isEmpty - Return true if the set contains no elements.</span>
+<a name="l01039"></a><a class="code" href="classllvm_1_1ImmutableSet.html#ae5b56ce894ce47a369e07125732fd3c6">01039</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet.html#ae5b56ce894ce47a369e07125732fd3c6" title="isEmpty - Return true if the set contains no elements.">isEmpty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !Root; }
+<a name="l01040"></a>01040 <span class="comment"></span>
+<a name="l01041"></a>01041 <span class="comment">  /// isSingleton - Return true if the set contains exactly one element.</span>
+<a name="l01042"></a>01042 <span class="comment">  ///   This method runs in constant time.</span>
+<a name="l01043"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a3bfc1f48cdd0eacbaf9508c7f4a1da9d">01043</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a3bfc1f48cdd0eacbaf9508c7f4a1da9d">isSingleton</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a4aec236c91e568c5dbf3ded151e1efbd">getHeight</a>() == 1; }
+<a name="l01044"></a>01044 
+<a name="l01045"></a>01045   <span class="keyword">template</span> <<span class="keyword">typename</span> Callback>
+<a name="l01046"></a><a class="code" href="classllvm_1_1ImmutableSet.html#ab6fabbc301543b58c231236d8f28489e">01046</a>   <span class="keywordtype">void</span> <span class="keywordflow">foreach</span>(Callback& C) { <span class="keywordflow">if</span> (Root) Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6bd643417e35b25c25e4b6c7f92b409f">foreach</a>(C); }
+<a name="l01047"></a>01047 
+<a name="l01048"></a>01048   <span class="keyword">template</span> <<span class="keyword">typename</span> Callback>
+<a name="l01049"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a57f4ca792be2b5b1d47acb20ad4ff757">01049</a>   <span class="keywordtype">void</span> <span class="keywordflow">foreach</span>() { <span class="keywordflow">if</span> (Root) { Callback <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974afd841a49aec1539bc88abc8ff9e170fb">C</a>; Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6bd643417e35b25c25e4b6c7f92b409f">foreach</a>(C); } }
+<a name="l01050"></a>01050 
+<a name="l01051"></a>01051   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01052"></a>01052   <span class="comment">// Iterators.</span>
+<a name="l01053"></a>01053   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01054"></a>01054 
+<a name="l01055"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">01055</a>   <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a> {
+<a name="l01056"></a>01056     <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">TreeTy::iterator</a> itr;
+<a name="l01057"></a>01057     <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a56930932c87bc5c8cc1f622ea9976f80">iterator</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* t) : itr(t) {}
+<a name="l01058"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a5586ab98841c435534b213c48e60f753">01058</a>     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a><<a class="code" href="classValT.html">ValT</a>,ValInfo>;
+<a name="l01059"></a>01059   <span class="keyword">public</span>:
+<a name="l01060"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a56930932c87bc5c8cc1f622ea9976f80">01060</a>     <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a56930932c87bc5c8cc1f622ea9976f80">iterator</a>() {}
+<a name="l01061"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a819fbe4e15ef9e0a78cd53421e8cd25f">01061</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a5477f9d1402af58f45729c3104b638cc">value_type_ref</a> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a819fbe4e15ef9e0a78cd53421e8cd25f">operator*</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> itr->getValue(); }
+<a name="l01062"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a94fef524def0a2f3feb8442817d4e14c">01062</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>& <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a94fef524def0a2f3feb8442817d4e14c">operator++</a>() { ++itr; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l01063"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#aa58d9d25b7e56492a99d21a0fc6f6e6d">01063</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>  <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#aa58d9d25b7e56492a99d21a0fc6f6e6d">operator++</a>(<span class="keywordtype">int</span>) { <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a> tmp(*<span class="keyword">this</span>); ++itr; <span class="keywordflow">return</span> tmp; }
+<a name="l01064"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a4118f36821b5fb881ed5b7cd74758223">01064</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>& <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a4118f36821b5fb881ed5b7cd74758223">operator--</a>() { --itr; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l01065"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a7de617a5a3890c2a0a05086ed1f4c1d5">01065</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>  <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a7de617a5a3890c2a0a05086ed1f4c1d5">operator--</a>(<span class="keywordtype">int</span>) { <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a> tmp(*<span class="keyword">this</span>); --itr; <span class="keywordflow">return</span> tmp; }
+<a name="l01066"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#ac5976ec62cb25e7e9a60cb695dd53950">01066</a>     <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#ac5976ec62cb25e7e9a60cb695dd53950">operator==</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>& RHS)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> RHS.itr == itr; }
+<a name="l01067"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a671eaf694f9d6bc39a1c5ae6352e61d7">01067</a>     <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a671eaf694f9d6bc39a1c5ae6352e61d7">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>& RHS)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> RHS.itr != itr; }
+<a name="l01068"></a><a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a608337d7fac93230a204171f90c79dc6">01068</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a253939e3ff972c78f5b5070eff81d1f4">value_type</a> *<a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a608337d7fac93230a204171f90c79dc6">operator-></a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &(<a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html#a819fbe4e15ef9e0a78cd53421e8cd25f">operator*</a>()); }
+<a name="l01069"></a>01069   };
+<a name="l01070"></a>01070 
+<a name="l01071"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a9e573660a0de08b67226673bdca700d5">01071</a>   <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a> <a class="code" href="classllvm_1_1ImmutableSet.html#a9e573660a0de08b67226673bdca700d5">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>(Root); }
+<a name="l01072"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a632b7298bd1e9a15a155e192bc1dab8a">01072</a>   <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a> <a class="code" href="classllvm_1_1ImmutableSet.html#a632b7298bd1e9a15a155e192bc1dab8a">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet_1_1iterator.html">iterator</a>(); }
+<a name="l01073"></a>01073 
+<a name="l01074"></a>01074   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01075"></a>01075   <span class="comment">// Utility methods.</span>
+<a name="l01076"></a>01076   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01077"></a>01077 
+<a name="l01078"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a4aec236c91e568c5dbf3ded151e1efbd">01078</a>   <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a4aec236c91e568c5dbf3ded151e1efbd">getHeight</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">getHeight</a>() : 0; }
+<a name="l01079"></a>01079 
+<a name="l01080"></a><a class="code" href="classllvm_1_1ImmutableSet.html#acae16c981fabd37fa4df79f5cf567896">01080</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImmutableSet.html#acae16c981fabd37fa4df79f5cf567896">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a>& ID, <span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet</a>& S) {
+<a name="l01081"></a>01081     ID.<a class="code" href="classllvm_1_1FoldingSetNodeID.html#a626e5a2c04c89e2ddd697e424ec68391">AddPointer</a>(S.Root);
+<a name="l01082"></a>01082   }
+<a name="l01083"></a>01083 
+<a name="l01084"></a><a class="code" href="classllvm_1_1ImmutableSet.html#a497e827221789304ebfef77f645d9a5f">01084</a>   <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImmutableSet.html#a497e827221789304ebfef77f645d9a5f">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a>& ID)<span class="keyword"> const </span>{
+<a name="l01085"></a>01085     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet.html#acae16c981fabd37fa4df79f5cf567896">Profile</a>(ID,*<span class="keyword">this</span>);
+<a name="l01086"></a>01086   }
+<a name="l01087"></a>01087 
+<a name="l01088"></a>01088   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01089"></a>01089   <span class="comment">// For testing.</span>
+<a name="l01090"></a>01090   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01091"></a>01091 
+<a name="l01092"></a><a class="code" href="classllvm_1_1ImmutableSet.html#abffd7b30bc2c5a17bbdfc0d7346c7d20">01092</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImmutableSet.html#abffd7b30bc2c5a17bbdfc0d7346c7d20">validateTree</a>()<span class="keyword"> const </span>{ <span class="keywordflow">if</span> (Root) Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a7e04391de44c91f61a1f08a37e7fad8a">validateTree</a>(); }
+<a name="l01093"></a>01093 };
+<a name="l01094"></a>01094 
+<a name="l01095"></a>01095 <span class="comment">// NOTE: This may some day replace the current ImmutableSet.</span>
+<a name="l01096"></a>01096 <span class="keyword">template</span> <<span class="keyword">typename</span> ValT, <span class="keyword">typename</span> ValInfo = ImutContainerInfo<ValT> >
+<a name="l01097"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html">01097</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> {
+<a name="l01098"></a>01098 <span class="keyword">public</span>:
+<a name="l01099"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#aca53faf35de74cd81b22e7cfe2780d31">01099</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ValInfo::value_type      <a class="code" href="classllvm_1_1ImmutableSetRef.html#aca53faf35de74cd81b22e7cfe2780d31">value_type</a>;
+<a name="l01100"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#ac0c861c86f06a5e59a6a1d709cc75dfe">01100</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> ValInfo::value_type_ref  <a class="code" href="classllvm_1_1ImmutableSetRef.html#ac0c861c86f06a5e59a6a1d709cc75dfe">value_type_ref</a>;
+<a name="l01101"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#ae71eeb39f6daf346e03d829ebde67860">01101</a>   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1ImutAVLTree.html">ImutAVLTree<ValInfo></a> <a class="code" href="classllvm_1_1ImmutableSetRef.html#ae71eeb39f6daf346e03d829ebde67860">TreeTy</a>;
+<a name="l01102"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#aa940495aad016f9c85e8a1d77b87b5e8">01102</a>   <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLFactory.html">TreeTy::Factory</a>          <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa940495aad016f9c85e8a1d77b87b5e8">FactoryTy</a>;
+<a name="l01103"></a>01103 
+<a name="l01104"></a>01104 <span class="keyword">private</span>:
+<a name="l01105"></a>01105   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *Root;
+<a name="l01106"></a>01106   <a class="code" href="classllvm_1_1ImutAVLFactory.html">FactoryTy</a> *Factory;
+<a name="l01107"></a>01107 
+<a name="l01108"></a>01108 <span class="keyword">public</span>:<span class="comment"></span>
+<a name="l01109"></a>01109 <span class="comment">  /// Constructs a set from a pointer to a tree root.  In general one</span>
+<a name="l01110"></a>01110 <span class="comment">  /// should use a Factory object to create sets instead of directly</span>
+<a name="l01111"></a>01111 <span class="comment">  /// invoking the constructor, but there are cases where make this</span>
+<a name="l01112"></a>01112 <span class="comment">  /// constructor public is useful.</span>
+<a name="l01113"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#aa37c1e77d43150a76272b1a5739445ae">01113</a> <span class="comment"></span>  <span class="keyword">explicit</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa37c1e77d43150a76272b1a5739445ae">ImmutableSetRef</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* R, <a class="code" href="classllvm_1_1ImutAVLFactory.html">FactoryTy</a> *<a class="code" href="LLParser_8cpp.html#a33ece1ef8074506a15d7f86eb76dbae6">F</a>)
+<a name="l01114"></a>01114     : Root(R),
+<a name="l01115"></a>01115       Factory(F) {
+<a name="l01116"></a>01116     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l01117"></a>01117   }
+<a name="l01118"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a1fbda7d5323bd6f1c33e064c721503d2">01118</a>   <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa37c1e77d43150a76272b1a5739445ae">ImmutableSetRef</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> &X)
+<a name="l01119"></a>01119     : Root(X.Root),
+<a name="l01120"></a>01120       Factory(X.Factory) {
+<a name="l01121"></a>01121     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l01122"></a>01122   }
+<a name="l01123"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a63b69eb9ddea1a7f9215bb8722a1d05d">01123</a>   <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> &<a class="code" href="classllvm_1_1ImmutableSetRef.html#a63b69eb9ddea1a7f9215bb8722a1d05d">operator=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> &X) {
+<a name="l01124"></a>01124     <span class="keywordflow">if</span> (Root != X.Root) {
+<a name="l01125"></a>01125       <span class="keywordflow">if</span> (X.Root) { X.Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6c0478e059ed72cca5a056192088e662">retain</a>(); }
+<a name="l01126"></a>01126       <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>(); }
+<a name="l01127"></a>01127       Root = X.Root;
+<a name="l01128"></a>01128       Factory = X.Factory;
+<a name="l01129"></a>01129     }
+<a name="l01130"></a>01130     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
+<a name="l01131"></a>01131   }
+<a name="l01132"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#aebd0bdefd06b46c6136f4455be2f3e78">01132</a>   <a class="code" href="classllvm_1_1ImmutableSetRef.html#aebd0bdefd06b46c6136f4455be2f3e78">~ImmutableSetRef</a>() {
+<a name="l01133"></a>01133     <span class="keywordflow">if</span> (Root) { Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#ace77835f84c5bed9111f65102c9ff04f">release</a>(); }
+<a name="l01134"></a>01134   }
+<a name="l01135"></a>01135 
+<a name="l01136"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#aee67f770c7e26cc07b0b2578ea085a2a">01136</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aee67f770c7e26cc07b0b2578ea085a2a">getEmptySet</a>(<a class="code" href="classllvm_1_1ImutAVLFactory.html">FactoryTy</a> *<a class="code" href="LLParser_8cpp.html#a33ece1ef8074506a15d7f86eb76dbae6">F</a>) {
+<a name="l01137"></a>01137     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa37c1e77d43150a76272b1a5739445ae">ImmutableSetRef</a>(0, F);
+<a name="l01138"></a>01138   }
+<a name="l01139"></a>01139 
+<a name="l01140"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a1bd4881656ae7caa31f306d0b46c48c5">01140</a>   <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a1bd4881656ae7caa31f306d0b46c48c5">add</a>(<a class="code" href="classllvm_1_1ImmutableSetRef.html#ac0c861c86f06a5e59a6a1d709cc75dfe">value_type_ref</a> V) {
+<a name="l01141"></a>01141     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa37c1e77d43150a76272b1a5739445ae">ImmutableSetRef</a>(Factory-><a class="code" href="classllvm_1_1ImutAVLFactory.html#a82a14e085fc5b4007790f70a01b76222">add</a>(Root, V), Factory);
+<a name="l01142"></a>01142   }
+<a name="l01143"></a>01143 
+<a name="l01144"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a5033f474ff56ccbc4a0f17dfb95f81be">01144</a>   <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> <span class="keyword">remove</span>(<a class="code" href="classllvm_1_1ImmutableSetRef.html#ac0c861c86f06a5e59a6a1d709cc75dfe">value_type_ref</a> V) {
+<a name="l01145"></a>01145     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa37c1e77d43150a76272b1a5739445ae">ImmutableSetRef</a>(Factory-><a class="code" href="classllvm_1_1ImutAVLFactory.html#a91b65702c20741c1ac050893c4a42dd5">remove</a>(Root, V), Factory);
+<a name="l01146"></a>01146   }
+<a name="l01147"></a>01147 <span class="comment"></span>
+<a name="l01148"></a>01148 <span class="comment">  /// Returns true if the set contains the specified value.</span>
+<a name="l01149"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a4da4210928a1c4b4ce11fda57e930959">01149</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a4da4210928a1c4b4ce11fda57e930959" title="Returns true if the set contains the specified value.">contains</a>(<a class="code" href="classllvm_1_1ImmutableSetRef.html#ac0c861c86f06a5e59a6a1d709cc75dfe">value_type_ref</a> V)<span class="keyword"> const </span>{
+<a name="l01150"></a>01150     <span class="keywordflow">return</span> Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#acde18b3919ed6ba89a66c67beff53229">contains</a>(V) : <span class="keyword">false</span>;
+<a name="l01151"></a>01151   }
+<a name="l01152"></a>01152 
+<a name="l01153"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a2d7958d5d6950ee134de444c36fdfdf6">01153</a>   <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet<ValT></a> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a2d7958d5d6950ee134de444c36fdfdf6">asImmutableSet</a>(<span class="keywordtype">bool</span> <a class="code" href="namespacellvm_1_1sys_1_1fs.html#ac81340f79222ebe6143d9e86257a09eb" title="Canonicalize path.">canonicalize</a> = <span class="keyword">true</span>)<span class="keyword"> const </span>{
+<a name="l01154"></a>01154     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSet.html">ImmutableSet<ValT></a>(<a class="code" href="namespacellvm_1_1sys_1_1fs.html#ac81340f79222ebe6143d9e86257a09eb" title="Canonicalize path.">canonicalize</a> ?
+<a name="l01155"></a>01155                               Factory-><a class="code" href="classllvm_1_1ImutAVLFactory.html#a9bddfc31770b6a82bf224ac2f4cb5543">getCanonicalTree</a>(Root) : Root);
+<a name="l01156"></a>01156   }
+<a name="l01157"></a>01157 
+<a name="l01158"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a1e616cbbd8f1bb0a3d1220ef13f4c16a">01158</a>   <a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a> *<a class="code" href="classllvm_1_1ImmutableSetRef.html#a1e616cbbd8f1bb0a3d1220ef13f4c16a">getRootWithoutRetain</a>()<span class="keyword"> const </span>{
+<a name="l01159"></a>01159     <span class="keywordflow">return</span> Root;
+<a name="l01160"></a>01160   }
+<a name="l01161"></a>01161 
+<a name="l01162"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a7d0f75359ba2ef6afdb43a0ca3bef49e">01162</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a7d0f75359ba2ef6afdb43a0ca3bef49e">operator==</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> &RHS)<span class="keyword"> const </span>{
+<a name="l01163"></a>01163     <span class="keywordflow">return</span> Root && RHS.Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a6577770be6a6b0877352b248d6ce4715">isEqual</a>(*RHS.Root) : Root == RHS.Root;
+<a name="l01164"></a>01164   }
+<a name="l01165"></a>01165 
+<a name="l01166"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a62d4574086ebe930c67a8a2c0811acee">01166</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a62d4574086ebe930c67a8a2c0811acee">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a> &RHS)<span class="keyword"> const </span>{
+<a name="l01167"></a>01167     <span class="keywordflow">return</span> Root && RHS.Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#aee20e730e8dd355f60fb68e38a107ede">isNotEqual</a>(*RHS.Root) : Root != RHS.Root;
+<a name="l01168"></a>01168   }
+<a name="l01169"></a>01169 <span class="comment"></span>
+<a name="l01170"></a>01170 <span class="comment">  /// isEmpty - Return true if the set contains no elements.</span>
+<a name="l01171"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#aa7a1fe4c735244e050133794a7353b7d">01171</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aa7a1fe4c735244e050133794a7353b7d" title="isEmpty - Return true if the set contains no elements.">isEmpty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !Root; }
+<a name="l01172"></a>01172 <span class="comment"></span>
+<a name="l01173"></a>01173 <span class="comment">  /// isSingleton - Return true if the set contains exactly one element.</span>
+<a name="l01174"></a>01174 <span class="comment">  ///   This method runs in constant time.</span>
+<a name="l01175"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a46657c2f7e426c9aad13db2d1ff86612">01175</a> <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a46657c2f7e426c9aad13db2d1ff86612">isSingleton</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a823d484d24957a886721c19f31080371">getHeight</a>() == 1; }
+<a name="l01176"></a>01176 
+<a name="l01177"></a>01177   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01178"></a>01178   <span class="comment">// Iterators.</span>
+<a name="l01179"></a>01179   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01180"></a>01180 
+<a name="l01181"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">01181</a>   <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a> {
+<a name="l01182"></a>01182     <span class="keyword">typename</span> <a class="code" href="classllvm_1_1ImutAVLTreeInOrderIterator.html">TreeTy::iterator</a> itr;
+<a name="l01183"></a>01183     <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a229fbfcebf675eb91bd23e3461e708bd">iterator</a>(<a class="code" href="classllvm_1_1ImutAVLTree.html">TreeTy</a>* t) : itr(t) {}
+<a name="l01184"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a455948c940eecbfc87d917fe8bca8662">01184</a>     <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a><<a class="code" href="classValT.html">ValT</a>,ValInfo>;
+<a name="l01185"></a>01185   <span class="keyword">public</span>:
+<a name="l01186"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a229fbfcebf675eb91bd23e3461e708bd">01186</a>     <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a229fbfcebf675eb91bd23e3461e708bd">iterator</a>() {}
+<a name="l01187"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a08dd787c8d372ef15d4d654c0a986efc">01187</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#ac0c861c86f06a5e59a6a1d709cc75dfe">value_type_ref</a> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a08dd787c8d372ef15d4d654c0a986efc">operator*</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> itr->getValue(); }
+<a name="l01188"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#af93abfcaf1879807bee907eb273e2b11">01188</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>& <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#af93abfcaf1879807bee907eb273e2b11">operator++</a>() { ++itr; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l01189"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a37d87c734448b7d8806f10b04b408ff9">01189</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>  <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a37d87c734448b7d8806f10b04b408ff9">operator++</a>(<span class="keywordtype">int</span>) { <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a> tmp(*<span class="keyword">this</span>); ++itr; <span class="keywordflow">return</span> tmp; }
+<a name="l01190"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#ae8f36f40a2a2690256512b879ff0a732">01190</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>& <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#ae8f36f40a2a2690256512b879ff0a732">operator--</a>() { --itr; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
+<a name="l01191"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#af41f20e54c8d13f530236273516560b6">01191</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>  <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#af41f20e54c8d13f530236273516560b6">operator--</a>(<span class="keywordtype">int</span>) { <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a> tmp(*<span class="keyword">this</span>); --itr; <span class="keywordflow">return</span> tmp; }
+<a name="l01192"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a3bd1c4cbcab7ae8c6e0da915146e567a">01192</a>     <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a3bd1c4cbcab7ae8c6e0da915146e567a">operator==</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>& RHS)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> RHS.itr == itr; }
+<a name="l01193"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a62225974c9c51d4f57f81d995dd7bb00">01193</a>     <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a62225974c9c51d4f57f81d995dd7bb00">operator!=</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>& RHS)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> RHS.itr != itr; }
+<a name="l01194"></a><a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#afbe16d887565f9041faa0bc82924ee0e">01194</a>     <span class="keyword">inline</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#aca53faf35de74cd81b22e7cfe2780d31">value_type</a> *<a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#afbe16d887565f9041faa0bc82924ee0e">operator-></a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &(<a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html#a08dd787c8d372ef15d4d654c0a986efc">operator*</a>()); }
+<a name="l01195"></a>01195   };
+<a name="l01196"></a>01196 
+<a name="l01197"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#af880612b7cc959a761f871c2e226a78f">01197</a>   <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a> <a class="code" href="classllvm_1_1ImmutableSetRef.html#af880612b7cc959a761f871c2e226a78f">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>(Root); }
+<a name="l01198"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#afa7bfe738352ce7a41ca5e5fcdc51074">01198</a>   <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a> <a class="code" href="classllvm_1_1ImmutableSetRef.html#afa7bfe738352ce7a41ca5e5fcdc51074">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef_1_1iterator.html">iterator</a>(); }
+<a name="l01199"></a>01199 
+<a name="l01200"></a>01200   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01201"></a>01201   <span class="comment">// Utility methods.</span>
+<a name="l01202"></a>01202   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01203"></a>01203 
+<a name="l01204"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a823d484d24957a886721c19f31080371">01204</a>   <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a823d484d24957a886721c19f31080371">getHeight</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Root ? Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a4cf5e58eb1f6b285be2ae0b30d55333a">getHeight</a>() : 0; }
+<a name="l01205"></a>01205 
+<a name="l01206"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a07ad22f466ef05eaeb48ef0cc705aca8">01206</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a07ad22f466ef05eaeb48ef0cc705aca8">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a>& ID, <span class="keyword">const</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html">ImmutableSetRef</a>& S) {
+<a name="l01207"></a>01207     ID.<a class="code" href="classllvm_1_1FoldingSetNodeID.html#a626e5a2c04c89e2ddd697e424ec68391">AddPointer</a>(S.Root);
+<a name="l01208"></a>01208   }
+<a name="l01209"></a>01209 
+<a name="l01210"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#ae72f30f72ee62a780d1a9adb2d734319">01210</a>   <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#ae72f30f72ee62a780d1a9adb2d734319">Profile</a>(<a class="code" href="classllvm_1_1FoldingSetNodeID.html">FoldingSetNodeID</a>& ID)<span class="keyword"> const </span>{
+<a name="l01211"></a>01211     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a07ad22f466ef05eaeb48ef0cc705aca8">Profile</a>(ID,*<span class="keyword">this</span>);
+<a name="l01212"></a>01212   }
+<a name="l01213"></a>01213 
+<a name="l01214"></a>01214   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01215"></a>01215   <span class="comment">// For testing.</span>
+<a name="l01216"></a>01216   <span class="comment">//===--------------------------------------------------===//</span>
+<a name="l01217"></a>01217 
+<a name="l01218"></a><a class="code" href="classllvm_1_1ImmutableSetRef.html#a51ddad5c7e1142877eadd1aa4ea4d13d">01218</a>   <span class="keywordtype">void</span> <a class="code" href="classllvm_1_1ImmutableSetRef.html#a51ddad5c7e1142877eadd1aa4ea4d13d">validateTree</a>()<span class="keyword"> const </span>{ <span class="keywordflow">if</span> (Root) Root-><a class="code" href="classllvm_1_1ImutAVLTree.html#a7e04391de44c91f61a1f08a37e7fad8a">validateTree</a>(); }
+<a name="l01219"></a>01219 };
+<a name="l01220"></a>01220 
+<a name="l01221"></a>01221 } <span class="comment">// end namespace llvm</span>
+<a name="l01222"></a>01222 
+<a name="l01223"></a>01223 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:39 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InMemoryStruct_8h__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InMemoryStruct_8h__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/InMemoryStruct_8h__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8cpp__incl.dot
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8cpp__incl.dot?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8cpp__incl.dot (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8cpp__incl.dot Fri Dec 21 00:57:24 2012
@@ -0,0 +1,9 @@
+digraph G
+{
+  bgcolor="transparent";
+  edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"];
+  node [fontname="FreeSans",fontsize="10",shape=record];
+  Node1 [label="IncludeFile.cpp",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled" fontcolor="black"];
+  Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node2 [label="llvm/Support/IncludeFile.h",height=0.2,width=0.4,color="black",URL="$IncludeFile_8h.html"];
+}

Added: www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8h.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8h.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8h.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/IncludeFile_8h.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,133 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: IncludeFile.h File Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_25acc6571c4e3a053ee4203146b47a61.html">include</a>      </li>
+      <li class="navelem"><a class="el" href="dir_fd2d7b5ce83b1c1657cd6600d8cb39fa.html">llvm</a>      </li>
+      <li class="navelem"><a class="el" href="dir_b423301f639fc46b24b2c9f122fcaff7.html">Support</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#nested-classes">Classes</a> |
+<a href="#namespaces">Namespaces</a> |
+<a href="#define-members">Defines</a>  </div>
+  <div class="headertitle">
+<div class="title">IncludeFile.h File Reference</div>  </div>
+</div>
+<div class="contents">
+<div class="textblock"><div class="dynheader">
+This graph shows which files directly or indirectly include this file:</div>
+<div class="dyncontent">
+<div class="center"><img src="IncludeFile_8h__dep__incl.png" border="0" usemap="#IncludeFile_8hdep" alt=""/></div>
+<!-- MAP 0 -->
+</div>
+</div>
+<p><a href="IncludeFile_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="structllvm_1_1IncludeFile.html">llvm::IncludeFile</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight">Class to ensure linking of corresponding object file.  <a href="structllvm_1_1IncludeFile.html#details">More...</a><br/></td></tr>
+<tr><td colspan="2"><h2><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespacellvm.html">llvm</a></td></tr>
+<tr><td class="mdescLeft"> </td><td class="mdescRight"><p>List of target independent CodeGen pass IDs. </p>
+<br/></td></tr>
+<tr><td colspan="2"><h2><a name="define-members"></a>
+Defines</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="IncludeFile_8h.html#a1f88989af2c6b9f8cc6e32acf5783ec9">FORCE_DEFINING_FILE_TO_BE_LINKED</a>(name)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="IncludeFile_8h.html#a94c46e7279464bfd7390db937de8c786">DEFINING_FILE_FOR</a>(name)   namespace llvm { const <a class="el" href="classchar.html">char</a> name ## LinkVar = 0; }</td></tr>
+</table>
+<hr/><h2>Define Documentation</h2>
+<a class="anchor" id="a94c46e7279464bfd7390db937de8c786"></a><!-- doxytag: member="IncludeFile.h::DEFINING_FILE_FOR" ref="a94c46e7279464bfd7390db937de8c786" args="(name)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define DEFINING_FILE_FOR</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">name</td><td>)</td>
+          <td>   namespace llvm { const <a class="el" href="classchar.html">char</a> name ## LinkVar = 0; }</td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>This macro is the counterpart to FORCE_DEFINING_FILE_TO_BE_LINKED. It should be used in a .cpp file to define the name referenced in a header file that will cause linkage of the .cpp file. It should only be used at extern level. </p>
+
+<p>Definition at line <a class="el" href="IncludeFile_8h_source.html#l00050">50</a> of file <a class="el" href="IncludeFile_8h_source.html">IncludeFile.h</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1f88989af2c6b9f8cc6e32acf5783ec9"></a><!-- doxytag: member="IncludeFile.h::FORCE_DEFINING_FILE_TO_BE_LINKED" ref="a1f88989af2c6b9f8cc6e32acf5783ec9" args="(name)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">#define FORCE_DEFINING_FILE_TO_BE_LINKED</td>
+          <td>(</td>
+          <td class="paramtype"> </td>
+          <td class="paramname">name</td><td>)</td>
+          <td></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<b>Value:</b><div class="fragment"><pre class="fragment"><span class="keyword">namespace </span>llvm { \
+    extern <span class="keyword">const</span> <span class="keywordtype">char</span> name ## LinkVar; \
+    static <span class="keyword">const</span> IncludeFile name ## LinkObj ( &name ## LinkVar ); \
+  }
+</pre></div><p>This macro is the public interface that <a class="el" href="IncludeFile_8h.html">IncludeFile.h</a> exports. This gives us the option to implement the "link the definition" capability in any manner that we choose. All header files that depend on a specific .cpp file being linked at run time should use this macro instead of the IncludeFile class directly.</p>
+<p>For example, foo.h would use:<br/>
+ <code><a class="el" href="IncludeFile_8h.html#a1f88989af2c6b9f8cc6e32acf5783ec9">FORCE_DEFINING_FILE_TO_BE_LINKED(foo)</a></code><br/>
+</p>
+<p>And, foo.cp would use:<br/>
+ <code><a class="el" href="IncludeFile_8h.html#a94c46e7279464bfd7390db937de8c786">DEFINING_FILE_FOR(foo)</a></code><br/>
+ </p>
+
+<p>Definition at line <a class="el" href="IncludeFile_8h_source.html#l00040">40</a> of file <a class="el" href="IncludeFile_8h_source.html">IncludeFile.h</a>.</p>
+
+</div>
+</div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:39:30 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/IndVarSimplify_8cpp__incl.dot
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/IndVarSimplify_8cpp__incl.dot?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/IndVarSimplify_8cpp__incl.dot (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/IndVarSimplify_8cpp__incl.dot Fri Dec 21 00:57:24 2012
@@ -0,0 +1,182 @@
+digraph G
+{
+  bgcolor="transparent";
+  edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"];
+  node [fontname="FreeSans",fontsize="10",shape=record];
+  Node1 [label="IndVarSimplify.cpp",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled" fontcolor="black"];
+  Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node2 [label="llvm/Transforms/Scalar.h",height=0.2,width=0.4,color="black",URL="$Transforms_2Scalar_8h.html"];
+  Node1 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node3 [label="llvm/BasicBlock.h",height=0.2,width=0.4,color="black",URL="$BasicBlock_8h.html"];
+  Node3 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node4 [label="llvm/Instruction.h",height=0.2,width=0.4,color="red",URL="$Instruction_8h.html"];
+  Node3 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node5 [label="llvm/SymbolTableListTraits.h",height=0.2,width=0.4,color="black",URL="$SymbolTableListTraits_8h.html"];
+  Node5 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node6 [label="llvm/ADT/ilist.h",height=0.2,width=0.4,color="red",URL="$ilist_8h.html"];
+  Node6 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node7 [label="llvm/Support/Compiler.h",height=0.2,width=0.4,color="black",URL="$Compiler_8h.html"];
+  Node6 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node8 [label="iterator",height=0.2,width=0.4,color="grey75"];
+  Node3 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node3 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node9 [label="llvm/ADT/Twine.h",height=0.2,width=0.4,color="red",URL="$Twine_8h.html"];
+  Node9 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node10 [label="llvm/Support/DataTypes.h",height=0.2,width=0.4,color="red",URL="$DataTypes_8h.html"];
+  Node9 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node11 [label="llvm/Support/ErrorHandling.h",height=0.2,width=0.4,color="red",URL="$ErrorHandling_8h.html"];
+  Node11 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node3 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node12 [label="llvm/Constants.h",height=0.2,width=0.4,color="black",URL="$Constants_8h.html"];
+  Node12 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node13 [label="llvm/Constant.h",height=0.2,width=0.4,color="red",URL="$Constant_8h.html"];
+  Node12 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node14 [label="llvm/OperandTraits.h",height=0.2,width=0.4,color="red",URL="$OperandTraits_8h.html"];
+  Node12 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node15 [label="llvm/ADT/APInt.h",height=0.2,width=0.4,color="red",URL="$APInt_8h.html"];
+  Node15 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node16 [label="llvm/ADT/ArrayRef.h",height=0.2,width=0.4,color="red",URL="$ArrayRef_8h.html"];
+  Node16 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node17 [label="llvm/ADT/SmallVector.h",height=0.2,width=0.4,color="red",URL="$SmallVector_8h.html"];
+  Node17 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node17 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node15 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node12 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node18 [label="llvm/ADT/APFloat.h",height=0.2,width=0.4,color="black",URL="$APFloat_8h.html"];
+  Node18 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node12 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 [label="llvm/Instructions.h",height=0.2,width=0.4,color="black",URL="$Instructions_8h.html"];
+  Node19 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node20 [label="llvm/InstrTypes.h",height=0.2,width=0.4,color="red",URL="$InstrTypes_8h.html"];
+  Node20 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node20 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node20 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node21 [label="llvm/DerivedTypes.h",height=0.2,width=0.4,color="black",URL="$DerivedTypes_8h.html"];
+  Node21 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node22 [label="llvm/Type.h",height=0.2,width=0.4,color="black",URL="$Type_8h.html"];
+  Node22 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node23 [label="llvm/Support/Casting.h",height=0.2,width=0.4,color="red",URL="$Casting_8h.html"];
+  Node22 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node21 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node21 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node20 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node24 [label="llvm/Attributes.h",height=0.2,width=0.4,color="red",URL="$Attributes_8h.html"];
+  Node24 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node25 [label="llvm/CallingConv.h",height=0.2,width=0.4,color="black",URL="$CallingConv_8h.html"];
+  Node19 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node26 [label="llvm/Support/IntegersSubset.h",height=0.2,width=0.4,color="red",URL="$IntegersSubset_8h.html"];
+  Node26 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node26 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node26 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node27 [label="llvm/LLVMContext.h",height=0.2,width=0.4,color="black",URL="$LLVMContext_8h.html"];
+  Node27 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node28 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node28 [label="llvm/Support/IntegersSubsetMapping.h",height=0.2,width=0.4,color="red",URL="$IntegersSubsetMapping_8h.html"];
+  Node28 -> Node26 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node29 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node29 [label="llvm/IntrinsicInst.h",height=0.2,width=0.4,color="black",URL="$IntrinsicInst_8h.html"];
+  Node29 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node29 -> Node30 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node30 [label="llvm/Function.h",height=0.2,width=0.4,color="red",URL="$Function_8h.html"];
+  Node30 -> Node25 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node30 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node30 -> Node24 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node30 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node29 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node29 -> Node31 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node31 [label="llvm/Intrinsics.h",height=0.2,width=0.4,color="red",URL="$Intrinsics_8h.html"];
+  Node31 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node27 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node32 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 [label="llvm/Analysis/Dominators.h",height=0.2,width=0.4,color="red",URL="$Dominators_8h.html"];
+  Node32 -> Node33 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node33 [label="llvm/Pass.h",height=0.2,width=0.4,color="red",URL="$Pass_8h.html"];
+  Node33 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node30 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node34 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node34 [label="llvm/ADT/DenseMap.h",height=0.2,width=0.4,color="red",URL="$DenseMap_8h.html"];
+  Node34 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node34 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node35 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node35 [label="llvm/ADT/DepthFirstIterator.h",height=0.2,width=0.4,color="red",URL="$DepthFirstIterator_8h.html"];
+  Node35 -> Node36 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node36 [label="llvm/ADT/GraphTraits.h",height=0.2,width=0.4,color="black",URL="$GraphTraits_8h.html"];
+  Node35 -> Node37 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node37 [label="llvm/ADT/SmallPtrSet.h",height=0.2,width=0.4,color="red",URL="$SmallPtrSet_8h.html"];
+  Node37 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node37 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node37 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node36 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node37 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node38 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node38 [label="llvm/Support/CFG.h",height=0.2,width=0.4,color="black",URL="$CFG_8h.html"];
+  Node38 -> Node36 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node38 -> Node30 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node38 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node32 -> Node39 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node39 [label="llvm/Support/raw_ostream.h",height=0.2,width=0.4,color="red",URL="$raw__ostream_8h.html"];
+  Node39 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node39 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node40 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node40 [label="llvm/Analysis/ScalarEvolutionExpander.h",height=0.2,width=0.4,color="red",URL="$ScalarEvolutionExpander_8h.html"];
+  Node1 -> Node41 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 [label="llvm/Analysis/LoopInfo.h",height=0.2,width=0.4,color="red",URL="$LoopInfo_8h.html"];
+  Node41 -> Node33 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node34 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node35 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node36 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node32 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node38 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node41 -> Node39 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node42 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node42 [label="llvm/Analysis/LoopPass.h",height=0.2,width=0.4,color="red",URL="$LoopPass_8h.html"];
+  Node42 -> Node41 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node42 -> Node33 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node42 -> Node30 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node38 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node43 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node43 [label="llvm/Support/CommandLine.h",height=0.2,width=0.4,color="red",URL="$CommandLine_8h.html"];
+  Node43 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node43 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node43 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node44 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node44 [label="llvm/Support/Debug.h",height=0.2,width=0.4,color="black",URL="$Debug_8h.html"];
+  Node1 -> Node39 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node45 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node45 [label="llvm/Transforms/Utils/Local.h",height=0.2,width=0.4,color="red",URL="$Local_8h.html"];
+  Node45 -> Node46 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node46 [label="llvm/DataLayout.h",height=0.2,width=0.4,color="black",URL="$DataLayout_8h.html"];
+  Node46 -> Node33 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node46 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node46 -> Node34 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node46 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node47 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node47 [label="llvm/Transforms/Utils/BasicBlockUtils.h",height=0.2,width=0.4,color="red",URL="$BasicBlockUtils_8h.html"];
+  Node47 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node47 -> Node38 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node48 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node48 [label="llvm/Transforms/Utils/SimplifyIndVar.h",height=0.2,width=0.4,color="red",URL="$SimplifyIndVar_8h.html"];
+  Node48 -> Node43 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node46 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node49 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node49 [label="llvm/Target/TargetLibraryInfo.h",height=0.2,width=0.4,color="black",URL="$TargetLibraryInfo_8h.html"];
+  Node49 -> Node33 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node49 -> Node34 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node34 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node50 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node50 [label="llvm/ADT/Statistic.h",height=0.2,width=0.4,color="red",URL="$Statistic_8h.html"];
+}

Added: www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,51 @@
+<map id="G" name="G">
+<area shape="rect" href="$FunctionLoweringInfo_8h.html" title="FunctionLoweringInfo.h" alt="" coords="956,84,1121,111"/>
+<area shape="rect" href="$LiveIntervalAnalysis_8h.html" title="LiveIntervalAnalysis.h" alt="" coords="4573,84,4731,111"/>
+<area shape="rect" href="$LiveVariables_8h.html" title="LiveVariables.h" alt="" coords="2028,84,2143,111"/>
+<area shape="rect" href="$MachineRegisterInfo_8h.html" title="MachineRegisterInfo.h" alt="" coords="3427,84,3587,111"/>
+<area shape="rect" href="$PrologEpilogInserter_8cpp.html" title="PrologEpilogInserter.cpp" alt="" coords="6909,161,7083,188"/>
+<area shape="rect" href="$RegAllocFast_8cpp.html" title="RegAllocFast.cpp" alt="" coords="7107,161,7235,188"/>
+<area shape="rect" href="$VirtRegMap_8h.html" title="VirtRegMap.h" alt="" coords="4759,84,4863,111"/>
+<area shape="rect" href="$LiveRangeCalc_8h.html" title="LiveRangeCalc.h" alt="" coords="3015,84,3140,111"/>
+<area shape="rect" href="$RuntimeDyldMachO_8h.html" title="RuntimeDyldMachO.h" alt="" coords="4988,84,5143,111"/>
+<area shape="rect" href="$FastISel_8cpp.html" title="FastISel.cpp" alt="" coords="349,161,445,188"/>
+<area shape="rect" href="$FunctionLoweringInfo_8cpp.html" title="FunctionLoweringInfo.cpp" alt="" coords="469,161,648,188"/>
+<area shape="rect" href="$SelectionDAGBuilder_8cpp.html" title="SelectionDAGBuilder.cpp" alt="" coords="672,161,851,188"/>
+<area shape="rect" href="$SelectionDAGISel_8cpp.html" title="SelectionDAGISel.cpp" alt="" coords="875,161,1035,188"/>
+<area shape="rect" href="$ARMFastISel_8cpp.html" title="ARMFastISel.cpp" alt="" coords="1059,161,1184,188"/>
+<area shape="rect" href="$X86FastISel_8cpp.html" title="X86FastISel.cpp" alt="" coords="1208,161,1328,188"/>
+<area shape="rect" href="$X86ISelDAGToDAG_8cpp.html" title="X86ISelDAGToDAG.cpp" alt="" coords="1352,161,1517,188"/>
+<area shape="rect" href="$CalcSpillWeights_8cpp.html" title="CalcSpillWeights.cpp" alt="" coords="3019,161,3168,188"/>
+<area shape="rect" href="$InlineSpiller_8cpp.html" title="InlineSpiller.cpp" alt="" coords="6408,161,6528,188"/>
+<area shape="rect" href="$InterferenceCache_8cpp.html" title="InterferenceCache.cpp" alt="" coords="5453,161,5619,188"/>
+<area shape="rect" href="$LiveDebugVariables_8cpp.html" title="LiveDebugVariables.cpp" alt="" coords="6552,161,6725,188"/>
+<area shape="rect" href="$LiveInterval_8cpp.html" title="LiveInterval.cpp" alt="" coords="3192,161,3312,188"/>
+<area shape="rect" href="$LiveIntervalAnalysis_8cpp.html" title="LiveIntervalAnalysis.cpp" alt="" coords="2824,161,2995,188"/>
+<area shape="rect" href="$LiveRangeEdit_8cpp.html" title="LiveRangeEdit.cpp" alt="" coords="6749,161,6885,188"/>
+<area shape="rect" href="$LiveRegMatrix_8cpp.html" title="LiveRegMatrix.cpp" alt="" coords="4099,161,4235,188"/>
+<area shape="rect" href="$LiveStackAnalysis_8cpp.html" title="LiveStackAnalysis.cpp" alt="" coords="5643,161,5803,188"/>
+<area shape="rect" href="$MachineScheduler_8cpp.html" title="MachineScheduler.cpp" alt="" coords="5827,161,5989,188"/>
+<area shape="rect" href="$MachineVerifier_8cpp.html" title="MachineVerifier.cpp" alt="" coords="2656,161,2800,188"/>
+<area shape="rect" href="$RegAllocBase_8cpp.html" title="RegAllocBase.cpp" alt="" coords="4259,161,4392,188"/>
+<area shape="rect" href="$RegAllocBasic_8cpp.html" title="RegAllocBasic.cpp" alt="" coords="4416,161,4552,188"/>
+<area shape="rect" href="$RegAllocGreedy_8cpp.html" title="RegAllocGreedy.cpp" alt="" coords="4576,161,4720,188"/>
+<area shape="rect" href="$RegAllocPBQP_8cpp.html" title="RegAllocPBQP.cpp" alt="" coords="4744,161,4877,188"/>
+<area shape="rect" href="$RegisterCoalescer_8cpp.html" title="RegisterCoalescer.cpp" alt="" coords="4901,161,5061,188"/>
+<area shape="rect" href="$RegisterPressure_8cpp.html" title="RegisterPressure.cpp" alt="" coords="3336,161,3491,188"/>
+<area shape="rect" href="$ScheduleDAGInstrs_8cpp.html" title="ScheduleDAGInstrs.cpp" alt="" coords="3515,161,3685,188"/>
+<area shape="rect" href="$Spiller_8cpp.html" title="Spiller.cpp" alt="" coords="5085,161,5171,188"/>
+<area shape="rect" href="$SpillPlacement_8cpp.html" title="SpillPlacement.cpp" alt="" coords="6013,161,6155,188"/>
+<area shape="rect" href="$SplitKit_8cpp.html" title="SplitKit.cpp" alt="" coords="5195,161,5285,188"/>
+<area shape="rect" href="$StackSlotColoring_8cpp.html" title="StackSlotColoring.cpp" alt="" coords="3709,161,3869,188"/>
+<area shape="rect" href="$StrongPHIElimination_8cpp.html" title="StrongPHIElimination.cpp" alt="" coords="3893,161,4075,188"/>
+<area shape="rect" href="$TwoAddressInstructionPass_8cpp.html" title="TwoAddressInstructionPass.cpp" alt="" coords="2413,161,2632,188"/>
+<area shape="rect" href="$VirtRegMap_8cpp.html" title="VirtRegMap.cpp" alt="" coords="5309,161,5429,188"/>
+<area shape="rect" href="$HexagonMachineScheduler_8h.html" title="HexagonMachineScheduler.h" alt="" coords="6179,161,6384,188"/>
+<area shape="rect" href="$LiveVariables_8cpp.html" title="LiveVariables.cpp" alt="" coords="1688,161,1819,188"/>
+<area shape="rect" href="$MachineBasicBlock_8cpp.html" title="MachineBasicBlock.cpp" alt="" coords="5,161,173,188"/>
+<area shape="rect" href="$PHIElimination_8cpp.html" title="PHIElimination.cpp" alt="" coords="1843,161,1981,188"/>
+<area shape="rect" href="$ARMBaseInstrInfo_8cpp.html" title="ARMBaseInstrInfo.cpp" alt="" coords="2005,161,2165,188"/>
+<area shape="rect" href="$ARMInstrInfo_8cpp.html" title="ARMInstrInfo.cpp" alt="" coords="197,161,325,188"/>
+<area shape="rect" href="$HexagonNewValueJump_8cpp.html" title="HexagonNewValueJump.cpp" alt="" coords="2189,161,2389,188"/>
+<area shape="rect" href="$X86InstrInfo_8cpp.html" title="X86InstrInfo.cpp" alt="" coords="1541,161,1664,188"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+64c32a23500c42958fd9430e16658d27
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/IndexedMap_8h__dep__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/Initialization_8h__dep__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/Initialization_8h__dep__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/Initialization_8h__dep__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/Initialization_8h__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/Initialization_8h__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/Initialization_8h__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,44 @@
+<map id="G" name="G">
+<area shape="rect" href="$CallingConv_8h.html" title="llvm/CallingConv.h" alt="" coords="799,471,935,497"/>
+<area shape="rect" href="$Instructions_8h.html" title="llvm/Instructions.h" alt="" coords="1399,393,1535,420"/>
+<area shape="rect" href="$Type_8h.html" title="llvm/Type.h" alt="" coords="1745,703,1836,729"/>
+<area shape="rect" href="$IntrinsicInst_8h.html" title="llvm/IntrinsicInst.h" alt="" coords="1193,316,1329,343"/>
+<area shape="rect" href="$Module_8h.html" title="llvm/Module.h" alt="" coords="453,316,563,343"/>
+<area shape="rect" href="$CallGraph_8h.html" title="llvm/Analysis/CallGraph.h" alt="" coords="911,239,1092,265"/>
+<area shape="rect" href="$CallSite_8h.html" title="llvm/Support/CallSite.h" alt="" coords="1505,316,1671,343"/>
+<area shape="rect" href="$InlineCost_8h.html" title="llvm/Analysis/InlineCost.h" alt="" coords="2216,161,2397,188"/>
+<area shape="rect" href="$SmallPtrSet_8h.html" title="llvm/ADT/SmallPtrSet.h" alt="" coords="1992,625,2160,652"/>
+<area shape="rect" href="$Transforms_2IPO_8h.html" title="llvm/Transforms/IPO.h" alt="" coords="5,84,163,111"/>
+<area shape="rect" href="$InlinerPass_8h.html" title="llvm/Transforms/IPO/InlinerPass.h" alt="" coords="205,84,435,111"/>
+<area shape="rect" href="$DataLayout_8h.html" title="llvm/DataLayout.h" alt="" coords="1756,548,1892,575"/>
+<area shape="rect" href="$InstrTypes_8h.html" title="llvm/InstrTypes.h" alt="" coords="1505,548,1631,575"/>
+<area shape="rect" href="$DerivedTypes_8h.html" title="llvm/DerivedTypes.h" alt="" coords="1441,625,1588,652"/>
+<area shape="rect" href="$Attributes_8h.html" title="llvm/Attributes.h" alt="" coords="1404,471,1529,497"/>
+<area shape="rect" href="$ArrayRef_8h.html" title="llvm/ADT/ArrayRef.h" alt="" coords="781,703,925,729"/>
+<area shape="rect" href="$SmallVector_8h.html" title="llvm/ADT/SmallVector.h" alt="" coords="1511,780,1679,807"/>
+<area shape="rect" href="$IntegersSubset_8h.html" title="llvm/Support/IntegersSubset.h" alt="" coords="1043,548,1259,575"/>
+<area shape="rect" href="$IntegersSubsetMapping_8h.html" title="llvm/Support/IntegersSubsetMapping.h" alt="" coords="1009,471,1279,497"/>
+<area shape="rect" href="$ErrorHandling_8h.html" title="llvm/Support/ErrorHandling.h" alt="" coords="395,703,600,729"/>
+<area shape="rect" href="$DataTypes_8h.html" title="llvm/Support/DataTypes.h" alt="" coords="1703,780,1887,807"/>
+<area shape="rect" href="$Compiler_8h.html" title="llvm/Support/Compiler.h" alt="" coords="903,857,1076,884"/>
+<area shape="rect" href="$Casting_8h.html" title="llvm/Support/Casting.h" alt="" coords="1961,780,2127,807"/>
+<area shape="rect" href="$Constants_8h.html" title="llvm/Constants.h" alt="" coords="789,625,917,652"/>
+<area shape="rect" href="$Function_8h.html" title="llvm/Function.h" alt="" coords="1207,393,1321,420"/>
+<area shape="rect" href="$Intrinsics_8h.html" title="llvm/Intrinsics.h" alt="" coords="503,471,623,497"/>
+<area shape="rect" href="$BasicBlock_8h.html" title="llvm/BasicBlock.h" alt="" coords="1705,471,1836,497"/>
+<area shape="rect" href="$GlobalVariable_8h.html" title="llvm/GlobalVariable.h" alt="" coords="449,393,604,420"/>
+<area shape="rect" href="$GlobalAlias_8h.html" title="llvm/GlobalAlias.h" alt="" coords="628,393,761,420"/>
+<area shape="rect" href="$Metadata_8h.html" title="llvm/Metadata.h" alt="" coords="303,393,425,420"/>
+<area shape="rect" href="$OwningPtr_8h.html" title="llvm/ADT/OwningPtr.h" alt="" coords="1103,780,1257,807"/>
+<area shape="rect" href="$Pass_8h.html" title="llvm/Pass.h" alt="" coords="121,625,212,652"/>
+<area shape="rect" href="$GraphTraits_8h.html" title="llvm/ADT/GraphTraits.h" alt="" coords="695,316,860,343"/>
+<area shape="rect" href="$STLExtras_8h.html" title="llvm/ADT/STLExtras.h" alt="" coords="1281,780,1436,807"/>
+<area shape="rect" href="$ValueHandle_8h.html" title="llvm/Support/ValueHandle.h" alt="" coords="2215,548,2412,575"/>
+<area shape="rect" href="$IncludeFile_8h.html" title="llvm/Support/IncludeFile.h" alt="" coords="884,316,1068,343"/>
+<area shape="rect" href="$PointerIntPair_8h.html" title="llvm/ADT/PointerIntPair.h" alt="" coords="2204,625,2380,652"/>
+<area shape="rect" href="$PointerLikeTypeTraits_8h.html" title="llvm/Support/PointerLikeTypeTraits.h" alt="" coords="2113,703,2361,729"/>
+<area shape="rect" href="$DenseMap_8h.html" title="llvm/ADT/DenseMap.h" alt="" coords="2499,625,2659,652"/>
+<area shape="rect" href="$ValueMap_8h.html" title="llvm/ADT/ValueMap.h" alt="" coords="2616,471,2771,497"/>
+<area shape="rect" href="$CodeMetrics_8h.html" title="llvm/Analysis/CodeMetrics.h" alt="" coords="2344,239,2541,265"/>
+<area shape="rect" href="$CallGraphSCCPass_8h.html" title="llvm/CallGraphSCCPass.h" alt="" coords="229,161,411,188"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+e97de8b4b2d8b02a63d01488280f61d4
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineAlways_8cpp_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,188 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InlineAlways.cpp Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_74e9364f374e99e3aeab4fae4e196292.html">lib</a>      </li>
+      <li class="navelem"><a class="el" href="dir_22ea62e2015f6a823fddac4ac38ba517.html">Transforms</a>      </li>
+      <li class="navelem"><a class="el" href="dir_a5a75fb0df8cea8d1a0a6c9d8a132571.html">IPO</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">InlineAlways.cpp</div>  </div>
+</div>
+<div class="contents">
+<a href="InlineAlways_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===- InlineAlways.cpp - Code to inline always_inline functions ----------===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// This file implements a custom inliner that handles only functions that</span>
+<a name="l00011"></a>00011 <span class="comment">// are marked as "always inline".</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a><a class="code" href="InlineAlways_8cpp.html#ad78e062f62e0d6e453941fb4ca843e4d">00015</a> <span class="preprocessor">#define DEBUG_TYPE "inline"</span>
+<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="CallingConv_8h.html">llvm/CallingConv.h</a>"</span>
+<a name="l00017"></a>00017 <span class="preprocessor">#include "<a class="code" href="Instructions_8h.html">llvm/Instructions.h</a>"</span>
+<a name="l00018"></a>00018 <span class="preprocessor">#include "<a class="code" href="IntrinsicInst_8h.html">llvm/IntrinsicInst.h</a>"</span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "<a class="code" href="Module_8h.html">llvm/Module.h</a>"</span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "<a class="code" href="Type_8h.html">llvm/Type.h</a>"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include "<a class="code" href="CallGraph_8h.html">llvm/Analysis/CallGraph.h</a>"</span>
+<a name="l00022"></a>00022 <span class="preprocessor">#include "<a class="code" href="InlineCost_8h.html">llvm/Analysis/InlineCost.h</a>"</span>
+<a name="l00023"></a>00023 <span class="preprocessor">#include "<a class="code" href="CallSite_8h.html">llvm/Support/CallSite.h</a>"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "<a class="code" href="Transforms_2IPO_8h.html">llvm/Transforms/IPO.h</a>"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="InlinerPass_8h.html">llvm/Transforms/IPO/InlinerPass.h</a>"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "<a class="code" href="DataLayout_8h.html">llvm/DataLayout.h</a>"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "<a class="code" href="SmallPtrSet_8h.html">llvm/ADT/SmallPtrSet.h</a>"</span>
+<a name="l00028"></a>00028 
+<a name="l00029"></a>00029 <span class="keyword">using namespace </span>llvm;
+<a name="l00030"></a>00030 
+<a name="l00031"></a>00031 <span class="keyword">namespace </span>{
+<a name="l00032"></a>00032 
+<a name="l00033"></a>00033   <span class="comment">// AlwaysInliner only inlines functions that are mark as "always inline".</span>
+<a name="l00034"></a>00034   <span class="keyword">class </span>AlwaysInliner : <span class="keyword">public</span> <a class="code" href="structllvm_1_1Inliner.html">Inliner</a> {
+<a name="l00035"></a>00035   <span class="keyword">public</span>:
+<a name="l00036"></a>00036     <span class="comment">// Use extremely low threshold.</span>
+<a name="l00037"></a>00037     AlwaysInliner() : <a class="code" href="structllvm_1_1Inliner.html">Inliner</a>(<a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974" title="LLVM Calling Convention Representation.">ID</a>, -2000000000, <span class="comment">/*InsertLifetime*/</span><span class="keyword">true</span>) {
+<a name="l00038"></a>00038       <a class="code" href="namespacellvm.html#aef80a0b9c512a3cd0b76dd2f46a63aee">initializeAlwaysInlinerPass</a>(*<a class="code" href="classllvm_1_1PassRegistry.html#a05a729900b76c89e808c6c3094921b2f">PassRegistry::getPassRegistry</a>());
+<a name="l00039"></a>00039     }
+<a name="l00040"></a>00040     AlwaysInliner(<span class="keywordtype">bool</span> InsertLifetime) : <a class="code" href="structllvm_1_1Inliner.html">Inliner</a>(<a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974" title="LLVM Calling Convention Representation.">ID</a>, -2000000000,
+<a name="l00041"></a>00041                                                  InsertLifetime) {
+<a name="l00042"></a>00042       <a class="code" href="namespacellvm.html#aef80a0b9c512a3cd0b76dd2f46a63aee">initializeAlwaysInlinerPass</a>(*<a class="code" href="classllvm_1_1PassRegistry.html#a05a729900b76c89e808c6c3094921b2f">PassRegistry::getPassRegistry</a>());
+<a name="l00043"></a>00043     }
+<a name="l00044"></a>00044     <span class="keyword">static</span> <span class="keywordtype">char</span> <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974" title="LLVM Calling Convention Representation.">ID</a>; <span class="comment">// Pass identification, replacement for typeid</span>
+<a name="l00045"></a>00045     <span class="keyword">virtual</span> <a class="code" href="classllvm_1_1InlineCost.html" title="Represents the cost of inlining a function.">InlineCost</a> getInlineCost(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS);
+<a name="l00046"></a>00046     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> doFinalization(<a class="code" href="classllvm_1_1CallGraph.html">CallGraph</a> &CG) {
+<a name="l00047"></a>00047       <span class="keywordflow">return</span> removeDeadFunctions(CG, <span class="comment">/*AlwaysInlineOnly=*/</span><span class="keyword">true</span>);
+<a name="l00048"></a>00048     }
+<a name="l00049"></a>00049     <span class="keyword">virtual</span> <span class="keywordtype">bool</span> doInitialization(<a class="code" href="classllvm_1_1CallGraph.html">CallGraph</a> &CG);
+<a name="l00050"></a>00050   };
+<a name="l00051"></a>00051 }
+<a name="l00052"></a>00052 
+<a name="l00053"></a>00053 <span class="keywordtype">char</span> <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974" title="LLVM Calling Convention Representation.">AlwaysInliner::ID</a> = 0;
+<a name="l00054"></a>00054 <a class="code" href="PassSupport_8h.html#aaa970fc931c1c63037a8182e028d04b1">INITIALIZE_PASS_BEGIN</a>(AlwaysInliner, <span class="stringliteral">"always-inline"</span>,
+<a name="l00055"></a>00055                 <span class="stringliteral">"Inliner for always_inline functions"</span>, <span class="keyword">false</span>, <span class="keyword">false</span>)
+<a name="l00056"></a>00056 <a class="code" href="PassSupport_8h.html#af0564bcdde2dd4400c670ca278c6035f">INITIALIZE_AG_DEPENDENCY</a>(<a class="code" href="classllvm_1_1CallGraph.html">CallGraph</a>)
+<a name="l00057"></a><a class="code" href="InlineAlways_8cpp.html#a46ccdc20c42bb5ae5b9d313e12a68421">00057</a> <a class="code" href="PassSupport_8h.html#a74ce8276b89067e806f67c45a6d92575">INITIALIZE_PASS_END</a>(AlwaysInliner, "always-<a class="code" href="InlineAlways_8cpp.html#a46ccdc20c42bb5ae5b9d313e12a68421">inline</a>",
+<a name="l00058"></a>00058                 "<a class="code" href="structllvm_1_1Inliner.html">Inliner</a> for always_inline <a class="code" href="InlineAlways_8cpp.html#a2d8a8f47affac13913c407ee9714d994">functions</a>", <a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>, false)
+<a name="l00059"></a>00059 
+<a name="l00060"></a><a class="code" href="namespacellvm.html#a852935189b67dcabffa0dd98173bc256">00060</a> <a class="code" href="classllvm_1_1Pass.html">Pass</a> *llvm::<a class="code" href="namespacellvm.html#a852935189b67dcabffa0dd98173bc256">createAlwaysInlinerPass</a>() { <span class="keywordflow">return</span> <span class="keyword">new</span> AlwaysInliner(); }
+<a name="l00061"></a>00061 
+<a name="l00062"></a><a class="code" href="namespacellvm.html#a7df5f9197cc2d8930d0897e8c5040b04">00062</a> <a class="code" href="classllvm_1_1Pass.html">Pass</a> *<a class="code" href="namespacellvm.html#a852935189b67dcabffa0dd98173bc256">llvm::createAlwaysInlinerPass</a>(<span class="keywordtype">bool</span> InsertLifetime) {
+<a name="l00063"></a>00063   <span class="keywordflow">return</span> <span class="keyword">new</span> AlwaysInliner(InsertLifetime);
+<a name="l00064"></a>00064 }
+<a name="l00065"></a>00065 <span class="comment"></span>
+<a name="l00066"></a>00066 <span class="comment">/// \brief Minimal filter to detect invalid constructs for inlining.</span>
+<a name="l00067"></a><a class="code" href="InlineAlways_8cpp.html#afc049a73ff1b9d6c82989f49b1220353">00067</a> <span class="comment"></span><span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="InlineAlways_8cpp.html#afc049a73ff1b9d6c82989f49b1220353" title="Minimal filter to detect invalid constructs for inlining.">isInlineViable</a>(<a class="code" href="classllvm_1_1Function.html">Function</a> &<a class="code" href="LLParser_8cpp.html#a33ece1ef8074506a15d7f86eb76dbae6">F</a>) {
+<a name="l00068"></a>00068   <span class="keywordtype">bool</span> ReturnsTwice =F.<a class="code" href="classllvm_1_1Function.html#aceca681da32da537bfd9f00dcf371278">getFnAttributes</a>().<a class="code" href="classllvm_1_1Attributes.html#ad68a7be4af7d92f3df681e13acbacc13" title="Return true if the attribute is present.">hasAttribute</a>(<a class="code" href="classllvm_1_1Attributes.html#a92f64dbb86772103c557c491dc1ebbe9a50c9c38f4103376bf0952c63b533ee67" title="Function can return twice.">Attributes::ReturnsTwice</a>);
+<a name="l00069"></a>00069   <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1ilist__iterator.html">Function::iterator</a> BI = F.<a class="code" href="classllvm_1_1Function.html#a88a5e60837674780a9d812d661897ac5">begin</a>(), BE = F.<a class="code" href="classllvm_1_1Function.html#ae4ca2261b8b901e415fda7feac5051ea">end</a>(); BI != BE; ++BI) {
+<a name="l00070"></a>00070     <span class="comment">// Disallow inlining of functions which contain an indirect branch.</span>
+<a name="l00071"></a>00071     <span class="keywordflow">if</span> (isa<IndirectBrInst>(BI->getTerminator()))
+<a name="l00072"></a>00072       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00073"></a>00073 
+<a name="l00074"></a>00074     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1ilist__iterator.html">BasicBlock::iterator</a> II = BI->begin(), <a class="code" href="namespacellvm_1_1ARM__PROC.html#a1add7850fad3f66c140ecee871460ea4ae9d798593a4a6b5cc48486a453a59e5e">IE</a> = BI->end(); II != <a class="code" href="namespacellvm_1_1ARM__PROC.html#a1add7850fad3f66c140ecee871460ea4ae9d798593a4a6b5cc48486a453a59e5e">IE</a>;
+<a name="l00075"></a>00075          ++II) {
+<a name="l00076"></a>00076       <a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS(II);
+<a name="l00077"></a>00077       <span class="keywordflow">if</span> (!CS)
+<a name="l00078"></a>00078         <span class="keywordflow">continue</span>;
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080       <span class="comment">// Disallow recursive calls.</span>
+<a name="l00081"></a>00081       <span class="keywordflow">if</span> (&F == CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a7966cd72245302e38c19138b4ad408b4">getCalledFunction</a>())
+<a name="l00082"></a>00082         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00083"></a>00083 
+<a name="l00084"></a>00084       <span class="comment">// Disallow calls which expose returns-twice to a function not previously</span>
+<a name="l00085"></a>00085       <span class="comment">// attributed as such.</span>
+<a name="l00086"></a>00086       <span class="keywordflow">if</span> (!ReturnsTwice && CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a5770c10251145ce2b6a2dc99906cba64">isCall</a>() &&
+<a name="l00087"></a>00087           cast<CallInst>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>())->canReturnTwice())
+<a name="l00088"></a>00088         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00089"></a>00089     }
+<a name="l00090"></a>00090   }
+<a name="l00091"></a>00091 
+<a name="l00092"></a>00092   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00093"></a>00093 }
+<a name="l00094"></a>00094 <span class="comment"></span>
+<a name="l00095"></a>00095 <span class="comment">/// \brief Get the inline cost for the always-inliner.</span>
+<a name="l00096"></a>00096 <span class="comment">///</span>
+<a name="l00097"></a>00097 <span class="comment">/// The always inliner *only* handles functions which are marked with the</span>
+<a name="l00098"></a>00098 <span class="comment">/// attribute to force inlining. As such, it is dramatically simpler and avoids</span>
+<a name="l00099"></a>00099 <span class="comment">/// using the powerful (but expensive) inline cost analysis. Instead it uses</span>
+<a name="l00100"></a>00100 <span class="comment">/// a very simple and boring direct walk of the instructions looking for</span>
+<a name="l00101"></a>00101 <span class="comment">/// impossible-to-inline constructs.</span>
+<a name="l00102"></a>00102 <span class="comment">///</span>
+<a name="l00103"></a>00103 <span class="comment">/// Note, it would be possible to go to some lengths to cache the information</span>
+<a name="l00104"></a>00104 <span class="comment">/// computed here, but as we only expect to do this for relatively few and</span>
+<a name="l00105"></a>00105 <span class="comment">/// small functions which have the explicit attribute to force inlining, it is</span>
+<a name="l00106"></a>00106 <span class="comment">/// likely not worth it in practice.</span>
+<a name="l00107"></a>00107 <span class="comment"></span><a class="code" href="classllvm_1_1InlineCost.html" title="Represents the cost of inlining a function.">InlineCost</a> AlwaysInliner::getInlineCost(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS) {
+<a name="l00108"></a>00108   <a class="code" href="classllvm_1_1Function.html">Function</a> *Callee = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a7966cd72245302e38c19138b4ad408b4">getCalledFunction</a>();
+<a name="l00109"></a>00109   <span class="comment">// We assume indirect calls aren't calling an always-inline function.</span>
+<a name="l00110"></a>00110   <span class="keywordflow">if</span> (!Callee) <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineCost.html#a0f35ef1ca1e7a0d68536b9f1388e02ed">InlineCost::getNever</a>();
+<a name="l00111"></a>00111 
+<a name="l00112"></a>00112   <span class="comment">// We can't inline calls to external functions.</span>
+<a name="l00113"></a>00113   <span class="comment">// FIXME: We shouldn't even get here.</span>
+<a name="l00114"></a>00114   <span class="keywordflow">if</span> (Callee-><a class="code" href="classllvm_1_1GlobalValue.html#a4640d98233102674ddb6d6efaf2b7f97">isDeclaration</a>()) <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineCost.html#a0f35ef1ca1e7a0d68536b9f1388e02ed">InlineCost::getNever</a>();
+<a name="l00115"></a>00115 
+<a name="l00116"></a>00116   <span class="comment">// Return never for anything not marked as always inline.</span>
+<a name="l00117"></a>00117   <span class="keywordflow">if</span> (!Callee-><a class="code" href="classllvm_1_1Function.html#aceca681da32da537bfd9f00dcf371278">getFnAttributes</a>().<a class="code" href="classllvm_1_1Attributes.html#ad68a7be4af7d92f3df681e13acbacc13" title="Return true if the attribute is present.">hasAttribute</a>(<a class="code" href="classllvm_1_1Attributes.html#a92f64dbb86772103c557c491dc1ebbe9ac1ef704649903c3d4286df97ffa7c873" title="inline=always">Attributes::AlwaysInline</a>))
+<a name="l00118"></a>00118     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineCost.html#a0f35ef1ca1e7a0d68536b9f1388e02ed">InlineCost::getNever</a>();
+<a name="l00119"></a>00119 
+<a name="l00120"></a>00120   <span class="comment">// Do some minimal analysis to preclude non-viable functions.</span>
+<a name="l00121"></a>00121   <span class="keywordflow">if</span> (!<a class="code" href="InlineAlways_8cpp.html#afc049a73ff1b9d6c82989f49b1220353" title="Minimal filter to detect invalid constructs for inlining.">isInlineViable</a>(*Callee))
+<a name="l00122"></a>00122     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineCost.html#a0f35ef1ca1e7a0d68536b9f1388e02ed">InlineCost::getNever</a>();
+<a name="l00123"></a>00123 
+<a name="l00124"></a>00124   <span class="comment">// Otherwise, force inlining.</span>
+<a name="l00125"></a>00125   <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineCost.html#a4071e05ae564f65cd2f1c7bde93d3e47">InlineCost::getAlways</a>();
+<a name="l00126"></a>00126 }
+<a name="l00127"></a>00127 
+<a name="l00128"></a>00128 <span class="comment">// doInitialization - Initializes the vector of functions that have not</span>
+<a name="l00129"></a>00129 <span class="comment">// been annotated with the "always inline" attribute.</span>
+<a name="l00130"></a>00130 <span class="keywordtype">bool</span> AlwaysInliner::doInitialization(<a class="code" href="classllvm_1_1CallGraph.html">CallGraph</a> &CG) {
+<a name="l00131"></a>00131   <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00132"></a>00132 }
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:40 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8cpp_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8cpp_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8cpp_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8cpp_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,350 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InlineAsm.cpp Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_74e9364f374e99e3aeab4fae4e196292.html">lib</a>      </li>
+      <li class="navelem"><a class="el" href="dir_83e3867971eec972e26e5b2c6ac80c1f.html">VMCore</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">InlineAsm.cpp</div>  </div>
+</div>
+<div class="contents">
+<a href="InlineAsm_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===-- InlineAsm.cpp - Implement the InlineAsm class ---------------------===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// This file implements the InlineAsm class.</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00012"></a>00012 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00013"></a>00013 
+<a name="l00014"></a>00014 <span class="preprocessor">#include "<a class="code" href="InlineAsm_8h.html">llvm/InlineAsm.h</a>"</span>
+<a name="l00015"></a>00015 <span class="preprocessor">#include "<a class="code" href="ConstantsContext_8h.html">ConstantsContext.h</a>"</span>
+<a name="l00016"></a>00016 <span class="preprocessor">#include "<a class="code" href="LLVMContextImpl_8h.html">LLVMContextImpl.h</a>"</span>
+<a name="l00017"></a>00017 <span class="preprocessor">#include "<a class="code" href="DerivedTypes_8h.html">llvm/DerivedTypes.h</a>"</span>
+<a name="l00018"></a>00018 <span class="preprocessor">#include <algorithm></span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include <cctype></span>
+<a name="l00020"></a>00020 <span class="keyword">using namespace </span>llvm;
+<a name="l00021"></a>00021 
+<a name="l00022"></a>00022 <span class="comment">// Implement the first virtual method in this class in this file so the</span>
+<a name="l00023"></a>00023 <span class="comment">// InlineAsm vtable is emitted here.</span>
+<a name="l00024"></a>00024 InlineAsm::~InlineAsm() {
+<a name="l00025"></a>00025 }
+<a name="l00026"></a>00026 
+<a name="l00027"></a>00027 
+<a name="l00028"></a><a class="code" href="classllvm_1_1InlineAsm.html#aaae042532c03bc95734e689525a6b88b">00028</a> <a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a> *<a class="code" href="classllvm_1_1InlineAsm.html#aaae042532c03bc95734e689525a6b88b">InlineAsm::get</a>(<a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *Ty, <a class="code" href="classllvm_1_1StringRef.html">StringRef</a> AsmString,
+<a name="l00029"></a>00029                           <a class="code" href="classllvm_1_1StringRef.html">StringRef</a> Constraints, <span class="keywordtype">bool</span> hasSideEffects,
+<a name="l00030"></a>00030                           <span class="keywordtype">bool</span> isAlignStack, <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">AsmDialect</a> asmDialect) {
+<a name="l00031"></a>00031   <a class="code" href="structllvm_1_1InlineAsmKeyType.html">InlineAsmKeyType</a> Key(AsmString, Constraints, hasSideEffects, isAlignStack,
+<a name="l00032"></a>00032                        asmDialect);
+<a name="l00033"></a>00033   <a class="code" href="classllvm_1_1LLVMContextImpl.html">LLVMContextImpl</a> *pImpl = Ty-><a class="code" href="classllvm_1_1Type.html#af348d5ea83429d08ba891ca3dd0e92b2" title="getContext - Return the LLVMContext in which this type was uniqued.">getContext</a>().<a class="code" href="classllvm_1_1LLVMContext.html#aa142c8c536b95dd8e8a243cb67b57a80">pImpl</a>;
+<a name="l00034"></a>00034   <span class="keywordflow">return</span> pImpl-><a class="code" href="classllvm_1_1LLVMContextImpl.html#ad835ce18873280fd6d24417011c31550">InlineAsms</a>.<a class="code" href="classllvm_1_1ConstantUniqueMap.html#a85aea35610584c8e476141cf27b1a2ce">getOrCreate</a>(<a class="code" href="classllvm_1_1PointerType.html#a8db49fd5069f21d514e7bb0fd11f0902">PointerType::getUnqual</a>(Ty), Key);
+<a name="l00035"></a>00035 }
+<a name="l00036"></a>00036 
+<a name="l00037"></a>00037 InlineAsm::InlineAsm(<a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *Ty, <span class="keyword">const</span> std::string &asmString,
+<a name="l00038"></a>00038                      <span class="keyword">const</span> std::string &constraints, <span class="keywordtype">bool</span> hasSideEffects,
+<a name="l00039"></a>00039                      <span class="keywordtype">bool</span> isAlignStack, AsmDialect asmDialect)
+<a name="l00040"></a>00040   : <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a>(Ty, <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a>::InlineAsmVal),
+<a name="l00041"></a>00041     AsmString(asmString), Constraints(constraints),
+<a name="l00042"></a>00042     HasSideEffects(hasSideEffects), IsAlignStack(isAlignStack),
+<a name="l00043"></a>00043     Dialect(asmDialect) {
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045   <span class="comment">// Do various checks on the constraint string and type.</span>
+<a name="l00046"></a>00046   assert(<a class="code" href="classllvm_1_1InlineAsm.html#a32e8f8fdcd54f65a6ebcf439476de6cf">Verify</a>(<a class="code" href="classllvm_1_1InlineAsm.html#a656acb05678054a8b2f7df10afeead30">getFunctionType</a>(), constraints) &&
+<a name="l00047"></a>00047          <span class="stringliteral">"Function type not legal for constraints!"</span>);
+<a name="l00048"></a>00048 }
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="keywordtype">void</span> InlineAsm::destroyConstant() {
+<a name="l00051"></a>00051   <a class="code" href="classllvm_1_1InlineAsm.html#a3f2a3a208a5af4cffff25115c2af3669">getType</a>()-><a class="code" href="classllvm_1_1Type.html#af348d5ea83429d08ba891ca3dd0e92b2" title="getContext - Return the LLVMContext in which this type was uniqued.">getContext</a>().<a class="code" href="classllvm_1_1LLVMContext.html#aa142c8c536b95dd8e8a243cb67b57a80">pImpl</a>-><a class="code" href="classllvm_1_1LLVMContextImpl.html#ad835ce18873280fd6d24417011c31550">InlineAsms</a>.<a class="code" href="classllvm_1_1ConstantUniqueMap.html#ae37de84c7c64a48d129d4723ef63733d">remove</a>(<span class="keyword">this</span>);
+<a name="l00052"></a>00052   <span class="keyword">delete</span> <span class="keyword">this</span>;
+<a name="l00053"></a>00053 }
+<a name="l00054"></a>00054 
+<a name="l00055"></a><a class="code" href="classllvm_1_1InlineAsm.html#a656acb05678054a8b2f7df10afeead30">00055</a> <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *<a class="code" href="classllvm_1_1InlineAsm.html#a656acb05678054a8b2f7df10afeead30">InlineAsm::getFunctionType</a>()<span class="keyword"> const </span>{
+<a name="l00056"></a>00056   <span class="keywordflow">return</span> cast<FunctionType>(<a class="code" href="classllvm_1_1InlineAsm.html#a3f2a3a208a5af4cffff25115c2af3669">getType</a>()-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>());
+<a name="l00057"></a>00057 }
+<a name="l00058"></a>00058     <span class="comment"></span>
+<a name="l00059"></a>00059 <span class="comment">///Default constructor.</span>
+<a name="l00060"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa4484fe312dc0f3a77bac05d2927e4cc">00060</a> <span class="comment"></span><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa4484fe312dc0f3a77bac05d2927e4cc" title="Default constructor.">InlineAsm::ConstraintInfo::ConstraintInfo</a>() :
+<a name="l00061"></a>00061   <a class="code" href="classllvm_1_1Type.html">Type</a>(isInput), isEarlyClobber(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>),
+<a name="l00062"></a>00062   MatchingInput(-1), isCommutative(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>),
+<a name="l00063"></a>00063   isIndirect(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>), isMultipleAlternative(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>),
+<a name="l00064"></a>00064   currentAlternativeIndex(0) {
+<a name="l00065"></a>00065 }
+<a name="l00066"></a>00066 <span class="comment"></span>
+<a name="l00067"></a>00067 <span class="comment">/// Copy constructor.</span>
+<a name="l00068"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a1e3b0e941fac6c5fc6feb8b78b824155">00068</a> <span class="comment"></span><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa4484fe312dc0f3a77bac05d2927e4cc" title="Default constructor.">InlineAsm::ConstraintInfo::ConstraintInfo</a>(<span class="keyword">const</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html">ConstraintInfo</a> &other) :
+<a name="l00069"></a>00069   <a class="code" href="classllvm_1_1Type.html">Type</a>(other.<a class="code" href="classllvm_1_1Type.html">Type</a>), isEarlyClobber(other.isEarlyClobber),
+<a name="l00070"></a>00070   MatchingInput(other.MatchingInput), isCommutative(other.isCommutative),
+<a name="l00071"></a>00071   isIndirect(other.isIndirect), Codes(other.Codes),
+<a name="l00072"></a>00072   isMultipleAlternative(other.isMultipleAlternative),
+<a name="l00073"></a>00073   multipleAlternatives(other.multipleAlternatives),
+<a name="l00074"></a>00074   currentAlternativeIndex(other.currentAlternativeIndex) {
+<a name="l00075"></a>00075 }
+<a name="l00076"></a>00076 <span class="comment"></span>
+<a name="l00077"></a>00077 <span class="comment">/// Parse - Analyze the specified string (e.g. "==&{eax}") and fill in the</span>
+<a name="l00078"></a>00078 <span class="comment">/// fields in this structure.  If the constraint string is not understood,</span>
+<a name="l00079"></a>00079 <span class="comment">/// return true, otherwise return false.</span>
+<a name="l00080"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa7d317c3dcdf1f805c995e9b3f2cba5f">00080</a> <span class="comment"></span><span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa7d317c3dcdf1f805c995e9b3f2cba5f">InlineAsm::ConstraintInfo::Parse</a>(<a class="code" href="classllvm_1_1StringRef.html">StringRef</a> Str,
+<a name="l00081"></a>00081                      <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">InlineAsm::ConstraintInfoVector</a> &ConstraintsSoFar) {
+<a name="l00082"></a>00082   <a class="code" href="classchar.html">StringRef::iterator</a> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = Str.<a class="code" href="classllvm_1_1StringRef.html#a4a0abf8eb4fa5989df63172649cba99f">begin</a>(), E = Str.<a class="code" href="classllvm_1_1StringRef.html#a9e277b660236bb0318b61ab9cdf60dc7">end</a>();
+<a name="l00083"></a>00083   <span class="keywordtype">unsigned</span> multipleAlternativeCount = Str.<a class="code" href="classllvm_1_1StringRef.html#a96436c303562dc7d5839d1cdaa77dbc9" title="Return the number of occurrences of C in the string.">count</a>(<span class="charliteral">'|'</span>) + 1;
+<a name="l00084"></a>00084   <span class="keywordtype">unsigned</span> multipleAlternativeIndex = 0;
+<a name="l00085"></a>00085   <a class="code" href="classllvm_1_1InlineAsm.html#a20147abed6937af2e166ff3f377d1c34">ConstraintCodeVector</a> *pCodes = &Codes;
+<a name="l00086"></a>00086   
+<a name="l00087"></a>00087   <span class="comment">// Initialize</span>
+<a name="l00088"></a>00088   isMultipleAlternative = (multipleAlternativeCount > 1 ? <span class="keyword">true</span> : <span class="keyword">false</span>);
+<a name="l00089"></a>00089   <span class="keywordflow">if</span> (isMultipleAlternative) {
+<a name="l00090"></a>00090     multipleAlternatives.resize(multipleAlternativeCount);
+<a name="l00091"></a>00091     pCodes = &multipleAlternatives[0].Codes;
+<a name="l00092"></a>00092   }
+<a name="l00093"></a>00093   <a class="code" href="classllvm_1_1Type.html">Type</a> = <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34a79ca3881430605a6c7da5227cfb115d6">isInput</a>;
+<a name="l00094"></a>00094   isEarlyClobber = <span class="keyword">false</span>;
+<a name="l00095"></a>00095   MatchingInput = -1;
+<a name="l00096"></a>00096   isCommutative = <span class="keyword">false</span>;
+<a name="l00097"></a>00097   isIndirect = <span class="keyword">false</span>;
+<a name="l00098"></a>00098   currentAlternativeIndex = 0;
+<a name="l00099"></a>00099   
+<a name="l00100"></a>00100   <span class="comment">// Parse prefixes.</span>
+<a name="l00101"></a>00101   <span class="keywordflow">if</span> (*I == <span class="charliteral">'~'</span>) {
+<a name="l00102"></a>00102     <a class="code" href="classllvm_1_1Type.html">Type</a> = <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34adf39e7f7e158f2ccacae6d4446197322">isClobber</a>;
+<a name="l00103"></a>00103     ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00104"></a>00104   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*I == <span class="charliteral">'='</span>) {
+<a name="l00105"></a>00105     ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00106"></a>00106     <a class="code" href="classllvm_1_1Type.html">Type</a> = <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34aabfa616f81b4833fdf462b07aabfa53f">isOutput</a>;
+<a name="l00107"></a>00107   }
+<a name="l00108"></a>00108   
+<a name="l00109"></a>00109   <span class="keywordflow">if</span> (*I == <span class="charliteral">'*'</span>) {
+<a name="l00110"></a>00110     isIndirect = <span class="keyword">true</span>;
+<a name="l00111"></a>00111     ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00112"></a>00112   }
+<a name="l00113"></a>00113   
+<a name="l00114"></a>00114   <span class="keywordflow">if</span> (I == E) <span class="keywordflow">return</span> <span class="keyword">true</span>;  <span class="comment">// Just a prefix, like "==" or "~".</span>
+<a name="l00115"></a>00115   
+<a name="l00116"></a>00116   <span class="comment">// Parse the modifiers.</span>
+<a name="l00117"></a>00117   <span class="keywordtype">bool</span> DoneWithModifiers = <span class="keyword">false</span>;
+<a name="l00118"></a>00118   <span class="keywordflow">while</span> (!DoneWithModifiers) {
+<a name="l00119"></a>00119     <span class="keywordflow">switch</span> (*I) {
+<a name="l00120"></a>00120     <span class="keywordflow">default</span>:
+<a name="l00121"></a>00121       DoneWithModifiers = <span class="keyword">true</span>;
+<a name="l00122"></a>00122       <span class="keywordflow">break</span>;
+<a name="l00123"></a>00123     <span class="keywordflow">case</span> <span class="charliteral">'&'</span>:     <span class="comment">// Early clobber.</span>
+<a name="l00124"></a>00124       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Type.html">Type</a> != <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34aabfa616f81b4833fdf462b07aabfa53f">isOutput</a> ||      <span class="comment">// Cannot early clobber anything but output.</span>
+<a name="l00125"></a>00125           isEarlyClobber)          <span class="comment">// Reject &&&&&&</span>
+<a name="l00126"></a>00126         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00127"></a>00127       isEarlyClobber = <span class="keyword">true</span>;
+<a name="l00128"></a>00128       <span class="keywordflow">break</span>;
+<a name="l00129"></a>00129     <span class="keywordflow">case</span> <span class="charliteral">'%'</span>:     <span class="comment">// Commutative.</span>
+<a name="l00130"></a>00130       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Type.html">Type</a> == <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34adf39e7f7e158f2ccacae6d4446197322">isClobber</a> ||     <span class="comment">// Cannot commute clobbers.</span>
+<a name="l00131"></a>00131           isCommutative)           <span class="comment">// Reject %%%%%</span>
+<a name="l00132"></a>00132         <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00133"></a>00133       isCommutative = <span class="keyword">true</span>;
+<a name="l00134"></a>00134       <span class="keywordflow">break</span>;
+<a name="l00135"></a>00135     <span class="keywordflow">case</span> <span class="charliteral">'#'</span>:     <span class="comment">// Comment.</span>
+<a name="l00136"></a>00136     <span class="keywordflow">case</span> <span class="charliteral">'*'</span>:     <span class="comment">// Register preferencing.</span>
+<a name="l00137"></a>00137       <span class="keywordflow">return</span> <span class="keyword">true</span>;     <span class="comment">// Not supported.</span>
+<a name="l00138"></a>00138     }
+<a name="l00139"></a>00139     
+<a name="l00140"></a>00140     <span class="keywordflow">if</span> (!DoneWithModifiers) {
+<a name="l00141"></a>00141       ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00142"></a>00142       <span class="keywordflow">if</span> (I == E) <span class="keywordflow">return</span> <span class="keyword">true</span>;   <span class="comment">// Just prefixes and modifiers!</span>
+<a name="l00143"></a>00143     }
+<a name="l00144"></a>00144   }
+<a name="l00145"></a>00145   
+<a name="l00146"></a>00146   <span class="comment">// Parse the various constraints.</span>
+<a name="l00147"></a>00147   <span class="keywordflow">while</span> (I != E) {
+<a name="l00148"></a>00148     <span class="keywordflow">if</span> (*I == <span class="charliteral">'{'</span>) {   <span class="comment">// Physical register reference.</span>
+<a name="l00149"></a>00149       <span class="comment">// Find the end of the register name.</span>
+<a name="l00150"></a>00150       <a class="code" href="classchar.html">StringRef::iterator</a> ConstraintEnd = std::find(I+1, E, <span class="charliteral">'}'</span>);
+<a name="l00151"></a>00151       <span class="keywordflow">if</span> (ConstraintEnd == E) <span class="keywordflow">return</span> <span class="keyword">true</span>;  <span class="comment">// "{foo"</span>
+<a name="l00152"></a>00152       pCodes->push_back(std::string(I, ConstraintEnd+1));
+<a name="l00153"></a>00153       I = ConstraintEnd+1;
+<a name="l00154"></a>00154     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isdigit(*I)) {     <span class="comment">// Matching Constraint</span>
+<a name="l00155"></a>00155       <span class="comment">// Maximal munch numbers.</span>
+<a name="l00156"></a>00156       <a class="code" href="classchar.html">StringRef::iterator</a> NumStart = <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00157"></a>00157       <span class="keywordflow">while</span> (I != E && isdigit(*I))
+<a name="l00158"></a>00158         ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00159"></a>00159       pCodes->push_back(std::string(NumStart, I));
+<a name="l00160"></a>00160       <span class="keywordtype">unsigned</span> <a class="code" href="regcomp_8c.html#a0240ac851181b84ac374872dc5434ee4">N</a> = atoi(pCodes->back().c_str());
+<a name="l00161"></a>00161       <span class="comment">// Check that this is a valid matching constraint!</span>
+<a name="l00162"></a>00162       <span class="keywordflow">if</span> (N >= ConstraintsSoFar.size() || ConstraintsSoFar[N].Type != <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34aabfa616f81b4833fdf462b07aabfa53f">isOutput</a>||
+<a name="l00163"></a>00163           <a class="code" href="classllvm_1_1Type.html">Type</a> != <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34a79ca3881430605a6c7da5227cfb115d6">isInput</a>)
+<a name="l00164"></a>00164         <span class="keywordflow">return</span> <span class="keyword">true</span>;  <span class="comment">// Invalid constraint number.</span>
+<a name="l00165"></a>00165       
+<a name="l00166"></a>00166       <span class="comment">// If Operand N already has a matching input, reject this.  An output</span>
+<a name="l00167"></a>00167       <span class="comment">// can't be constrained to the same value as multiple inputs.</span>
+<a name="l00168"></a>00168       <span class="keywordflow">if</span> (isMultipleAlternative) {
+<a name="l00169"></a>00169         <a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html">InlineAsm::SubConstraintInfo</a> &scInfo =
+<a name="l00170"></a>00170           ConstraintsSoFar[N].multipleAlternatives[multipleAlternativeIndex];
+<a name="l00171"></a>00171         <span class="keywordflow">if</span> (scInfo.<a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a0b66d4f6afaaebe0bc8ef720445659f0">MatchingInput</a> != -1)
+<a name="l00172"></a>00172           <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00173"></a>00173         <span class="comment">// Note that operand #n has a matching input.</span>
+<a name="l00174"></a>00174         scInfo.<a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a0b66d4f6afaaebe0bc8ef720445659f0">MatchingInput</a> = ConstraintsSoFar.size();
+<a name="l00175"></a>00175       } <span class="keywordflow">else</span> {
+<a name="l00176"></a>00176         <span class="keywordflow">if</span> (ConstraintsSoFar[N].hasMatchingInput())
+<a name="l00177"></a>00177           <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00178"></a>00178         <span class="comment">// Note that operand #n has a matching input.</span>
+<a name="l00179"></a>00179         ConstraintsSoFar[N].MatchingInput = ConstraintsSoFar.size();
+<a name="l00180"></a>00180         }
+<a name="l00181"></a>00181     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*I == <span class="charliteral">'|'</span>) {
+<a name="l00182"></a>00182       multipleAlternativeIndex++;
+<a name="l00183"></a>00183       pCodes = &multipleAlternatives[multipleAlternativeIndex].Codes;
+<a name="l00184"></a>00184       ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00185"></a>00185     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*I == <span class="charliteral">'^'</span>) {
+<a name="l00186"></a>00186       <span class="comment">// Multi-letter constraint</span>
+<a name="l00187"></a>00187       <span class="comment">// FIXME: For now assuming these are 2-character constraints.</span>
+<a name="l00188"></a>00188       pCodes->push_back(std::string(I+1, I+3));
+<a name="l00189"></a>00189       I += 3;
+<a name="l00190"></a>00190     } <span class="keywordflow">else</span> {
+<a name="l00191"></a>00191       <span class="comment">// Single letter constraint.</span>
+<a name="l00192"></a>00192       pCodes->push_back(std::string(I, I+1));
+<a name="l00193"></a>00193       ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00194"></a>00194     }
+<a name="l00195"></a>00195   }
+<a name="l00196"></a>00196 
+<a name="l00197"></a>00197   <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00198"></a>00198 }
+<a name="l00199"></a>00199 <span class="comment"></span>
+<a name="l00200"></a>00200 <span class="comment">/// selectAlternative - Point this constraint to the alternative constraint</span>
+<a name="l00201"></a>00201 <span class="comment">/// indicated by the index.</span>
+<a name="l00202"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#af49538ed53bce83dcf52b11234d559a4">00202</a> <span class="comment"></span><span class="keywordtype">void</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#af49538ed53bce83dcf52b11234d559a4">InlineAsm::ConstraintInfo::selectAlternative</a>(<span class="keywordtype">unsigned</span> index) {
+<a name="l00203"></a>00203   <span class="keywordflow">if</span> (index < multipleAlternatives.size()) {
+<a name="l00204"></a>00204     currentAlternativeIndex = index;
+<a name="l00205"></a>00205     <a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html">InlineAsm::SubConstraintInfo</a> &scInfo =
+<a name="l00206"></a>00206       multipleAlternatives[currentAlternativeIndex];
+<a name="l00207"></a>00207     MatchingInput = scInfo.<a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a0b66d4f6afaaebe0bc8ef720445659f0">MatchingInput</a>;
+<a name="l00208"></a>00208     Codes = scInfo.<a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a907e764ba5f5a8cf55fcddac6c782d53">Codes</a>;
+<a name="l00209"></a>00209   }
+<a name="l00210"></a>00210 }
+<a name="l00211"></a>00211 
+<a name="l00212"></a>00212 <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">InlineAsm::ConstraintInfoVector</a>
+<a name="l00213"></a><a class="code" href="classllvm_1_1InlineAsm.html#a66b2f8cc39befa7a141f20ef9a74ed36">00213</a> <a class="code" href="classllvm_1_1InlineAsm.html#a1e1b62e85a762333415f8a32c3dafe9a">InlineAsm::ParseConstraints</a>(<a class="code" href="classllvm_1_1StringRef.html">StringRef</a> Constraints) {
+<a name="l00214"></a>00214   <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">ConstraintInfoVector</a> Result;
+<a name="l00215"></a>00215   
+<a name="l00216"></a>00216   <span class="comment">// Scan the constraints string.</span>
+<a name="l00217"></a>00217   <span class="keywordflow">for</span> (<a class="code" href="classchar.html">StringRef::iterator</a> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = Constraints.<a class="code" href="classllvm_1_1StringRef.html#a4a0abf8eb4fa5989df63172649cba99f">begin</a>(),
+<a name="l00218"></a>00218          E = Constraints.<a class="code" href="classllvm_1_1StringRef.html#a9e277b660236bb0318b61ab9cdf60dc7">end</a>(); <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> != E; ) {
+<a name="l00219"></a>00219     <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html">ConstraintInfo</a> Info;
+<a name="l00220"></a>00220 
+<a name="l00221"></a>00221     <span class="comment">// Find the end of this constraint.</span>
+<a name="l00222"></a>00222     <a class="code" href="classchar.html">StringRef::iterator</a> ConstraintEnd = std::find(<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>, E, <span class="charliteral">','</span>);
+<a name="l00223"></a>00223 
+<a name="l00224"></a>00224     <span class="keywordflow">if</span> (ConstraintEnd == <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> ||  <span class="comment">// Empty constraint like ",,"</span>
+<a name="l00225"></a>00225         Info.<a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa7d317c3dcdf1f805c995e9b3f2cba5f">Parse</a>(<a class="code" href="classllvm_1_1StringRef.html">StringRef</a>(<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>, ConstraintEnd-<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>), Result)) {
+<a name="l00226"></a>00226       Result.clear();          <span class="comment">// Erroneous constraint?</span>
+<a name="l00227"></a>00227       <span class="keywordflow">break</span>;
+<a name="l00228"></a>00228     }
+<a name="l00229"></a>00229 
+<a name="l00230"></a>00230     Result.push_back(Info);
+<a name="l00231"></a>00231     
+<a name="l00232"></a>00232     <span class="comment">// ConstraintEnd may be either the next comma or the end of the string.  In</span>
+<a name="l00233"></a>00233     <span class="comment">// the former case, we skip the comma.</span>
+<a name="l00234"></a>00234     <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = ConstraintEnd;
+<a name="l00235"></a>00235     <span class="keywordflow">if</span> (<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> != E) {
+<a name="l00236"></a>00236       ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00237"></a>00237       <span class="keywordflow">if</span> (<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> == E) { Result.clear(); <span class="keywordflow">break</span>; }    <span class="comment">// don't allow "xyz,"</span>
+<a name="l00238"></a>00238     }
+<a name="l00239"></a>00239   }
+<a name="l00240"></a>00240   
+<a name="l00241"></a>00241   <span class="keywordflow">return</span> Result;
+<a name="l00242"></a>00242 }
+<a name="l00243"></a>00243 <span class="comment"></span>
+<a name="l00244"></a>00244 <span class="comment">/// Verify - Verify that the specified constraint string is reasonable for the</span>
+<a name="l00245"></a>00245 <span class="comment">/// specified function type, and otherwise validate the constraint string.</span>
+<a name="l00246"></a><a class="code" href="classllvm_1_1InlineAsm.html#a32e8f8fdcd54f65a6ebcf439476de6cf">00246</a> <span class="comment"></span><span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a32e8f8fdcd54f65a6ebcf439476de6cf">InlineAsm::Verify</a>(<a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *Ty, <a class="code" href="classllvm_1_1StringRef.html">StringRef</a> ConstStr) {
+<a name="l00247"></a>00247   <span class="keywordflow">if</span> (Ty-><a class="code" href="classllvm_1_1FunctionType.html#ab9b67f93a2231970abb3d95636660ffc">isVarArg</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00248"></a>00248   
+<a name="l00249"></a>00249   <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">ConstraintInfoVector</a> Constraints = <a class="code" href="classllvm_1_1InlineAsm.html#a1e1b62e85a762333415f8a32c3dafe9a">ParseConstraints</a>(ConstStr);
+<a name="l00250"></a>00250   
+<a name="l00251"></a>00251   <span class="comment">// Error parsing constraints.</span>
+<a name="l00252"></a>00252   <span class="keywordflow">if</span> (Constraints.empty() && !ConstStr.<a class="code" href="classllvm_1_1StringRef.html#ad7e292682516000f8b472f4510a2acf7" title="empty - Check if the string is empty.">empty</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00253"></a>00253   
+<a name="l00254"></a>00254   <span class="keywordtype">unsigned</span> NumOutputs = 0, NumInputs = 0, NumClobbers = 0;
+<a name="l00255"></a>00255   <span class="keywordtype">unsigned</span> NumIndirect = 0;
+<a name="l00256"></a>00256   
+<a name="l00257"></a>00257   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = Constraints.size(); i != e; ++i) {
+<a name="l00258"></a>00258     <span class="keywordflow">switch</span> (Constraints[i].<a class="code" href="classllvm_1_1Type.html">Type</a>) {
+<a name="l00259"></a>00259     <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34aabfa616f81b4833fdf462b07aabfa53f">InlineAsm::isOutput</a>:
+<a name="l00260"></a>00260       <span class="keywordflow">if</span> ((NumInputs-NumIndirect) != 0 || NumClobbers != 0)
+<a name="l00261"></a>00261         <span class="keywordflow">return</span> <span class="keyword">false</span>;  <span class="comment">// outputs before inputs and clobbers.</span>
+<a name="l00262"></a>00262       <span class="keywordflow">if</span> (!Constraints[i].isIndirect) {
+<a name="l00263"></a>00263         ++NumOutputs;
+<a name="l00264"></a>00264         <span class="keywordflow">break</span>;
+<a name="l00265"></a>00265       }
+<a name="l00266"></a>00266       ++NumIndirect;
+<a name="l00267"></a>00267       <span class="comment">// FALLTHROUGH for Indirect Outputs.</span>
+<a name="l00268"></a>00268     <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34a79ca3881430605a6c7da5227cfb115d6">InlineAsm::isInput</a>:
+<a name="l00269"></a>00269       <span class="keywordflow">if</span> (NumClobbers) <span class="keywordflow">return</span> <span class="keyword">false</span>;               <span class="comment">// inputs before clobbers.</span>
+<a name="l00270"></a>00270       ++NumInputs;
+<a name="l00271"></a>00271       <span class="keywordflow">break</span>;
+<a name="l00272"></a>00272     <span class="keywordflow">case</span> <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34adf39e7f7e158f2ccacae6d4446197322">InlineAsm::isClobber</a>:
+<a name="l00273"></a>00273       ++NumClobbers;
+<a name="l00274"></a>00274       <span class="keywordflow">break</span>;
+<a name="l00275"></a>00275     }
+<a name="l00276"></a>00276   }
+<a name="l00277"></a>00277   
+<a name="l00278"></a>00278   <span class="keywordflow">switch</span> (NumOutputs) {
+<a name="l00279"></a>00279   <span class="keywordflow">case</span> 0:
+<a name="l00280"></a>00280     <span class="keywordflow">if</span> (!Ty-><a class="code" href="classllvm_1_1FunctionType.html#a9eda832d6e80bc19b98f22f4ec714e3f">getReturnType</a>()-><a class="code" href="classllvm_1_1Type.html#af5c7041df3ad5edffe5da17b5264c1fc" title="isVoidTy - Return true if this is 'void'.">isVoidTy</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00281"></a>00281     <span class="keywordflow">break</span>;
+<a name="l00282"></a>00282   <span class="keywordflow">case</span> 1:
+<a name="l00283"></a>00283     <span class="keywordflow">if</span> (Ty-><a class="code" href="classllvm_1_1FunctionType.html#a9eda832d6e80bc19b98f22f4ec714e3f">getReturnType</a>()-><a class="code" href="classllvm_1_1Type.html#aed87738661d539150b3fc4bb46e36aa3">isStructTy</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00284"></a>00284     <span class="keywordflow">break</span>;
+<a name="l00285"></a>00285   <span class="keywordflow">default</span>:
+<a name="l00286"></a>00286     <a class="code" href="classllvm_1_1StructType.html">StructType</a> *STy = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1StructType.html">StructType</a>>(Ty-><a class="code" href="classllvm_1_1FunctionType.html#a9eda832d6e80bc19b98f22f4ec714e3f">getReturnType</a>());
+<a name="l00287"></a>00287     <span class="keywordflow">if</span> (STy == 0 || STy-><a class="code" href="classllvm_1_1StructType.html#aa2113dcf8c96c19c9a2abf786b9ad3b7">getNumElements</a>() != NumOutputs)
+<a name="l00288"></a>00288       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00289"></a>00289     <span class="keywordflow">break</span>;
+<a name="l00290"></a>00290   }      
+<a name="l00291"></a>00291   
+<a name="l00292"></a>00292   <span class="keywordflow">if</span> (Ty-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>() != NumInputs) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00293"></a>00293   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00294"></a>00294 }
+<a name="l00295"></a>00295 
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:40 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h__incl.dot
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h__incl.dot?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h__incl.dot (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h__incl.dot Fri Dec 21 00:57:24 2012
@@ -0,0 +1,58 @@
+digraph G
+{
+  bgcolor="transparent";
+  edge [fontname="FreeSans",fontsize="10",labelfontname="FreeSans",labelfontsize="10"];
+  node [fontname="FreeSans",fontsize="10",shape=record];
+  Node1 [label="InlineAsm.h",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled" fontcolor="black"];
+  Node1 -> Node2 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node2 [label="llvm/Value.h",height=0.2,width=0.4,color="black",URL="$Value_8h.html"];
+  Node2 -> Node3 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node3 [label="llvm/Use.h",height=0.2,width=0.4,color="black",URL="$Use_8h.html"];
+  Node3 -> Node4 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node4 [label="llvm/ADT/PointerIntPair.h",height=0.2,width=0.4,color="black",URL="$PointerIntPair_8h.html"];
+  Node4 -> Node5 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node5 [label="llvm/Support/PointerLikeTypeTraits.h",height=0.2,width=0.4,color="black",URL="$PointerLikeTypeTraits_8h.html"];
+  Node5 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node6 [label="llvm/Support/DataTypes.h",height=0.2,width=0.4,color="black",URL="$DataTypes_8h.html"];
+  Node6 -> Node7 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node7 [label="math.h",height=0.2,width=0.4,color="grey75"];
+  Node6 -> Node8 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node8 [label="sys/types.h",height=0.2,width=0.4,color="grey75"];
+  Node6 -> Node9 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node9 [label="inttypes.h",height=0.2,width=0.4,color="grey75"];
+  Node6 -> Node10 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node10 [label="stdint.h",height=0.2,width=0.4,color="grey75"];
+  Node4 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node11 [label="cassert",height=0.2,width=0.4,color="grey75"];
+  Node3 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node12 [label="llvm/Support/Compiler.h",height=0.2,width=0.4,color="black",URL="$Compiler_8h.html"];
+  Node3 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node13 [label="cstddef",height=0.2,width=0.4,color="grey75"];
+  Node3 -> Node14 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node14 [label="iterator",height=0.2,width=0.4,color="grey75"];
+  Node2 -> Node15 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node15 [label="llvm/Support/Casting.h",height=0.2,width=0.4,color="black",URL="$Casting_8h.html"];
+  Node15 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node16 [label="llvm/Support/type_traits.h",height=0.2,width=0.4,color="black",URL="$type__traits_8h.html"];
+  Node16 -> Node6 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node16 -> Node13 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node16 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node17 [label="utility",height=0.2,width=0.4,color="grey75"];
+  Node15 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node2 -> Node12 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node18 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node18 [label="llvm/ADT/StringRef.h",height=0.2,width=0.4,color="black",URL="$StringRef_8h.html"];
+  Node18 -> Node16 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node18 -> Node19 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node19 [label="algorithm",height=0.2,width=0.4,color="grey75"];
+  Node18 -> Node11 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node18 -> Node20 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node20 [label="cstring",height=0.2,width=0.4,color="grey75"];
+  Node18 -> Node21 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node21 [label="limits",height=0.2,width=0.4,color="grey75"];
+  Node18 -> Node22 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node22 [label="string",height=0.2,width=0.4,color="grey75"];
+  Node18 -> Node17 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node1 -> Node23 [color="midnightblue",fontsize="10",style="solid",fontname="FreeSans"];
+  Node23 [label="vector",height=0.2,width=0.4,color="grey75"];
+}

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineAsm_8h_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,364 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InlineAsm.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_25acc6571c4e3a053ee4203146b47a61.html">include</a>      </li>
+      <li class="navelem"><a class="el" href="dir_fd2d7b5ce83b1c1657cd6600d8cb39fa.html">llvm</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">InlineAsm.h</div>  </div>
+</div>
+<div class="contents">
+<a href="InlineAsm_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===-- llvm/InlineAsm.h - Class to represent inline asm strings-*- C++ -*-===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// This class represents the inline asm strings, which are Value*'s that are</span>
+<a name="l00011"></a>00011 <span class="comment">// used as the callee operand of call instructions.  InlineAsm's are uniqued</span>
+<a name="l00012"></a>00012 <span class="comment">// like constants, and created via InlineAsm::get(...).</span>
+<a name="l00013"></a>00013 <span class="comment">//</span>
+<a name="l00014"></a>00014 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00015"></a>00015 
+<a name="l00016"></a>00016 <span class="preprocessor">#ifndef LLVM_INLINEASM_H</span>
+<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#define LLVM_INLINEASM_H</span>
+<a name="l00018"></a>00018 <span class="preprocessor"></span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "<a class="code" href="Value_8h.html">llvm/Value.h</a>"</span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "<a class="code" href="StringRef_8h.html">llvm/ADT/StringRef.h</a>"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include <vector></span>
+<a name="l00022"></a>00022 
+<a name="l00023"></a>00023 <span class="keyword">namespace </span>llvm {
+<a name="l00024"></a>00024 
+<a name="l00025"></a>00025 <span class="keyword">class </span>PointerType;
+<a name="l00026"></a>00026 <span class="keyword">class </span>FunctionType;
+<a name="l00027"></a>00027 <span class="keyword">class </span>Module;
+<a name="l00028"></a>00028 <span class="keyword">struct </span>InlineAsmKeyType;
+<a name="l00029"></a>00029 <span class="keyword">template</span><<span class="keyword">class </span>ValType, <span class="keyword">class </span>ValRefType, <span class="keyword">class </span>TypeClass, <span class="keyword">class </span>ConstantClass,
+<a name="l00030"></a>00030          <span class="keywordtype">bool</span> HasLargeKey>
+<a name="l00031"></a>00031 <span class="keyword">class </span>ConstantUniqueMap;
+<a name="l00032"></a>00032 <span class="keyword">template</span><<span class="keyword">class</span> ConstantClass, <span class="keyword">class</span> TypeClass, <span class="keyword">class</span> ValType>
+<a name="l00033"></a>00033 <span class="keyword">struct </span>ConstantCreator;
+<a name="l00034"></a>00034 
+<a name="l00035"></a><a class="code" href="classllvm_1_1InlineAsm.html">00035</a> <span class="keyword">class </span><a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a> : <span class="keyword">public</span> <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> {
+<a name="l00036"></a>00036 <span class="keyword">public</span>:
+<a name="l00037"></a><a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">00037</a>   <span class="keyword">enum</span> <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">AsmDialect</a> {
+<a name="l00038"></a><a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8ae46075a65afe271f3d7f91e1243aacca">00038</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8ae46075a65afe271f3d7f91e1243aacca">AD_ATT</a>,
+<a name="l00039"></a><a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8ac2322cfab42cb6c46aa198861244231e">00039</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8ac2322cfab42cb6c46aa198861244231e">AD_Intel</a>
+<a name="l00040"></a>00040   };
+<a name="l00041"></a>00041 
+<a name="l00042"></a>00042 <span class="keyword">private</span>:
+<a name="l00043"></a><a class="code" href="classllvm_1_1InlineAsm.html#a87c49742d172b720255cff82ed14c172">00043</a>   <span class="keyword">friend</span> <span class="keyword">struct </span><a class="code" href="structllvm_1_1ConstantCreator.html">ConstantCreator</a><<a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a>, <a class="code" href="classllvm_1_1PointerType.html">PointerType</a>, <a class="code" href="structllvm_1_1InlineAsmKeyType.html">InlineAsmKeyType</a>>;
+<a name="l00044"></a>00044   <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classllvm_1_1ConstantUniqueMap.html">ConstantUniqueMap</a><<a class="code" href="structllvm_1_1InlineAsmKeyType.html">InlineAsmKeyType</a>, const <a class="code" href="structllvm_1_1InlineAsmKeyType.html">InlineAsmKeyType</a>&,
+<a name="l00045"></a><a class="code" href="classllvm_1_1InlineAsm.html#a931f97af7fab651869f5d57c8feac810">00045</a>                                  <a class="code" href="classllvm_1_1PointerType.html">PointerType</a>, <a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a>, <span class="keyword">false</span>>;
+<a name="l00046"></a>00046 
+<a name="l00047"></a>00047   <a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a> &) <a class="code" href="Compiler_8h.html#aacca75352b8e153274310c374564eb01">LLVM_DELETED_FUNCTION</a>;
+<a name="l00048"></a>00048   <span class="keywordtype">void</span> operator=(const <a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a>&) LLVM_DELETED_FUNCTION;
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050   std::<span class="keywordtype">string</span> AsmString, Constraints;
+<a name="l00051"></a>00051   <span class="keywordtype">bool</span> HasSideEffects;
+<a name="l00052"></a>00052   <span class="keywordtype">bool</span> IsAlignStack;
+<a name="l00053"></a>00053   <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">AsmDialect</a> Dialect;
+<a name="l00054"></a>00054 
+<a name="l00055"></a>00055   <a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a>(<a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *Ty, const std::<span class="keywordtype">string</span> &AsmString,
+<a name="l00056"></a>00056             const std::<span class="keywordtype">string</span> &Constraints, <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#abd669ca0b499e13b6b05c0fac7831501">hasSideEffects</a>,
+<a name="l00057"></a>00057             <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a77bf4c8774ee4307d20adc27aea319b6">isAlignStack</a>, <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">AsmDialect</a> asmDialect);
+<a name="l00058"></a>00058   virtual ~<a class="code" href="classllvm_1_1InlineAsm.html">InlineAsm</a>();
+<a name="l00059"></a>00059 <span class="comment"></span>
+<a name="l00060"></a>00060 <span class="comment">  /// When the ConstantUniqueMap merges two types and makes two InlineAsms</span>
+<a name="l00061"></a>00061 <span class="comment">  /// identical, it destroys one of them with this method.</span>
+<a name="l00062"></a>00062 <span class="comment"></span>  <span class="keywordtype">void</span> destroyConstant();
+<a name="l00063"></a>00063 public:
+<a name="l00064"></a>00064 <span class="comment"></span>
+<a name="l00065"></a>00065 <span class="comment">  /// InlineAsm::get - Return the specified uniqued inline asm string.</span>
+<a name="l00066"></a>00066 <span class="comment">  ///</span>
+<a name="l00067"></a>00067 <span class="comment"></span>  static InlineAsm *<a class="code" href="classllvm_1_1InlineAsm.html#aaae042532c03bc95734e689525a6b88b">get</a>(<a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *Ty, <a class="code" href="classllvm_1_1StringRef.html">StringRef</a> AsmString,
+<a name="l00068"></a>00068                         <a class="code" href="classllvm_1_1StringRef.html">StringRef</a> Constraints, <span class="keywordtype">bool</span> hasSideEffects,
+<a name="l00069"></a>00069                         <span class="keywordtype">bool</span> isAlignStack = <a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>,
+<a name="l00070"></a>00070                         <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">AsmDialect</a> asmDialect = <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8ae46075a65afe271f3d7f91e1243aacca">AD_ATT</a>);
+<a name="l00071"></a>00071   
+<a name="l00072"></a><a class="code" href="classllvm_1_1InlineAsm.html#abd669ca0b499e13b6b05c0fac7831501">00072</a>   <span class="keywordtype">bool</span> hasSideEffects()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> HasSideEffects; }
+<a name="l00073"></a><a class="code" href="classllvm_1_1InlineAsm.html#a77bf4c8774ee4307d20adc27aea319b6">00073</a>   <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a77bf4c8774ee4307d20adc27aea319b6">isAlignStack</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> IsAlignStack; }
+<a name="l00074"></a><a class="code" href="classllvm_1_1InlineAsm.html#a58908f198b8b16ea3ac0cdad176f2d84">00074</a>   <a class="code" href="classllvm_1_1InlineAsm.html#a2c0e1ae3b31928af2e0a390bbc2ea9b8">AsmDialect</a> <a class="code" href="classllvm_1_1InlineAsm.html#a58908f198b8b16ea3ac0cdad176f2d84">getDialect</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Dialect; }
+<a name="l00075"></a>00075 <span class="comment"></span>
+<a name="l00076"></a>00076 <span class="comment">  /// getType - InlineAsm's are always pointers.</span>
+<a name="l00077"></a>00077 <span class="comment">  ///</span>
+<a name="l00078"></a><a class="code" href="classllvm_1_1InlineAsm.html#a3f2a3a208a5af4cffff25115c2af3669">00078</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *<a class="code" href="classllvm_1_1InlineAsm.html#a3f2a3a208a5af4cffff25115c2af3669">getType</a>()<span class="keyword"> const </span>{
+<a name="l00079"></a>00079     <span class="keywordflow">return</span> <span class="keyword">reinterpret_cast<</span><a class="code" href="classllvm_1_1PointerType.html">PointerType</a>*<span class="keyword">></span>(<a class="code" href="classllvm_1_1InlineAsm.html#a3f2a3a208a5af4cffff25115c2af3669">Value::getType</a>());
+<a name="l00080"></a>00080   }
+<a name="l00081"></a>00081   <span class="comment"></span>
+<a name="l00082"></a>00082 <span class="comment">  /// getFunctionType - InlineAsm's are always pointers to functions.</span>
+<a name="l00083"></a>00083 <span class="comment">  ///</span>
+<a name="l00084"></a>00084 <span class="comment"></span>  <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *<a class="code" href="classllvm_1_1InlineAsm.html#a656acb05678054a8b2f7df10afeead30">getFunctionType</a>() <span class="keyword">const</span>;
+<a name="l00085"></a>00085   
+<a name="l00086"></a><a class="code" href="classllvm_1_1InlineAsm.html#acad2c25760f7ee076b78bc5268d89dbb">00086</a>   <span class="keyword">const</span> std::string &<a class="code" href="classllvm_1_1InlineAsm.html#acad2c25760f7ee076b78bc5268d89dbb">getAsmString</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> AsmString; }
+<a name="l00087"></a><a class="code" href="classllvm_1_1InlineAsm.html#ae4bc227894502e052f318167fce6a851">00087</a>   <span class="keyword">const</span> std::string &<a class="code" href="classllvm_1_1InlineAsm.html#ae4bc227894502e052f318167fce6a851">getConstraintString</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> Constraints; }
+<a name="l00088"></a>00088 <span class="comment"></span>
+<a name="l00089"></a>00089 <span class="comment">  /// Verify - This static method can be used by the parser to check to see if</span>
+<a name="l00090"></a>00090 <span class="comment">  /// the specified constraint string is legal for the type.  This returns true</span>
+<a name="l00091"></a>00091 <span class="comment">  /// if legal, false if not.</span>
+<a name="l00092"></a>00092 <span class="comment">  ///</span>
+<a name="l00093"></a>00093 <span class="comment"></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a32e8f8fdcd54f65a6ebcf439476de6cf">Verify</a>(<a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *Ty, <a class="code" href="classllvm_1_1StringRef.html">StringRef</a> Constraints);
+<a name="l00094"></a>00094 
+<a name="l00095"></a>00095   <span class="comment">// Constraint String Parsing </span>
+<a name="l00096"></a><a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34">00096</a>   <span class="keyword">enum</span> <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34">ConstraintPrefix</a> {
+<a name="l00097"></a><a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34a79ca3881430605a6c7da5227cfb115d6">00097</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34a79ca3881430605a6c7da5227cfb115d6">isInput</a>,            <span class="comment">// 'x'</span>
+<a name="l00098"></a><a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34aabfa616f81b4833fdf462b07aabfa53f">00098</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34aabfa616f81b4833fdf462b07aabfa53f">isOutput</a>,           <span class="comment">// '=x'</span>
+<a name="l00099"></a><a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34adf39e7f7e158f2ccacae6d4446197322">00099</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34adf39e7f7e158f2ccacae6d4446197322">isClobber</a>           <span class="comment">// '~x'</span>
+<a name="l00100"></a>00100   };
+<a name="l00101"></a>00101   
+<a name="l00102"></a><a class="code" href="classllvm_1_1InlineAsm.html#a20147abed6937af2e166ff3f377d1c34">00102</a>   <span class="keyword">typedef</span> std::vector<std::string> <a class="code" href="classllvm_1_1InlineAsm.html#a20147abed6937af2e166ff3f377d1c34">ConstraintCodeVector</a>;
+<a name="l00103"></a>00103   
+<a name="l00104"></a><a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html">00104</a>   <span class="keyword">struct </span><a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html">SubConstraintInfo</a> {<span class="comment"></span>
+<a name="l00105"></a>00105 <span class="comment">    /// MatchingInput - If this is not -1, this is an output constraint where an</span>
+<a name="l00106"></a>00106 <span class="comment">    /// input constraint is required to match it (e.g. "0").  The value is the</span>
+<a name="l00107"></a>00107 <span class="comment">    /// constraint number that matches this one (for example, if this is</span>
+<a name="l00108"></a>00108 <span class="comment">    /// constraint #0 and constraint #4 has the value "0", this will be 4).</span>
+<a name="l00109"></a><a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a0b66d4f6afaaebe0bc8ef720445659f0">00109</a> <span class="comment"></span>    <span class="keywordtype">signed</span> <span class="keywordtype">char</span> <a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a0b66d4f6afaaebe0bc8ef720445659f0">MatchingInput</a>;<span class="comment"></span>
+<a name="l00110"></a>00110 <span class="comment">    /// Code - The constraint code, either the register name (in braces) or the</span>
+<a name="l00111"></a>00111 <span class="comment">    /// constraint letter/number.</span>
+<a name="l00112"></a><a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a907e764ba5f5a8cf55fcddac6c782d53">00112</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1InlineAsm.html#a20147abed6937af2e166ff3f377d1c34">ConstraintCodeVector</a> <a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a907e764ba5f5a8cf55fcddac6c782d53">Codes</a>;<span class="comment"></span>
+<a name="l00113"></a>00113 <span class="comment">    /// Default constructor.</span>
+<a name="l00114"></a><a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a718962439330a671526f79e095d85eac">00114</a> <span class="comment"></span>    <a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a718962439330a671526f79e095d85eac" title="Default constructor.">SubConstraintInfo</a>() : <a class="code" href="structllvm_1_1InlineAsm_1_1SubConstraintInfo.html#a0b66d4f6afaaebe0bc8ef720445659f0">MatchingInput</a>(-1) {}
+<a name="l00115"></a>00115   };
+<a name="l00116"></a>00116 
+<a name="l00117"></a><a class="code" href="classllvm_1_1InlineAsm.html#ab47de337f6d65d3be4c4210f8ca3c755">00117</a>   <span class="keyword">typedef</span> std::vector<SubConstraintInfo> <a class="code" href="classllvm_1_1InlineAsm.html#ab47de337f6d65d3be4c4210f8ca3c755">SubConstraintInfoVector</a>;
+<a name="l00118"></a><a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">00118</a>   <span class="keyword">struct </span><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html">ConstraintInfo</a>;
+<a name="l00119"></a>00119   <span class="keyword">typedef</span> std::vector<ConstraintInfo> <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">ConstraintInfoVector</a>;
+<a name="l00120"></a>00120   
+<a name="l00121"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html">00121</a>   <span class="keyword">struct </span><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html">ConstraintInfo</a> {<span class="comment"></span>
+<a name="l00122"></a>00122 <span class="comment">    /// Type - The basic type of the constraint: input/output/clobber</span>
+<a name="l00123"></a>00123 <span class="comment">    ///</span>
+<a name="l00124"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a3400e49d5c9d94f96aa1117ecd0b799d">00124</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1InlineAsm.html#a511f48809ad14f13e50b957a137a9d34">ConstraintPrefix</a> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a3400e49d5c9d94f96aa1117ecd0b799d">Type</a>;
+<a name="l00125"></a>00125     <span class="comment"></span>
+<a name="l00126"></a>00126 <span class="comment">    /// isEarlyClobber - "&": output operand writes result before inputs are all</span>
+<a name="l00127"></a>00127 <span class="comment">    /// read.  This is only ever set for an output operand.</span>
+<a name="l00128"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#ad8d69e9e180e95d3db75d01a377c4f7b">00128</a> <span class="comment"></span>    <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#ad8d69e9e180e95d3db75d01a377c4f7b">isEarlyClobber</a>; 
+<a name="l00129"></a>00129     <span class="comment"></span>
+<a name="l00130"></a>00130 <span class="comment">    /// MatchingInput - If this is not -1, this is an output constraint where an</span>
+<a name="l00131"></a>00131 <span class="comment">    /// input constraint is required to match it (e.g. "0").  The value is the</span>
+<a name="l00132"></a>00132 <span class="comment">    /// constraint number that matches this one (for example, if this is</span>
+<a name="l00133"></a>00133 <span class="comment">    /// constraint #0 and constraint #4 has the value "0", this will be 4).</span>
+<a name="l00134"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#ab97bb7b71dc672158ceca4872e3bd65b">00134</a> <span class="comment"></span>    <span class="keywordtype">signed</span> <span class="keywordtype">char</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#ab97bb7b71dc672158ceca4872e3bd65b">MatchingInput</a>;
+<a name="l00135"></a>00135     <span class="comment"></span>
+<a name="l00136"></a>00136 <span class="comment">    /// hasMatchingInput - Return true if this is an output constraint that has</span>
+<a name="l00137"></a>00137 <span class="comment">    /// a matching input constraint.</span>
+<a name="l00138"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a7f1ace23db4245f4e3f4ca1a6cde24a9">00138</a> <span class="comment"></span>    <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a7f1ace23db4245f4e3f4ca1a6cde24a9">hasMatchingInput</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#ab97bb7b71dc672158ceca4872e3bd65b">MatchingInput</a> != -1; }
+<a name="l00139"></a>00139     <span class="comment"></span>
+<a name="l00140"></a>00140 <span class="comment">    /// isCommutative - This is set to true for a constraint that is commutative</span>
+<a name="l00141"></a>00141 <span class="comment">    /// with the next operand.</span>
+<a name="l00142"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a0f648e1a394e583d417765348cf69aaa">00142</a> <span class="comment"></span>    <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a0f648e1a394e583d417765348cf69aaa">isCommutative</a>;
+<a name="l00143"></a>00143     <span class="comment"></span>
+<a name="l00144"></a>00144 <span class="comment">    /// isIndirect - True if this operand is an indirect operand.  This means</span>
+<a name="l00145"></a>00145 <span class="comment">    /// that the address of the source or destination is present in the call</span>
+<a name="l00146"></a>00146 <span class="comment">    /// instruction, instead of it being returned or passed in explicitly.  This</span>
+<a name="l00147"></a>00147 <span class="comment">    /// is represented with a '*' in the asm string.</span>
+<a name="l00148"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#acbf697bfd59727faf13eeb80fdf90d79">00148</a> <span class="comment"></span>    <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#acbf697bfd59727faf13eeb80fdf90d79">isIndirect</a>;
+<a name="l00149"></a>00149     <span class="comment"></span>
+<a name="l00150"></a>00150 <span class="comment">    /// Code - The constraint code, either the register name (in braces) or the</span>
+<a name="l00151"></a>00151 <span class="comment">    /// constraint letter/number.</span>
+<a name="l00152"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a45da89271c079571aad8d046b1e612b9">00152</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1InlineAsm.html#a20147abed6937af2e166ff3f377d1c34">ConstraintCodeVector</a> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a45da89271c079571aad8d046b1e612b9">Codes</a>;
+<a name="l00153"></a>00153     <span class="comment"></span>
+<a name="l00154"></a>00154 <span class="comment">    /// isMultipleAlternative - '|': has multiple-alternative constraints.</span>
+<a name="l00155"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#adb37fd376d51ba0400e0d4a718b82f34">00155</a> <span class="comment"></span>    <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#adb37fd376d51ba0400e0d4a718b82f34" title="isMultipleAlternative - '|': has multiple-alternative constraints.">isMultipleAlternative</a>;
+<a name="l00156"></a>00156     <span class="comment"></span>
+<a name="l00157"></a>00157 <span class="comment">    /// multipleAlternatives - If there are multiple alternative constraints,</span>
+<a name="l00158"></a>00158 <span class="comment">    /// this array will contain them.  Otherwise it will be empty.</span>
+<a name="l00159"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#abceda5166e96dabf2ea376669b86699d">00159</a> <span class="comment"></span>    <a class="code" href="classllvm_1_1InlineAsm.html#ab47de337f6d65d3be4c4210f8ca3c755">SubConstraintInfoVector</a> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#abceda5166e96dabf2ea376669b86699d">multipleAlternatives</a>;
+<a name="l00160"></a>00160     <span class="comment"></span>
+<a name="l00161"></a>00161 <span class="comment">    /// The currently selected alternative constraint index.</span>
+<a name="l00162"></a><a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a644cffb72161b4ee4261bbd0611851da">00162</a> <span class="comment"></span>    <span class="keywordtype">unsigned</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#a644cffb72161b4ee4261bbd0611851da" title="The currently selected alternative constraint index.">currentAlternativeIndex</a>;
+<a name="l00163"></a>00163     <span class="comment"></span>
+<a name="l00164"></a>00164 <span class="comment">    ///Default constructor.</span>
+<a name="l00165"></a>00165 <span class="comment"></span>    <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa4484fe312dc0f3a77bac05d2927e4cc" title="Default constructor.">ConstraintInfo</a>();
+<a name="l00166"></a>00166     <span class="comment"></span>
+<a name="l00167"></a>00167 <span class="comment">    /// Copy constructor.</span>
+<a name="l00168"></a>00168 <span class="comment"></span>    <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa4484fe312dc0f3a77bac05d2927e4cc" title="Default constructor.">ConstraintInfo</a>(<span class="keyword">const</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html">ConstraintInfo</a> &other);
+<a name="l00169"></a>00169     <span class="comment"></span>
+<a name="l00170"></a>00170 <span class="comment">    /// Parse - Analyze the specified string (e.g. "=*&{eax}") and fill in the</span>
+<a name="l00171"></a>00171 <span class="comment">    /// fields in this structure.  If the constraint string is not understood,</span>
+<a name="l00172"></a>00172 <span class="comment">    /// return true, otherwise return false.</span>
+<a name="l00173"></a>00173 <span class="comment"></span>    <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#aa7d317c3dcdf1f805c995e9b3f2cba5f">Parse</a>(<a class="code" href="classllvm_1_1StringRef.html">StringRef</a> Str, <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">ConstraintInfoVector</a> &ConstraintsSoFar);
+<a name="l00174"></a>00174                <span class="comment"></span>
+<a name="l00175"></a>00175 <span class="comment">    /// selectAlternative - Point this constraint to the alternative constraint</span>
+<a name="l00176"></a>00176 <span class="comment">    /// indicated by the index.</span>
+<a name="l00177"></a>00177 <span class="comment"></span>    <span class="keywordtype">void</span> <a class="code" href="structllvm_1_1InlineAsm_1_1ConstraintInfo.html#af49538ed53bce83dcf52b11234d559a4">selectAlternative</a>(<span class="keywordtype">unsigned</span> index);
+<a name="l00178"></a>00178   };
+<a name="l00179"></a>00179   <span class="comment"></span>
+<a name="l00180"></a>00180 <span class="comment">  /// ParseConstraints - Split up the constraint string into the specific</span>
+<a name="l00181"></a>00181 <span class="comment">  /// constraints and their prefixes.  If this returns an empty vector, and if</span>
+<a name="l00182"></a>00182 <span class="comment">  /// the constraint string itself isn't empty, there was an error parsing.</span>
+<a name="l00183"></a>00183 <span class="comment"></span>  <span class="keyword">static</span> <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">ConstraintInfoVector</a> <a class="code" href="classllvm_1_1InlineAsm.html#a1e1b62e85a762333415f8a32c3dafe9a">ParseConstraints</a>(<a class="code" href="classllvm_1_1StringRef.html">StringRef</a> ConstraintString);
+<a name="l00184"></a>00184   <span class="comment"></span>
+<a name="l00185"></a>00185 <span class="comment">  /// ParseConstraints - Parse the constraints of this inlineasm object, </span>
+<a name="l00186"></a>00186 <span class="comment">  /// returning them the same way that ParseConstraints(str) does.</span>
+<a name="l00187"></a><a class="code" href="classllvm_1_1InlineAsm.html#a1e1b62e85a762333415f8a32c3dafe9a">00187</a> <span class="comment"></span>  <a class="code" href="classllvm_1_1InlineAsm.html#a31526f25930b7a788db22d53b4961f99">ConstraintInfoVector</a> <a class="code" href="classllvm_1_1InlineAsm.html#a1e1b62e85a762333415f8a32c3dafe9a">ParseConstraints</a>()<span class="keyword"> const </span>{
+<a name="l00188"></a>00188     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineAsm.html#a1e1b62e85a762333415f8a32c3dafe9a">ParseConstraints</a>(Constraints);
+<a name="l00189"></a>00189   }
+<a name="l00190"></a>00190   
+<a name="l00191"></a>00191   <span class="comment">// Methods for support type inquiry through isa, cast, and dyn_cast:</span>
+<a name="l00192"></a><a class="code" href="classllvm_1_1InlineAsm.html#afaf51ba283866e0cc1400691f2956c49">00192</a>   <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#afaf51ba283866e0cc1400691f2956c49">classof</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *V) {
+<a name="l00193"></a>00193     <span class="keywordflow">return</span> V-><a class="code" href="classllvm_1_1Value.html#a2983b7b4998ef5b9f51b18c01588af3c">getValueID</a>() == <a class="code" href="classllvm_1_1Value.html#af6d11b38374c4f9e6ba3a6407da2dee0a47980378076d543ddda1fe321bb6a068">Value::InlineAsmVal</a>;
+<a name="l00194"></a>00194   }
+<a name="l00195"></a>00195 
+<a name="l00196"></a>00196   
+<a name="l00197"></a>00197   <span class="comment">// These are helper methods for dealing with flags in the INLINEASM SDNode</span>
+<a name="l00198"></a>00198   <span class="comment">// in the backend.</span>
+<a name="l00199"></a>00199   
+<a name="l00200"></a>00200   <span class="keyword">enum</span> {
+<a name="l00201"></a>00201     <span class="comment">// Fixed operands on an INLINEASM SDNode.</span>
+<a name="l00202"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a561c23f9fc6d8fe79f70cebf74937b30">00202</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a561c23f9fc6d8fe79f70cebf74937b30">Op_InputChain</a> = 0,
+<a name="l00203"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a697a92728413dc065842407e006b87fe">00203</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a697a92728413dc065842407e006b87fe">Op_AsmString</a> = 1,
+<a name="l00204"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5aa7de3aedc6eaa004e9c6523f21fa4a53">00204</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5aa7de3aedc6eaa004e9c6523f21fa4a53">Op_MDNode</a> = 2,
+<a name="l00205"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a5c9183275c4ec573ab0f9ecc202ed26e">00205</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a5c9183275c4ec573ab0f9ecc202ed26e">Op_ExtraInfo</a> = 3,    <span class="comment">// HasSideEffects, IsAlignStack, AsmDialect.</span>
+<a name="l00206"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5afed51603ce2d64ec9af92ff0154913ca">00206</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5afed51603ce2d64ec9af92ff0154913ca">Op_FirstOperand</a> = 4,
+<a name="l00207"></a>00207 
+<a name="l00208"></a>00208     <span class="comment">// Fixed operands on an INLINEASM MachineInstr.</span>
+<a name="l00209"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5aae2aa90a74f555d8cc300b2b36403d1d">00209</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5aae2aa90a74f555d8cc300b2b36403d1d">MIOp_AsmString</a> = 0,
+<a name="l00210"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab049673bbc307f5502c8aba23224a605">00210</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab049673bbc307f5502c8aba23224a605">MIOp_ExtraInfo</a> = 1,    <span class="comment">// HasSideEffects, IsAlignStack, AsmDialect.</span>
+<a name="l00211"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ad8e4e0d44daebe8c07cf5d6d60a4fc30">00211</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ad8e4e0d44daebe8c07cf5d6d60a4fc30">MIOp_FirstOperand</a> = 2,
+<a name="l00212"></a>00212 
+<a name="l00213"></a>00213     <span class="comment">// Interpretation of the MIOp_ExtraInfo bit field.</span>
+<a name="l00214"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a68a61079919e61d3af1002124c2f1ff9">00214</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a68a61079919e61d3af1002124c2f1ff9">Extra_HasSideEffects</a> = 1,
+<a name="l00215"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ada6152484586a08fa711d4b0d44c87e5">00215</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ada6152484586a08fa711d4b0d44c87e5">Extra_IsAlignStack</a> = 2,
+<a name="l00216"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5abff974c258dde829c1c6b6f32667be3a">00216</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5abff974c258dde829c1c6b6f32667be3a">Extra_AsmDialect</a> = 4,
+<a name="l00217"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5aa21b27c3cc4550dcd3ff599dbe76d0c3">00217</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5aa21b27c3cc4550dcd3ff599dbe76d0c3">Extra_MayLoad</a> = 8,
+<a name="l00218"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab01e1dce8dabbbb3d14ed5f34c366008">00218</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab01e1dce8dabbbb3d14ed5f34c366008">Extra_MayStore</a> = 16,
+<a name="l00219"></a>00219 
+<a name="l00220"></a>00220     <span class="comment">// Inline asm operands map to multiple SDNode / MachineInstr operands.</span>
+<a name="l00221"></a>00221     <span class="comment">// The first operand is an immediate describing the asm operand, the low</span>
+<a name="l00222"></a>00222     <span class="comment">// bits is the kind:</span>
+<a name="l00223"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a0ff8c93595b64f062d0462190886d5d7">00223</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a0ff8c93595b64f062d0462190886d5d7">Kind_RegUse</a> = 1,             <span class="comment">// Input register, "r".</span>
+<a name="l00224"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a58bd17e96db00a428e371f768f6e24d6">00224</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a58bd17e96db00a428e371f768f6e24d6">Kind_RegDef</a> = 2,             <span class="comment">// Output register, "=r".</span>
+<a name="l00225"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a3b5d231420c0849846d3cf123aa29e4c">00225</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a3b5d231420c0849846d3cf123aa29e4c">Kind_RegDefEarlyClobber</a> = 3, <span class="comment">// Early-clobber output register, "=&r".</span>
+<a name="l00226"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a6cb34802ef5bc1245d2dac7edb2838be">00226</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a6cb34802ef5bc1245d2dac7edb2838be">Kind_Clobber</a> = 4,            <span class="comment">// Clobbered register, "~r".</span>
+<a name="l00227"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ae2f53b879eee452fe6d66ae04df1530b">00227</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ae2f53b879eee452fe6d66ae04df1530b">Kind_Imm</a> = 5,                <span class="comment">// Immediate.</span>
+<a name="l00228"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab0e1673a8cfccd30c66a4beaf1dd6368">00228</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab0e1673a8cfccd30c66a4beaf1dd6368">Kind_Mem</a> = 6,                <span class="comment">// Memory operand, "m".</span>
+<a name="l00229"></a>00229 
+<a name="l00230"></a><a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a7d42f298685fd953ac7c34200d2b0dd2">00230</a>     <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a7d42f298685fd953ac7c34200d2b0dd2">Flag_MatchingOperand</a> = 0x80000000
+<a name="l00231"></a>00231   };
+<a name="l00232"></a>00232   
+<a name="l00233"></a><a class="code" href="classllvm_1_1InlineAsm.html#a14fae851fdfe0477b8017dfde555e083">00233</a>   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1InlineAsm.html#a14fae851fdfe0477b8017dfde555e083">getFlagWord</a>(<span class="keywordtype">unsigned</span> <a class="code" href="namespacellvm_1_1EngineKind.html#a9df47239a42cd9621ac26d9ecbd57441">Kind</a>, <span class="keywordtype">unsigned</span> NumOps) {
+<a name="l00234"></a>00234     assert(((NumOps << 3) & ~0xffff) == 0 && <span class="stringliteral">"Too many inline asm operands!"</span>);
+<a name="l00235"></a>00235     assert(Kind >= <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a0ff8c93595b64f062d0462190886d5d7">Kind_RegUse</a> && Kind <= <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab0e1673a8cfccd30c66a4beaf1dd6368">Kind_Mem</a> && <span class="stringliteral">"Invalid Kind"</span>);
+<a name="l00236"></a>00236     <span class="keywordflow">return</span> Kind | (NumOps << 3);
+<a name="l00237"></a>00237   }
+<a name="l00238"></a>00238   <span class="comment"></span>
+<a name="l00239"></a>00239 <span class="comment">  /// getFlagWordForMatchingOp - Augment an existing flag word returned by</span>
+<a name="l00240"></a>00240 <span class="comment">  /// getFlagWord with information indicating that this input operand is tied </span>
+<a name="l00241"></a>00241 <span class="comment">  /// to a previous output operand.</span>
+<a name="l00242"></a><a class="code" href="classllvm_1_1InlineAsm.html#ae3ddbf9f1afac4946d59e5a03ffb396f">00242</a> <span class="comment"></span>  <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae3ddbf9f1afac4946d59e5a03ffb396f">getFlagWordForMatchingOp</a>(<span class="keywordtype">unsigned</span> InputFlag,
+<a name="l00243"></a>00243                                            <span class="keywordtype">unsigned</span> MatchedOperandNo) {
+<a name="l00244"></a>00244     assert(MatchedOperandNo <= 0x7fff && <span class="stringliteral">"Too big matched operand"</span>);
+<a name="l00245"></a>00245     assert((InputFlag & ~0xffff) == 0 && <span class="stringliteral">"High bits already contain data"</span>);
+<a name="l00246"></a>00246     <span class="keywordflow">return</span> InputFlag | <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a7d42f298685fd953ac7c34200d2b0dd2">Flag_MatchingOperand</a> | (MatchedOperandNo << 16);
+<a name="l00247"></a>00247   }
+<a name="l00248"></a>00248 <span class="comment"></span>
+<a name="l00249"></a>00249 <span class="comment">  /// getFlagWordForRegClass - Augment an existing flag word returned by</span>
+<a name="l00250"></a>00250 <span class="comment">  /// getFlagWord with the required register class for the following register</span>
+<a name="l00251"></a>00251 <span class="comment">  /// operands.</span>
+<a name="l00252"></a>00252 <span class="comment">  /// A tied use operand cannot have a register class, use the register class</span>
+<a name="l00253"></a>00253 <span class="comment">  /// from the def operand instead.</span>
+<a name="l00254"></a><a class="code" href="classllvm_1_1InlineAsm.html#af053c0d415074d8ab6817bc5fcd38f00">00254</a> <span class="comment"></span>  <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1InlineAsm.html#af053c0d415074d8ab6817bc5fcd38f00">getFlagWordForRegClass</a>(<span class="keywordtype">unsigned</span> InputFlag, <span class="keywordtype">unsigned</span> RC) {
+<a name="l00255"></a>00255     <span class="comment">// Store RC + 1, reserve the value 0 to mean 'no register class'.</span>
+<a name="l00256"></a>00256     ++RC;
+<a name="l00257"></a>00257     assert(RC <= 0x7fff && <span class="stringliteral">"Too large register class ID"</span>);
+<a name="l00258"></a>00258     assert((InputFlag & ~0xffff) == 0 && <span class="stringliteral">"High bits already contain data"</span>);
+<a name="l00259"></a>00259     <span class="keywordflow">return</span> InputFlag | (RC << 16);
+<a name="l00260"></a>00260   }
+<a name="l00261"></a>00261 
+<a name="l00262"></a><a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">00262</a>   <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">getKind</a>(<span class="keywordtype">unsigned</span> Flags) {
+<a name="l00263"></a>00263     <span class="keywordflow">return</span> Flags & 7;
+<a name="l00264"></a>00264   }
+<a name="l00265"></a>00265 
+<a name="l00266"></a><a class="code" href="classllvm_1_1InlineAsm.html#a32c5c5c8245b02828882d927c6cc4163">00266</a>   <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a32c5c5c8245b02828882d927c6cc4163">isRegDefKind</a>(<span class="keywordtype">unsigned</span> Flag){ <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">getKind</a>(Flag) == <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a58bd17e96db00a428e371f768f6e24d6">Kind_RegDef</a>;}
+<a name="l00267"></a><a class="code" href="classllvm_1_1InlineAsm.html#ab0b71a8c50e0f387c5c4fc3882f1ccef">00267</a>   <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#ab0b71a8c50e0f387c5c4fc3882f1ccef">isImmKind</a>(<span class="keywordtype">unsigned</span> Flag) { <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">getKind</a>(Flag) == <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ae2f53b879eee452fe6d66ae04df1530b">Kind_Imm</a>; }
+<a name="l00268"></a><a class="code" href="classllvm_1_1InlineAsm.html#a20a6d489de78da41c6032c7651f405a6">00268</a>   <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a20a6d489de78da41c6032c7651f405a6">isMemKind</a>(<span class="keywordtype">unsigned</span> Flag) { <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">getKind</a>(Flag) == <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5ab0e1673a8cfccd30c66a4beaf1dd6368">Kind_Mem</a>; }
+<a name="l00269"></a><a class="code" href="classllvm_1_1InlineAsm.html#ad1192da842e9cc239677b7963863b7a2">00269</a>   <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#ad1192da842e9cc239677b7963863b7a2">isRegDefEarlyClobberKind</a>(<span class="keywordtype">unsigned</span> Flag) {
+<a name="l00270"></a>00270     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">getKind</a>(Flag) == <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a3b5d231420c0849846d3cf123aa29e4c">Kind_RegDefEarlyClobber</a>;
+<a name="l00271"></a>00271   }
+<a name="l00272"></a><a class="code" href="classllvm_1_1InlineAsm.html#a0641b34e2b6dd46499f40b7214160d44">00272</a>   <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#a0641b34e2b6dd46499f40b7214160d44">isClobberKind</a>(<span class="keywordtype">unsigned</span> Flag) {
+<a name="l00273"></a>00273     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae61e5f4b796419c0912a891100b46916">getKind</a>(Flag) == <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a6cb34802ef5bc1245d2dac7edb2838be">Kind_Clobber</a>;
+<a name="l00274"></a>00274   }
+<a name="l00275"></a>00275 <span class="comment"></span>
+<a name="l00276"></a>00276 <span class="comment">  /// getNumOperandRegisters - Extract the number of registers field from the</span>
+<a name="l00277"></a>00277 <span class="comment">  /// inline asm operand flag.</span>
+<a name="l00278"></a><a class="code" href="classllvm_1_1InlineAsm.html#a4437506c56127755bed59ee1b30e95b9">00278</a> <span class="comment"></span>  <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="classllvm_1_1InlineAsm.html#a4437506c56127755bed59ee1b30e95b9">getNumOperandRegisters</a>(<span class="keywordtype">unsigned</span> Flag) {
+<a name="l00279"></a>00279     <span class="keywordflow">return</span> (Flag & 0xffff) >> 3;
+<a name="l00280"></a>00280   }
+<a name="l00281"></a>00281 <span class="comment"></span>
+<a name="l00282"></a>00282 <span class="comment">  /// isUseOperandTiedToDef - Return true if the flag of the inline asm</span>
+<a name="l00283"></a>00283 <span class="comment">  /// operand indicates it is an use operand that's matched to a def operand.</span>
+<a name="l00284"></a><a class="code" href="classllvm_1_1InlineAsm.html#aa61b16dbbaf7183dfd648ad1e12fb21e">00284</a> <span class="comment"></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#aa61b16dbbaf7183dfd648ad1e12fb21e">isUseOperandTiedToDef</a>(<span class="keywordtype">unsigned</span> Flag, <span class="keywordtype">unsigned</span> &Idx) {
+<a name="l00285"></a>00285     <span class="keywordflow">if</span> ((Flag & <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a7d42f298685fd953ac7c34200d2b0dd2">Flag_MatchingOperand</a>) == 0)
+<a name="l00286"></a>00286       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00287"></a>00287     Idx = (Flag & ~Flag_MatchingOperand) >> 16;
+<a name="l00288"></a>00288     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00289"></a>00289   }
+<a name="l00290"></a>00290 <span class="comment"></span>
+<a name="l00291"></a>00291 <span class="comment">  /// hasRegClassConstraint - Returns true if the flag contains a register</span>
+<a name="l00292"></a>00292 <span class="comment">  /// class constraint.  Sets RC to the register class ID.</span>
+<a name="l00293"></a><a class="code" href="classllvm_1_1InlineAsm.html#ae3d883d313492d5f36a7bf5134190c9c">00293</a> <span class="comment"></span>  <span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="classllvm_1_1InlineAsm.html#ae3d883d313492d5f36a7bf5134190c9c">hasRegClassConstraint</a>(<span class="keywordtype">unsigned</span> Flag, <span class="keywordtype">unsigned</span> &RC) {
+<a name="l00294"></a>00294     <span class="keywordflow">if</span> (Flag & <a class="code" href="classllvm_1_1InlineAsm.html#a25464ee25a64b02cb48356ca2284dab5a7d42f298685fd953ac7c34200d2b0dd2">Flag_MatchingOperand</a>)
+<a name="l00295"></a>00295       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00296"></a>00296     <span class="keywordtype">unsigned</span> High = Flag >> 16;
+<a name="l00297"></a>00297     <span class="comment">// getFlagWordForRegClass() uses 0 to mean no register class, and otherwise</span>
+<a name="l00298"></a>00298     <span class="comment">// stores RC + 1.</span>
+<a name="l00299"></a>00299     <span class="keywordflow">if</span> (!High)
+<a name="l00300"></a>00300       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00301"></a>00301     RC = High - 1;
+<a name="l00302"></a>00302     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00303"></a>00303   }
+<a name="l00304"></a>00304 
+<a name="l00305"></a>00305 };
+<a name="l00306"></a>00306 
+<a name="l00307"></a>00307 } <span class="comment">// End llvm namespace</span>
+<a name="l00308"></a>00308 
+<a name="l00309"></a>00309 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:40 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,44 @@
+<map id="G" name="G">
+<area shape="rect" href="$InlineCost_8h.html" title="llvm/Analysis/InlineCost.h" alt="" coords="1852,84,2033,111"/>
+<area shape="rect" href="$CallingConv_8h.html" title="llvm/CallingConv.h" alt="" coords="1363,393,1499,420"/>
+<area shape="rect" href="$SmallPtrSet_8h.html" title="llvm/ADT/SmallPtrSet.h" alt="" coords="2139,393,2307,420"/>
+<area shape="rect" href="$CallSite_8h.html" title="llvm/Support/CallSite.h" alt="" coords="1119,239,1284,265"/>
+<area shape="rect" href="$SmallVector_8h.html" title="llvm/ADT/SmallVector.h" alt="" coords="2331,393,2499,420"/>
+<area shape="rect" href="$ConstantFolding_8h.html" title="llvm/Analysis/ConstantFolding.h" alt="" coords="2641,84,2863,111"/>
+<area shape="rect" href="$InstructionSimplify_8h.html" title="llvm/Analysis/InstructionSimplify.h" alt="" coords="2887,84,3121,111"/>
+<area shape="rect" href="$Debug_8h.html" title="llvm/Support/Debug.h" alt="" coords="3145,84,3305,111"/>
+<area shape="rect" href="$InstVisitor_8h.html" title="llvm/Support/InstVisitor.h" alt="" coords="1013,84,1192,111"/>
+<area shape="rect" href="$IntrinsicInst_8h.html" title="llvm/IntrinsicInst.h" alt="" coords="908,161,1044,188"/>
+<area shape="rect" href="$GlobalAlias_8h.html" title="llvm/GlobalAlias.h" alt="" coords="17,316,151,343"/>
+<area shape="rect" href="$GetElementPtrTypeIterator_8h.html" title="llvm/Support/GetElementPtrTypeIterator.h" alt="" coords="377,316,663,343"/>
+<area shape="rect" href="$raw__ostream_8h.html" title="llvm/Support/raw_ostream.h" alt="" coords="1509,471,1709,497"/>
+<area shape="rect" href="$Operator_8h.html" title="llvm/Operator.h" alt="" coords="1359,239,1479,265"/>
+<area shape="rect" href="$DataLayout_8h.html" title="llvm/DataLayout.h" alt="" coords="1735,316,1871,343"/>
+<area shape="rect" href="$STLExtras_8h.html" title="llvm/ADT/STLExtras.h" alt="" coords="2523,393,2677,420"/>
+<area shape="rect" href="$SetVector_8h.html" title="llvm/ADT/SetVector.h" alt="" coords="2311,161,2465,188"/>
+<area shape="rect" href="$Statistic_8h.html" title="llvm/ADT/Statistic.h" alt="" coords="3329,84,3473,111"/>
+<area shape="rect" href="$Function_8h.html" title="llvm/Function.h" alt="" coords="929,239,1044,265"/>
+<area shape="rect" href="$DenseMap_8h.html" title="llvm/ADT/DenseMap.h" alt="" coords="1904,393,2064,420"/>
+<area shape="rect" href="$ValueMap_8h.html" title="llvm/ADT/ValueMap.h" alt="" coords="1980,161,2135,188"/>
+<area shape="rect" href="$CodeMetrics_8h.html" title="llvm/Analysis/CodeMetrics.h" alt="" coords="1657,161,1855,188"/>
+<area shape="rect" href="$GlobalValue_8h.html" title="llvm/GlobalValue.h" alt="" coords="348,393,487,420"/>
+<area shape="rect" href="$BasicBlock_8h.html" title="llvm/BasicBlock.h" alt="" coords="788,316,919,343"/>
+<area shape="rect" href="$Compiler_8h.html" title="llvm/Support/Compiler.h" alt="" coords="1707,625,1880,652"/>
+<area shape="rect" href="$Attributes_8h.html" title="llvm/Attributes.h" alt="" coords="941,393,1067,420"/>
+<area shape="rect" href="$Instruction_8h.html" title="llvm/Instruction.h" alt="" coords="736,393,867,420"/>
+<area shape="rect" href="$Twine_8h.html" title="llvm/ADT/Twine.h" alt="" coords="384,471,509,497"/>
+<area shape="rect" href="$DataTypes_8h.html" title="llvm/Support/DataTypes.h" alt="" coords="1281,548,1465,575"/>
+<area shape="rect" href="$User_8h.html" title="llvm/User.h" alt="" coords="533,471,624,497"/>
+<area shape="rect" href="$ilist__node_8h.html" title="llvm/ADT/ilist_node.h" alt="" coords="699,471,851,497"/>
+<area shape="rect" href="$ErrorHandling_8h.html" title="llvm/Support/ErrorHandling.h" alt="" coords="484,548,689,575"/>
+<area shape="rect" href="$StringRef_8h.html" title="llvm/ADT/StringRef.h" alt="" coords="689,625,839,652"/>
+<area shape="rect" href="$PointerIntPair_8h.html" title="llvm/ADT/PointerIntPair.h" alt="" coords="1276,625,1452,652"/>
+<area shape="rect" href="$Instructions_8h.html" title="llvm/Instructions.h" alt="" coords="1196,316,1332,343"/>
+<area shape="rect" href="$DerivedTypes_8h.html" title="llvm/DerivedTypes.h" alt="" coords="1192,393,1339,420"/>
+<area shape="rect" href="$Type_8h.html" title="llvm/Type.h" alt="" coords="1293,471,1384,497"/>
+<area shape="rect" href="$Intrinsics_8h.html" title="llvm/Intrinsics.h" alt="" coords="684,239,804,265"/>
+<area shape="rect" href="$Module_8h.html" title="llvm/Module.h" alt="" coords="1220,161,1329,188"/>
+<area shape="rect" href="$Constants_8h.html" title="llvm/Constants.h" alt="" coords="175,316,303,343"/>
+<area shape="rect" href="$OperandTraits_8h.html" title="llvm/OperandTraits.h" alt="" coords="121,393,273,420"/>
+<area shape="rect" href="$Pass_8h.html" title="llvm/Pass.h" alt="" coords="1795,548,1885,575"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+64e5d12abeec8d2854b5c2ad912d7d3b
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/InlineCost_8cpp__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineFunction_8cpp.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineFunction_8cpp.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineFunction_8cpp.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineFunction_8cpp.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,395 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InlineFunction.cpp File Reference</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_74e9364f374e99e3aeab4fae4e196292.html">lib</a>      </li>
+      <li class="navelem"><a class="el" href="dir_22ea62e2015f6a823fddac4ac38ba517.html">Transforms</a>      </li>
+      <li class="navelem"><a class="el" href="dir_256b03a856f3de95632a509cd258a236.html">Utils</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="summary">
+<a href="#func-members">Functions</a>  </div>
+  <div class="headertitle">
+<div class="title">InlineFunction.cpp File Reference</div>  </div>
+</div>
+<div class="contents">
+<div class="textblock"><code>#include "<a class="el" href="Cloning_8h_source.html">llvm/Transforms/Utils/Cloning.h</a>"</code><br/>
+<code>#include "<a class="el" href="Attributes_8h_source.html">llvm/Attributes.h</a>"</code><br/>
+<code>#include "<a class="el" href="Constants_8h_source.html">llvm/Constants.h</a>"</code><br/>
+<code>#include "<a class="el" href="DebugInfo_8h_source.html">llvm/DebugInfo.h</a>"</code><br/>
+<code>#include "<a class="el" href="DerivedTypes_8h_source.html">llvm/DerivedTypes.h</a>"</code><br/>
+<code>#include "<a class="el" href="IRBuilder_8h_source.html">llvm/IRBuilder.h</a>"</code><br/>
+<code>#include "<a class="el" href="Instructions_8h_source.html">llvm/Instructions.h</a>"</code><br/>
+<code>#include "<a class="el" href="IntrinsicInst_8h_source.html">llvm/IntrinsicInst.h</a>"</code><br/>
+<code>#include "<a class="el" href="Intrinsics_8h_source.html">llvm/Intrinsics.h</a>"</code><br/>
+<code>#include "<a class="el" href="Module_8h_source.html">llvm/Module.h</a>"</code><br/>
+<code>#include "<a class="el" href="SmallVector_8h_source.html">llvm/ADT/SmallVector.h</a>"</code><br/>
+<code>#include "<a class="el" href="StringExtras_8h_source.html">llvm/ADT/StringExtras.h</a>"</code><br/>
+<code>#include "<a class="el" href="CallGraph_8h_source.html">llvm/Analysis/CallGraph.h</a>"</code><br/>
+<code>#include "<a class="el" href="InstructionSimplify_8h_source.html">llvm/Analysis/InstructionSimplify.h</a>"</code><br/>
+<code>#include "<a class="el" href="CallSite_8h_source.html">llvm/Support/CallSite.h</a>"</code><br/>
+<code>#include "<a class="el" href="DataLayout_8h_source.html">llvm/DataLayout.h</a>"</code><br/>
+<code>#include "<a class="el" href="Local_8h_source.html">llvm/Transforms/Utils/Local.h</a>"</code><br/>
+</div><div class="textblock"><div class="dynheader">
+Include dependency graph for InlineFunction.cpp:</div>
+<div class="dyncontent">
+<div class="center"><img src="InlineFunction_8cpp__incl.png" border="0" usemap="#InlineFunction_8cpp" alt=""/></div>
+<!-- MAP 0 -->
+</div>
+</div>
+<p><a href="InlineFunction_8cpp_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr><td colspan="2"><h2><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="X86DisassemblerDecoder_8c.html#a6156fe0b594c9754f386f6c6a30c8165">bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#a8a5477ba7f5e6636e418ee33a310dba8">HandleCallsInBlockInlinedThroughInvoke</a> (<a class="el" href="classllvm_1_1BasicBlock.html">BasicBlock</a> *BB, InvokeInliningInfo &Invoke)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#aae72e0be5e309374360bff57c16a31ee">HandleInlinedInvoke</a> (<a class="el" href="classllvm_1_1InvokeInst.html">InvokeInst</a> *II, <a class="el" href="classllvm_1_1BasicBlock.html">BasicBlock</a> *FirstNewBlock, <a class="el" href="structllvm_1_1ClonedCodeInfo.html">ClonedCodeInfo</a> &InlinedCodeInfo)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#a1d19879a40bcc9f91d922869cc5938f1">UpdateCallGraphAfterInlining</a> (<a class="el" href="classllvm_1_1CallSite.html">CallSite</a> CS, <a class="el" href="classllvm_1_1Function.html#a6742ba0740034550bed98bc80596f7ad">Function::iterator</a> FirstNewBlock, <a class="el" href="namespacellvm.html#a9c9330452728f71805e9f5ed77e8a454">ValueToValueMapTy</a> &VMap, <a class="el" href="classllvm_1_1InlineFunctionInfo.html">InlineFunctionInfo</a> &IFI)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classllvm_1_1Value.html">Value</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#a28e1413decf2fc1330e9016e49db9a96">HandleByValArgument</a> (<a class="el" href="classllvm_1_1Value.html">Value</a> *Arg, <a class="el" href="classllvm_1_1Instruction.html">Instruction</a> *TheCall, const <a class="el" href="classllvm_1_1Function.html">Function</a> *CalledFunc, <a class="el" href="classllvm_1_1InlineFunctionInfo.html">InlineFunctionInfo</a> &IFI, <a class="el" href="classunsigned.html">unsigned</a> ByValAlignment)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="X86DisassemblerDecoder_8c.html#a6156fe0b594c9754f386f6c6a30c8165">bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#ae21f217cd2f8044e639f13111a0b37db">isUsedByLifetimeMarker</a> (<a class="el" href="classllvm_1_1Value.html">Value</a> *V)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="X86DisassemblerDecoder_8c.html#a6156fe0b594c9754f386f6c6a30c8165">bool</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#afaa78d0b3224d3175937f997dc2bc688">hasLifetimeMarkers</a> (<a class="el" href="classllvm_1_1AllocaInst.html">AllocaInst</a> *AI)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classllvm_1_1DebugLoc.html">DebugLoc</a> </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#ad85ea9d2b52150630da3211a12057dfe">updateInlinedAtInfo</a> (const <a class="el" href="classllvm_1_1DebugLoc.html">DebugLoc</a> &DL, const <a class="el" href="classllvm_1_1DebugLoc.html">DebugLoc</a> &InlinedAtDL, <a class="el" href="classllvm_1_1LLVMContext.html">LLVMContext</a> &Ctx)</td></tr>
+<tr><td class="memItemLeft" align="right" valign="top">static void </td><td class="memItemRight" valign="bottom"><a class="el" href="InlineFunction_8cpp.html#a67d41e5dcf9429da9de95bfeed648c86">fixupLineNumbers</a> (<a class="el" href="classllvm_1_1Function.html">Function</a> *Fn, <a class="el" href="classllvm_1_1Function.html#a6742ba0740034550bed98bc80596f7ad">Function::iterator</a> FI, <a class="el" href="classllvm_1_1Instruction.html">Instruction</a> *TheCall)</td></tr>
+</table>
+<hr/><h2>Function Documentation</h2>
+<a class="anchor" id="a67d41e5dcf9429da9de95bfeed648c86"></a><!-- doxytag: member="InlineFunction.cpp::fixupLineNumbers" ref="a67d41e5dcf9429da9de95bfeed648c86" args="(Function *Fn, Function::iterator FI, Instruction *TheCall)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static void fixupLineNumbers </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Function.html">Function</a> * </td>
+          <td class="paramname"><em>Fn</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Function.html#a6742ba0740034550bed98bc80596f7ad">Function::iterator</a> </td>
+          <td class="paramname"><em>FI</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Instruction.html">Instruction</a> * </td>
+          <td class="paramname"><em>TheCall</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>fixupLineNumbers - Update inlined instructions' line numbers to to encode location where these instructions are inlined. </p>
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00457">457</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="DebugInfo_8cpp_source.html#l00731">llvm::createInlinedVariable()</a>, <a class="el" href="Function_8h_source.html#l00352">llvm::Function::end()</a>, <a class="el" href="Instruction_8h_source.html#l00177">llvm::Instruction::getDebugLoc()</a>, <a class="el" href="DebugLoc_8h_source.html#l00068">llvm::DebugLoc::isUnknown()</a>, and <a class="el" href="InlineFunction_8cpp_source.html#l00441">updateInlinedAtInfo()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00489">llvm::InlineFunction()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a28e1413decf2fc1330e9016e49db9a96"></a><!-- doxytag: member="InlineFunction.cpp::HandleByValArgument" ref="a28e1413decf2fc1330e9016e49db9a96" args="(Value *Arg, Instruction *TheCall, const Function *CalledFunc, InlineFunctionInfo &IFI, unsigned ByValAlignment)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="classllvm_1_1Value.html">Value</a>* HandleByValArgument </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Value.html">Value</a> * </td>
+          <td class="paramname"><em>Arg</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Instruction.html">Instruction</a> * </td>
+          <td class="paramname"><em>TheCall</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="classllvm_1_1Function.html">Function</a> * </td>
+          <td class="paramname"><em>CalledFunc</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1InlineFunctionInfo.html">InlineFunctionInfo</a> & </td>
+          <td class="paramname"><em>IFI</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classunsigned.html">unsigned</a> </td>
+          <td class="paramname"><em>ByValAlignment</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>HandleByValArgument - When inlining a call site that has a byval argument, we have to make the implicit memcpy explicit by adding it. </p>
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00330">330</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="Function_8h_source.html#l00350">llvm::Function::begin()</a>, <a class="el" href="Constants_8cpp_source.html#l00460">llvm::ConstantInt::get()</a>, <a class="el" href="Value_8cpp_source.html#l00468">llvm::Value::getContext()</a>, <a class="el" href="Function_8cpp_source.html#l00611">llvm::Intrinsic::getDeclaration()</a>, <a class="el" href="Constants_8cpp_source.html#l00413">llvm::ConstantInt::getFalse()</a>, <a class="el" href="Type_8cpp_source.html#l00240">llvm::Type::getInt32Ty()</a>, <a class="el" href="Type_8cpp_source.html#l00241">llvm::Type::getInt64Ty()</a>, <a class="el" href="Type_8cpp_source.html#l00283">llvm::Type::getInt8PtrTy()</a>, <a class="el" href="Value_8cpp_source.html#l00164">llvm::Value::getName()</a>, <a class="el" href="Local_8cpp_source.html#l00805">llvm::getOrEnforceKnownAlignment()</a>, <a class="el" href="Instruction_8h_source.html#l00051">llvm::Instruction::getParent()</a>, <a class="el" href="BasicBlock_8h_source.
 html#l00110">llvm::BasicBlock::getParent()</a>, <a class="el" href="GlobalValue_8h_source.html#l00286">llvm::GlobalValue::getParent()</a>, <a class="el" href="DataLayout_8cpp_source.html#l00653">llvm::DataLayout::getPrefTypeAlignment()</a>, <a class="el" href="Constants_8cpp_source.html#l01688">llvm::ConstantExpr::getSizeOf()</a>, <a class="el" href="Value_8h_source.html#l00106">llvm::Value::getType()</a>, <a class="el" href="DataLayout_8h_source.html#l00293">llvm::DataLayout::getTypeStoreSize()</a>, <a class="el" href="TargetLibraryInfo_8h_source.html#l00218">llvm::LibFunc::memcpy</a>, <a class="el" href="Function_8h_source.html#l00229">llvm::Function::onlyReadsMemory()</a>, and <a class="el" href="Cloning_8h_source.html#l00167">llvm::InlineFunctionInfo::TD</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00489">llvm::InlineFunction()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8a5477ba7f5e6636e418ee33a310dba8"></a><!-- doxytag: member="InlineFunction.cpp::HandleCallsInBlockInlinedThroughInvoke" ref="a8a5477ba7f5e6636e418ee33a310dba8" args="(BasicBlock *BB, InvokeInliningInfo &Invoke)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="X86DisassemblerDecoder_8c.html#a6156fe0b594c9754f386f6c6a30c8165">bool</a> HandleCallsInBlockInlinedThroughInvoke </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1BasicBlock.html">BasicBlock</a> * </td>
+          <td class="paramname"><em>BB</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">InvokeInliningInfo & </td>
+          <td class="paramname"><em>Invoke</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>HandleCallsInBlockInlinedThroughInvoke - When we inline a basic block into an invoke, we have to turn all of the calls that can throw into invokes. This function analyze BB to see if there are any calls, and if so, it rewrites them to be invokes that jump to InvokeDest and fills in the PHI nodes in that block with the values specified in InvokeDestPHIValues.</p>
+<p>Returns true to indicate that the next block should be skipped. </p>
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00164">164</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="CallSite_8h_source.html#l00138">llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_begin()</a>, <a class="el" href="CallSite_8h_source.html#l00144">llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_end()</a>, <a class="el" href="BasicBlock_8h_source.html#l00189">llvm::BasicBlock::begin()</a>, <a class="el" href="Instructions_8h_source.html#l02966">llvm::InvokeInst::Create()</a>, <a class="el" href="Instructions_8h_source.html#l01322">llvm::CallInst::doesNotThrow()</a>, <a class="el" href="Casting_8h_source.html#l00233">llvm::dyn_cast()</a>, <a class="el" href="BasicBlock_8h_source.html#l00191">llvm::BasicBlock::end()</a>, <a class="el" href="Instructions_8h_source.html#l01257">llvm::CallInst::getAttributes()</a>, <a class="el" href="Instructions_8h_source.html#l01352">llvm::CallInst::getCalledValue()</a>, <a class="el" href="Instructions_8h_source.html#l01247">llvm:
 :CallInst::getCallingConv()</a>, <a class="el" href="Instructions_8h_source.html#l02223">llvm::LandingPadInst::getClause()</a>, <a class="el" href="BasicBlock_8h_source.html#l00204">llvm::BasicBlock::getInstList()</a>, <a class="el" href="Value_8cpp_source.html#l00164">llvm::Value::getName()</a>, <a class="el" href="Instructions_8h_source.html#l02236">llvm::LandingPadInst::getNumClauses()</a>, <a class="el" href="ARMBaseInfo_8h_source.html#l00097">llvm::ARM_PROC::I</a>, <a class="el" href="Value_8cpp_source.html#l00297">llvm::Value::replaceAllUsesWith()</a>, <a class="el" href="SubtargetFeature_8cpp_source.html#l00068">Split()</a>, and <a class="el" href="BasicBlock_8cpp_source.html#l00298">llvm::BasicBlock::splitBasicBlock()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00224">HandleInlinedInvoke()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae72e0be5e309374360bff57c16a31ee"></a><!-- doxytag: member="InlineFunction.cpp::HandleInlinedInvoke" ref="aae72e0be5e309374360bff57c16a31ee" args="(InvokeInst *II, BasicBlock *FirstNewBlock, ClonedCodeInfo &InlinedCodeInfo)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static void HandleInlinedInvoke </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1InvokeInst.html">InvokeInst</a> * </td>
+          <td class="paramname"><em>II</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1BasicBlock.html">BasicBlock</a> * </td>
+          <td class="paramname"><em>FirstNewBlock</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="structllvm_1_1ClonedCodeInfo.html">ClonedCodeInfo</a> & </td>
+          <td class="paramname"><em>InlinedCodeInfo</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>HandleInlinedInvoke - If we inlined an invoke site, we need to convert calls in the body of the inlined function into invokes.</p>
+<p>II is the invoke instruction being inlined. FirstNewBlock is the first block of the inlined code (the last block is the end of the function), and InlineCodeInfo is information about the code that got inlined. </p>
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00224">224</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="Cloning_8h_source.html#l00057">llvm::ClonedCodeInfo::ContainsCalls</a>, <a class="el" href="Function_8h_source.html#l00352">llvm::Function::end()</a>, <a class="el" href="Instruction_8h_source.html#l00051">llvm::Instruction::getParent()</a>, <a class="el" href="BasicBlock_8h_source.html#l00110">llvm::BasicBlock::getParent()</a>, <a class="el" href="Instructions_8h_source.html#l03104">llvm::InvokeInst::getUnwindDest()</a>, <a class="el" href="InlineFunction_8cpp_source.html#l00164">HandleCallsInBlockInlinedThroughInvoke()</a>, and <a class="el" href="BasicBlock_8cpp_source.html#l00216">llvm::BasicBlock::removePredecessor()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00489">llvm::InlineFunction()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afaa78d0b3224d3175937f997dc2bc688"></a><!-- doxytag: member="InlineFunction.cpp::hasLifetimeMarkers" ref="afaa78d0b3224d3175937f997dc2bc688" args="(AllocaInst *AI)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="X86DisassemblerDecoder_8c.html#a6156fe0b594c9754f386f6c6a30c8165">bool</a> hasLifetimeMarkers </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1AllocaInst.html">AllocaInst</a> * </td>
+          <td class="paramname"><em>AI</em></td><td>)</td>
+          <td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00423">423</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="Type_8h_source.html#l00124">llvm::Type::getContext()</a>, <a class="el" href="Type_8cpp_source.html#l00283">llvm::Type::getInt8PtrTy()</a>, <a class="el" href="Instructions_8h_source.html#l00092">llvm::AllocaInst::getType()</a>, <a class="el" href="ARMBaseInfo_8h_source.html#l00097">llvm::ARM_PROC::I</a>, <a class="el" href="InlineFunction_8cpp_source.html#l00406">isUsedByLifetimeMarker()</a>, <a class="el" href="Value_8h_source.html#l00145">llvm::Value::use_begin()</a>, and <a class="el" href="Value_8h_source.html#l00147">llvm::Value::use_end()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00489">llvm::InlineFunction()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae21f217cd2f8044e639f13111a0b37db"></a><!-- doxytag: member="InlineFunction.cpp::isUsedByLifetimeMarker" ref="ae21f217cd2f8044e639f13111a0b37db" args="(Value *V)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="X86DisassemblerDecoder_8c.html#a6156fe0b594c9754f386f6c6a30c8165">bool</a> isUsedByLifetimeMarker </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Value.html">Value</a> * </td>
+          <td class="paramname"><em>V</em></td><td>)</td>
+          <td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00406">406</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="Value_8h_source.html#l00145">llvm::Value::use_begin()</a>, and <a class="el" href="Value_8h_source.html#l00147">llvm::Value::use_end()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00423">hasLifetimeMarkers()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d19879a40bcc9f91d922869cc5938f1"></a><!-- doxytag: member="InlineFunction.cpp::UpdateCallGraphAfterInlining" ref="a1d19879a40bcc9f91d922869cc5938f1" args="(CallSite CS, Function::iterator FirstNewBlock, ValueToValueMapTy &VMap, InlineFunctionInfo &IFI)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static void UpdateCallGraphAfterInlining </td>
+          <td>(</td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1CallSite.html">CallSite</a> </td>
+          <td class="paramname"><em>CS</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1Function.html#a6742ba0740034550bed98bc80596f7ad">Function::iterator</a> </td>
+          <td class="paramname"><em>FirstNewBlock</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="namespacellvm.html#a9c9330452728f71805e9f5ed77e8a454">ValueToValueMapTy</a> & </td>
+          <td class="paramname"><em>VMap</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1InlineFunctionInfo.html">InlineFunctionInfo</a> & </td>
+          <td class="paramname"><em>IFI</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>UpdateCallGraphAfterInlining - Once we have cloned code over from a callee into the caller, update the specified callgraph to reflect the changes we made. Note that it's possible that not all code was copied over, so only some edges of the callgraph may remain. </p>
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00268">268</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="CallGraph_8h_source.html#l00261">llvm::CallGraphNode::addCalledFunction()</a>, <a class="el" href="CallGraph_8h_source.html#l00213">llvm::CallGraphNode::begin()</a>, <a class="el" href="Cloning_8h_source.html#l00166">llvm::InlineFunctionInfo::CG</a>, <a class="el" href="Casting_8h_source.html#l00233">llvm::dyn_cast()</a>, <a class="el" href="ValueMap_8h_source.html#l00100">llvm::ValueMap< KeyT, ValueT, Config >::end()</a>, <a class="el" href="CallGraph_8h_source.html#l00214">llvm::CallGraphNode::end()</a>, <a class="el" href="LLParser_8cpp.html#a33ece1ef8074506a15d7f86eb76dbae6">F()</a>, <a class="el" href="ValueMap_8h_source.html#l00117">llvm::ValueMap< KeyT, ValueT, Config >::find()</a>, <a class="el" href="CallSite_8h_source.html#l00094">llvm::CallSiteBase< FunTy, ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getCalledFunction()</a>, <a class="el" href="CallSite_8h_source.html#l00080">llvm::CallSiteBase< FunTy, 
 ValTy, UserTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction()</a>, <a class="el" href="Instruction_8h_source.html#l00051">llvm::Instruction::getParent()</a>, <a class="el" href="BasicBlock_8h_source.html#l00110">llvm::BasicBlock::getParent()</a>, <a class="el" href="ARMBaseInfo_8h_source.html#l00097">llvm::ARM_PROC::I</a>, <a class="el" href="Cloning_8h_source.html#l00175">llvm::InlineFunctionInfo::InlinedCalls</a>, <a class="el" href="SmallVector_8h_source.html#l00231">llvm::SmallVectorTemplateBase< T, isPodLike >::push_back()</a>, and <a class="el" href="CallGraph_8cpp_source.html#l00280">llvm::CallGraphNode::removeCallEdgeFor()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00489">llvm::InlineFunction()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad85ea9d2b52150630da3211a12057dfe"></a><!-- doxytag: member="InlineFunction.cpp::updateInlinedAtInfo" ref="ad85ea9d2b52150630da3211a12057dfe" args="(const DebugLoc &DL, const DebugLoc &InlinedAtDL, LLVMContext &Ctx)" -->
+<div class="memitem">
+<div class="memproto">
+      <table class="memname">
+        <tr>
+          <td class="memname">static <a class="el" href="classllvm_1_1DebugLoc.html">DebugLoc</a> updateInlinedAtInfo </td>
+          <td>(</td>
+          <td class="paramtype">const <a class="el" href="classllvm_1_1DebugLoc.html">DebugLoc</a> & </td>
+          <td class="paramname"><em>DL</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const <a class="el" href="classllvm_1_1DebugLoc.html">DebugLoc</a> & </td>
+          <td class="paramname"><em>InlinedAtDL</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype"><a class="el" href="classllvm_1_1LLVMContext.html">LLVMContext</a> & </td>
+          <td class="paramname"><em>Ctx</em> </td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td><code> [static]</code></td>
+        </tr>
+      </table>
+</div>
+<div class="memdoc">
+<p>updateInlinedAtInfo - Helper function used by fixupLineNumbers to recursively update InlinedAtEntry of a DebugLoc. </p>
+
+<p>Definition at line <a class="el" href="InlineFunction_8cpp_source.html#l00441">441</a> of file <a class="el" href="InlineFunction_8cpp_source.html">InlineFunction.cpp</a>.</p>
+
+<p>References <a class="el" href="DebugLoc_8cpp_source.html#l00074">llvm::DebugLoc::get()</a>, <a class="el" href="DebugLoc_8cpp_source.html#l00100">llvm::DebugLoc::getAsMDNode()</a>, <a class="el" href="DebugLoc_8h_source.html#l00074">llvm::DebugLoc::getCol()</a>, <a class="el" href="DebugLoc_8cpp_source.html#l00117">llvm::DebugLoc::getFromDILocation()</a>, <a class="el" href="DebugLoc_8cpp_source.html#l00037">llvm::DebugLoc::getInlinedAt()</a>, <a class="el" href="DebugLoc_8h_source.html#l00070">llvm::DebugLoc::getLine()</a>, and <a class="el" href="DebugLoc_8cpp_source.html#l00020">llvm::DebugLoc::getScope()</a>.</p>
+
+<p>Referenced by <a class="el" href="InlineFunction_8cpp_source.html#l00457">fixupLineNumbers()</a>.</p>
+
+</div>
+</div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:39:30 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,45 @@
+<map id="G" name="G">
+<area shape="rect" href="$CallingConv_8h.html" title="llvm/CallingConv.h" alt="" coords="783,548,919,575"/>
+<area shape="rect" href="$Instructions_8h.html" title="llvm/Instructions.h" alt="" coords="1343,393,1479,420"/>
+<area shape="rect" href="$Type_8h.html" title="llvm/Type.h" alt="" coords="235,703,325,729"/>
+<area shape="rect" href="$IntrinsicInst_8h.html" title="llvm/IntrinsicInst.h" alt="" coords="1644,316,1780,343"/>
+<area shape="rect" href="$Module_8h.html" title="llvm/Module.h" alt="" coords="496,393,605,420"/>
+<area shape="rect" href="$CallGraph_8h.html" title="llvm/Analysis/CallGraph.h" alt="" coords="1297,239,1479,265"/>
+<area shape="rect" href="$CallSite_8h.html" title="llvm/Support/CallSite.h" alt="" coords="1239,316,1404,343"/>
+<area shape="rect" href="$InlineCost_8h.html" title="llvm/Analysis/InlineCost.h" alt="" coords="2337,161,2519,188"/>
+<area shape="rect" href="$Transforms_2IPO_8h.html" title="llvm/Transforms/IPO.h" alt="" coords="1963,84,2120,111"/>
+<area shape="rect" href="$InlinerPass_8h.html" title="llvm/Transforms/IPO/InlinerPass.h" alt="" coords="1340,84,1569,111"/>
+<area shape="rect" href="$DataLayout_8h.html" title="llvm/DataLayout.h" alt="" coords="1749,239,1885,265"/>
+<area shape="rect" href="$InstrTypes_8h.html" title="llvm/InstrTypes.h" alt="" coords="943,548,1068,575"/>
+<area shape="rect" href="$DerivedTypes_8h.html" title="llvm/DerivedTypes.h" alt="" coords="1012,625,1159,652"/>
+<area shape="rect" href="$ErrorHandling_8h.html" title="llvm/Support/ErrorHandling.h" alt="" coords="451,703,656,729"/>
+<area shape="rect" href="$Attributes_8h.html" title="llvm/Attributes.h" alt="" coords="1193,548,1319,575"/>
+<area shape="rect" href="$ArrayRef_8h.html" title="llvm/ADT/ArrayRef.h" alt="" coords="1743,703,1887,729"/>
+<area shape="rect" href="$SmallVector_8h.html" title="llvm/ADT/SmallVector.h" alt="" coords="1913,780,2081,807"/>
+<area shape="rect" href="$IntegersSubset_8h.html" title="llvm/Support/IntegersSubset.h" alt="" coords="1393,548,1609,575"/>
+<area shape="rect" href="$IntegersSubsetMapping_8h.html" title="llvm/Support/IntegersSubsetMapping.h" alt="" coords="1448,471,1717,497"/>
+<area shape="rect" href="$Instruction_8h.html" title="llvm/Instruction.h" alt="" coords="807,625,937,652"/>
+<area shape="rect" href="$OperandTraits_8h.html" title="llvm/OperandTraits.h" alt="" coords="731,703,883,729"/>
+<area shape="rect" href="$Twine_8h.html" title="llvm/ADT/Twine.h" alt="" coords="464,625,589,652"/>
+<area shape="rect" href="$DataTypes_8h.html" title="llvm/Support/DataTypes.h" alt="" coords="601,780,785,807"/>
+<area shape="rect" href="$Casting_8h.html" title="llvm/Support/Casting.h" alt="" coords="324,780,489,807"/>
+<area shape="rect" href="$Constants_8h.html" title="llvm/Constants.h" alt="" coords="1472,625,1600,652"/>
+<area shape="rect" href="$Function_8h.html" title="llvm/Function.h" alt="" coords="707,471,821,497"/>
+<area shape="rect" href="$Intrinsics_8h.html" title="llvm/Intrinsics.h" alt="" coords="1911,625,2031,652"/>
+<area shape="rect" href="$BasicBlock_8h.html" title="llvm/BasicBlock.h" alt="" coords="628,548,759,575"/>
+<area shape="rect" href="$GlobalVariable_8h.html" title="llvm/GlobalVariable.h" alt="" coords="449,548,604,575"/>
+<area shape="rect" href="$GlobalAlias_8h.html" title="llvm/GlobalAlias.h" alt="" coords="292,548,425,575"/>
+<area shape="rect" href="$Metadata_8h.html" title="llvm/Metadata.h" alt="" coords="1200,471,1323,497"/>
+<area shape="rect" href="$OwningPtr_8h.html" title="llvm/ADT/OwningPtr.h" alt="" coords="5,780,160,807"/>
+<area shape="rect" href="$Pass_8h.html" title="llvm/Pass.h" alt="" coords="1479,316,1569,343"/>
+<area shape="rect" href="$GraphTraits_8h.html" title="llvm/ADT/GraphTraits.h" alt="" coords="841,316,1007,343"/>
+<area shape="rect" href="$STLExtras_8h.html" title="llvm/ADT/STLExtras.h" alt="" coords="2489,471,2644,497"/>
+<area shape="rect" href="$ValueHandle_8h.html" title="llvm/Support/ValueHandle.h" alt="" coords="1855,316,2052,343"/>
+<area shape="rect" href="$IncludeFile_8h.html" title="llvm/Support/IncludeFile.h" alt="" coords="1031,316,1215,343"/>
+<area shape="rect" href="$PointerIntPair_8h.html" title="llvm/ADT/PointerIntPair.h" alt="" coords="1855,393,2031,420"/>
+<area shape="rect" href="$DenseMap_8h.html" title="llvm/ADT/DenseMap.h" alt="" coords="2601,316,2761,343"/>
+<area shape="rect" href="$SmallPtrSet_8h.html" title="llvm/ADT/SmallPtrSet.h" alt="" coords="2359,703,2527,729"/>
+<area shape="rect" href="$ValueMap_8h.html" title="llvm/ADT/ValueMap.h" alt="" coords="2652,239,2807,265"/>
+<area shape="rect" href="$CodeMetrics_8h.html" title="llvm/Analysis/CodeMetrics.h" alt="" coords="2329,239,2527,265"/>
+<area shape="rect" href="$CallGraphSCCPass_8h.html" title="llvm/CallGraphSCCPass.h" alt="" coords="1364,161,1545,188"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineSimple_8cpp__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+a367da80e73e620e44d0ee18192b8a86
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,46 @@
+<map id="G" name="G">
+<area shape="rect" href="$Spiller_8h.html" title="Spiller.h" alt="" coords="21,84,93,111"/>
+<area shape="rect" href="$VirtRegMap_8h.html" title="VirtRegMap.h" alt="" coords="2565,239,2669,265"/>
+<area shape="rect" href="$Statistic_8h.html" title="llvm/ADT/Statistic.h" alt="" coords="5,393,149,420"/>
+<area shape="rect" href="$TinyPtrVector_8h.html" title="llvm/ADT/TinyPtrVector.h" alt="" coords="2309,316,2485,343"/>
+<area shape="rect" href="$AliasAnalysis_8h.html" title="llvm/Analysis/AliasAnalysis.h" alt="" coords="2335,84,2535,111"/>
+<area shape="rect" href="$LiveIntervalAnalysis_8h.html" title="llvm/CodeGen/LiveIntervalAnalysis.h" alt="" coords="1637,84,1888,111"/>
+<area shape="rect" href="$MachineInstrBundle_8h.html" title="llvm/CodeGen/MachineInstrBundle.h" alt="" coords="1933,316,2184,343"/>
+<area shape="rect" href="$MachineFunction_8h.html" title="llvm/CodeGen/MachineFunction.h" alt="" coords="1627,316,1859,343"/>
+<area shape="rect" href="$LiveRangeEdit_8h.html" title="llvm/CodeGen/LiveRangeEdit.h" alt="" coords="2960,84,3176,111"/>
+<area shape="rect" href="$Target_2TargetMachine_8h.html" title="llvm/Target/TargetMachine.h" alt="" coords="3251,161,3448,188"/>
+<area shape="rect" href="$LiveStackAnalysis_8h.html" title="llvm/CodeGen/LiveStackAnalysis.h" alt="" coords="1076,84,1316,111"/>
+<area shape="rect" href="$MachineDominators_8h.html" title="llvm/CodeGen/MachineDominators.h" alt="" coords="251,239,504,265"/>
+<area shape="rect" href="$raw__ostream_8h.html" title="llvm/Support/raw_ostream.h" alt="" coords="404,471,604,497"/>
+<area shape="rect" href="$MachineFrameInfo_8h.html" title="llvm/CodeGen/MachineFrameInfo.h" alt="" coords="3395,393,3637,420"/>
+<area shape="rect" href="$MachineLoopInfo_8h.html" title="llvm/CodeGen/MachineLoopInfo.h" alt="" coords="528,239,760,265"/>
+<area shape="rect" href="$MachineRegisterInfo_8h.html" title="llvm/CodeGen/MachineRegisterInfo.h" alt="" coords="2693,239,2947,265"/>
+<area shape="rect" href="$TargetInstrInfo_8h.html" title="llvm/Target/TargetInstrInfo.h" alt="" coords="2088,161,2283,188"/>
+<area shape="rect" href="$CommandLine_8h.html" title="llvm/Support/CommandLine.h" alt="" coords="3160,393,3371,420"/>
+<area shape="rect" href="$Debug_8h.html" title="llvm/Support/Debug.h" alt="" coords="3523,84,3683,111"/>
+<area shape="rect" href="$MachineFunctionPass_8h.html" title="llvm/CodeGen/MachineFunctionPass.h" alt="" coords="936,316,1197,343"/>
+<area shape="rect" href="$TargetRegisterInfo_8h.html" title="llvm/Target/TargetRegisterInfo.h" alt="" coords="2560,316,2779,343"/>
+<area shape="rect" href="$IndexedMap_8h.html" title="llvm/ADT/IndexedMap.h" alt="" coords="2904,316,3075,343"/>
+<area shape="rect" href="$MachineBasicBlock_8h.html" title="llvm/CodeGen/MachineBasicBlock.h" alt="" coords="1336,393,1584,420"/>
+<area shape="rect" href="$ArrayRef_8h.html" title="llvm/ADT/ArrayRef.h" alt="" coords="2789,393,2933,420"/>
+<area shape="rect" href="$DataTypes_8h.html" title="llvm/Support/DataTypes.h" alt="" coords="600,548,784,575"/>
+<area shape="rect" href="$SmallVector_8h.html" title="llvm/ADT/SmallVector.h" alt="" coords="2188,471,2356,497"/>
+<area shape="rect" href="$Compiler_8h.html" title="llvm/Support/Compiler.h" alt="" coords="1119,548,1292,575"/>
+<area shape="rect" href="$STLExtras_8h.html" title="llvm/ADT/STLExtras.h" alt="" coords="2509,393,2664,420"/>
+<area shape="rect" href="$Atomic_8h.html" title="llvm/Support/Atomic.h" alt="" coords="13,471,176,497"/>
+<area shape="rect" href="$Valgrind_8h.html" title="llvm/Support/Valgrind.h" alt="" coords="208,471,376,497"/>
+<area shape="rect" href="$PointerUnion_8h.html" title="llvm/ADT/PointerUnion.h" alt="" coords="2309,393,2485,420"/>
+<area shape="rect" href="$CallSite_8h.html" title="llvm/Support/CallSite.h" alt="" coords="2408,161,2573,188"/>
+<area shape="rect" href="$DenseMap_8h.html" title="llvm/ADT/DenseMap.h" alt="" coords="1069,471,1229,497"/>
+<area shape="rect" href="$LiveInterval_8h.html" title="llvm/CodeGen/LiveInterval.h" alt="" coords="1411,161,1608,188"/>
+<area shape="rect" href="$Allocator_8h.html" title="llvm/Support/Allocator.h" alt="" coords="987,393,1160,420"/>
+<area shape="rect" href="$SlotIndexes_8h.html" title="llvm/CodeGen/SlotIndexes.h" alt="" coords="1424,239,1624,265"/>
+<area shape="rect" href="$BitVector_8h.html" title="llvm/ADT/BitVector.h" alt="" coords="2532,471,2681,497"/>
+<area shape="rect" href="$SmallPtrSet_8h.html" title="llvm/ADT/SmallPtrSet.h" alt="" coords="780,471,948,497"/>
+<area shape="rect" href="$ilist_8h.html" title="llvm/ADT/ilist.h" alt="" coords="1459,471,1573,497"/>
+<area shape="rect" href="$DebugLoc_8h.html" title="llvm/Support/DebugLoc.h" alt="" coords="1659,393,1840,420"/>
+<area shape="rect" href="$Recycler_8h.html" title="llvm/Support/Recycler.h" alt="" coords="1915,393,2083,420"/>
+<area shape="rect" href="$Dominators_8h.html" title="llvm/Analysis/Dominators.h" alt="" coords="428,393,623,420"/>
+<area shape="rect" href="$DominatorInternals_8h.html" title="llvm/Analysis/DominatorInternals.h" alt="" coords="219,316,461,343"/>
+<area shape="rect" href="$LoopInfo_8h.html" title="llvm/Analysis/LoopInfo.h" alt="" coords="536,316,709,343"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+f891a53f09a08d04857ca33aa95519de
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlineSpiller_8cpp_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,1350 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InlineSpiller.cpp Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_74e9364f374e99e3aeab4fae4e196292.html">lib</a>      </li>
+      <li class="navelem"><a class="el" href="dir_f2244d21cf8bec63d11bfc1ad661d96f.html">CodeGen</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">InlineSpiller.cpp</div>  </div>
+</div>
+<div class="contents">
+<a href="InlineSpiller_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===-------- InlineSpiller.cpp - Insert spills and restores inline -------===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// The inline spiller modifies the machine function directly instead of</span>
+<a name="l00011"></a>00011 <span class="comment">// inserting spills and restores in VirtRegMap.</span>
+<a name="l00012"></a>00012 <span class="comment">//</span>
+<a name="l00013"></a>00013 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00014"></a>00014 
+<a name="l00015"></a><a class="code" href="InlineSpiller_8cpp.html#ad78e062f62e0d6e453941fb4ca843e4d">00015</a> <span class="preprocessor">#define DEBUG_TYPE "regalloc"</span>
+<a name="l00016"></a>00016 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="Spiller_8h.html">Spiller.h</a>"</span>
+<a name="l00017"></a>00017 <span class="preprocessor">#include "<a class="code" href="VirtRegMap_8h.html">VirtRegMap.h</a>"</span>
+<a name="l00018"></a>00018 <span class="preprocessor">#include "<a class="code" href="Statistic_8h.html">llvm/ADT/Statistic.h</a>"</span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "<a class="code" href="TinyPtrVector_8h.html">llvm/ADT/TinyPtrVector.h</a>"</span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "<a class="code" href="AliasAnalysis_8h.html">llvm/Analysis/AliasAnalysis.h</a>"</span>
+<a name="l00021"></a>00021 <span class="preprocessor">#include "<a class="code" href="LiveIntervalAnalysis_8h.html">llvm/CodeGen/LiveIntervalAnalysis.h</a>"</span>
+<a name="l00022"></a>00022 <span class="preprocessor">#include "<a class="code" href="LiveRangeEdit_8h.html">llvm/CodeGen/LiveRangeEdit.h</a>"</span>
+<a name="l00023"></a>00023 <span class="preprocessor">#include "<a class="code" href="LiveStackAnalysis_8h.html">llvm/CodeGen/LiveStackAnalysis.h</a>"</span>
+<a name="l00024"></a>00024 <span class="preprocessor">#include "<a class="code" href="MachineDominators_8h.html">llvm/CodeGen/MachineDominators.h</a>"</span>
+<a name="l00025"></a>00025 <span class="preprocessor">#include "<a class="code" href="MachineInstrBundle_8h.html">llvm/CodeGen/MachineInstrBundle.h</a>"</span>
+<a name="l00026"></a>00026 <span class="preprocessor">#include "<a class="code" href="MachineFrameInfo_8h.html">llvm/CodeGen/MachineFrameInfo.h</a>"</span>
+<a name="l00027"></a>00027 <span class="preprocessor">#include "<a class="code" href="MachineFunction_8h.html">llvm/CodeGen/MachineFunction.h</a>"</span>
+<a name="l00028"></a>00028 <span class="preprocessor">#include "<a class="code" href="MachineLoopInfo_8h.html">llvm/CodeGen/MachineLoopInfo.h</a>"</span>
+<a name="l00029"></a>00029 <span class="preprocessor">#include "<a class="code" href="MachineRegisterInfo_8h.html">llvm/CodeGen/MachineRegisterInfo.h</a>"</span>
+<a name="l00030"></a>00030 <span class="preprocessor">#include "<a class="code" href="Target_2TargetMachine_8h.html">llvm/Target/TargetMachine.h</a>"</span>
+<a name="l00031"></a>00031 <span class="preprocessor">#include "<a class="code" href="TargetInstrInfo_8h.html">llvm/Target/TargetInstrInfo.h</a>"</span>
+<a name="l00032"></a>00032 <span class="preprocessor">#include "<a class="code" href="CommandLine_8h.html">llvm/Support/CommandLine.h</a>"</span>
+<a name="l00033"></a>00033 <span class="preprocessor">#include "<a class="code" href="Debug_8h.html">llvm/Support/Debug.h</a>"</span>
+<a name="l00034"></a>00034 <span class="preprocessor">#include "<a class="code" href="raw__ostream_8h.html">llvm/Support/raw_ostream.h</a>"</span>
+<a name="l00035"></a>00035 
+<a name="l00036"></a>00036 <span class="keyword">using namespace </span>llvm;
+<a name="l00037"></a>00037 
+<a name="l00038"></a>00038 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumSpilledRanges,   <span class="stringliteral">"Number of spilled live ranges"</span>);
+<a name="l00039"></a>00039 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumSnippets,        <span class="stringliteral">"Number of spilled snippets"</span>);
+<a name="l00040"></a>00040 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumSpills,          <span class="stringliteral">"Number of spills inserted"</span>);
+<a name="l00041"></a>00041 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumSpillsRemoved,   <span class="stringliteral">"Number of spills removed"</span>);
+<a name="l00042"></a>00042 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumReloads,         <span class="stringliteral">"Number of reloads inserted"</span>);
+<a name="l00043"></a>00043 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumReloadsRemoved,  <span class="stringliteral">"Number of reloads removed"</span>);
+<a name="l00044"></a>00044 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumFolded,          <span class="stringliteral">"Number of folded stack accesses"</span>);
+<a name="l00045"></a>00045 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumFoldedLoads,     <span class="stringliteral">"Number of folded loads"</span>);
+<a name="l00046"></a>00046 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumRemats,          <span class="stringliteral">"Number of rematerialized defs for spilling"</span>);
+<a name="l00047"></a>00047 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumOmitReloadSpill, <span class="stringliteral">"Number of omitted spills of reloads"</span>);
+<a name="l00048"></a>00048 <a class="code" href="Statistic_8h.html#ad6117415b93e5675d5a6c8e1855b3b2f">STATISTIC</a>(NumHoists,          <span class="stringliteral">"Number of hoisted spills"</span>);
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050 <span class="keyword">static</span> <a class="code" href="classllvm_1_1cl_1_1opt.html">cl::opt<bool></a> <a class="code" href="InlineSpiller_8cpp.html#a7819774f1578a13aaf380ec73782c9e4">DisableHoisting</a>(<span class="stringliteral">"disable-spill-hoist"</span>, <a class="code" href="namespacellvm_1_1cl.html#a68075925a54790e71ca790e1d4f21a40a263ac008d8d31f13ce460395fc4cf7e6">cl::Hidden</a>,
+<a name="l00051"></a>00051                                      <a class="code" href="structllvm_1_1cl_1_1desc.html">cl::desc</a>(<span class="stringliteral">"Disable inline spill hoisting"</span>));
+<a name="l00052"></a>00052 
+<a name="l00053"></a>00053 <span class="keyword">namespace </span>{
+<a name="l00054"></a>00054 <span class="keyword">class </span>InlineSpiller : <span class="keyword">public</span> <a class="code" href="classllvm_1_1Spiller.html">Spiller</a> {
+<a name="l00055"></a>00055   <a class="code" href="classllvm_1_1MachineFunction.html">MachineFunction</a> &MF;
+<a name="l00056"></a>00056   <a class="code" href="classllvm_1_1LiveIntervals.html">LiveIntervals</a> &LIS;
+<a name="l00057"></a>00057   <a class="code" href="classllvm_1_1LiveStacks.html">LiveStacks</a> &LSS;
+<a name="l00058"></a>00058   <a class="code" href="classllvm_1_1AliasAnalysis.html">AliasAnalysis</a> *AA;
+<a name="l00059"></a>00059   <a class="code" href="classllvm_1_1MachineDominatorTree.html">MachineDominatorTree</a> &MDT;
+<a name="l00060"></a>00060   <a class="code" href="classllvm_1_1MachineLoopInfo.html">MachineLoopInfo</a> &Loops;
+<a name="l00061"></a>00061   <a class="code" href="classllvm_1_1VirtRegMap.html">VirtRegMap</a> &VRM;
+<a name="l00062"></a>00062   <a class="code" href="classllvm_1_1MachineFrameInfo.html" title="Abstract Stack Frame Information.">MachineFrameInfo</a> &MFI;
+<a name="l00063"></a>00063   <a class="code" href="classllvm_1_1MachineRegisterInfo.html">MachineRegisterInfo</a> &MRI;
+<a name="l00064"></a>00064   <span class="keyword">const</span> <a class="code" href="classllvm_1_1TargetInstrInfo.html">TargetInstrInfo</a> &TII;
+<a name="l00065"></a>00065   <span class="keyword">const</span> <a class="code" href="classllvm_1_1TargetRegisterInfo.html">TargetRegisterInfo</a> &TRI;
+<a name="l00066"></a>00066 
+<a name="l00067"></a>00067   <span class="comment">// Variables that are valid during spill(), but used by multiple methods.</span>
+<a name="l00068"></a>00068   <a class="code" href="classllvm_1_1LiveRangeEdit.html">LiveRangeEdit</a> *Edit;
+<a name="l00069"></a>00069   <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> *StackInt;
+<a name="l00070"></a>00070   <span class="keywordtype">int</span> StackSlot;
+<a name="l00071"></a>00071   <span class="keywordtype">unsigned</span> Original;
+<a name="l00072"></a>00072 
+<a name="l00073"></a>00073   <span class="comment">// All registers to spill to StackSlot, including the main register.</span>
+<a name="l00074"></a>00074   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<unsigned, 8></a> RegsToSpill;
+<a name="l00075"></a>00075 
+<a name="l00076"></a>00076   <span class="comment">// All COPY instructions to/from snippets.</span>
+<a name="l00077"></a>00077   <span class="comment">// They are ignored since both operands refer to the same stack slot.</span>
+<a name="l00078"></a>00078   <a class="code" href="classllvm_1_1SmallPtrSet.html">SmallPtrSet<MachineInstr*, 8></a> SnippetCopies;
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080   <span class="comment">// Values that failed to remat at some point.</span>
+<a name="l00081"></a>00081   <a class="code" href="classllvm_1_1SmallPtrSet.html">SmallPtrSet<VNInfo*, 8></a> UsedValues;
+<a name="l00082"></a>00082 
+<a name="l00083"></a>00083 <span class="keyword">public</span>:
+<a name="l00084"></a>00084   <span class="comment">// Information about a value that was defined by a copy from a sibling</span>
+<a name="l00085"></a>00085   <span class="comment">// register.</span>
+<a name="l00086"></a>00086   <span class="keyword">struct </span>SibValueInfo {
+<a name="l00087"></a>00087     <span class="comment">// True when all reaching defs were reloads: No spill is necessary.</span>
+<a name="l00088"></a>00088     <span class="keywordtype">bool</span> AllDefsAreReloads;
+<a name="l00089"></a>00089 
+<a name="l00090"></a>00090     <span class="comment">// True when value is defined by an original PHI not from splitting.</span>
+<a name="l00091"></a>00091     <span class="keywordtype">bool</span> DefByOrigPHI;
+<a name="l00092"></a>00092 
+<a name="l00093"></a>00093     <span class="comment">// True when the COPY defining this value killed its source.</span>
+<a name="l00094"></a>00094     <span class="keywordtype">bool</span> KillsSource;
+<a name="l00095"></a>00095 
+<a name="l00096"></a>00096     <span class="comment">// The preferred register to spill.</span>
+<a name="l00097"></a>00097     <span class="keywordtype">unsigned</span> SpillReg;
+<a name="l00098"></a>00098 
+<a name="l00099"></a>00099     <span class="comment">// The value of SpillReg that should be spilled.</span>
+<a name="l00100"></a>00100     <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *SpillVNI;
+<a name="l00101"></a>00101 
+<a name="l00102"></a>00102     <span class="comment">// The block where SpillVNI should be spilled. Currently, this must be the</span>
+<a name="l00103"></a>00103     <span class="comment">// block containing SpillVNI->def.</span>
+<a name="l00104"></a>00104     <a class="code" href="classllvm_1_1MachineBasicBlock.html">MachineBasicBlock</a> *SpillMBB;
+<a name="l00105"></a>00105 
+<a name="l00106"></a>00106     <span class="comment">// A defining instruction that is not a sibling copy or a reload, or NULL.</span>
+<a name="l00107"></a>00107     <span class="comment">// This can be used as a template for rematerialization.</span>
+<a name="l00108"></a>00108     <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *DefMI;
+<a name="l00109"></a>00109 
+<a name="l00110"></a>00110     <span class="comment">// List of values that depend on this one.  These values are actually the</span>
+<a name="l00111"></a>00111     <span class="comment">// same, but live range splitting has placed them in different registers,</span>
+<a name="l00112"></a>00112     <span class="comment">// or SSA update needed to insert PHI-defs to preserve SSA form.  This is</span>
+<a name="l00113"></a>00113     <span class="comment">// copies of the current value and phi-kills.  Usually only phi-kills cause</span>
+<a name="l00114"></a>00114     <span class="comment">// more than one dependent value.</span>
+<a name="l00115"></a>00115     <a class="code" href="classllvm_1_1TinyPtrVector.html">TinyPtrVector<VNInfo*></a> Deps;
+<a name="l00116"></a>00116 
+<a name="l00117"></a>00117     SibValueInfo(<span class="keywordtype">unsigned</span> <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI)
+<a name="l00118"></a>00118       : AllDefsAreReloads(<a class="code" href="BasicAliasAnalysis_8cpp.html#a80603f23207dd836075c078e6264204a">true</a>), DefByOrigPHI(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>), KillsSource(<a class="code" href="AliasAnalysisEvaluator_8cpp.html#a3898a228575af19a9b2052f2b3677dce">false</a>),
+<a name="l00119"></a>00119         SpillReg(Reg), SpillVNI(VNI), SpillMBB(0), DefMI(0) {}
+<a name="l00120"></a>00120 
+<a name="l00121"></a>00121     <span class="comment">// Returns true when a def has been found.</span>
+<a name="l00122"></a>00122     <span class="keywordtype">bool</span> hasDef()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> DefByOrigPHI || DefMI; }
+<a name="l00123"></a>00123   };
+<a name="l00124"></a>00124 
+<a name="l00125"></a>00125 <span class="keyword">private</span>:
+<a name="l00126"></a>00126   <span class="comment">// Values in RegsToSpill defined by sibling copies.</span>
+<a name="l00127"></a>00127   <span class="keyword">typedef</span> <a class="code" href="classllvm_1_1DenseMap.html">DenseMap<VNInfo*, SibValueInfo></a> SibValueMap;
+<a name="l00128"></a>00128   SibValueMap SibValues;
+<a name="l00129"></a>00129 
+<a name="l00130"></a>00130   <span class="comment">// Dead defs generated during spilling.</span>
+<a name="l00131"></a>00131   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<MachineInstr*, 8></a> DeadDefs;
+<a name="l00132"></a>00132 
+<a name="l00133"></a>00133   ~InlineSpiller() {}
+<a name="l00134"></a>00134 
+<a name="l00135"></a>00135 <span class="keyword">public</span>:
+<a name="l00136"></a>00136   InlineSpiller(<a class="code" href="classllvm_1_1MachineFunctionPass.html">MachineFunctionPass</a> &<a class="code" href="TwoAddressInstructionPass_8cpp.html#a34b5cf133e2453a532a504197fec9171">pass</a>,
+<a name="l00137"></a>00137                 <a class="code" href="classllvm_1_1MachineFunction.html">MachineFunction</a> &mf,
+<a name="l00138"></a>00138                 <a class="code" href="classllvm_1_1VirtRegMap.html">VirtRegMap</a> &vrm)
+<a name="l00139"></a>00139     : MF(mf),
+<a name="l00140"></a>00140       LIS(pass.getAnalysis<<a class="code" href="classllvm_1_1LiveIntervals.html">LiveIntervals</a>>()),
+<a name="l00141"></a>00141       LSS(pass.getAnalysis<<a class="code" href="classllvm_1_1LiveStacks.html">LiveStacks</a>>()),
+<a name="l00142"></a>00142       AA(&pass.getAnalysis<<a class="code" href="classllvm_1_1AliasAnalysis.html">AliasAnalysis</a>>()),
+<a name="l00143"></a>00143       MDT(pass.getAnalysis<<a class="code" href="classllvm_1_1MachineDominatorTree.html">MachineDominatorTree</a>>()),
+<a name="l00144"></a>00144       Loops(pass.getAnalysis<<a class="code" href="classllvm_1_1MachineLoopInfo.html">MachineLoopInfo</a>>()),
+<a name="l00145"></a>00145       VRM(vrm),
+<a name="l00146"></a>00146       MFI(*mf.getFrameInfo()),
+<a name="l00147"></a>00147       MRI(mf.getRegInfo()),
+<a name="l00148"></a>00148       TII(*mf.getTarget().getInstrInfo()),
+<a name="l00149"></a>00149       TRI(*mf.getTarget().getRegisterInfo()) {}
+<a name="l00150"></a>00150 
+<a name="l00151"></a>00151   <span class="keywordtype">void</span> spill(<a class="code" href="classllvm_1_1LiveRangeEdit.html">LiveRangeEdit</a> &);
+<a name="l00152"></a>00152 
+<a name="l00153"></a>00153 <span class="keyword">private</span>:
+<a name="l00154"></a>00154   <span class="keywordtype">bool</span> isSnippet(<span class="keyword">const</span> <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SnipLI);
+<a name="l00155"></a>00155   <span class="keywordtype">void</span> collectRegsToSpill();
+<a name="l00156"></a>00156 
+<a name="l00157"></a>00157   <span class="keywordtype">bool</span> isRegToSpill(<span class="keywordtype">unsigned</span> <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>) {
+<a name="l00158"></a>00158     <span class="keywordflow">return</span> std::find(RegsToSpill.begin(),
+<a name="l00159"></a>00159                      RegsToSpill.end(), <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>) != RegsToSpill.end();
+<a name="l00160"></a>00160   }
+<a name="l00161"></a>00161 
+<a name="l00162"></a>00162   <span class="keywordtype">bool</span> isSibling(<span class="keywordtype">unsigned</span> Reg);
+<a name="l00163"></a>00163   <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *traceSiblingValue(<span class="keywordtype">unsigned</span>, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a>*, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a>*);
+<a name="l00164"></a>00164   <span class="keywordtype">void</span> propagateSiblingValue(SibValueMap::iterator, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI = 0);
+<a name="l00165"></a>00165   <span class="keywordtype">void</span> analyzeSiblingValues();
+<a name="l00166"></a>00166 
+<a name="l00167"></a>00167   <span class="keywordtype">bool</span> hoistSpill(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SpillLI, <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *CopyMI);
+<a name="l00168"></a>00168   <span class="keywordtype">void</span> eliminateRedundantSpills(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &<a class="code" href="LoopInfoImpl_8h.html#ab7b7f3fe4279386eae18cf924053d077">LI</a>, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI);
+<a name="l00169"></a>00169 
+<a name="l00170"></a>00170   <span class="keywordtype">void</span> markValueUsed(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a>*, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a>*);
+<a name="l00171"></a>00171   <span class="keywordtype">bool</span> reMaterializeFor(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a>&, <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>);
+<a name="l00172"></a>00172   <span class="keywordtype">void</span> reMaterializeAll();
+<a name="l00173"></a>00173 
+<a name="l00174"></a>00174   <span class="keywordtype">bool</span> coalesceStackAccess(<a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *<a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>, <span class="keywordtype">unsigned</span> Reg);
+<a name="l00175"></a>00175   <span class="keywordtype">bool</span> foldMemoryOperand(<a class="code" href="classllvm_1_1ArrayRef.html">ArrayRef</a><std::pair<MachineInstr*, unsigned> >,
+<a name="l00176"></a>00176                          <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *LoadMI = 0);
+<a name="l00177"></a>00177   <span class="keywordtype">void</span> insertReload(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &NewLI, <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a>,
+<a name="l00178"></a>00178                     <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>);
+<a name="l00179"></a>00179   <span class="keywordtype">void</span> insertSpill(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &NewLI, <span class="keyword">const</span> <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &OldLI,
+<a name="l00180"></a>00180                    <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a>, <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>);
+<a name="l00181"></a>00181 
+<a name="l00182"></a>00182   <span class="keywordtype">void</span> spillAroundUses(<span class="keywordtype">unsigned</span> Reg);
+<a name="l00183"></a>00183   <span class="keywordtype">void</span> spillAll();
+<a name="l00184"></a>00184 };
+<a name="l00185"></a>00185 }
+<a name="l00186"></a>00186 
+<a name="l00187"></a>00187 <span class="keyword">namespace </span>llvm {
+<a name="l00188"></a><a class="code" href="namespacellvm.html#abc755629d1844132f222498e5c454d9b">00188</a> <a class="code" href="classllvm_1_1Spiller.html">Spiller</a> *<a class="code" href="namespacellvm.html#abc755629d1844132f222498e5c454d9b">createInlineSpiller</a>(<a class="code" href="classllvm_1_1MachineFunctionPass.html">MachineFunctionPass</a> &<a class="code" href="TwoAddressInstructionPass_8cpp.html#a34b5cf133e2453a532a504197fec9171">pass</a>,
+<a name="l00189"></a>00189                              <a class="code" href="classllvm_1_1MachineFunction.html">MachineFunction</a> &mf,
+<a name="l00190"></a>00190                              <a class="code" href="classllvm_1_1VirtRegMap.html">VirtRegMap</a> &vrm) {
+<a name="l00191"></a>00191   <span class="keywordflow">return</span> <span class="keyword">new</span> InlineSpiller(pass, mf, vrm);
+<a name="l00192"></a>00192 }
+<a name="l00193"></a>00193 }
+<a name="l00194"></a>00194 
+<a name="l00195"></a>00195 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00196"></a>00196 <span class="comment">//                                Snippets</span>
+<a name="l00197"></a>00197 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00198"></a>00198 
+<a name="l00199"></a>00199 <span class="comment">// When spilling a virtual register, we also spill any snippets it is connected</span>
+<a name="l00200"></a>00200 <span class="comment">// to. The snippets are small live ranges that only have a single real use,</span>
+<a name="l00201"></a>00201 <span class="comment">// leftovers from live range splitting. Spilling them enables memory operand</span>
+<a name="l00202"></a>00202 <span class="comment">// folding or tightens the live range around the single use.</span>
+<a name="l00203"></a>00203 <span class="comment">//</span>
+<a name="l00204"></a>00204 <span class="comment">// This minimizes register pressure and maximizes the store-to-load distance for</span>
+<a name="l00205"></a>00205 <span class="comment">// spill slots which can be important in tight loops.</span>
+<a name="l00206"></a>00206 <span class="comment"></span>
+<a name="l00207"></a>00207 <span class="comment">/// isFullCopyOf - If MI is a COPY to or from Reg, return the other register,</span>
+<a name="l00208"></a>00208 <span class="comment">/// otherwise return 0.</span>
+<a name="l00209"></a><a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">00209</a> <span class="comment"></span><span class="keyword">static</span> <span class="keywordtype">unsigned</span> <a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">isFullCopyOf</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *<a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>, <span class="keywordtype">unsigned</span> <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>) {
+<a name="l00210"></a>00210   <span class="keywordflow">if</span> (!MI-><a class="code" href="classllvm_1_1MachineInstr.html#a3453f907d426baccbf3d657b3724f359">isFullCopy</a>())
+<a name="l00211"></a>00211     <span class="keywordflow">return</span> 0;
+<a name="l00212"></a>00212   <span class="keywordflow">if</span> (MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(0).<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>() == <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>)
+<a name="l00213"></a>00213       <span class="keywordflow">return</span> MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(1).<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>();
+<a name="l00214"></a>00214   <span class="keywordflow">if</span> (MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(1).<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>() == <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>)
+<a name="l00215"></a>00215       <span class="keywordflow">return</span> MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(0).<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>();
+<a name="l00216"></a>00216   <span class="keywordflow">return</span> 0;
+<a name="l00217"></a>00217 }
+<a name="l00218"></a>00218 <span class="comment"></span>
+<a name="l00219"></a>00219 <span class="comment">/// isSnippet - Identify if a live interval is a snippet that should be spilled.</span>
+<a name="l00220"></a>00220 <span class="comment">/// It is assumed that SnipLI is a virtual register with the same original as</span>
+<a name="l00221"></a>00221 <span class="comment">/// Edit->getReg().</span>
+<a name="l00222"></a>00222 <span class="comment"></span><span class="keywordtype">bool</span> InlineSpiller::isSnippet(<span class="keyword">const</span> <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SnipLI) {
+<a name="l00223"></a>00223   <span class="keywordtype">unsigned</span> <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a> = Edit->getReg();
+<a name="l00224"></a>00224 
+<a name="l00225"></a>00225   <span class="comment">// A snippet is a tiny live range with only a single instruction using it</span>
+<a name="l00226"></a>00226   <span class="comment">// besides copies to/from Reg or spills/fills. We accept:</span>
+<a name="l00227"></a>00227   <span class="comment">//</span>
+<a name="l00228"></a>00228   <span class="comment">//   %snip = COPY %Reg / FILL fi#</span>
+<a name="l00229"></a>00229   <span class="comment">//   %snip = USE %snip</span>
+<a name="l00230"></a>00230   <span class="comment">//   %Reg = COPY %snip / SPILL %snip, fi#</span>
+<a name="l00231"></a>00231   <span class="comment">//</span>
+<a name="l00232"></a>00232   <span class="keywordflow">if</span> (SnipLI.<a class="code" href="classllvm_1_1LiveInterval.html#a931a78433b7505739c06774af3ef253e">getNumValNums</a>() > 2 || !LIS.intervalIsInOneMBB(SnipLI))
+<a name="l00233"></a>00233     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00234"></a>00234 
+<a name="l00235"></a>00235   <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *UseMI = 0;
+<a name="l00236"></a>00236 
+<a name="l00237"></a>00237   <span class="comment">// Check that all uses satisfy our criteria.</span>
+<a name="l00238"></a>00238   <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineRegisterInfo_1_1defusechain__iterator.html">MachineRegisterInfo::reg_nodbg_iterator</a>
+<a name="l00239"></a>00239          RI = MRI.reg_nodbg_begin(SnipLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>);
+<a name="l00240"></a>00240        <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *<a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a> = RI.skipInstruction();) {
+<a name="l00241"></a>00241 
+<a name="l00242"></a>00242     <span class="comment">// Allow copies to/from Reg.</span>
+<a name="l00243"></a>00243     <span class="keywordflow">if</span> (<a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">isFullCopyOf</a>(MI, Reg))
+<a name="l00244"></a>00244       <span class="keywordflow">continue</span>;
+<a name="l00245"></a>00245 
+<a name="l00246"></a>00246     <span class="comment">// Allow stack slot loads.</span>
+<a name="l00247"></a>00247     <span class="keywordtype">int</span> FI;
+<a name="l00248"></a>00248     <span class="keywordflow">if</span> (SnipLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a> == TII.isLoadFromStackSlot(MI, FI) && FI == StackSlot)
+<a name="l00249"></a>00249       <span class="keywordflow">continue</span>;
+<a name="l00250"></a>00250 
+<a name="l00251"></a>00251     <span class="comment">// Allow stack slot stores.</span>
+<a name="l00252"></a>00252     <span class="keywordflow">if</span> (SnipLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a> == TII.isStoreToStackSlot(MI, FI) && FI == StackSlot)
+<a name="l00253"></a>00253       <span class="keywordflow">continue</span>;
+<a name="l00254"></a>00254 
+<a name="l00255"></a>00255     <span class="comment">// Allow a single additional instruction.</span>
+<a name="l00256"></a>00256     <span class="keywordflow">if</span> (UseMI && MI != UseMI)
+<a name="l00257"></a>00257       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00258"></a>00258     UseMI = <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>;
+<a name="l00259"></a>00259   }
+<a name="l00260"></a>00260   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00261"></a>00261 }
+<a name="l00262"></a>00262 <span class="comment"></span>
+<a name="l00263"></a>00263 <span class="comment">/// collectRegsToSpill - Collect live range snippets that only have a single</span>
+<a name="l00264"></a>00264 <span class="comment">/// real use.</span>
+<a name="l00265"></a>00265 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::collectRegsToSpill() {
+<a name="l00266"></a>00266   <span class="keywordtype">unsigned</span> Reg = Edit->getReg();
+<a name="l00267"></a>00267 
+<a name="l00268"></a>00268   <span class="comment">// Main register always spills.</span>
+<a name="l00269"></a>00269   RegsToSpill.assign(1, Reg);
+<a name="l00270"></a>00270   SnippetCopies.clear();
+<a name="l00271"></a>00271 
+<a name="l00272"></a>00272   <span class="comment">// Snippets all have the same original, so there can't be any for an original</span>
+<a name="l00273"></a>00273   <span class="comment">// register.</span>
+<a name="l00274"></a>00274   <span class="keywordflow">if</span> (Original == Reg)
+<a name="l00275"></a>00275     <span class="keywordflow">return</span>;
+<a name="l00276"></a>00276 
+<a name="l00277"></a>00277   <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineRegisterInfo_1_1defusechain__iterator.html">MachineRegisterInfo::reg_iterator</a> RI = MRI.reg_begin(Reg);
+<a name="l00278"></a>00278        <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = RI.skipInstruction();) {
+<a name="l00279"></a>00279     <span class="keywordtype">unsigned</span> SnipReg = <a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">isFullCopyOf</a>(MI, Reg);
+<a name="l00280"></a>00280     <span class="keywordflow">if</span> (!isSibling(SnipReg))
+<a name="l00281"></a>00281       <span class="keywordflow">continue</span>;
+<a name="l00282"></a>00282     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SnipLI = LIS.getInterval(SnipReg);
+<a name="l00283"></a>00283     <span class="keywordflow">if</span> (!isSnippet(SnipLI))
+<a name="l00284"></a>00284       <span class="keywordflow">continue</span>;
+<a name="l00285"></a>00285     SnippetCopies.insert(MI);
+<a name="l00286"></a>00286     <span class="keywordflow">if</span> (isRegToSpill(SnipReg))
+<a name="l00287"></a>00287       <span class="keywordflow">continue</span>;
+<a name="l00288"></a>00288     RegsToSpill.push_back(SnipReg);
+<a name="l00289"></a>00289     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\talso spill snippet "</span> << SnipLI << <span class="charliteral">'\n'</span>);
+<a name="l00290"></a>00290     ++NumSnippets;
+<a name="l00291"></a>00291   }
+<a name="l00292"></a>00292 }
+<a name="l00293"></a>00293 
+<a name="l00294"></a>00294 
+<a name="l00295"></a>00295 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00296"></a>00296 <span class="comment">//                            Sibling Values</span>
+<a name="l00297"></a>00297 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00298"></a>00298 
+<a name="l00299"></a>00299 <span class="comment">// After live range splitting, some values to be spilled may be defined by</span>
+<a name="l00300"></a>00300 <span class="comment">// copies from sibling registers. We trace the sibling copies back to the</span>
+<a name="l00301"></a>00301 <span class="comment">// original value if it still exists. We need it for rematerialization.</span>
+<a name="l00302"></a>00302 <span class="comment">//</span>
+<a name="l00303"></a>00303 <span class="comment">// Even when the value can't be rematerialized, we still want to determine if</span>
+<a name="l00304"></a>00304 <span class="comment">// the value has already been spilled, or we may want to hoist the spill from a</span>
+<a name="l00305"></a>00305 <span class="comment">// loop.</span>
+<a name="l00306"></a>00306 
+<a name="l00307"></a>00307 <span class="keywordtype">bool</span> InlineSpiller::isSibling(<span class="keywordtype">unsigned</span> Reg) {
+<a name="l00308"></a>00308   <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1TargetRegisterInfo.html#ae62c5ea35b71f9020caa94340bc78f37">TargetRegisterInfo::isVirtualRegister</a>(Reg) &&
+<a name="l00309"></a>00309            VRM.getOriginal(Reg) == Original;
+<a name="l00310"></a>00310 }
+<a name="l00311"></a>00311 
+<a name="l00312"></a>00312 <span class="preprocessor">#ifndef NDEBUG</span>
+<a name="l00313"></a><a class="code" href="InlineSpiller_8cpp.html#afa2d5297013e3e0bb19c30b38db134dc">00313</a> <span class="preprocessor"></span><span class="keyword">static</span> <a class="code" href="classllvm_1_1raw__ostream.html">raw_ostream</a> &<a class="code" href="namespacellvm.html#a6a02d446812b76c3b271d9e3e3c77b49">operator<<</a>(<a class="code" href="classllvm_1_1raw__ostream.html">raw_ostream</a> &OS,
+<a name="l00314"></a>00314                                <span class="keyword">const</span> InlineSpiller::SibValueInfo &SVI) {
+<a name="l00315"></a>00315   OS << <span class="stringliteral">"spill "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(SVI.SpillReg) << <span class="charliteral">':'</span>
+<a name="l00316"></a>00316      << SVI.SpillVNI->id << <span class="charliteral">'@'</span> << SVI.SpillVNI->def;
+<a name="l00317"></a>00317   <span class="keywordflow">if</span> (SVI.SpillMBB)
+<a name="l00318"></a>00318     OS << <span class="stringliteral">" in BB#"</span> << SVI.SpillMBB->getNumber();
+<a name="l00319"></a>00319   <span class="keywordflow">if</span> (SVI.AllDefsAreReloads)
+<a name="l00320"></a>00320     OS << <span class="stringliteral">" all-reloads"</span>;
+<a name="l00321"></a>00321   <span class="keywordflow">if</span> (SVI.DefByOrigPHI)
+<a name="l00322"></a>00322     OS << <span class="stringliteral">" orig-phi"</span>;
+<a name="l00323"></a>00323   <span class="keywordflow">if</span> (SVI.KillsSource)
+<a name="l00324"></a>00324     OS << <span class="stringliteral">" kill"</span>;
+<a name="l00325"></a>00325   OS << <span class="stringliteral">" deps["</span>;
+<a name="l00326"></a>00326   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = SVI.Deps.size(); i != e; ++i)
+<a name="l00327"></a>00327     OS << <span class="charliteral">' '</span> << SVI.Deps[i]->id << <span class="charliteral">'@'</span> << SVI.Deps[i]->def;
+<a name="l00328"></a>00328   OS << <span class="stringliteral">" ]"</span>;
+<a name="l00329"></a>00329   <a class="code" href="LLParser_8cpp.html#ab86ae2177a3bc7ef5154e74e482cf6bc">if</a> (SVI.DefMI)
+<a name="l00330"></a>00330     OS << <span class="stringliteral">" def: "</span> << *SVI.DefMI;
+<a name="l00331"></a>00331   <span class="keywordflow">else</span>
+<a name="l00332"></a>00332     OS << <span class="charliteral">'\n'</span>;
+<a name="l00333"></a>00333   <span class="keywordflow">return</span> OS;
+<a name="l00334"></a>00334 }
+<a name="l00335"></a>00335 <span class="preprocessor">#endif</span>
+<a name="l00336"></a>00336 <span class="preprocessor"></span><span class="comment"></span>
+<a name="l00337"></a>00337 <span class="comment">/// propagateSiblingValue - Propagate the value in SVI to dependents if it is</span>
+<a name="l00338"></a>00338 <span class="comment">/// known.  Otherwise remember the dependency for later.</span>
+<a name="l00339"></a>00339 <span class="comment">///</span>
+<a name="l00340"></a>00340 <span class="comment">/// @param SVI SibValues entry to propagate.</span>
+<a name="l00341"></a>00341 <span class="comment">/// @param VNI Dependent value, or NULL to propagate to all saved dependents.</span>
+<a name="l00342"></a>00342 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::propagateSiblingValue(SibValueMap::iterator SVI,
+<a name="l00343"></a>00343                                           <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI) {
+<a name="l00344"></a>00344   <span class="comment">// When VNI is non-NULL, add it to SVI's deps, and only propagate to that.</span>
+<a name="l00345"></a>00345   <a class="code" href="classllvm_1_1TinyPtrVector.html">TinyPtrVector<VNInfo*></a> FirstDeps;
+<a name="l00346"></a>00346   <span class="keywordflow">if</span> (VNI) {
+<a name="l00347"></a>00347     FirstDeps.<a class="code" href="classllvm_1_1TinyPtrVector.html#a1437e12220a4cd03b10656dcb607c642">push_back</a>(VNI);
+<a name="l00348"></a>00348     SVI->second.Deps.push_back(VNI);
+<a name="l00349"></a>00349   }
+<a name="l00350"></a>00350 
+<a name="l00351"></a>00351   <span class="comment">// Has the value been completely determined yet?  If not, defer propagation.</span>
+<a name="l00352"></a>00352   <span class="keywordflow">if</span> (!SVI->second.hasDef())
+<a name="l00353"></a>00353     <span class="keywordflow">return</span>;
+<a name="l00354"></a>00354 
+<a name="l00355"></a>00355   <span class="comment">// Work list of values to propagate.  It would be nice to use a SetVector</span>
+<a name="l00356"></a>00356   <span class="comment">// here, but then we would be forced to use a SmallSet.</span>
+<a name="l00357"></a>00357   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<SibValueMap::iterator, 8></a> WorkList(1, SVI);
+<a name="l00358"></a>00358   <a class="code" href="classllvm_1_1SmallPtrSet.html">SmallPtrSet<VNInfo*, 8></a> WorkSet;
+<a name="l00359"></a>00359 
+<a name="l00360"></a>00360   <span class="keywordflow">do</span> {
+<a name="l00361"></a>00361     SVI = WorkList.pop_back_val();
+<a name="l00362"></a>00362     WorkSet.<a class="code" href="classllvm_1_1SmallPtrSet.html#a2ce650c1d4a48661b501206d04b6ab04">erase</a>(SVI->first);
+<a name="l00363"></a>00363     <a class="code" href="classllvm_1_1TinyPtrVector.html">TinyPtrVector<VNInfo*></a> *Deps = VNI ? &FirstDeps : &SVI->second.Deps;
+<a name="l00364"></a>00364     VNI = 0;
+<a name="l00365"></a>00365 
+<a name="l00366"></a>00366     SibValueInfo &SV = SVI->second;
+<a name="l00367"></a>00367     <span class="keywordflow">if</span> (!SV.SpillMBB)
+<a name="l00368"></a>00368       SV.SpillMBB = LIS.getMBBFromIndex(SV.SpillVNI->def);
+<a name="l00369"></a>00369 
+<a name="l00370"></a>00370     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"  prop to "</span> << Deps-><a class="code" href="classllvm_1_1TinyPtrVector.html#acbf133519c18f7e338abf7f355fbf4a0">size</a>() << <span class="stringliteral">": "</span>
+<a name="l00371"></a>00371                  << SVI->first->id << <span class="charliteral">'@'</span> << SVI->first->def << <span class="stringliteral">":\t"</span> << SV);
+<a name="l00372"></a>00372 
+<a name="l00373"></a>00373     assert(SV.hasDef() && <span class="stringliteral">"Propagating undefined value"</span>);
+<a name="l00374"></a>00374 
+<a name="l00375"></a>00375     <span class="comment">// Should this value be propagated as a preferred spill candidate?  We don't</span>
+<a name="l00376"></a>00376     <span class="comment">// propagate values of registers that are about to spill.</span>
+<a name="l00377"></a>00377     <span class="keywordtype">bool</span> PropSpill = !<a class="code" href="InlineSpiller_8cpp.html#a7819774f1578a13aaf380ec73782c9e4">DisableHoisting</a> && !isRegToSpill(SV.SpillReg);
+<a name="l00378"></a>00378     <span class="keywordtype">unsigned</span> SpillDepth = ~0u;
+<a name="l00379"></a>00379 
+<a name="l00380"></a>00380     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1VNInfo.html">TinyPtrVector<VNInfo*>::iterator</a> DepI = Deps-><a class="code" href="classllvm_1_1TinyPtrVector.html#a0e09f111089ae4fffb14fa1b22816483">begin</a>(),
+<a name="l00381"></a>00381          DepE = Deps-><a class="code" href="classllvm_1_1TinyPtrVector.html#aa8dc0937a5c524026865ef2a68d3c4f1">end</a>(); DepI != DepE; ++DepI) {
+<a name="l00382"></a>00382       SibValueMap::iterator DepSVI = SibValues.find(*DepI);
+<a name="l00383"></a>00383       assert(DepSVI != SibValues.end() && <span class="stringliteral">"Dependent value not in SibValues"</span>);
+<a name="l00384"></a>00384       SibValueInfo &DepSV = DepSVI->second;
+<a name="l00385"></a>00385       <span class="keywordflow">if</span> (!DepSV.SpillMBB)
+<a name="l00386"></a>00386         DepSV.SpillMBB = LIS.getMBBFromIndex(DepSV.SpillVNI->def);
+<a name="l00387"></a>00387 
+<a name="l00388"></a>00388       <span class="keywordtype">bool</span> Changed = <span class="keyword">false</span>;
+<a name="l00389"></a>00389 
+<a name="l00390"></a>00390       <span class="comment">// Propagate defining instruction.</span>
+<a name="l00391"></a>00391       <span class="keywordflow">if</span> (!DepSV.hasDef()) {
+<a name="l00392"></a>00392         Changed = <span class="keyword">true</span>;
+<a name="l00393"></a>00393         DepSV.DefMI = SV.DefMI;
+<a name="l00394"></a>00394         DepSV.DefByOrigPHI = SV.DefByOrigPHI;
+<a name="l00395"></a>00395       }
+<a name="l00396"></a>00396 
+<a name="l00397"></a>00397       <span class="comment">// Propagate AllDefsAreReloads.  For PHI values, this computes an AND of</span>
+<a name="l00398"></a>00398       <span class="comment">// all predecessors.</span>
+<a name="l00399"></a>00399       <span class="keywordflow">if</span> (!SV.AllDefsAreReloads && DepSV.AllDefsAreReloads) {
+<a name="l00400"></a>00400         Changed = <span class="keyword">true</span>;
+<a name="l00401"></a>00401         DepSV.AllDefsAreReloads = <span class="keyword">false</span>;
+<a name="l00402"></a>00402       }
+<a name="l00403"></a>00403 
+<a name="l00404"></a>00404       <span class="comment">// Propagate best spill value.</span>
+<a name="l00405"></a>00405       <span class="keywordflow">if</span> (PropSpill && SV.SpillVNI != DepSV.SpillVNI) {
+<a name="l00406"></a>00406         <span class="keywordflow">if</span> (SV.SpillMBB == DepSV.SpillMBB) {
+<a name="l00407"></a>00407           <span class="comment">// DepSV is in the same block.  Hoist when dominated.</span>
+<a name="l00408"></a>00408           <span class="keywordflow">if</span> (DepSV.KillsSource && SV.SpillVNI->def < DepSV.SpillVNI->def) {
+<a name="l00409"></a>00409             <span class="comment">// This is an alternative def earlier in the same MBB.</span>
+<a name="l00410"></a>00410             <span class="comment">// Hoist the spill as far as possible in SpillMBB. This can ease</span>
+<a name="l00411"></a>00411             <span class="comment">// register pressure:</span>
+<a name="l00412"></a>00412             <span class="comment">//</span>
+<a name="l00413"></a>00413             <span class="comment">//   x = def</span>
+<a name="l00414"></a>00414             <span class="comment">//   y = use x</span>
+<a name="l00415"></a>00415             <span class="comment">//   s = copy x</span>
+<a name="l00416"></a>00416             <span class="comment">//</span>
+<a name="l00417"></a>00417             <span class="comment">// Hoisting the spill of s to immediately after the def removes the</span>
+<a name="l00418"></a>00418             <span class="comment">// interference between x and y:</span>
+<a name="l00419"></a>00419             <span class="comment">//</span>
+<a name="l00420"></a>00420             <span class="comment">//   x = def</span>
+<a name="l00421"></a>00421             <span class="comment">//   spill x</span>
+<a name="l00422"></a>00422             <span class="comment">//   y = use x<kill></span>
+<a name="l00423"></a>00423             <span class="comment">//</span>
+<a name="l00424"></a>00424             <span class="comment">// This hoist only helps when the DepSV copy kills its source.</span>
+<a name="l00425"></a>00425             Changed = <span class="keyword">true</span>;
+<a name="l00426"></a>00426             DepSV.SpillReg = SV.SpillReg;
+<a name="l00427"></a>00427             DepSV.SpillVNI = SV.SpillVNI;
+<a name="l00428"></a>00428             DepSV.SpillMBB = SV.SpillMBB;
+<a name="l00429"></a>00429           }
+<a name="l00430"></a>00430         } <span class="keywordflow">else</span> {
+<a name="l00431"></a>00431           <span class="comment">// DepSV is in a different block.</span>
+<a name="l00432"></a>00432           <span class="keywordflow">if</span> (SpillDepth == ~0u)
+<a name="l00433"></a>00433             SpillDepth = Loops.getLoopDepth(SV.SpillMBB);
+<a name="l00434"></a>00434 
+<a name="l00435"></a>00435           <span class="comment">// Also hoist spills to blocks with smaller loop depth, but make sure</span>
+<a name="l00436"></a>00436           <span class="comment">// that the new value dominates.  Non-phi dependents are always</span>
+<a name="l00437"></a>00437           <span class="comment">// dominated, phis need checking.</span>
+<a name="l00438"></a>00438           <span class="keywordflow">if</span> ((Loops.getLoopDepth(DepSV.SpillMBB) > SpillDepth) &&
+<a name="l00439"></a>00439               (!DepSVI->first->isPHIDef() ||
+<a name="l00440"></a>00440                MDT.dominates(SV.SpillMBB, DepSV.SpillMBB))) {
+<a name="l00441"></a>00441             Changed = <span class="keyword">true</span>;
+<a name="l00442"></a>00442             DepSV.SpillReg = SV.SpillReg;
+<a name="l00443"></a>00443             DepSV.SpillVNI = SV.SpillVNI;
+<a name="l00444"></a>00444             DepSV.SpillMBB = SV.SpillMBB;
+<a name="l00445"></a>00445           }
+<a name="l00446"></a>00446         }
+<a name="l00447"></a>00447       }
+<a name="l00448"></a>00448 
+<a name="l00449"></a>00449       <span class="keywordflow">if</span> (!Changed)
+<a name="l00450"></a>00450         <span class="keywordflow">continue</span>;
+<a name="l00451"></a>00451 
+<a name="l00452"></a>00452       <span class="comment">// Something changed in DepSVI. Propagate to dependents.</span>
+<a name="l00453"></a>00453       <span class="keywordflow">if</span> (WorkSet.<a class="code" href="classllvm_1_1SmallPtrSet.html#a9b6dd0fc7a648a939e571246045b673e">insert</a>(DepSVI->first))
+<a name="l00454"></a>00454         WorkList.push_back(DepSVI);
+<a name="l00455"></a>00455 
+<a name="l00456"></a>00456       <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"  update "</span> << DepSVI->first->id << <span class="charliteral">'@'</span>
+<a name="l00457"></a>00457             << DepSVI->first->def << <span class="stringliteral">" to:\t"</span> << DepSV);
+<a name="l00458"></a>00458     }
+<a name="l00459"></a>00459   } <span class="keywordflow">while</span> (!WorkList.empty());
+<a name="l00460"></a>00460 }
+<a name="l00461"></a>00461 <span class="comment"></span>
+<a name="l00462"></a>00462 <span class="comment">/// traceSiblingValue - Trace a value that is about to be spilled back to the</span>
+<a name="l00463"></a>00463 <span class="comment">/// real defining instructions by looking through sibling copies. Always stay</span>
+<a name="l00464"></a>00464 <span class="comment">/// within the range of OrigVNI so the registers are known to carry the same</span>
+<a name="l00465"></a>00465 <span class="comment">/// value.</span>
+<a name="l00466"></a>00466 <span class="comment">///</span>
+<a name="l00467"></a>00467 <span class="comment">/// Determine if the value is defined by all reloads, so spilling isn't</span>
+<a name="l00468"></a>00468 <span class="comment">/// necessary - the value is already in the stack slot.</span>
+<a name="l00469"></a>00469 <span class="comment">///</span>
+<a name="l00470"></a>00470 <span class="comment">/// Return a defining instruction that may be a candidate for rematerialization.</span>
+<a name="l00471"></a>00471 <span class="comment">///</span>
+<a name="l00472"></a>00472 <span class="comment"></span><a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *InlineSpiller::traceSiblingValue(<span class="keywordtype">unsigned</span> UseReg, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *UseVNI,
+<a name="l00473"></a>00473                                                <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *OrigVNI) {
+<a name="l00474"></a>00474   <span class="comment">// Check if a cached value already exists.</span>
+<a name="l00475"></a>00475   SibValueMap::iterator SVI;
+<a name="l00476"></a>00476   <span class="keywordtype">bool</span> Inserted;
+<a name="l00477"></a>00477   <a class="code" href="namespacellvm.html#a7dc3e2c002713fec56bdbf16aa704576">tie</a>(SVI, Inserted) =
+<a name="l00478"></a>00478     SibValues.insert(std::make_pair(UseVNI, SibValueInfo(UseReg, UseVNI)));
+<a name="l00479"></a>00479   <span class="keywordflow">if</span> (!Inserted) {
+<a name="l00480"></a>00480     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Cached value "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(UseReg) << <span class="charliteral">':'</span>
+<a name="l00481"></a>00481                  << UseVNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="charliteral">'@'</span> << UseVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> << <span class="charliteral">' '</span> << SVI->second);
+<a name="l00482"></a>00482     <span class="keywordflow">return</span> SVI->second.DefMI;
+<a name="l00483"></a>00483   }
+<a name="l00484"></a>00484 
+<a name="l00485"></a>00485   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Tracing value "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(UseReg) << <span class="charliteral">':'</span>
+<a name="l00486"></a>00486                << UseVNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="charliteral">'@'</span> << UseVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> << <span class="charliteral">'\n'</span>);
+<a name="l00487"></a>00487 
+<a name="l00488"></a>00488   <span class="comment">// List of (Reg, VNI) that have been inserted into SibValues, but need to be</span>
+<a name="l00489"></a>00489   <span class="comment">// processed.</span>
+<a name="l00490"></a>00490   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<std::pair<unsigned, VNInfo*></a>, 8> WorkList;
+<a name="l00491"></a>00491   WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(UseReg, UseVNI));
+<a name="l00492"></a>00492 
+<a name="l00493"></a>00493   <span class="keywordflow">do</span> {
+<a name="l00494"></a>00494     <span class="keywordtype">unsigned</span> <a class="code" href="X86DisassemblerDecoder_8h.html#a546839a5c4bcf9f9450967155f48de41">Reg</a>;
+<a name="l00495"></a>00495     <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI;
+<a name="l00496"></a>00496     <a class="code" href="namespacellvm.html#a7dc3e2c002713fec56bdbf16aa704576">tie</a>(Reg, VNI) = WorkList.<a class="code" href="classllvm_1_1SmallVectorImpl.html#a0c8ffe664a36e30d49c84d0aded2fe08">pop_back_val</a>();
+<a name="l00497"></a>00497     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"  "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(Reg) << <span class="charliteral">':'</span> << VNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="charliteral">'@'</span> << VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>
+<a name="l00498"></a>00498                  << <span class="stringliteral">":\t"</span>);
+<a name="l00499"></a>00499 
+<a name="l00500"></a>00500     <span class="comment">// First check if this value has already been computed.</span>
+<a name="l00501"></a>00501     SVI = SibValues.find(VNI);
+<a name="l00502"></a>00502     assert(SVI != SibValues.end() && <span class="stringliteral">"Missing SibValues entry"</span>);
+<a name="l00503"></a>00503 
+<a name="l00504"></a>00504     <span class="comment">// Trace through PHI-defs created by live range splitting.</span>
+<a name="l00505"></a>00505     <span class="keywordflow">if</span> (VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae0af39c31bb54b8c908d8d4a15f55da5">isPHIDef</a>()) {
+<a name="l00506"></a>00506       <span class="comment">// Stop at original PHIs.  We don't know the value at the predecessors.</span>
+<a name="l00507"></a>00507       <span class="keywordflow">if</span> (VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> == OrigVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>) {
+<a name="l00508"></a>00508         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"orig phi value\n"</span>);
+<a name="l00509"></a>00509         SVI->second.DefByOrigPHI = <span class="keyword">true</span>;
+<a name="l00510"></a>00510         SVI->second.AllDefsAreReloads = <span class="keyword">false</span>;
+<a name="l00511"></a>00511         propagateSiblingValue(SVI);
+<a name="l00512"></a>00512         <span class="keywordflow">continue</span>;
+<a name="l00513"></a>00513       }
+<a name="l00514"></a>00514 
+<a name="l00515"></a>00515       <span class="comment">// This is a PHI inserted by live range splitting.  We could trace the</span>
+<a name="l00516"></a>00516       <span class="comment">// live-out value from predecessor blocks, but that search can be very</span>
+<a name="l00517"></a>00517       <span class="comment">// expensive if there are many predecessors and many more PHIs as</span>
+<a name="l00518"></a>00518       <span class="comment">// generated by tail-dup when it sees an indirectbr.  Instead, look at</span>
+<a name="l00519"></a>00519       <span class="comment">// all the non-PHI defs that have the same value as OrigVNI.  They must</span>
+<a name="l00520"></a>00520       <span class="comment">// jointly dominate VNI->def.  This is not optimal since VNI may actually</span>
+<a name="l00521"></a>00521       <span class="comment">// be jointly dominated by a smaller subset of defs, so there is a change</span>
+<a name="l00522"></a>00522       <span class="comment">// we will miss a AllDefsAreReloads optimization.</span>
+<a name="l00523"></a>00523 
+<a name="l00524"></a>00524       <span class="comment">// Separate all values dominated by OrigVNI into PHIs and non-PHIs.</span>
+<a name="l00525"></a>00525       <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<VNInfo*, 8></a> PHIs, NonPHIs;
+<a name="l00526"></a>00526       <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &<a class="code" href="LoopInfoImpl_8h.html#ab7b7f3fe4279386eae18cf924053d077">LI</a> = LIS.getInterval(Reg);
+<a name="l00527"></a>00527       <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &OrigLI = LIS.getInterval(Original);
+<a name="l00528"></a>00528 
+<a name="l00529"></a>00529       <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1VNInfo.html">LiveInterval::vni_iterator</a> VI = LI.<a class="code" href="classllvm_1_1LiveInterval.html#a1cbff779d55e3b1bb52dea75c5694ea4">vni_begin</a>(), VE = LI.<a class="code" href="classllvm_1_1LiveInterval.html#a0c5e7091b298bf51ec73229bbbd304c9">vni_end</a>();
+<a name="l00530"></a>00530            VI != VE; ++VI) {
+<a name="l00531"></a>00531         <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI2 = *VI;
+<a name="l00532"></a>00532         <span class="keywordflow">if</span> (VNI2-><a class="code" href="classllvm_1_1VNInfo.html#ae4b6b5a6aeabaa9cd6ba683d8786b2a5" title="Returns true if this value is unused.">isUnused</a>())
+<a name="l00533"></a>00533           <span class="keywordflow">continue</span>;
+<a name="l00534"></a>00534         <span class="keywordflow">if</span> (!OrigLI.<a class="code" href="classllvm_1_1LiveInterval.html#af43c501f1cfacd7433c5fc5fde40974a">containsOneValue</a>() &&
+<a name="l00535"></a>00535             OrigLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(VNI2-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>) != OrigVNI)
+<a name="l00536"></a>00536           <span class="keywordflow">continue</span>;
+<a name="l00537"></a>00537         <span class="keywordflow">if</span> (VNI2-><a class="code" href="classllvm_1_1VNInfo.html#ae0af39c31bb54b8c908d8d4a15f55da5">isPHIDef</a>() && VNI2-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> != OrigVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>)
+<a name="l00538"></a>00538           PHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(VNI2);
+<a name="l00539"></a>00539         <span class="keywordflow">else</span>
+<a name="l00540"></a>00540           NonPHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(VNI2);
+<a name="l00541"></a>00541       }
+<a name="l00542"></a>00542       <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"split phi value, checking "</span> << PHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>()
+<a name="l00543"></a>00543                    << <span class="stringliteral">" phi-defs, and "</span> << NonPHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>()
+<a name="l00544"></a>00544                    << <span class="stringliteral">" non-phi/orig defs\n"</span>);
+<a name="l00545"></a>00545 
+<a name="l00546"></a>00546       <span class="comment">// Create entries for all the PHIs.  Don't add them to the worklist, we</span>
+<a name="l00547"></a>00547       <span class="comment">// are processing all of them in one go here.</span>
+<a name="l00548"></a>00548       <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = PHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); i != e; ++i)
+<a name="l00549"></a>00549         SibValues.insert(std::make_pair(PHIs[i], SibValueInfo(Reg, PHIs[i])));
+<a name="l00550"></a>00550 
+<a name="l00551"></a>00551       <span class="comment">// Add every PHI as a dependent of all the non-PHIs.</span>
+<a name="l00552"></a>00552       <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = NonPHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); i != e; ++i) {
+<a name="l00553"></a>00553         <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *NonPHI = NonPHIs[i];
+<a name="l00554"></a>00554         <span class="comment">// Known value? Try an insertion.</span>
+<a name="l00555"></a>00555         <a class="code" href="namespacellvm.html#a7dc3e2c002713fec56bdbf16aa704576">tie</a>(SVI, Inserted) =
+<a name="l00556"></a>00556           SibValues.insert(std::make_pair(NonPHI, SibValueInfo(Reg, NonPHI)));
+<a name="l00557"></a>00557         <span class="comment">// Add all the PHIs as dependents of NonPHI.</span>
+<a name="l00558"></a>00558         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> pi = 0, pe = PHIs.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); pi != pe; ++pi)
+<a name="l00559"></a>00559           SVI->second.Deps.push_back(PHIs[pi]);
+<a name="l00560"></a>00560         <span class="comment">// This is the first time we see NonPHI, add it to the worklist.</span>
+<a name="l00561"></a>00561         <span class="keywordflow">if</span> (Inserted)
+<a name="l00562"></a>00562           WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(Reg, NonPHI));
+<a name="l00563"></a>00563         <span class="keywordflow">else</span>
+<a name="l00564"></a>00564           <span class="comment">// Propagate to all inserted PHIs, not just VNI.</span>
+<a name="l00565"></a>00565           propagateSiblingValue(SVI);
+<a name="l00566"></a>00566       }
+<a name="l00567"></a>00567 
+<a name="l00568"></a>00568       <span class="comment">// Next work list item.</span>
+<a name="l00569"></a>00569       <span class="keywordflow">continue</span>;
+<a name="l00570"></a>00570     }
+<a name="l00571"></a>00571 
+<a name="l00572"></a>00572     <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = LIS.getInstructionFromIndex(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00573"></a>00573     assert(MI && <span class="stringliteral">"Missing def"</span>);
+<a name="l00574"></a>00574 
+<a name="l00575"></a>00575     <span class="comment">// Trace through sibling copies.</span>
+<a name="l00576"></a>00576     <span class="keywordflow">if</span> (<span class="keywordtype">unsigned</span> SrcReg = <a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">isFullCopyOf</a>(MI, Reg)) {
+<a name="l00577"></a>00577       <span class="keywordflow">if</span> (isSibling(SrcReg)) {
+<a name="l00578"></a>00578         <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SrcLI = LIS.getInterval(SrcReg);
+<a name="l00579"></a>00579         <a class="code" href="classllvm_1_1LiveRangeQuery.html">LiveRangeQuery</a> SrcQ(SrcLI, VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00580"></a>00580         assert(SrcQ.valueIn() && <span class="stringliteral">"Copy from non-existing value"</span>);
+<a name="l00581"></a>00581         <span class="comment">// Check if this COPY kills its source.</span>
+<a name="l00582"></a>00582         SVI->second.KillsSource = SrcQ.isKill();
+<a name="l00583"></a>00583         <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *SrcVNI = SrcQ.valueIn();
+<a name="l00584"></a>00584         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"copy of "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(SrcReg) << <span class="charliteral">':'</span>
+<a name="l00585"></a>00585                      << SrcVNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="charliteral">'@'</span> << SrcVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>
+<a name="l00586"></a>00586                      << <span class="stringliteral">" kill="</span> << <span class="keywordtype">unsigned</span>(SVI->second.KillsSource) << <span class="charliteral">'\n'</span>);
+<a name="l00587"></a>00587         <span class="comment">// Known sibling source value? Try an insertion.</span>
+<a name="l00588"></a>00588         <a class="code" href="namespacellvm.html#a7dc3e2c002713fec56bdbf16aa704576">tie</a>(SVI, Inserted) = SibValues.insert(std::make_pair(SrcVNI,
+<a name="l00589"></a>00589                                                  SibValueInfo(SrcReg, SrcVNI)));
+<a name="l00590"></a>00590         <span class="comment">// This is the first time we see Src, add it to the worklist.</span>
+<a name="l00591"></a>00591         <span class="keywordflow">if</span> (Inserted)
+<a name="l00592"></a>00592           WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(SrcReg, SrcVNI));
+<a name="l00593"></a>00593         propagateSiblingValue(SVI, VNI);
+<a name="l00594"></a>00594         <span class="comment">// Next work list item.</span>
+<a name="l00595"></a>00595         <span class="keywordflow">continue</span>;
+<a name="l00596"></a>00596       }
+<a name="l00597"></a>00597     }
+<a name="l00598"></a>00598 
+<a name="l00599"></a>00599     <span class="comment">// Track reachable reloads.</span>
+<a name="l00600"></a>00600     SVI->second.DefMI = <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>;
+<a name="l00601"></a>00601     SVI->second.SpillMBB = MI-><a class="code" href="classllvm_1_1MachineInstr.html#aabad9b72f6d20d3462efc34020d39f73">getParent</a>();
+<a name="l00602"></a>00602     <span class="keywordtype">int</span> FI;
+<a name="l00603"></a>00603     <span class="keywordflow">if</span> (Reg == TII.isLoadFromStackSlot(MI, FI) && FI == StackSlot) {
+<a name="l00604"></a>00604       <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"reload\n"</span>);
+<a name="l00605"></a>00605       propagateSiblingValue(SVI);
+<a name="l00606"></a>00606       <span class="comment">// Next work list item.</span>
+<a name="l00607"></a>00607       <span class="keywordflow">continue</span>;
+<a name="l00608"></a>00608     }
+<a name="l00609"></a>00609 
+<a name="l00610"></a>00610     <span class="comment">// Potential remat candidate.</span>
+<a name="l00611"></a>00611     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"def "</span> << *MI);
+<a name="l00612"></a>00612     SVI->second.AllDefsAreReloads = <span class="keyword">false</span>;
+<a name="l00613"></a>00613     propagateSiblingValue(SVI);
+<a name="l00614"></a>00614   } <span class="keywordflow">while</span> (!WorkList.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00615"></a>00615 
+<a name="l00616"></a>00616   <span class="comment">// Look up the value we were looking for.  We already did this lookup at the</span>
+<a name="l00617"></a>00617   <span class="comment">// top of the function, but SibValues may have been invalidated.</span>
+<a name="l00618"></a>00618   SVI = SibValues.find(UseVNI);
+<a name="l00619"></a>00619   assert(SVI != SibValues.end() && <span class="stringliteral">"Didn't compute requested info"</span>);
+<a name="l00620"></a>00620   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"  traced to:\t"</span> << SVI->second);
+<a name="l00621"></a>00621   <span class="keywordflow">return</span> SVI->second.DefMI;
+<a name="l00622"></a>00622 }
+<a name="l00623"></a>00623 <span class="comment"></span>
+<a name="l00624"></a>00624 <span class="comment">/// analyzeSiblingValues - Trace values defined by sibling copies back to</span>
+<a name="l00625"></a>00625 <span class="comment">/// something that isn't a sibling copy.</span>
+<a name="l00626"></a>00626 <span class="comment">///</span>
+<a name="l00627"></a>00627 <span class="comment">/// Keep track of values that may be rematerializable.</span>
+<a name="l00628"></a>00628 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::analyzeSiblingValues() {
+<a name="l00629"></a>00629   SibValues.clear();
+<a name="l00630"></a>00630 
+<a name="l00631"></a>00631   <span class="comment">// No siblings at all?</span>
+<a name="l00632"></a>00632   <span class="keywordflow">if</span> (Edit->getReg() == Original)
+<a name="l00633"></a>00633     <span class="keywordflow">return</span>;
+<a name="l00634"></a>00634 
+<a name="l00635"></a>00635   <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &OrigLI = LIS.getInterval(Original);
+<a name="l00636"></a>00636   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i) {
+<a name="l00637"></a>00637     <span class="keywordtype">unsigned</span> Reg = RegsToSpill[i];
+<a name="l00638"></a>00638     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &LI = LIS.getInterval(Reg);
+<a name="l00639"></a>00639     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1VNInfo.html">LiveInterval::const_vni_iterator</a> VI = LI.<a class="code" href="classllvm_1_1LiveInterval.html#a1cbff779d55e3b1bb52dea75c5694ea4">vni_begin</a>(),
+<a name="l00640"></a>00640          VE = LI.<a class="code" href="classllvm_1_1LiveInterval.html#a0c5e7091b298bf51ec73229bbbd304c9">vni_end</a>(); VI != VE; ++VI) {
+<a name="l00641"></a>00641       <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI = *VI;
+<a name="l00642"></a>00642       <span class="keywordflow">if</span> (VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae4b6b5a6aeabaa9cd6ba683d8786b2a5" title="Returns true if this value is unused.">isUnused</a>())
+<a name="l00643"></a>00643         <span class="keywordflow">continue</span>;
+<a name="l00644"></a>00644       <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *DefMI = 0;
+<a name="l00645"></a>00645       <span class="keywordflow">if</span> (!VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae0af39c31bb54b8c908d8d4a15f55da5">isPHIDef</a>()) {
+<a name="l00646"></a>00646        DefMI = LIS.getInstructionFromIndex(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00647"></a>00647        assert(DefMI && <span class="stringliteral">"No defining instruction"</span>);
+<a name="l00648"></a>00648       }
+<a name="l00649"></a>00649       <span class="comment">// Check possible sibling copies.</span>
+<a name="l00650"></a>00650       <span class="keywordflow">if</span> (VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae0af39c31bb54b8c908d8d4a15f55da5">isPHIDef</a>() || DefMI-><a class="code" href="classllvm_1_1MachineInstr.html#ae0ac5973cd95f76e3365e67aaad69de6">isCopy</a>()) {
+<a name="l00651"></a>00651         <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *OrigVNI = OrigLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00652"></a>00652         assert(OrigVNI && <span class="stringliteral">"Def outside original live range"</span>);
+<a name="l00653"></a>00653         <span class="keywordflow">if</span> (OrigVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> != VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>)
+<a name="l00654"></a>00654           DefMI = traceSiblingValue(Reg, VNI, OrigVNI);
+<a name="l00655"></a>00655       }
+<a name="l00656"></a>00656       <span class="keywordflow">if</span> (DefMI && Edit->checkRematerializable(VNI, DefMI, AA)) {
+<a name="l00657"></a>00657         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Value "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(Reg) << <span class="charliteral">':'</span> << VNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="charliteral">'@'</span>
+<a name="l00658"></a>00658                      << VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> << <span class="stringliteral">" may remat from "</span> << *DefMI);
+<a name="l00659"></a>00659       }
+<a name="l00660"></a>00660     }
+<a name="l00661"></a>00661   }
+<a name="l00662"></a>00662 }
+<a name="l00663"></a>00663 <span class="comment"></span>
+<a name="l00664"></a>00664 <span class="comment">/// hoistSpill - Given a sibling copy that defines a value to be spilled, insert</span>
+<a name="l00665"></a>00665 <span class="comment">/// a spill at a better location.</span>
+<a name="l00666"></a>00666 <span class="comment"></span><span class="keywordtype">bool</span> InlineSpiller::hoistSpill(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SpillLI, <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *CopyMI) {
+<a name="l00667"></a>00667   <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> Idx = LIS.getInstructionIndex(CopyMI);
+<a name="l00668"></a>00668   <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI = SpillLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(Idx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>());
+<a name="l00669"></a>00669   assert(VNI && VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> == Idx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>() && <span class="stringliteral">"Not defined by copy"</span>);
+<a name="l00670"></a>00670   SibValueMap::iterator <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = SibValues.find(VNI);
+<a name="l00671"></a>00671   <span class="keywordflow">if</span> (I == SibValues.end())
+<a name="l00672"></a>00672     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00673"></a>00673 
+<a name="l00674"></a>00674   <span class="keyword">const</span> SibValueInfo &SVI = I->second;
+<a name="l00675"></a>00675 
+<a name="l00676"></a>00676   <span class="comment">// Let the normal folding code deal with the boring case.</span>
+<a name="l00677"></a>00677   <span class="keywordflow">if</span> (!SVI.AllDefsAreReloads && SVI.SpillVNI == VNI)
+<a name="l00678"></a>00678     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00679"></a>00679 
+<a name="l00680"></a>00680   <span class="comment">// SpillReg may have been deleted by remat and DCE.</span>
+<a name="l00681"></a>00681   <span class="keywordflow">if</span> (!LIS.hasInterval(SVI.SpillReg)) {
+<a name="l00682"></a>00682     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Stale interval: "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(SVI.SpillReg) << <span class="charliteral">'\n'</span>);
+<a name="l00683"></a>00683     SibValues.erase(I);
+<a name="l00684"></a>00684     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00685"></a>00685   }
+<a name="l00686"></a>00686 
+<a name="l00687"></a>00687   <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SibLI = LIS.getInterval(SVI.SpillReg);
+<a name="l00688"></a>00688   <span class="keywordflow">if</span> (!SibLI.<a class="code" href="classllvm_1_1LiveInterval.html#a22b04e05b05b90b445ac7a6715e64017" title="containsValue - Returns true if VNI belongs to this interval.">containsValue</a>(SVI.SpillVNI)) {
+<a name="l00689"></a>00689     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Stale value: "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(SVI.SpillReg) << <span class="charliteral">'\n'</span>);
+<a name="l00690"></a>00690     SibValues.erase(I);
+<a name="l00691"></a>00691     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00692"></a>00692   }
+<a name="l00693"></a>00693 
+<a name="l00694"></a>00694   <span class="comment">// Conservatively extend the stack slot range to the range of the original</span>
+<a name="l00695"></a>00695   <span class="comment">// value. We may be able to do better with stack slot coloring by being more</span>
+<a name="l00696"></a>00696   <span class="comment">// careful here.</span>
+<a name="l00697"></a>00697   assert(StackInt && <span class="stringliteral">"No stack slot assigned yet."</span>);
+<a name="l00698"></a>00698   <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &OrigLI = LIS.getInterval(Original);
+<a name="l00699"></a>00699   <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *OrigVNI = OrigLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(Idx);
+<a name="l00700"></a>00700   StackInt->MergeValueInAsValue(OrigLI, OrigVNI, StackInt->getValNumInfo(0));
+<a name="l00701"></a>00701   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tmerged orig valno "</span> << OrigVNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="stringliteral">": "</span>
+<a name="l00702"></a>00702                << *StackInt << <span class="charliteral">'\n'</span>);
+<a name="l00703"></a>00703 
+<a name="l00704"></a>00704   <span class="comment">// Already spilled everywhere.</span>
+<a name="l00705"></a>00705   <span class="keywordflow">if</span> (SVI.AllDefsAreReloads) {
+<a name="l00706"></a>00706     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tno spill needed: "</span> << SVI);
+<a name="l00707"></a>00707     ++NumOmitReloadSpill;
+<a name="l00708"></a>00708     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00709"></a>00709   }
+<a name="l00710"></a>00710   <span class="comment">// We are going to spill SVI.SpillVNI immediately after its def, so clear out</span>
+<a name="l00711"></a>00711   <span class="comment">// any later spills of the same value.</span>
+<a name="l00712"></a>00712   eliminateRedundantSpills(SibLI, SVI.SpillVNI);
+<a name="l00713"></a>00713 
+<a name="l00714"></a>00714   <a class="code" href="classllvm_1_1MachineBasicBlock.html">MachineBasicBlock</a> *MBB = LIS.getMBBFromIndex(SVI.SpillVNI->def);
+<a name="l00715"></a>00715   <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> MII;
+<a name="l00716"></a>00716   <span class="keywordflow">if</span> (SVI.SpillVNI->isPHIDef())
+<a name="l00717"></a>00717     MII = MBB-><a class="code" href="classllvm_1_1MachineBasicBlock.html#a3be7d94076d328797ab57ce09cefab33">SkipPHIsAndLabels</a>(MBB-><a class="code" href="classllvm_1_1MachineBasicBlock.html#ab2d91e7bec944efcbc39d8e30644f111">begin</a>());
+<a name="l00718"></a>00718   <span class="keywordflow">else</span> {
+<a name="l00719"></a>00719     <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *DefMI = LIS.getInstructionFromIndex(SVI.SpillVNI->def);
+<a name="l00720"></a>00720     assert(DefMI && <span class="stringliteral">"Defining instruction disappeared"</span>);
+<a name="l00721"></a>00721     MII = DefMI;
+<a name="l00722"></a>00722     ++MII;
+<a name="l00723"></a>00723   }
+<a name="l00724"></a>00724   <span class="comment">// Insert spill without kill flag immediately after def.</span>
+<a name="l00725"></a>00725   TII.storeRegToStackSlot(*MBB, MII, SVI.SpillReg, <span class="keyword">false</span>, StackSlot,
+<a name="l00726"></a>00726                           MRI.getRegClass(SVI.SpillReg), &TRI);
+<a name="l00727"></a>00727   --MII; <span class="comment">// Point to store instruction.</span>
+<a name="l00728"></a>00728   LIS.InsertMachineInstrInMaps(MII);
+<a name="l00729"></a>00729   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\thoisted: "</span> << SVI.SpillVNI->def << <span class="charliteral">'\t'</span> << *MII);
+<a name="l00730"></a>00730 
+<a name="l00731"></a>00731   ++NumSpills;
+<a name="l00732"></a>00732   ++NumHoists;
+<a name="l00733"></a>00733   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00734"></a>00734 }
+<a name="l00735"></a>00735 <span class="comment"></span>
+<a name="l00736"></a>00736 <span class="comment">/// eliminateRedundantSpills - SLI:VNI is known to be on the stack. Remove any</span>
+<a name="l00737"></a>00737 <span class="comment">/// redundant spills of this value in SLI.reg and sibling copies.</span>
+<a name="l00738"></a>00738 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::eliminateRedundantSpills(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SLI, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI) {
+<a name="l00739"></a>00739   assert(VNI && <span class="stringliteral">"Missing value"</span>);
+<a name="l00740"></a>00740   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<std::pair<LiveInterval*, VNInfo*></a>, 8> WorkList;
+<a name="l00741"></a>00741   WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(&SLI, VNI));
+<a name="l00742"></a>00742   assert(StackInt && <span class="stringliteral">"No stack slot assigned yet."</span>);
+<a name="l00743"></a>00743 
+<a name="l00744"></a>00744   <span class="keywordflow">do</span> {
+<a name="l00745"></a>00745     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> *<a class="code" href="LoopInfoImpl_8h.html#ab7b7f3fe4279386eae18cf924053d077">LI</a>;
+<a name="l00746"></a>00746     <a class="code" href="namespacellvm.html#a7dc3e2c002713fec56bdbf16aa704576">tie</a>(LI, VNI) = WorkList.<a class="code" href="classllvm_1_1SmallVectorImpl.html#a0c8ffe664a36e30d49c84d0aded2fe08">pop_back_val</a>();
+<a name="l00747"></a>00747     <span class="keywordtype">unsigned</span> Reg = LI-><a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>;
+<a name="l00748"></a>00748     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Checking redundant spills for "</span>
+<a name="l00749"></a>00749                  << VNI-><a class="code" href="classllvm_1_1VNInfo.html#ad989a0c1b26066308798f4d11a0e69df" title="The ID number of this value.">id</a> << <span class="charliteral">'@'</span> << VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> << <span class="stringliteral">" in "</span> << *LI << <span class="charliteral">'\n'</span>);
+<a name="l00750"></a>00750 
+<a name="l00751"></a>00751     <span class="comment">// Regs to spill are taken care of.</span>
+<a name="l00752"></a>00752     <span class="keywordflow">if</span> (isRegToSpill(Reg))
+<a name="l00753"></a>00753       <span class="keywordflow">continue</span>;
+<a name="l00754"></a>00754 
+<a name="l00755"></a>00755     <span class="comment">// Add all of VNI's live range to StackInt.</span>
+<a name="l00756"></a>00756     StackInt->MergeValueInAsValue(*LI, VNI, StackInt->getValNumInfo(0));
+<a name="l00757"></a>00757     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Merged to stack int: "</span> << *StackInt << <span class="charliteral">'\n'</span>);
+<a name="l00758"></a>00758 
+<a name="l00759"></a>00759     <span class="comment">// Find all spills and copies of VNI.</span>
+<a name="l00760"></a>00760     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineRegisterInfo_1_1defusechain__iterator.html">MachineRegisterInfo::use_nodbg_iterator</a> UI = MRI.use_nodbg_begin(Reg);
+<a name="l00761"></a>00761          <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = UI.skipInstruction();) {
+<a name="l00762"></a>00762       <span class="keywordflow">if</span> (!MI-><a class="code" href="classllvm_1_1MachineInstr.html#ae0ac5973cd95f76e3365e67aaad69de6">isCopy</a>() && !MI-><a class="code" href="classllvm_1_1MachineInstr.html#aa5f0eb2aad4a731d5d5133b8cb5e0a98">mayStore</a>())
+<a name="l00763"></a>00763         <span class="keywordflow">continue</span>;
+<a name="l00764"></a>00764       <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> Idx = LIS.getInstructionIndex(MI);
+<a name="l00765"></a>00765       <span class="keywordflow">if</span> (LI-><a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(Idx) != VNI)
+<a name="l00766"></a>00766         <span class="keywordflow">continue</span>;
+<a name="l00767"></a>00767 
+<a name="l00768"></a>00768       <span class="comment">// Follow sibling copies down the dominator tree.</span>
+<a name="l00769"></a>00769       <span class="keywordflow">if</span> (<span class="keywordtype">unsigned</span> DstReg = <a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">isFullCopyOf</a>(MI, Reg)) {
+<a name="l00770"></a>00770         <span class="keywordflow">if</span> (isSibling(DstReg)) {
+<a name="l00771"></a>00771            <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &DstLI = LIS.getInterval(DstReg);
+<a name="l00772"></a>00772            <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *DstVNI = DstLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(Idx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>());
+<a name="l00773"></a>00773            assert(DstVNI && <span class="stringliteral">"Missing defined value"</span>);
+<a name="l00774"></a>00774            assert(DstVNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a> == Idx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>() && <span class="stringliteral">"Wrong copy def slot"</span>);
+<a name="l00775"></a>00775            WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(&DstLI, DstVNI));
+<a name="l00776"></a>00776         }
+<a name="l00777"></a>00777         <span class="keywordflow">continue</span>;
+<a name="l00778"></a>00778       }
+<a name="l00779"></a>00779 
+<a name="l00780"></a>00780       <span class="comment">// Erase spills.</span>
+<a name="l00781"></a>00781       <span class="keywordtype">int</span> FI;
+<a name="l00782"></a>00782       <span class="keywordflow">if</span> (Reg == TII.isStoreToStackSlot(MI, FI) && FI == StackSlot) {
+<a name="l00783"></a>00783         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Redundant spill "</span> << Idx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l00784"></a>00784         <span class="comment">// eliminateDeadDefs won't normally remove stores, so switch opcode.</span>
+<a name="l00785"></a>00785         MI-><a class="code" href="classllvm_1_1MachineInstr.html#a1ecb35298bc4d1fe03997959e1210c87">setDesc</a>(TII.get(<a class="code" href="namespacellvm_1_1TargetOpcode.html#aa2b3629c9319f86eee5a2c0e8c75ebfaa3de0a03c0721e0683934a37868f6a421">TargetOpcode::KILL</a>));
+<a name="l00786"></a>00786         DeadDefs.push_back(MI);
+<a name="l00787"></a>00787         ++NumSpillsRemoved;
+<a name="l00788"></a>00788         --NumSpills;
+<a name="l00789"></a>00789       }
+<a name="l00790"></a>00790     }
+<a name="l00791"></a>00791   } <span class="keywordflow">while</span> (!WorkList.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00792"></a>00792 }
+<a name="l00793"></a>00793 
+<a name="l00794"></a>00794 
+<a name="l00795"></a>00795 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00796"></a>00796 <span class="comment">//                            Rematerialization</span>
+<a name="l00797"></a>00797 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00798"></a>00798 <span class="comment"></span>
+<a name="l00799"></a>00799 <span class="comment">/// markValueUsed - Remember that VNI failed to rematerialize, so its defining</span>
+<a name="l00800"></a>00800 <span class="comment">/// instruction cannot be eliminated. See through snippet copies</span>
+<a name="l00801"></a>00801 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::markValueUsed(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> *LI, <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI) {
+<a name="l00802"></a>00802   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<std::pair<LiveInterval*, VNInfo*></a>, 8> WorkList;
+<a name="l00803"></a>00803   WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(LI, VNI));
+<a name="l00804"></a>00804   <span class="keywordflow">do</span> {
+<a name="l00805"></a>00805     <a class="code" href="namespacellvm.html#a7dc3e2c002713fec56bdbf16aa704576">tie</a>(LI, VNI) = WorkList.<a class="code" href="classllvm_1_1SmallVectorImpl.html#a0c8ffe664a36e30d49c84d0aded2fe08">pop_back_val</a>();
+<a name="l00806"></a>00806     <span class="keywordflow">if</span> (!UsedValues.insert(VNI))
+<a name="l00807"></a>00807       <span class="keywordflow">continue</span>;
+<a name="l00808"></a>00808 
+<a name="l00809"></a>00809     <span class="keywordflow">if</span> (VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae0af39c31bb54b8c908d8d4a15f55da5">isPHIDef</a>()) {
+<a name="l00810"></a>00810       <a class="code" href="classllvm_1_1MachineBasicBlock.html">MachineBasicBlock</a> *MBB = LIS.getMBBFromIndex(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00811"></a>00811       <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineBasicBlock.html#a7e7a1a247b7725a24fe19a91f90782cc">MachineBasicBlock::pred_iterator</a> PI = MBB-><a class="code" href="classllvm_1_1MachineBasicBlock.html#ab644fcf07a4c2708333cf66276282357">pred_begin</a>(),
+<a name="l00812"></a>00812              PE = MBB-><a class="code" href="classllvm_1_1MachineBasicBlock.html#a0359a738e0412c5a7ea55d61175e0661">pred_end</a>(); PI != PE; ++PI) {
+<a name="l00813"></a>00813         <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *PVNI = LI-><a class="code" href="classllvm_1_1LiveInterval.html#a16e0818d8c1dc2fb3128d277d3fc3d29">getVNInfoBefore</a>(LIS.getMBBEndIdx(*PI));
+<a name="l00814"></a>00814         <span class="keywordflow">if</span> (PVNI)
+<a name="l00815"></a>00815           WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(LI, PVNI));
+<a name="l00816"></a>00816       }
+<a name="l00817"></a>00817       <span class="keywordflow">continue</span>;
+<a name="l00818"></a>00818     }
+<a name="l00819"></a>00819 
+<a name="l00820"></a>00820     <span class="comment">// Follow snippet copies.</span>
+<a name="l00821"></a>00821     <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = LIS.getInstructionFromIndex(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00822"></a>00822     <span class="keywordflow">if</span> (!SnippetCopies.count(MI))
+<a name="l00823"></a>00823       <span class="keywordflow">continue</span>;
+<a name="l00824"></a>00824     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SnipLI = LIS.getInterval(MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(1).<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>());
+<a name="l00825"></a>00825     assert(isRegToSpill(SnipLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>) && <span class="stringliteral">"Unexpected register in copy"</span>);
+<a name="l00826"></a>00826     <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *SnipVNI = SnipLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>(<span class="keyword">true</span>));
+<a name="l00827"></a>00827     assert(SnipVNI && <span class="stringliteral">"Snippet undefined before copy"</span>);
+<a name="l00828"></a>00828     WorkList.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(std::make_pair(&SnipLI, SnipVNI));
+<a name="l00829"></a>00829   } <span class="keywordflow">while</span> (!WorkList.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>());
+<a name="l00830"></a>00830 }
+<a name="l00831"></a>00831 <span class="comment"></span>
+<a name="l00832"></a>00832 <span class="comment">/// reMaterializeFor - Attempt to rematerialize before MI instead of reloading.</span>
+<a name="l00833"></a>00833 <span class="comment"></span><span class="keywordtype">bool</span> InlineSpiller::reMaterializeFor(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &VirtReg,
+<a name="l00834"></a>00834                                      <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> MI) {
+<a name="l00835"></a>00835   <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> UseIdx = LIS.getInstructionIndex(MI).<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>(<span class="keyword">true</span>);
+<a name="l00836"></a>00836   <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *ParentVNI = VirtReg.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(UseIdx.<a class="code" href="classllvm_1_1SlotIndex.html#ae1bbc48a5bdb10b387be69816bf67f6f">getBaseIndex</a>());
+<a name="l00837"></a>00837 
+<a name="l00838"></a>00838   <span class="keywordflow">if</span> (!ParentVNI) {
+<a name="l00839"></a>00839     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tadding <undef> flags: "</span>);
+<a name="l00840"></a>00840     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = MI->getNumOperands(); i != e; ++i) {
+<a name="l00841"></a>00841       <a class="code" href="classllvm_1_1MachineOperand.html">MachineOperand</a> &MO = MI->getOperand(i);
+<a name="l00842"></a>00842       <span class="keywordflow">if</span> (MO.<a class="code" href="classllvm_1_1MachineOperand.html#ad8198d6d83af9410d867136e33fbf4b2" title="isReg - Tests if this is a MO_Register operand.">isReg</a>() && MO.<a class="code" href="classllvm_1_1MachineOperand.html#a57bf9ee7219097ff0f98da23a3b3b782">isUse</a>() && MO.<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>() == VirtReg.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>)
+<a name="l00843"></a>00843         MO.<a class="code" href="classllvm_1_1MachineOperand.html#ab979122f21b7fa46d3d2d9b21983068b">setIsUndef</a>();
+<a name="l00844"></a>00844     }
+<a name="l00845"></a>00845     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << UseIdx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l00846"></a>00846     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00847"></a>00847   }
+<a name="l00848"></a>00848 
+<a name="l00849"></a>00849   <span class="keywordflow">if</span> (SnippetCopies.count(MI))
+<a name="l00850"></a>00850     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00851"></a>00851 
+<a name="l00852"></a>00852   <span class="comment">// Use an OrigVNI from traceSiblingValue when ParentVNI is a sibling copy.</span>
+<a name="l00853"></a>00853   <a class="code" href="structllvm_1_1LiveRangeEdit_1_1Remat.html" title="Remat - Information needed to rematerialize at a specific location.">LiveRangeEdit::Remat</a> RM(ParentVNI);
+<a name="l00854"></a>00854   SibValueMap::const_iterator SibI = SibValues.find(ParentVNI);
+<a name="l00855"></a>00855   <span class="keywordflow">if</span> (SibI != SibValues.end())
+<a name="l00856"></a>00856     RM.OrigMI = SibI->second.DefMI;
+<a name="l00857"></a>00857   <a class="code" href="LLParser_8cpp.html#ab86ae2177a3bc7ef5154e74e482cf6bc">if</a> (!Edit->canRematerializeAt(RM, UseIdx, <span class="keyword">false</span>)) {
+<a name="l00858"></a>00858     markValueUsed(&VirtReg, ParentVNI);
+<a name="l00859"></a>00859     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tcannot remat for "</span> << UseIdx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l00860"></a>00860     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00861"></a>00861   }
+<a name="l00862"></a>00862 
+<a name="l00863"></a>00863   <span class="comment">// If the instruction also writes VirtReg.reg, it had better not require the</span>
+<a name="l00864"></a>00864   <span class="comment">// same register for uses and defs.</span>
+<a name="l00865"></a>00865   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<std::pair<MachineInstr*, unsigned></a>, 8> Ops;
+<a name="l00866"></a>00866   MIBundleOperands::VirtRegInfo RI =
+<a name="l00867"></a>00867     <a class="code" href="classllvm_1_1MIBundleOperands.html">MIBundleOperands</a>(MI).<a class="code" href="classllvm_1_1MachineOperandIteratorBase.html#a7f3be7515f152b4514c5979e69e8e693">analyzeVirtReg</a>(VirtReg.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>, &Ops);
+<a name="l00868"></a>00868   <span class="keywordflow">if</span> (RI.Tied) {
+<a name="l00869"></a>00869     markValueUsed(&VirtReg, ParentVNI);
+<a name="l00870"></a>00870     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tcannot remat tied reg: "</span> << UseIdx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l00871"></a>00871     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00872"></a>00872   }
+<a name="l00873"></a>00873 
+<a name="l00874"></a>00874   <span class="comment">// Before rematerializing into a register for a single instruction, try to</span>
+<a name="l00875"></a>00875   <span class="comment">// fold a load into the instruction. That avoids allocating a new register.</span>
+<a name="l00876"></a>00876   <span class="keywordflow">if</span> (RM.OrigMI->canFoldAsLoad() &&
+<a name="l00877"></a>00877       foldMemoryOperand(Ops, RM.OrigMI)) {
+<a name="l00878"></a>00878     Edit->markRematerialized(RM.ParentVNI);
+<a name="l00879"></a>00879     ++NumFoldedLoads;
+<a name="l00880"></a>00880     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00881"></a>00881   }
+<a name="l00882"></a>00882 
+<a name="l00883"></a>00883   <span class="comment">// Alocate a new register for the remat.</span>
+<a name="l00884"></a>00884   <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &NewLI = Edit->createFrom(Original);
+<a name="l00885"></a>00885   NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a0f0455af60f6cc894c2f580b82042b0b" title="markNotSpillable - Mark interval as not spillable">markNotSpillable</a>();
+<a name="l00886"></a>00886 
+<a name="l00887"></a>00887   <span class="comment">// Finally we can rematerialize OrigMI before MI.</span>
+<a name="l00888"></a>00888   <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> DefIdx = Edit->rematerializeAt(*MI->getParent(), <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>, NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>, RM,
+<a name="l00889"></a>00889                                            TRI);
+<a name="l00890"></a>00890   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tremat:  "</span> << DefIdx << <span class="charliteral">'\t'</span>
+<a name="l00891"></a>00891                << *LIS.getInstructionFromIndex(DefIdx));
+<a name="l00892"></a>00892 
+<a name="l00893"></a>00893   <span class="comment">// Replace operands</span>
+<a name="l00894"></a>00894   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = Ops.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); i != e; ++i) {
+<a name="l00895"></a>00895     <a class="code" href="classllvm_1_1MachineOperand.html">MachineOperand</a> &MO = MI->getOperand(Ops[i].second);
+<a name="l00896"></a>00896     <span class="keywordflow">if</span> (MO.<a class="code" href="classllvm_1_1MachineOperand.html#ad8198d6d83af9410d867136e33fbf4b2" title="isReg - Tests if this is a MO_Register operand.">isReg</a>() && MO.<a class="code" href="classllvm_1_1MachineOperand.html#a57bf9ee7219097ff0f98da23a3b3b782">isUse</a>() && MO.<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>() == VirtReg.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>) {
+<a name="l00897"></a>00897       MO.<a class="code" href="classllvm_1_1MachineOperand.html#a624a062754a09d3787614d8627096705">setReg</a>(NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>);
+<a name="l00898"></a>00898       MO.<a class="code" href="classllvm_1_1MachineOperand.html#a8a82683fccdef8a5ef772ef03277aee7">setIsKill</a>();
+<a name="l00899"></a>00899     }
+<a name="l00900"></a>00900   }
+<a name="l00901"></a>00901   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\t        "</span> << UseIdx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l00902"></a>00902 
+<a name="l00903"></a>00903   <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *DefVNI = NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a3af29c063ea820a43ae5030a1cc6849c">getNextValue</a>(DefIdx, LIS.getVNInfoAllocator());
+<a name="l00904"></a>00904   NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#ac937369f15ba7bb3727fb8142580934e">addRange</a>(<a class="code" href="structllvm_1_1LiveRange.html">LiveRange</a>(DefIdx, UseIdx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>(), DefVNI));
+<a name="l00905"></a>00905   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tinterval: "</span> << NewLI << <span class="charliteral">'\n'</span>);
+<a name="l00906"></a>00906   ++NumRemats;
+<a name="l00907"></a>00907   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00908"></a>00908 }
+<a name="l00909"></a>00909 <span class="comment"></span>
+<a name="l00910"></a>00910 <span class="comment">/// reMaterializeAll - Try to rematerialize as many uses as possible,</span>
+<a name="l00911"></a>00911 <span class="comment">/// and trim the live ranges after.</span>
+<a name="l00912"></a>00912 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::reMaterializeAll() {
+<a name="l00913"></a>00913   <span class="comment">// analyzeSiblingValues has already tested all relevant defining instructions.</span>
+<a name="l00914"></a>00914   <span class="keywordflow">if</span> (!Edit->anyRematerializable(AA))
+<a name="l00915"></a>00915     <span class="keywordflow">return</span>;
+<a name="l00916"></a>00916 
+<a name="l00917"></a>00917   UsedValues.clear();
+<a name="l00918"></a>00918 
+<a name="l00919"></a>00919   <span class="comment">// Try to remat before all uses of snippets.</span>
+<a name="l00920"></a>00920   <span class="keywordtype">bool</span> anyRemat = <span class="keyword">false</span>;
+<a name="l00921"></a>00921   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i) {
+<a name="l00922"></a>00922     <span class="keywordtype">unsigned</span> Reg = RegsToSpill[i];
+<a name="l00923"></a>00923     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &LI = LIS.getInterval(Reg);
+<a name="l00924"></a>00924     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineRegisterInfo_1_1defusechain__iterator.html">MachineRegisterInfo::use_nodbg_iterator</a>
+<a name="l00925"></a>00925          RI = MRI.use_nodbg_begin(Reg);
+<a name="l00926"></a>00926          <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = RI.skipBundle();)
+<a name="l00927"></a>00927       anyRemat |= reMaterializeFor(LI, MI);
+<a name="l00928"></a>00928   }
+<a name="l00929"></a>00929   <span class="keywordflow">if</span> (!anyRemat)
+<a name="l00930"></a>00930     <span class="keywordflow">return</span>;
+<a name="l00931"></a>00931 
+<a name="l00932"></a>00932   <span class="comment">// Remove any values that were completely rematted.</span>
+<a name="l00933"></a>00933   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i) {
+<a name="l00934"></a>00934     <span class="keywordtype">unsigned</span> Reg = RegsToSpill[i];
+<a name="l00935"></a>00935     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &LI = LIS.getInterval(Reg);
+<a name="l00936"></a>00936     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1VNInfo.html">LiveInterval::vni_iterator</a> I = LI.<a class="code" href="classllvm_1_1LiveInterval.html#a1cbff779d55e3b1bb52dea75c5694ea4">vni_begin</a>(), E = LI.<a class="code" href="classllvm_1_1LiveInterval.html#a0c5e7091b298bf51ec73229bbbd304c9">vni_end</a>();
+<a name="l00937"></a>00937          I != E; ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>) {
+<a name="l00938"></a>00938       <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI = *<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00939"></a>00939       <span class="keywordflow">if</span> (VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae4b6b5a6aeabaa9cd6ba683d8786b2a5" title="Returns true if this value is unused.">isUnused</a>() || VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae0af39c31bb54b8c908d8d4a15f55da5">isPHIDef</a>() || UsedValues.count(VNI))
+<a name="l00940"></a>00940         <span class="keywordflow">continue</span>;
+<a name="l00941"></a>00941       <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = LIS.getInstructionFromIndex(VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>);
+<a name="l00942"></a>00942       MI-><a class="code" href="classllvm_1_1MachineInstr.html#af30461d94263a5dc8a22baeea4ba5c2a">addRegisterDead</a>(Reg, &TRI);
+<a name="l00943"></a>00943       <span class="keywordflow">if</span> (!MI-><a class="code" href="classllvm_1_1MachineInstr.html#a89e006230bfc175988ee94b655eed619">allDefsAreDead</a>())
+<a name="l00944"></a>00944         <span class="keywordflow">continue</span>;
+<a name="l00945"></a>00945       <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"All defs dead: "</span> << *MI);
+<a name="l00946"></a>00946       DeadDefs.push_back(MI);
+<a name="l00947"></a>00947     }
+<a name="l00948"></a>00948   }
+<a name="l00949"></a>00949 
+<a name="l00950"></a>00950   <span class="comment">// Eliminate dead code after remat. Note that some snippet copies may be</span>
+<a name="l00951"></a>00951   <span class="comment">// deleted here.</span>
+<a name="l00952"></a>00952   <span class="keywordflow">if</span> (DeadDefs.empty())
+<a name="l00953"></a>00953     <span class="keywordflow">return</span>;
+<a name="l00954"></a>00954   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Remat created "</span> << DeadDefs.size() << <span class="stringliteral">" dead defs.\n"</span>);
+<a name="l00955"></a>00955   Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
+<a name="l00956"></a>00956 
+<a name="l00957"></a>00957   <span class="comment">// Get rid of deleted and empty intervals.</span>
+<a name="l00958"></a>00958   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = RegsToSpill.size(); i != 0; --i) {
+<a name="l00959"></a>00959     <span class="keywordtype">unsigned</span> Reg = RegsToSpill[i-1];
+<a name="l00960"></a>00960     <span class="keywordflow">if</span> (!LIS.hasInterval(Reg)) {
+<a name="l00961"></a>00961       RegsToSpill.erase(RegsToSpill.begin() + (i - 1));
+<a name="l00962"></a>00962       <span class="keywordflow">continue</span>;
+<a name="l00963"></a>00963     }
+<a name="l00964"></a>00964     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &LI = LIS.getInterval(Reg);
+<a name="l00965"></a>00965     <span class="keywordflow">if</span> (!LI.<a class="code" href="classllvm_1_1LiveInterval.html#a3653e03e9e6e5d5ae0783ea17563046e">empty</a>())
+<a name="l00966"></a>00966       <span class="keywordflow">continue</span>;
+<a name="l00967"></a>00967     Edit->eraseVirtReg(Reg);
+<a name="l00968"></a>00968     RegsToSpill.erase(RegsToSpill.begin() + (i - 1));
+<a name="l00969"></a>00969   }
+<a name="l00970"></a>00970   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << RegsToSpill.size() << <span class="stringliteral">" registers to spill after remat.\n"</span>);
+<a name="l00971"></a>00971 }
+<a name="l00972"></a>00972 
+<a name="l00973"></a>00973 
+<a name="l00974"></a>00974 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00975"></a>00975 <span class="comment">//                                 Spilling</span>
+<a name="l00976"></a>00976 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00977"></a>00977 <span class="comment"></span>
+<a name="l00978"></a>00978 <span class="comment">/// If MI is a load or store of StackSlot, it can be removed.</span>
+<a name="l00979"></a>00979 <span class="comment"></span><span class="keywordtype">bool</span> InlineSpiller::coalesceStackAccess(<a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI, <span class="keywordtype">unsigned</span> Reg) {
+<a name="l00980"></a>00980   <span class="keywordtype">int</span> FI = 0;
+<a name="l00981"></a>00981   <span class="keywordtype">unsigned</span> InstrReg = TII.isLoadFromStackSlot(MI, FI);
+<a name="l00982"></a>00982   <span class="keywordtype">bool</span> IsLoad = InstrReg;
+<a name="l00983"></a>00983   <span class="keywordflow">if</span> (!IsLoad)
+<a name="l00984"></a>00984     InstrReg = TII.isStoreToStackSlot(MI, FI);
+<a name="l00985"></a>00985 
+<a name="l00986"></a>00986   <span class="comment">// We have a stack access. Is it the right register and slot?</span>
+<a name="l00987"></a>00987   <span class="keywordflow">if</span> (InstrReg != Reg || FI != StackSlot)
+<a name="l00988"></a>00988     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00989"></a>00989 
+<a name="l00990"></a>00990   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Coalescing stack access: "</span> << *MI);
+<a name="l00991"></a>00991   LIS.RemoveMachineInstrFromMaps(MI);
+<a name="l00992"></a>00992   MI-><a class="code" href="classllvm_1_1MachineInstr.html#ac2421adbb9996e1b15f03a8abb6c70a8">eraseFromParent</a>();
+<a name="l00993"></a>00993 
+<a name="l00994"></a>00994   <span class="keywordflow">if</span> (IsLoad) {
+<a name="l00995"></a>00995     ++NumReloadsRemoved;
+<a name="l00996"></a>00996     --NumReloads;
+<a name="l00997"></a>00997   } <span class="keywordflow">else</span> {
+<a name="l00998"></a>00998     ++NumSpillsRemoved;
+<a name="l00999"></a>00999     --NumSpills;
+<a name="l01000"></a>01000   }
+<a name="l01001"></a>01001 
+<a name="l01002"></a>01002   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01003"></a>01003 }
+<a name="l01004"></a>01004 <span class="comment"></span>
+<a name="l01005"></a>01005 <span class="comment">/// foldMemoryOperand - Try folding stack slot references in Ops into their</span>
+<a name="l01006"></a>01006 <span class="comment">/// instructions.</span>
+<a name="l01007"></a>01007 <span class="comment">///</span>
+<a name="l01008"></a>01008 <span class="comment">/// @param Ops    Operand indices from analyzeVirtReg().</span>
+<a name="l01009"></a>01009 <span class="comment">/// @param LoadMI Load instruction to use instead of stack slot when non-null.</span>
+<a name="l01010"></a>01010 <span class="comment">/// @return       True on success.</span>
+<a name="l01011"></a>01011 <span class="comment"></span><span class="keywordtype">bool</span> InlineSpiller::
+<a name="l01012"></a>01012 foldMemoryOperand(<a class="code" href="classllvm_1_1ArrayRef.html">ArrayRef</a><std::pair<MachineInstr*, unsigned> > Ops,
+<a name="l01013"></a>01013                   <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *LoadMI) {
+<a name="l01014"></a>01014   <span class="keywordflow">if</span> (Ops.<a class="code" href="classllvm_1_1SmallVectorBase.html#afdecfccba9b1fd8c9fd8eb27ae69e9a0">empty</a>())
+<a name="l01015"></a>01015     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01016"></a>01016   <span class="comment">// Don't attempt folding in bundles.</span>
+<a name="l01017"></a>01017   <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = Ops.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a58dc840fc84420b7f0b773794b8101c1">front</a>().first;
+<a name="l01018"></a>01018   <span class="keywordflow">if</span> (Ops.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#acd9e771a3296c6b24146955754620557">back</a>().first != MI || MI-><a class="code" href="classllvm_1_1MachineInstr.html#aae9502b8400c00ad3d1dbd8d5f3bcad8">isBundled</a>())
+<a name="l01019"></a>01019     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01020"></a>01020 
+<a name="l01021"></a>01021   <span class="keywordtype">bool</span> WasCopy = MI-><a class="code" href="classllvm_1_1MachineInstr.html#ae0ac5973cd95f76e3365e67aaad69de6">isCopy</a>();
+<a name="l01022"></a>01022   <span class="keywordtype">unsigned</span> ImpReg = 0;
+<a name="l01023"></a>01023 
+<a name="l01024"></a>01024   <span class="comment">// TargetInstrInfo::foldMemoryOperand only expects explicit, non-tied</span>
+<a name="l01025"></a>01025   <span class="comment">// operands.</span>
+<a name="l01026"></a>01026   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<unsigned, 8></a> FoldOps;
+<a name="l01027"></a>01027   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = Ops.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); i != e; ++i) {
+<a name="l01028"></a>01028     <span class="keywordtype">unsigned</span> Idx = Ops[i].second;
+<a name="l01029"></a>01029     <a class="code" href="classllvm_1_1MachineOperand.html">MachineOperand</a> &MO = MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(Idx);
+<a name="l01030"></a>01030     <span class="keywordflow">if</span> (MO.<a class="code" href="classllvm_1_1MachineOperand.html#a40a5d6e03f5bfd15839355a7c39ab3a0">isImplicit</a>()) {
+<a name="l01031"></a>01031       ImpReg = MO.<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>();
+<a name="l01032"></a>01032       <span class="keywordflow">continue</span>;
+<a name="l01033"></a>01033     }
+<a name="l01034"></a>01034     <span class="comment">// FIXME: Teach targets to deal with subregs.</span>
+<a name="l01035"></a>01035     <span class="keywordflow">if</span> (MO.<a class="code" href="classllvm_1_1MachineOperand.html#aca37b55b20f45c96067bac1d4f1dcb7f">getSubReg</a>())
+<a name="l01036"></a>01036       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01037"></a>01037     <span class="comment">// We cannot fold a load instruction into a def.</span>
+<a name="l01038"></a>01038     <span class="keywordflow">if</span> (LoadMI && MO.<a class="code" href="classllvm_1_1MachineOperand.html#a8de7d5cf38939044471c6ee60a01a3df">isDef</a>())
+<a name="l01039"></a>01039       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01040"></a>01040     <span class="comment">// Tied use operands should not be passed to foldMemoryOperand.</span>
+<a name="l01041"></a>01041     <span class="keywordflow">if</span> (!MI-><a class="code" href="classllvm_1_1MachineInstr.html#a24f355a6becd20125a8f556c22c2c0af">isRegTiedToDefOperand</a>(Idx))
+<a name="l01042"></a>01042       FoldOps.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(Idx);
+<a name="l01043"></a>01043   }
+<a name="l01044"></a>01044 
+<a name="l01045"></a>01045   <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *FoldMI =
+<a name="l01046"></a>01046                 LoadMI ? TII.foldMemoryOperand(MI, FoldOps, LoadMI)
+<a name="l01047"></a>01047                        : TII.foldMemoryOperand(MI, FoldOps, StackSlot);
+<a name="l01048"></a>01048   <span class="keywordflow">if</span> (!FoldMI)
+<a name="l01049"></a>01049     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01050"></a>01050   LIS.ReplaceMachineInstrInMaps(MI, FoldMI);
+<a name="l01051"></a>01051   MI-><a class="code" href="classllvm_1_1MachineInstr.html#ac2421adbb9996e1b15f03a8abb6c70a8">eraseFromParent</a>();
+<a name="l01052"></a>01052 
+<a name="l01053"></a>01053   <span class="comment">// TII.foldMemoryOperand may have left some implicit operands on the</span>
+<a name="l01054"></a>01054   <span class="comment">// instruction.  Strip them.</span>
+<a name="l01055"></a>01055   <span class="keywordflow">if</span> (ImpReg)
+<a name="l01056"></a>01056     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = FoldMI-><a class="code" href="classllvm_1_1MachineInstr.html#a7b5fe96d88954efc855e6c466207e535">getNumOperands</a>(); i; --i) {
+<a name="l01057"></a>01057       <a class="code" href="classllvm_1_1MachineOperand.html">MachineOperand</a> &MO = FoldMI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(i - 1);
+<a name="l01058"></a>01058       <span class="keywordflow">if</span> (!MO.<a class="code" href="classllvm_1_1MachineOperand.html#ad8198d6d83af9410d867136e33fbf4b2" title="isReg - Tests if this is a MO_Register operand.">isReg</a>() || !MO.<a class="code" href="classllvm_1_1MachineOperand.html#a40a5d6e03f5bfd15839355a7c39ab3a0">isImplicit</a>())
+<a name="l01059"></a>01059         <span class="keywordflow">break</span>;
+<a name="l01060"></a>01060       <span class="keywordflow">if</span> (MO.<a class="code" href="classllvm_1_1MachineOperand.html#ab75f703d251cc0ce0206fe00a999db86" title="getReg - Returns the register number.">getReg</a>() == ImpReg)
+<a name="l01061"></a>01061         FoldMI-><a class="code" href="classllvm_1_1MachineInstr.html#a001a88e1d71c2e11ccd57efe75da4af3">RemoveOperand</a>(i - 1);
+<a name="l01062"></a>01062     }
+<a name="l01063"></a>01063 
+<a name="l01064"></a>01064   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tfolded:  "</span> << LIS.getInstructionIndex(FoldMI) << <span class="charliteral">'\t'</span>
+<a name="l01065"></a>01065                << *FoldMI);
+<a name="l01066"></a>01066   <span class="keywordflow">if</span> (!WasCopy)
+<a name="l01067"></a>01067     ++NumFolded;
+<a name="l01068"></a>01068   <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Ops.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a58dc840fc84420b7f0b773794b8101c1">front</a>().second == 0)
+<a name="l01069"></a>01069     ++NumSpills;
+<a name="l01070"></a>01070   <span class="keywordflow">else</span>
+<a name="l01071"></a>01071     ++NumReloads;
+<a name="l01072"></a>01072   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01073"></a>01073 }
+<a name="l01074"></a>01074 <span class="comment"></span>
+<a name="l01075"></a>01075 <span class="comment">/// insertReload - Insert a reload of NewLI.reg before MI.</span>
+<a name="l01076"></a>01076 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::insertReload(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &NewLI,
+<a name="l01077"></a>01077                                  <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> Idx,
+<a name="l01078"></a>01078                                  <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> MI) {
+<a name="l01079"></a>01079   <a class="code" href="classllvm_1_1MachineBasicBlock.html">MachineBasicBlock</a> &MBB = *MI-><a class="code" href="classllvm_1_1MachineBasicBlock.html#af2e482ff2a9253ec6bc2285491496bd6">getParent</a>();
+<a name="l01080"></a>01080   TII.loadRegFromStackSlot(MBB, MI, NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>, StackSlot,
+<a name="l01081"></a>01081                            MRI.getRegClass(NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>), &TRI);
+<a name="l01082"></a>01082   --<a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>; <span class="comment">// Point to load instruction.</span>
+<a name="l01083"></a>01083   <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> LoadIdx = LIS.InsertMachineInstrInMaps(MI).<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>();
+<a name="l01084"></a>01084   <span class="comment">// Some (out-of-tree) targets have EC reload instructions.</span>
+<a name="l01085"></a>01085   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MachineOperand.html">MachineOperand</a> *MO = MI->findRegisterDefOperand(NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>))
+<a name="l01086"></a>01086     <span class="keywordflow">if</span> (MO-><a class="code" href="classllvm_1_1MachineOperand.html#a11d72231fe6da4abec10afff58dede5d">isEarlyClobber</a>())
+<a name="l01087"></a>01087       LoadIdx = LoadIdx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>(<span class="keyword">true</span>);
+<a name="l01088"></a>01088   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\treload:  "</span> << LoadIdx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l01089"></a>01089   <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *LoadVNI = NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a3af29c063ea820a43ae5030a1cc6849c">getNextValue</a>(LoadIdx, LIS.getVNInfoAllocator());
+<a name="l01090"></a>01090   NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#ac937369f15ba7bb3727fb8142580934e">addRange</a>(<a class="code" href="structllvm_1_1LiveRange.html">LiveRange</a>(LoadIdx, Idx, LoadVNI));
+<a name="l01091"></a>01091   ++NumReloads;
+<a name="l01092"></a>01092 }
+<a name="l01093"></a>01093 <span class="comment"></span>
+<a name="l01094"></a>01094 <span class="comment">/// insertSpill - Insert a spill of NewLI.reg after MI.</span>
+<a name="l01095"></a>01095 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::insertSpill(<a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &NewLI, <span class="keyword">const</span> <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &OldLI,
+<a name="l01096"></a>01096                                 <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> Idx, <a class="code" href="classllvm_1_1MachineBasicBlock.html#ac51be7ff80fe8d6ae5e8c0acb194908a">MachineBasicBlock::iterator</a> MI) {
+<a name="l01097"></a>01097   <a class="code" href="classllvm_1_1MachineBasicBlock.html">MachineBasicBlock</a> &MBB = *MI-><a class="code" href="classllvm_1_1MachineBasicBlock.html#af2e482ff2a9253ec6bc2285491496bd6">getParent</a>();
+<a name="l01098"></a>01098   TII.storeRegToStackSlot(MBB, ++MI, NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>, <span class="keyword">true</span>, StackSlot,
+<a name="l01099"></a>01099                           MRI.getRegClass(NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>), &TRI);
+<a name="l01100"></a>01100   --<a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>; <span class="comment">// Point to store instruction.</span>
+<a name="l01101"></a>01101   <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> StoreIdx = LIS.InsertMachineInstrInMaps(MI).<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>();
+<a name="l01102"></a>01102   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tspilled: "</span> << StoreIdx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l01103"></a>01103   <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *StoreVNI = NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a3af29c063ea820a43ae5030a1cc6849c">getNextValue</a>(Idx, LIS.getVNInfoAllocator());
+<a name="l01104"></a>01104   NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#ac937369f15ba7bb3727fb8142580934e">addRange</a>(<a class="code" href="structllvm_1_1LiveRange.html">LiveRange</a>(Idx, StoreIdx, StoreVNI));
+<a name="l01105"></a>01105   ++NumSpills;
+<a name="l01106"></a>01106 }
+<a name="l01107"></a>01107 <span class="comment"></span>
+<a name="l01108"></a>01108 <span class="comment">/// spillAroundUses - insert spill code around each use of Reg.</span>
+<a name="l01109"></a>01109 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::spillAroundUses(<span class="keywordtype">unsigned</span> Reg) {
+<a name="l01110"></a>01110   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"spillAroundUses "</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(Reg) << <span class="charliteral">'\n'</span>);
+<a name="l01111"></a>01111   <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &OldLI = LIS.getInterval(Reg);
+<a name="l01112"></a>01112 
+<a name="l01113"></a>01113   <span class="comment">// Iterate over instructions using Reg.</span>
+<a name="l01114"></a>01114   <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineRegisterInfo_1_1defusechain__iterator.html">MachineRegisterInfo::reg_iterator</a> RegI = MRI.reg_begin(Reg);
+<a name="l01115"></a>01115        <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = RegI.skipBundle();) {
+<a name="l01116"></a>01116 
+<a name="l01117"></a>01117     <span class="comment">// Debug values are not allowed to affect codegen.</span>
+<a name="l01118"></a>01118     <span class="keywordflow">if</span> (MI-><a class="code" href="classllvm_1_1MachineInstr.html#a1e1d26226c627cf3dcf3c191b85e7d7d">isDebugValue</a>()) {
+<a name="l01119"></a>01119       <span class="comment">// Modify DBG_VALUE now that the value is in a spill slot.</span>
+<a name="l01120"></a>01120       uint64_t Offset = MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(1).<a class="code" href="classllvm_1_1MachineOperand.html#a7059d68a29d5ecfb37623ab45cdb4e8d">getImm</a>();
+<a name="l01121"></a>01121       <span class="keyword">const</span> <a class="code" href="classllvm_1_1MDNode.html" title="MDNode - a tuple of other values.">MDNode</a> *MDPtr = MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(2).<a class="code" href="classllvm_1_1MachineOperand.html#afd78a2f55a6c4914e7e9cf442a0dabe8">getMetadata</a>();
+<a name="l01122"></a>01122       <a class="code" href="classllvm_1_1DebugLoc.html">DebugLoc</a> DL = MI-><a class="code" href="classllvm_1_1MachineInstr.html#a5ca4af2a257043145ad650eafb4402f9">getDebugLoc</a>();
+<a name="l01123"></a>01123       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *NewDV = TII.emitFrameIndexDebugValue(MF, StackSlot,
+<a name="l01124"></a>01124                                                            Offset, MDPtr, DL)) {
+<a name="l01125"></a>01125         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Modifying debug info due to spill:"</span> << <span class="stringliteral">"\t"</span> << *MI);
+<a name="l01126"></a>01126         <a class="code" href="classllvm_1_1MachineBasicBlock.html">MachineBasicBlock</a> *MBB = MI-><a class="code" href="classllvm_1_1MachineInstr.html#aabad9b72f6d20d3462efc34020d39f73">getParent</a>();
+<a name="l01127"></a>01127         MBB-><a class="code" href="classllvm_1_1MachineBasicBlock.html#ad657517ec09c4e070fab95c2a9115853">insert</a>(MBB-><a class="code" href="classllvm_1_1MachineBasicBlock.html#a537a9265c55392ab47d44954f27db538">erase</a>(MI), NewDV);
+<a name="l01128"></a>01128       } <span class="keywordflow">else</span> {
+<a name="l01129"></a>01129         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Removing debug info due to spill:"</span> << <span class="stringliteral">"\t"</span> << *MI);
+<a name="l01130"></a>01130         MI-><a class="code" href="classllvm_1_1MachineInstr.html#ac2421adbb9996e1b15f03a8abb6c70a8">eraseFromParent</a>();
+<a name="l01131"></a>01131       }
+<a name="l01132"></a>01132       <span class="keywordflow">continue</span>;
+<a name="l01133"></a>01133     }
+<a name="l01134"></a>01134 
+<a name="l01135"></a>01135     <span class="comment">// Ignore copies to/from snippets. We'll delete them.</span>
+<a name="l01136"></a>01136     <span class="keywordflow">if</span> (SnippetCopies.count(MI))
+<a name="l01137"></a>01137       <span class="keywordflow">continue</span>;
+<a name="l01138"></a>01138 
+<a name="l01139"></a>01139     <span class="comment">// Stack slot accesses may coalesce away.</span>
+<a name="l01140"></a>01140     <span class="keywordflow">if</span> (coalesceStackAccess(MI, Reg))
+<a name="l01141"></a>01141       <span class="keywordflow">continue</span>;
+<a name="l01142"></a>01142 
+<a name="l01143"></a>01143     <span class="comment">// Analyze instruction.</span>
+<a name="l01144"></a>01144     <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<std::pair<MachineInstr*, unsigned></a>, 8> Ops;
+<a name="l01145"></a>01145     MIBundleOperands::VirtRegInfo RI =
+<a name="l01146"></a>01146       <a class="code" href="classllvm_1_1MIBundleOperands.html">MIBundleOperands</a>(MI).<a class="code" href="classllvm_1_1MachineOperandIteratorBase.html#a7f3be7515f152b4514c5979e69e8e693">analyzeVirtReg</a>(Reg, &Ops);
+<a name="l01147"></a>01147 
+<a name="l01148"></a>01148     <span class="comment">// Find the slot index where this instruction reads and writes OldLI.</span>
+<a name="l01149"></a>01149     <span class="comment">// This is usually the def slot, except for tied early clobbers.</span>
+<a name="l01150"></a>01150     <a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a> Idx = LIS.getInstructionIndex(MI).<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>();
+<a name="l01151"></a>01151     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI = OldLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(Idx.<a class="code" href="classllvm_1_1SlotIndex.html#a04196b5e551d63690ede0244f80f2503">getRegSlot</a>(<span class="keyword">true</span>)))
+<a name="l01152"></a>01152       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1SlotIndex.html#a0b73244049319d841fd11a238f35b5d1" title="isSameInstr - Return true if A and B refer to the same instruction.">SlotIndex::isSameInstr</a>(Idx, VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>))
+<a name="l01153"></a>01153         Idx = VNI-><a class="code" href="classllvm_1_1VNInfo.html#ae623a0f1ab59da851f2ebf1674d1fddb" title="The index of the defining instruction.">def</a>;
+<a name="l01154"></a>01154 
+<a name="l01155"></a>01155     <span class="comment">// Check for a sibling copy.</span>
+<a name="l01156"></a>01156     <span class="keywordtype">unsigned</span> SibReg = <a class="code" href="InlineSpiller_8cpp.html#a5be2fd119675b3a42f255829d377267d">isFullCopyOf</a>(MI, Reg);
+<a name="l01157"></a>01157     <span class="keywordflow">if</span> (SibReg && isSibling(SibReg)) {
+<a name="l01158"></a>01158       <span class="comment">// This may actually be a copy between snippets.</span>
+<a name="l01159"></a>01159       <span class="keywordflow">if</span> (isRegToSpill(SibReg)) {
+<a name="l01160"></a>01160         <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Found new snippet copy: "</span> << *MI);
+<a name="l01161"></a>01161         SnippetCopies.insert(MI);
+<a name="l01162"></a>01162         <span class="keywordflow">continue</span>;
+<a name="l01163"></a>01163       }
+<a name="l01164"></a>01164       <span class="keywordflow">if</span> (RI.Writes) {
+<a name="l01165"></a>01165         <span class="comment">// Hoist the spill of a sib-reg copy.</span>
+<a name="l01166"></a>01166         <span class="keywordflow">if</span> (hoistSpill(OldLI, MI)) {
+<a name="l01167"></a>01167           <span class="comment">// This COPY is now dead, the value is already in the stack slot.</span>
+<a name="l01168"></a>01168           MI-><a class="code" href="classllvm_1_1MachineInstr.html#a302e45878c6dc1714334c7ce96d56846">getOperand</a>(0).<a class="code" href="classllvm_1_1MachineOperand.html#a61a42c85bd86c6ca4554e27d33c3f798">setIsDead</a>();
+<a name="l01169"></a>01169           DeadDefs.push_back(MI);
+<a name="l01170"></a>01170           <span class="keywordflow">continue</span>;
+<a name="l01171"></a>01171         }
+<a name="l01172"></a>01172       } <span class="keywordflow">else</span> {
+<a name="l01173"></a>01173         <span class="comment">// This is a reload for a sib-reg copy. Drop spills downstream.</span>
+<a name="l01174"></a>01174         <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &SibLI = LIS.getInterval(SibReg);
+<a name="l01175"></a>01175         eliminateRedundantSpills(SibLI, SibLI.<a class="code" href="classllvm_1_1LiveInterval.html#a68122ff6b66e6c58b33a16b2ecd0cec1" title="getVNInfoAt - Return the VNInfo that is live at Idx, or NULL.">getVNInfoAt</a>(Idx));
+<a name="l01176"></a>01176         <span class="comment">// The COPY will fold to a reload below.</span>
+<a name="l01177"></a>01177       }
+<a name="l01178"></a>01178     }
+<a name="l01179"></a>01179 
+<a name="l01180"></a>01180     <span class="comment">// Attempt to fold memory ops.</span>
+<a name="l01181"></a>01181     <span class="keywordflow">if</span> (foldMemoryOperand(Ops))
+<a name="l01182"></a>01182       <span class="keywordflow">continue</span>;
+<a name="l01183"></a>01183 
+<a name="l01184"></a>01184     <span class="comment">// Allocate interval around instruction.</span>
+<a name="l01185"></a>01185     <span class="comment">// FIXME: Infer regclass from instruction alone.</span>
+<a name="l01186"></a>01186     <a class="code" href="classllvm_1_1LiveInterval.html">LiveInterval</a> &NewLI = Edit->createFrom(Reg);
+<a name="l01187"></a>01187     NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a0f0455af60f6cc894c2f580b82042b0b" title="markNotSpillable - Mark interval as not spillable">markNotSpillable</a>();
+<a name="l01188"></a>01188 
+<a name="l01189"></a>01189     <span class="keywordflow">if</span> (RI.Reads)
+<a name="l01190"></a>01190       insertReload(NewLI, Idx, MI);
+<a name="l01191"></a>01191 
+<a name="l01192"></a>01192     <span class="comment">// Rewrite instruction operands.</span>
+<a name="l01193"></a>01193     <span class="keywordtype">bool</span> hasLiveDef = <span class="keyword">false</span>;
+<a name="l01194"></a>01194     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = Ops.<a class="code" href="classllvm_1_1SmallVectorTemplateCommon.html#a22a311dfe4c28a897de8a9365a4f0a84">size</a>(); i != e; ++i) {
+<a name="l01195"></a>01195       <a class="code" href="classllvm_1_1MachineOperand.html">MachineOperand</a> &MO = Ops[i].first->getOperand(Ops[i].second);
+<a name="l01196"></a>01196       MO.<a class="code" href="classllvm_1_1MachineOperand.html#a624a062754a09d3787614d8627096705">setReg</a>(NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a4ec9ddf8db4481c798f557e8af82693f">reg</a>);
+<a name="l01197"></a>01197       <span class="keywordflow">if</span> (MO.<a class="code" href="classllvm_1_1MachineOperand.html#a57bf9ee7219097ff0f98da23a3b3b782">isUse</a>()) {
+<a name="l01198"></a>01198         <span class="keywordflow">if</span> (!Ops[i].first->isRegTiedToDefOperand(Ops[i].second))
+<a name="l01199"></a>01199           MO.<a class="code" href="classllvm_1_1MachineOperand.html#a8a82683fccdef8a5ef772ef03277aee7">setIsKill</a>();
+<a name="l01200"></a>01200       } <span class="keywordflow">else</span> {
+<a name="l01201"></a>01201         <span class="keywordflow">if</span> (!MO.<a class="code" href="classllvm_1_1MachineOperand.html#a196420aa839c2b21f42c4bf5c36df437">isDead</a>())
+<a name="l01202"></a>01202           hasLiveDef = <span class="keyword">true</span>;
+<a name="l01203"></a>01203       }
+<a name="l01204"></a>01204     }
+<a name="l01205"></a>01205     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\trewrite: "</span> << Idx << <span class="charliteral">'\t'</span> << *MI);
+<a name="l01206"></a>01206 
+<a name="l01207"></a>01207     <span class="comment">// FIXME: Use a second vreg if instruction has no tied ops.</span>
+<a name="l01208"></a>01208     <span class="keywordflow">if</span> (RI.Writes) {
+<a name="l01209"></a>01209       <span class="keywordflow">if</span> (hasLiveDef)
+<a name="l01210"></a>01210         insertSpill(NewLI, OldLI, Idx, MI);
+<a name="l01211"></a>01211       <span class="keywordflow">else</span> {
+<a name="l01212"></a>01212         <span class="comment">// This instruction defines a dead value.  We don't need to spill it,</span>
+<a name="l01213"></a>01213         <span class="comment">// but do create a live range for the dead value.</span>
+<a name="l01214"></a>01214         <a class="code" href="classllvm_1_1VNInfo.html">VNInfo</a> *VNI = NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#a3af29c063ea820a43ae5030a1cc6849c">getNextValue</a>(Idx, LIS.getVNInfoAllocator());
+<a name="l01215"></a>01215         NewLI.<a class="code" href="classllvm_1_1LiveInterval.html#ac937369f15ba7bb3727fb8142580934e">addRange</a>(<a class="code" href="structllvm_1_1LiveRange.html">LiveRange</a>(Idx, Idx.<a class="code" href="classllvm_1_1SlotIndex.html#af0fdc9086e9065592b7fcd8b43d558c5" title="Returns the dead def kill slot for the current instruction.">getDeadSlot</a>(), VNI));
+<a name="l01216"></a>01216       }
+<a name="l01217"></a>01217     }
+<a name="l01218"></a>01218 
+<a name="l01219"></a>01219     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"\tinterval: "</span> << NewLI << <span class="charliteral">'\n'</span>);
+<a name="l01220"></a>01220   }
+<a name="l01221"></a>01221 }
+<a name="l01222"></a>01222 <span class="comment"></span>
+<a name="l01223"></a>01223 <span class="comment">/// spillAll - Spill all registers remaining after rematerialization.</span>
+<a name="l01224"></a>01224 <span class="comment"></span><span class="keywordtype">void</span> InlineSpiller::spillAll() {
+<a name="l01225"></a>01225   <span class="comment">// Update LiveStacks now that we are committed to spilling.</span>
+<a name="l01226"></a>01226   <span class="keywordflow">if</span> (StackSlot == <a class="code" href="classllvm_1_1VirtRegMap.html#af46e84a1bcd065452628bf5eedf4a3cba120c86e3ef630a99345f58523740bfd3">VirtRegMap::NO_STACK_SLOT</a>) {
+<a name="l01227"></a>01227     StackSlot = VRM.assignVirt2StackSlot(Original);
+<a name="l01228"></a>01228     StackInt = &LSS.getOrCreateInterval(StackSlot, MRI.getRegClass(Original));
+<a name="l01229"></a>01229     StackInt->getNextValue(<a class="code" href="classllvm_1_1SlotIndex.html" title="SlotIndex - An opaque wrapper around machine indexes.">SlotIndex</a>(), LSS.getVNInfoAllocator());
+<a name="l01230"></a>01230   } <span class="keywordflow">else</span>
+<a name="l01231"></a>01231     StackInt = &LSS.getInterval(StackSlot);
+<a name="l01232"></a>01232 
+<a name="l01233"></a>01233   <span class="keywordflow">if</span> (Original != Edit->getReg())
+<a name="l01234"></a>01234     VRM.assignVirt2StackSlot(Edit->getReg(), StackSlot);
+<a name="l01235"></a>01235 
+<a name="l01236"></a>01236   assert(StackInt->getNumValNums() == 1 && <span class="stringliteral">"Bad stack interval values"</span>);
+<a name="l01237"></a>01237   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i)
+<a name="l01238"></a>01238     StackInt->MergeRangesInAsValue(LIS.getInterval(RegsToSpill[i]),
+<a name="l01239"></a>01239                                    StackInt->getValNumInfo(0));
+<a name="l01240"></a>01240   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Merged spilled regs: "</span> << *StackInt << <span class="charliteral">'\n'</span>);
+<a name="l01241"></a>01241 
+<a name="l01242"></a>01242   <span class="comment">// Spill around uses of all RegsToSpill.</span>
+<a name="l01243"></a>01243   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i)
+<a name="l01244"></a>01244     spillAroundUses(RegsToSpill[i]);
+<a name="l01245"></a>01245 
+<a name="l01246"></a>01246   <span class="comment">// Hoisted spills may cause dead code.</span>
+<a name="l01247"></a>01247   <span class="keywordflow">if</span> (!DeadDefs.empty()) {
+<a name="l01248"></a>01248     <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Eliminating "</span> << DeadDefs.size() << <span class="stringliteral">" dead defs\n"</span>);
+<a name="l01249"></a>01249     Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);
+<a name="l01250"></a>01250   }
+<a name="l01251"></a>01251 
+<a name="l01252"></a>01252   <span class="comment">// Finally delete the SnippetCopies.</span>
+<a name="l01253"></a>01253   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i) {
+<a name="l01254"></a>01254     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1MachineRegisterInfo_1_1defusechain__iterator.html">MachineRegisterInfo::reg_iterator</a> RI = MRI.reg_begin(RegsToSpill[i]);
+<a name="l01255"></a>01255          <a class="code" href="classllvm_1_1MachineInstr.html">MachineInstr</a> *MI = RI.skipInstruction();) {
+<a name="l01256"></a>01256       assert(SnippetCopies.count(MI) && <span class="stringliteral">"Remaining use wasn't a snippet copy"</span>);
+<a name="l01257"></a>01257       <span class="comment">// FIXME: Do this with a LiveRangeEdit callback.</span>
+<a name="l01258"></a>01258       LIS.RemoveMachineInstrFromMaps(MI);
+<a name="l01259"></a>01259       MI-><a class="code" href="classllvm_1_1MachineInstr.html#ac2421adbb9996e1b15f03a8abb6c70a8">eraseFromParent</a>();
+<a name="l01260"></a>01260     }
+<a name="l01261"></a>01261   }
+<a name="l01262"></a>01262 
+<a name="l01263"></a>01263   <span class="comment">// Delete all spilled registers.</span>
+<a name="l01264"></a>01264   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = RegsToSpill.size(); i != e; ++i)
+<a name="l01265"></a>01265     Edit->eraseVirtReg(RegsToSpill[i]);
+<a name="l01266"></a>01266 }
+<a name="l01267"></a>01267 
+<a name="l01268"></a>01268 <span class="keywordtype">void</span> InlineSpiller::spill(<a class="code" href="classllvm_1_1LiveRangeEdit.html">LiveRangeEdit</a> &edit) {
+<a name="l01269"></a>01269   ++NumSpilledRanges;
+<a name="l01270"></a>01270   Edit = &edit;
+<a name="l01271"></a>01271   assert(!<a class="code" href="classllvm_1_1TargetRegisterInfo.html#acd7ff2004156240432b82c305aab07db">TargetRegisterInfo::isStackSlot</a>(edit.<a class="code" href="classllvm_1_1LiveRangeEdit.html#a8038b08f86db8d7e7f951f7ef4352767">getReg</a>())
+<a name="l01272"></a>01272          && <span class="stringliteral">"Trying to spill a stack slot."</span>);
+<a name="l01273"></a>01273   <span class="comment">// Share a stack slot among all descendants of Original.</span>
+<a name="l01274"></a>01274   Original = VRM.getOriginal(edit.<a class="code" href="classllvm_1_1LiveRangeEdit.html#a8038b08f86db8d7e7f951f7ef4352767">getReg</a>());
+<a name="l01275"></a>01275   StackSlot = VRM.getStackSlot(Original);
+<a name="l01276"></a>01276   StackInt = 0;
+<a name="l01277"></a>01277 
+<a name="l01278"></a>01278   <a class="code" href="Debug_8h.html#aef41e8aaf4c60819b30faf396cdf4978">DEBUG</a>(<a class="code" href="namespacellvm.html#a7c46c742c31be54870e2038048e6b391" title="dbgs - Return a circular-buffered debug stream.">dbgs</a>() << <span class="stringliteral">"Inline spilling "</span>
+<a name="l01279"></a>01279                << MRI.getRegClass(edit.<a class="code" href="classllvm_1_1LiveRangeEdit.html#a8038b08f86db8d7e7f951f7ef4352767">getReg</a>())-><a class="code" href="namespacellvm_1_1Intrinsic.html#a2950ceaccea680f8278bfcb7517cc9ce">getName</a>()
+<a name="l01280"></a>01280                << <span class="charliteral">':'</span> << <a class="code" href="classllvm_1_1PrintReg.html">PrintReg</a>(edit.<a class="code" href="classllvm_1_1LiveRangeEdit.html#a8038b08f86db8d7e7f951f7ef4352767">getReg</a>()) << <span class="charliteral">' '</span> << edit.<a class="code" href="classllvm_1_1LiveRangeEdit.html#a39247d9f0a920790c427c7bacac001f0">getParent</a>()
+<a name="l01281"></a>01281                << <span class="stringliteral">"\nFrom original "</span> << LIS.getInterval(Original) << <span class="charliteral">'\n'</span>);
+<a name="l01282"></a>01282   assert(edit.<a class="code" href="classllvm_1_1LiveRangeEdit.html#a39247d9f0a920790c427c7bacac001f0">getParent</a>().<a class="code" href="classllvm_1_1LiveInterval.html#ac6eb568d30c5719664c2ccfe8dab72e8" title="isSpillable - Can this interval be spilled?">isSpillable</a>() &&
+<a name="l01283"></a>01283          <span class="stringliteral">"Attempting to spill already spilled value."</span>);
+<a name="l01284"></a>01284   assert(DeadDefs.empty() && <span class="stringliteral">"Previous spill didn't remove dead defs"</span>);
+<a name="l01285"></a>01285 
+<a name="l01286"></a>01286   collectRegsToSpill();
+<a name="l01287"></a>01287   analyzeSiblingValues();
+<a name="l01288"></a>01288   reMaterializeAll();
+<a name="l01289"></a>01289 
+<a name="l01290"></a>01290   <span class="comment">// Remat may handle everything.</span>
+<a name="l01291"></a>01291   <span class="keywordflow">if</span> (!RegsToSpill.empty())
+<a name="l01292"></a>01292     spillAll();
+<a name="l01293"></a>01293 
+<a name="l01294"></a>01294   Edit->calculateRegClassAndHint(MF, Loops);
+<a name="l01295"></a>01295 }
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:45 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InlinerPass_8h_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InlinerPass_8h_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InlinerPass_8h_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InlinerPass_8h_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InlinerPass.h Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_25acc6571c4e3a053ee4203146b47a61.html">include</a>      </li>
+      <li class="navelem"><a class="el" href="dir_fd2d7b5ce83b1c1657cd6600d8cb39fa.html">llvm</a>      </li>
+      <li class="navelem"><a class="el" href="dir_5c61f109262ee79315cb0ac1a5e1be6f.html">Transforms</a>      </li>
+      <li class="navelem"><a class="el" href="dir_c26a45075aa7057f5e495d7b601b10be.html">IPO</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">InlinerPass.h</div>  </div>
+</div>
+<div class="contents">
+<a href="InlinerPass_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===- InlinerPass.h - Code common to all inliners --------------*- C++ -*-===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// This file defines a simple policy-based bottom-up inliner.  This file</span>
+<a name="l00011"></a>00011 <span class="comment">// implements all of the boring mechanics of the bottom-up inlining, while the</span>
+<a name="l00012"></a>00012 <span class="comment">// subclass determines WHAT to inline, which is the much more interesting</span>
+<a name="l00013"></a>00013 <span class="comment">// component.</span>
+<a name="l00014"></a>00014 <span class="comment">//</span>
+<a name="l00015"></a>00015 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00016"></a>00016 
+<a name="l00017"></a>00017 <span class="preprocessor">#ifndef LLVM_TRANSFORMS_IPO_INLINERPASS_H</span>
+<a name="l00018"></a>00018 <span class="preprocessor"></span><span class="preprocessor">#define LLVM_TRANSFORMS_IPO_INLINERPASS_H</span>
+<a name="l00019"></a>00019 <span class="preprocessor"></span>
+<a name="l00020"></a>00020 <span class="preprocessor">#include "<a class="code" href="CallGraphSCCPass_8h.html">llvm/CallGraphSCCPass.h</a>"</span>
+<a name="l00021"></a>00021 
+<a name="l00022"></a>00022 <span class="keyword">namespace </span>llvm {
+<a name="l00023"></a>00023   <span class="keyword">class </span>CallSite;
+<a name="l00024"></a>00024   <span class="keyword">class </span>DataLayout;
+<a name="l00025"></a>00025   <span class="keyword">class </span>InlineCost;
+<a name="l00026"></a>00026   <span class="keyword">template</span><<span class="keyword">class</span> PtrType, <span class="keywordtype">unsigned</span> SmallSize>
+<a name="l00027"></a>00027   <span class="keyword">class </span>SmallPtrSet;
+<a name="l00028"></a>00028 <span class="comment"></span>
+<a name="l00029"></a>00029 <span class="comment">/// Inliner - This class contains all of the helper code which is used to</span>
+<a name="l00030"></a>00030 <span class="comment">/// perform the inlining operations that do not depend on the policy.</span>
+<a name="l00031"></a>00031 <span class="comment">///</span>
+<a name="l00032"></a><a class="code" href="structllvm_1_1Inliner.html">00032</a> <span class="comment"></span><span class="keyword">struct </span><a class="code" href="structllvm_1_1Inliner.html">Inliner</a> : <span class="keyword">public</span> <a class="code" href="classllvm_1_1CallGraphSCCPass.html">CallGraphSCCPass</a> {
+<a name="l00033"></a>00033   <span class="keyword">explicit</span> <a class="code" href="structllvm_1_1Inliner.html#a684e17b3a0e3f1da103dc89007f86a8a">Inliner</a>(<span class="keywordtype">char</span> &<a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974" title="LLVM Calling Convention Representation.">ID</a>);
+<a name="l00034"></a>00034   <span class="keyword">explicit</span> <a class="code" href="structllvm_1_1Inliner.html#a684e17b3a0e3f1da103dc89007f86a8a">Inliner</a>(<span class="keywordtype">char</span> &ID, <span class="keywordtype">int</span> <a class="code" href="CaptureTracking_8cpp.html#ac30708db2a991631cbf3d95c6324d929">Threshold</a>, <span class="keywordtype">bool</span> InsertLifetime);
+<a name="l00035"></a>00035 <span class="comment"></span>
+<a name="l00036"></a>00036 <span class="comment">  /// getAnalysisUsage - For this class, we declare that we require and preserve</span>
+<a name="l00037"></a>00037 <span class="comment">  /// the call graph.  If the derived class implements this method, it should</span>
+<a name="l00038"></a>00038 <span class="comment">  /// always explicitly call the implementation here.</span>
+<a name="l00039"></a>00039 <span class="comment"></span>  <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="structllvm_1_1Inliner.html#a8118328d04211c3c6ce01ba325e035de">getAnalysisUsage</a>(<a class="code" href="classllvm_1_1AnalysisUsage.html">AnalysisUsage</a> &Info) <span class="keyword">const</span>;
+<a name="l00040"></a>00040 
+<a name="l00041"></a>00041   <span class="comment">// Main run interface method, this implements the interface required by the</span>
+<a name="l00042"></a>00042   <span class="comment">// Pass class.</span>
+<a name="l00043"></a>00043   <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1Inliner.html#a858c5642c087e71c160a4ba5c9e3bca7">runOnSCC</a>(<a class="code" href="classllvm_1_1CallGraphSCC.html" title="CallGraphSCC - This is a single SCC that a CallGraphSCCPass is run on.">CallGraphSCC</a> &SCC);
+<a name="l00044"></a>00044 
+<a name="l00045"></a>00045   <span class="comment">// doFinalization - Remove now-dead linkonce functions at the end of</span>
+<a name="l00046"></a>00046   <span class="comment">// processing to avoid breaking the SCC traversal.</span>
+<a name="l00047"></a>00047   <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1Inliner.html#a37fdb5d9c74686e9d834de2d2b911cf6">doFinalization</a>(<a class="code" href="classllvm_1_1CallGraph.html">CallGraph</a> &CG);
+<a name="l00048"></a>00048 <span class="comment"></span>
+<a name="l00049"></a>00049 <span class="comment">  /// This method returns the value specified by the -inline-threshold value,</span>
+<a name="l00050"></a>00050 <span class="comment">  /// specified on the command line.  This is typically not directly needed.</span>
+<a name="l00051"></a>00051 <span class="comment">  ///</span>
+<a name="l00052"></a><a class="code" href="structllvm_1_1Inliner.html#a898d32aab9e4ccad52ea854a179b1202">00052</a> <span class="comment"></span>  <span class="keywordtype">unsigned</span> <a class="code" href="structllvm_1_1Inliner.html#a898d32aab9e4ccad52ea854a179b1202">getInlineThreshold</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> InlineThreshold; }
+<a name="l00053"></a>00053 <span class="comment"></span>
+<a name="l00054"></a>00054 <span class="comment">  /// Calculate the inline threshold for given Caller. This threshold is lower</span>
+<a name="l00055"></a>00055 <span class="comment">  /// if the caller is marked with OptimizeForSize and -inline-threshold is not</span>
+<a name="l00056"></a>00056 <span class="comment">  /// given on the comand line. It is higher if the callee is marked with the</span>
+<a name="l00057"></a>00057 <span class="comment">  /// inlinehint attribute.</span>
+<a name="l00058"></a>00058 <span class="comment">  ///</span>
+<a name="l00059"></a>00059 <span class="comment"></span>  <span class="keywordtype">unsigned</span> <a class="code" href="structllvm_1_1Inliner.html#a898d32aab9e4ccad52ea854a179b1202">getInlineThreshold</a>(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS) <span class="keyword">const</span>;
+<a name="l00060"></a>00060 <span class="comment"></span>
+<a name="l00061"></a>00061 <span class="comment">  /// getInlineCost - This method must be implemented by the subclass to</span>
+<a name="l00062"></a>00062 <span class="comment">  /// determine the cost of inlining the specified call site.  If the cost</span>
+<a name="l00063"></a>00063 <span class="comment">  /// returned is greater than the current inline threshold, the call site is</span>
+<a name="l00064"></a>00064 <span class="comment">  /// not inlined.</span>
+<a name="l00065"></a>00065 <span class="comment">  ///</span>
+<a name="l00066"></a>00066 <span class="comment"></span>  <span class="keyword">virtual</span> <a class="code" href="classllvm_1_1InlineCost.html" title="Represents the cost of inlining a function.">InlineCost</a> <a class="code" href="structllvm_1_1Inliner.html#a9d648a6780642b0fe493bc41d36188bf">getInlineCost</a>(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS) = 0;
+<a name="l00067"></a>00067 <span class="comment"></span>
+<a name="l00068"></a>00068 <span class="comment">  /// removeDeadFunctions - Remove dead functions.</span>
+<a name="l00069"></a>00069 <span class="comment">  ///</span>
+<a name="l00070"></a>00070 <span class="comment">  /// This also includes a hack in the form of the 'AlwaysInlineOnly' flag</span>
+<a name="l00071"></a>00071 <span class="comment">  /// which restricts it to deleting functions with an 'AlwaysInline'</span>
+<a name="l00072"></a>00072 <span class="comment">  /// attribute. This is useful for the InlineAlways pass that only wants to</span>
+<a name="l00073"></a>00073 <span class="comment">  /// deal with that subset of the functions.</span>
+<a name="l00074"></a>00074 <span class="comment"></span>  <span class="keywordtype">bool</span> <a class="code" href="structllvm_1_1Inliner.html#a92f46ce0db10f7b7bcbcc57d5a65652c">removeDeadFunctions</a>(<a class="code" href="classllvm_1_1CallGraph.html">CallGraph</a> &CG, <span class="keywordtype">bool</span> AlwaysInlineOnly = <span class="keyword">false</span>);
+<a name="l00075"></a>00075 
+<a name="l00076"></a>00076 <span class="keyword">private</span>:
+<a name="l00077"></a>00077   <span class="comment">// InlineThreshold - Cache the value here for easy access.</span>
+<a name="l00078"></a>00078   <span class="keywordtype">unsigned</span> InlineThreshold;
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080   <span class="comment">// InsertLifetime - Insert @llvm.lifetime intrinsics.</span>
+<a name="l00081"></a>00081   <span class="keywordtype">bool</span> InsertLifetime;
+<a name="l00082"></a>00082 <span class="comment"></span>
+<a name="l00083"></a>00083 <span class="comment">  /// shouldInline - Return true if the inliner should attempt to</span>
+<a name="l00084"></a>00084 <span class="comment">  /// inline at the given CallSite.</span>
+<a name="l00085"></a>00085 <span class="comment"></span>  <span class="keywordtype">bool</span> shouldInline(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS);
+<a name="l00086"></a>00086 };
+<a name="l00087"></a>00087 
+<a name="l00088"></a>00088 } <span class="comment">// End llvm namespace</span>
+<a name="l00089"></a>00089 
+<a name="l00090"></a>00090 <span class="preprocessor">#endif</span>
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:45 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>

Added: www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,45 @@
+<map id="G" name="G">
+<area shape="rect" href="$InstCombine_8h.html" title="InstCombine.h" alt="" coords="1467,84,1579,111"/>
+<area shape="rect" href="$DataLayout_8h.html" title="llvm/DataLayout.h" alt="" coords="2145,316,2281,343"/>
+<area shape="rect" href="$InstructionSimplify_8h.html" title="llvm/Analysis/InstructionSimplify.h" alt="" coords="1119,84,1353,111"/>
+<area shape="rect" href="$GetElementPtrTypeIterator_8h.html" title="llvm/Support/GetElementPtrTypeIterator.h" alt="" coords="144,393,429,420"/>
+<area shape="rect" href="$PatternMatch_8h.html" title="llvm/Support/PatternMatch.h" alt="" coords="972,239,1175,265"/>
+<area shape="rect" href="$InstCombineWorklist_8h.html" title="InstCombineWorklist.h" alt="" coords="2309,393,2469,420"/>
+<area shape="rect" href="$IRBuilder_8h.html" title="llvm/IRBuilder.h" alt="" coords="1421,239,1539,265"/>
+<area shape="rect" href="$Pass_8h.html" title="llvm/Pass.h" alt="" coords="2144,393,2235,420"/>
+<area shape="rect" href="$IntrinsicInst_8h.html" title="llvm/IntrinsicInst.h" alt="" coords="1199,239,1335,265"/>
+<area shape="rect" href="$Operator_8h.html" title="llvm/Operator.h" alt="" coords="339,316,459,343"/>
+<area shape="rect" href="$ValueTracking_8h.html" title="llvm/Analysis/ValueTracking.h" alt="" coords="1915,393,2120,420"/>
+<area shape="rect" href="$InstVisitor_8h.html" title="llvm/Support/InstVisitor.h" alt="" coords="675,161,853,188"/>
+<area shape="rect" href="$TargetFolder_8h.html" title="llvm/Support/TargetFolder.h" alt="" coords="1619,316,1813,343"/>
+<area shape="rect" href="$SimplifyLibCalls_8h.html" title="llvm/Transforms/Utils/SimplifyLibCalls.h" alt="" coords="1304,161,1571,188"/>
+<area shape="rect" href="$Instruction_8h.html" title="llvm/Instruction.h" alt="" coords="859,471,989,497"/>
+<area shape="rect" href="$Compiler_8h.html" title="llvm/Support/Compiler.h" alt="" coords="1647,703,1820,729"/>
+<area shape="rect" href="$Debug_8h.html" title="llvm/Support/Debug.h" alt="" coords="2351,471,2511,497"/>
+<area shape="rect" href="$SmallVector_8h.html" title="llvm/ADT/SmallVector.h" alt="" coords="1649,548,1817,575"/>
+<area shape="rect" href="$DenseMap_8h.html" title="llvm/ADT/DenseMap.h" alt="" coords="2457,548,2617,575"/>
+<area shape="rect" href="$raw__ostream_8h.html" title="llvm/Support/raw_ostream.h" alt="" coords="1796,625,1996,652"/>
+<area shape="rect" href="$User_8h.html" title="llvm/User.h" alt="" coords="857,548,948,575"/>
+<area shape="rect" href="$ErrorHandling_8h.html" title="llvm/Support/ErrorHandling.h" alt="" coords="843,625,1048,652"/>
+<area shape="rect" href="$StringRef_8h.html" title="llvm/ADT/StringRef.h" alt="" coords="1113,703,1263,729"/>
+<area shape="rect" href="$type__traits_8h.html" title="llvm/Support/type_traits.h" alt="" coords="2059,780,2245,807"/>
+<area shape="rect" href="$DataTypes_8h.html" title="llvm/Support/DataTypes.h" alt="" coords="477,857,661,884"/>
+<area shape="rect" href="$AlignOf_8h.html" title="llvm/Support/AlignOf.h" alt="" coords="2121,625,2284,652"/>
+<area shape="rect" href="$Instructions_8h.html" title="llvm/Instructions.h" alt="" coords="867,316,1003,343"/>
+<area shape="rect" href="$Twine_8h.html" title="llvm/ADT/Twine.h" alt="" coords="607,548,732,575"/>
+<area shape="rect" href="$ArrayRef_8h.html" title="llvm/ADT/ArrayRef.h" alt="" coords="1441,471,1585,497"/>
+<area shape="rect" href="$BasicBlock_8h.html" title="llvm/BasicBlock.h" alt="" coords="656,393,787,420"/>
+<area shape="rect" href="$LLVMContext_8h.html" title="llvm/LLVMContext.h" alt="" coords="1439,625,1585,652"/>
+<area shape="rect" href="$ConstantFolder_8h.html" title="llvm/Support/ConstantFolder.h" alt="" coords="1128,316,1341,343"/>
+<area shape="rect" href="$InstrTypes_8h.html" title="llvm/InstrTypes.h" alt="" coords="912,393,1037,420"/>
+<area shape="rect" href="$DerivedTypes_8h.html" title="llvm/DerivedTypes.h" alt="" coords="333,471,480,497"/>
+<area shape="rect" href="$Type_8h.html" title="llvm/Type.h" alt="" coords="340,548,431,575"/>
+<area shape="rect" href="$PassSupport_8h.html" title="llvm/PassSupport.h" alt="" coords="1929,471,2073,497"/>
+<area shape="rect" href="$PassAnalysisSupport_8h.html" title="llvm/PassAnalysisSupport.h" alt="" coords="1660,471,1855,497"/>
+<area shape="rect" href="$Constants_8h.html" title="llvm/Constants.h" alt="" coords="1315,393,1443,420"/>
+<area shape="rect" href="$Function_8h.html" title="llvm/Function.h" alt="" coords="483,316,597,343"/>
+<area shape="rect" href="$Intrinsics_8h.html" title="llvm/Intrinsics.h" alt="" coords="723,316,843,343"/>
+<area shape="rect" href="$Module_8h.html" title="llvm/Module.h" alt="" coords="447,239,556,265"/>
+<area shape="rect" href="$CallSite_8h.html" title="llvm/Support/CallSite.h" alt="" coords="681,239,847,265"/>
+<area shape="rect" href="$ConstantFolding_8h.html" title="llvm/Analysis/ConstantFolding.h" alt="" coords="1669,393,1891,420"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InstCombineAddSub_8cpp__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+6ca7522b88eabaa325354d7d2eeed234
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.map
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.map?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.map (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.map Fri Dec 21 00:57:24 2012
@@ -0,0 +1,46 @@
+<map id="G" name="G">
+<area shape="rect" href="$InstCombine_8h.html" title="InstCombine.h" alt="" coords="1529,84,1641,111"/>
+<area shape="rect" href="$Intrinsics_8h.html" title="llvm/Intrinsics.h" alt="" coords="2425,316,2545,343"/>
+<area shape="rect" href="$InstructionSimplify_8h.html" title="llvm/Analysis/InstructionSimplify.h" alt="" coords="1271,84,1505,111"/>
+<area shape="rect" href="$CmpInstAnalysis_8h.html" title="llvm/Transforms/Utils/CmpInstAnalysis.h" alt="" coords="471,161,745,188"/>
+<area shape="rect" href="$ConstantRange_8h.html" title="llvm/Support/ConstantRange.h" alt="" coords="480,393,696,420"/>
+<area shape="rect" href="$PatternMatch_8h.html" title="llvm/Support/PatternMatch.h" alt="" coords="1244,239,1447,265"/>
+<area shape="rect" href="$InstCombineWorklist_8h.html" title="InstCombineWorklist.h" alt="" coords="195,393,355,420"/>
+<area shape="rect" href="$IRBuilder_8h.html" title="llvm/IRBuilder.h" alt="" coords="1631,239,1748,265"/>
+<area shape="rect" href="$Pass_8h.html" title="llvm/Pass.h" alt="" coords="2557,471,2648,497"/>
+<area shape="rect" href="$IntrinsicInst_8h.html" title="llvm/IntrinsicInst.h" alt="" coords="1471,239,1607,265"/>
+<area shape="rect" href="$Operator_8h.html" title="llvm/Operator.h" alt="" coords="723,316,843,343"/>
+<area shape="rect" href="$ValueTracking_8h.html" title="llvm/Analysis/ValueTracking.h" alt="" coords="1821,471,2027,497"/>
+<area shape="rect" href="$InstVisitor_8h.html" title="llvm/Support/InstVisitor.h" alt="" coords="1117,161,1296,188"/>
+<area shape="rect" href="$TargetFolder_8h.html" title="llvm/Support/TargetFolder.h" alt="" coords="1923,316,2117,343"/>
+<area shape="rect" href="$SimplifyLibCalls_8h.html" title="llvm/Transforms/Utils/SimplifyLibCalls.h" alt="" coords="1452,161,1719,188"/>
+<area shape="rect" href="$Instruction_8h.html" title="llvm/Instruction.h" alt="" coords="429,471,560,497"/>
+<area shape="rect" href="$Debug_8h.html" title="llvm/Support/Debug.h" alt="" coords="93,471,253,497"/>
+<area shape="rect" href="$Compiler_8h.html" title="llvm/Support/Compiler.h" alt="" coords="973,703,1147,729"/>
+<area shape="rect" href="$SmallVector_8h.html" title="llvm/ADT/SmallVector.h" alt="" coords="1315,625,1483,652"/>
+<area shape="rect" href="$DenseMap_8h.html" title="llvm/ADT/DenseMap.h" alt="" coords="1059,471,1219,497"/>
+<area shape="rect" href="$raw__ostream_8h.html" title="llvm/Support/raw_ostream.h" alt="" coords="309,548,509,575"/>
+<area shape="rect" href="$MathExtras_8h.html" title="llvm/Support/MathExtras.h" alt="" coords="1195,548,1384,575"/>
+<area shape="rect" href="$StringRef_8h.html" title="llvm/ADT/StringRef.h" alt="" coords="1987,625,2136,652"/>
+<area shape="rect" href="$DataTypes_8h.html" title="llvm/Support/DataTypes.h" alt="" coords="741,625,925,652"/>
+<area shape="rect" href="$Instructions_8h.html" title="llvm/Instructions.h" alt="" coords="1147,316,1283,343"/>
+<area shape="rect" href="$Twine_8h.html" title="llvm/ADT/Twine.h" alt="" coords="2152,471,2277,497"/>
+<area shape="rect" href="$ArrayRef_8h.html" title="llvm/ADT/ArrayRef.h" alt="" coords="1661,548,1805,575"/>
+<area shape="rect" href="$BasicBlock_8h.html" title="llvm/BasicBlock.h" alt="" coords="821,393,952,420"/>
+<area shape="rect" href="$DataLayout_8h.html" title="llvm/DataLayout.h" alt="" coords="1227,393,1363,420"/>
+<area shape="rect" href="$LLVMContext_8h.html" title="llvm/LLVMContext.h" alt="" coords="1043,625,1189,652"/>
+<area shape="rect" href="$ConstantFolder_8h.html" title="llvm/Support/ConstantFolder.h" alt="" coords="1483,316,1696,343"/>
+<area shape="rect" href="$InstrTypes_8h.html" title="llvm/InstrTypes.h" alt="" coords="1077,393,1203,420"/>
+<area shape="rect" href="$DerivedTypes_8h.html" title="llvm/DerivedTypes.h" alt="" coords="736,471,883,497"/>
+<area shape="rect" href="$ErrorHandling_8h.html" title="llvm/Support/ErrorHandling.h" alt="" coords="1981,548,2187,575"/>
+<area shape="rect" href="$OperandTraits_8h.html" title="llvm/OperandTraits.h" alt="" coords="1544,471,1696,497"/>
+<area shape="rect" href="$Type_8h.html" title="llvm/Type.h" alt="" coords="705,548,796,575"/>
+<area shape="rect" href="$PassSupport_8h.html" title="llvm/PassSupport.h" alt="" coords="2531,548,2675,575"/>
+<area shape="rect" href="$PassAnalysisSupport_8h.html" title="llvm/PassAnalysisSupport.h" alt="" coords="2312,548,2507,575"/>
+<area shape="rect" href="$Constants_8h.html" title="llvm/Constants.h" alt="" coords="1540,393,1668,420"/>
+<area shape="rect" href="$APInt_8h.html" title="llvm/ADT/APInt.h" alt="" coords="1344,471,1469,497"/>
+<area shape="rect" href="$Function_8h.html" title="llvm/Function.h" alt="" coords="867,316,981,343"/>
+<area shape="rect" href="$Module_8h.html" title="llvm/Module.h" alt="" coords="871,239,980,265"/>
+<area shape="rect" href="$CallSite_8h.html" title="llvm/Support/CallSite.h" alt="" coords="1004,239,1169,265"/>
+<area shape="rect" href="$ConstantFolding_8h.html" title="llvm/Analysis/ConstantFolding.h" alt="" coords="1973,393,2195,420"/>
+</map>

Added: www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.md5
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.md5?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.md5 (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.md5 Fri Dec 21 00:57:24 2012
@@ -0,0 +1 @@
+c22f7f7cabda640d673ff3ea0fd0bfbd
\ No newline at end of file

Added: www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.png
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.png?rev=170845&view=auto
==============================================================================
Binary file - no diff available.

Propchange: www-releases/trunk/3.2/docs/doxygen/html/InstCombineAndOrXor_8cpp__incl.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: www-releases/trunk/3.2/docs/doxygen/html/InstCombineCalls_8cpp_source.html
URL: http://llvm.org/viewvc/llvm-project/www-releases/trunk/3.2/docs/doxygen/html/InstCombineCalls_8cpp_source.html?rev=170845&view=auto
==============================================================================
--- www-releases/trunk/3.2/docs/doxygen/html/InstCombineCalls_8cpp_source.html (added)
+++ www-releases/trunk/3.2/docs/doxygen/html/InstCombineCalls_8cpp_source.html Fri Dec 21 00:57:24 2012
@@ -0,0 +1,1445 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html><head>
+<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
+<meta name="keywords" content="LLVM,Low Level Virtual Machine,C++,doxygen,API,documentation"/>
+<meta name="description" content="C++ source code API documentation for LLVM."/>
+<title>LLVM: InstCombineCalls.cpp Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css"/>
+</head><body>
+<p class="title">LLVM API Documentation</p>
+<!-- Generated by Doxygen 1.7.5.1 -->
+  <div id="navrow1" class="tabs">
+    <ul class="tablist">
+      <li><a href="index.html"><span>Main Page</span></a></li>
+      <li><a href="pages.html"><span>Related Pages</span></a></li>
+      <li><a href="modules.html"><span>Modules</span></a></li>
+      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+      <li><a href="annotated.html"><span>Classes</span></a></li>
+      <li class="current"><a href="files.html"><span>Files</span></a></li>
+      <li><a href="dirs.html"><span>Directories</span></a></li>
+    </ul>
+  </div>
+  <div id="navrow2" class="tabs2">
+    <ul class="tablist">
+      <li><a href="files.html"><span>File List</span></a></li>
+      <li><a href="globals.html"><span>File Members</span></a></li>
+    </ul>
+  </div>
+  <div id="nav-path" class="navpath">
+    <ul>
+      <li class="navelem"><a class="el" href="dir_b41d254693bea6e92988e5bb1ad97e02.html">llvm-3.2.src</a>      </li>
+      <li class="navelem"><a class="el" href="dir_74e9364f374e99e3aeab4fae4e196292.html">lib</a>      </li>
+      <li class="navelem"><a class="el" href="dir_22ea62e2015f6a823fddac4ac38ba517.html">Transforms</a>      </li>
+      <li class="navelem"><a class="el" href="dir_09c12503c252eb886e96f43c24bde98c.html">InstCombine</a>      </li>
+    </ul>
+  </div>
+</div>
+<div class="header">
+  <div class="headertitle">
+<div class="title">InstCombineCalls.cpp</div>  </div>
+</div>
+<div class="contents">
+<a href="InstCombineCalls_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//===- InstCombineCalls.cpp -----------------------------------------------===//</span>
+<a name="l00002"></a>00002 <span class="comment">//</span>
+<a name="l00003"></a>00003 <span class="comment">//                     The LLVM Compiler Infrastructure</span>
+<a name="l00004"></a>00004 <span class="comment">//</span>
+<a name="l00005"></a>00005 <span class="comment">// This file is distributed under the University of Illinois Open Source</span>
+<a name="l00006"></a>00006 <span class="comment">// License. See LICENSE.TXT for details.</span>
+<a name="l00007"></a>00007 <span class="comment">//</span>
+<a name="l00008"></a>00008 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00009"></a>00009 <span class="comment">//</span>
+<a name="l00010"></a>00010 <span class="comment">// This file implements the visitCall and visitInvoke functions.</span>
+<a name="l00011"></a>00011 <span class="comment">//</span>
+<a name="l00012"></a>00012 <span class="comment">//===----------------------------------------------------------------------===//</span>
+<a name="l00013"></a>00013 
+<a name="l00014"></a>00014 <span class="preprocessor">#include "<a class="code" href="InstCombine_8h.html">InstCombine.h</a>"</span>
+<a name="l00015"></a>00015 <span class="preprocessor">#include "<a class="code" href="CallSite_8h.html">llvm/Support/CallSite.h</a>"</span>
+<a name="l00016"></a>00016 <span class="preprocessor">#include "<a class="code" href="DataLayout_8h.html">llvm/DataLayout.h</a>"</span>
+<a name="l00017"></a>00017 <span class="preprocessor">#include "<a class="code" href="MemoryBuiltins_8h.html">llvm/Analysis/MemoryBuiltins.h</a>"</span>
+<a name="l00018"></a>00018 <span class="preprocessor">#include "<a class="code" href="BuildLibCalls_8h.html">llvm/Transforms/Utils/BuildLibCalls.h</a>"</span>
+<a name="l00019"></a>00019 <span class="preprocessor">#include "<a class="code" href="Local_8h.html">llvm/Transforms/Utils/Local.h</a>"</span>
+<a name="l00020"></a>00020 <span class="keyword">using namespace </span>llvm;
+<a name="l00021"></a>00021 <span class="comment"></span>
+<a name="l00022"></a>00022 <span class="comment">/// getPromotedType - Return the specified type promoted as it would be to pass</span>
+<a name="l00023"></a>00023 <span class="comment">/// though a va_arg area.</span>
+<a name="l00024"></a><a class="code" href="InstCombineCalls_8cpp.html#ae3e81cb5632a20699e7989bbfbb6c83e">00024</a> <span class="comment"></span><span class="keyword">static</span> <a class="code" href="classllvm_1_1Type.html">Type</a> *<a class="code" href="InstCombineCalls_8cpp.html#ae3e81cb5632a20699e7989bbfbb6c83e">getPromotedType</a>(<a class="code" href="classllvm_1_1Type.html">Type</a> *Ty) {
+<a name="l00025"></a>00025   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a>* ITy = dyn_cast<IntegerType>(Ty)) {
+<a name="l00026"></a>00026     <span class="keywordflow">if</span> (ITy->getBitWidth() < 32)
+<a name="l00027"></a>00027       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1Type.html#a30dd396c5b40cd86c1591872e574ccdf">Type::getInt32Ty</a>(Ty-><a class="code" href="classllvm_1_1Type.html#af348d5ea83429d08ba891ca3dd0e92b2" title="getContext - Return the LLVMContext in which this type was uniqued.">getContext</a>());
+<a name="l00028"></a>00028   }
+<a name="l00029"></a>00029   <span class="keywordflow">return</span> Ty;
+<a name="l00030"></a>00030 }
+<a name="l00031"></a>00031 <span class="comment"></span>
+<a name="l00032"></a>00032 <span class="comment">/// reduceToSingleValueType - Given an aggregate type which ultimately holds a</span>
+<a name="l00033"></a>00033 <span class="comment">/// single scalar element, like {{{type}}} or [1 x type], return type.</span>
+<a name="l00034"></a><a class="code" href="InstCombineCalls_8cpp.html#a5e9f35c62ddea741af99837acfaf6da4">00034</a> <span class="comment"></span><span class="keyword">static</span> <a class="code" href="classllvm_1_1Type.html">Type</a> *<a class="code" href="InstCombineCalls_8cpp.html#a5e9f35c62ddea741af99837acfaf6da4">reduceToSingleValueType</a>(<a class="code" href="classllvm_1_1Type.html">Type</a> *T) {
+<a name="l00035"></a>00035   <span class="keywordflow">while</span> (!T-><a class="code" href="classllvm_1_1Type.html#a36e21267fe14e69d3251eab1cd3a0076">isSingleValueType</a>()) {
+<a name="l00036"></a>00036     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1StructType.html">StructType</a> *STy = dyn_cast<StructType>(T)) {
+<a name="l00037"></a>00037       <span class="keywordflow">if</span> (STy->getNumElements() == 1)
+<a name="l00038"></a>00038         T = STy->getElementType(0);
+<a name="l00039"></a>00039       <span class="keywordflow">else</span>
+<a name="l00040"></a>00040         <span class="keywordflow">break</span>;
+<a name="l00041"></a>00041     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ArrayType.html">ArrayType</a> *ATy = dyn_cast<ArrayType>(T)) {
+<a name="l00042"></a>00042       <span class="keywordflow">if</span> (ATy->getNumElements() == 1)
+<a name="l00043"></a>00043         T = ATy->getElementType();
+<a name="l00044"></a>00044       <span class="keywordflow">else</span>
+<a name="l00045"></a>00045         <span class="keywordflow">break</span>;
+<a name="l00046"></a>00046     } <span class="keywordflow">else</span>
+<a name="l00047"></a>00047       <span class="keywordflow">break</span>;
+<a name="l00048"></a>00048   }
+<a name="l00049"></a>00049 
+<a name="l00050"></a>00050   <span class="keywordflow">return</span> T;
+<a name="l00051"></a>00051 }
+<a name="l00052"></a>00052 
+<a name="l00053"></a>00053 <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *InstCombiner::SimplifyMemTransfer(<a class="code" href="classllvm_1_1MemIntrinsic.html">MemIntrinsic</a> *<a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>) {
+<a name="l00054"></a>00054   <span class="keywordtype">unsigned</span> DstAlign = <a class="code" href="namespacellvm.html#a43b09383874e62945e0050480bf3d641" title="getKnownAlignment - Try to infer an alignment for the specified pointer.">getKnownAlignment</a>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), TD);
+<a name="l00055"></a>00055   <span class="keywordtype">unsigned</span> SrcAlign = <a class="code" href="namespacellvm.html#a43b09383874e62945e0050480bf3d641" title="getKnownAlignment - Try to infer an alignment for the specified pointer.">getKnownAlignment</a>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1), TD);
+<a name="l00056"></a>00056   <span class="keywordtype">unsigned</span> <a class="code" href="namespacellvm.html#af36d7e69ab16b64b2e3a48c83aa9f0f6">MinAlign</a> = std::min(DstAlign, SrcAlign);
+<a name="l00057"></a>00057   <span class="keywordtype">unsigned</span> CopyAlign = MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a42dd65db3521498f10afb8c6f66e1bb5">getAlignment</a>();
+<a name="l00058"></a>00058 
+<a name="l00059"></a>00059   <span class="keywordflow">if</span> (CopyAlign < MinAlign) {
+<a name="l00060"></a>00060     MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a2dc2a7867d2c559ae17261d3f595f0d9">setAlignment</a>(<a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#ac7d475ed63dc9c318e816f68ab2f7d89">getAlignmentType</a>(),
+<a name="l00061"></a>00061                                              <a class="code" href="namespacellvm.html#af36d7e69ab16b64b2e3a48c83aa9f0f6">MinAlign</a>, <span class="keyword">false</span>));
+<a name="l00062"></a>00062     <span class="keywordflow">return</span> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>;
+<a name="l00063"></a>00063   }
+<a name="l00064"></a>00064 
+<a name="l00065"></a>00065   <span class="comment">// If MemCpyInst length is 1/2/4/8 bytes then replace memcpy with</span>
+<a name="l00066"></a>00066   <span class="comment">// load/store.</span>
+<a name="l00067"></a>00067   <a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *MemOpLength = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a>>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(2));
+<a name="l00068"></a>00068   <span class="keywordflow">if</span> (MemOpLength == 0) <span class="keywordflow">return</span> 0;
+<a name="l00069"></a>00069 
+<a name="l00070"></a>00070   <span class="comment">// Source and destination pointer types are always "i8*" for intrinsic.  See</span>
+<a name="l00071"></a>00071   <span class="comment">// if the size is something we can handle with a single primitive load/store.</span>
+<a name="l00072"></a>00072   <span class="comment">// A single load+store correctly handles overlapping memory in the memmove</span>
+<a name="l00073"></a>00073   <span class="comment">// case.</span>
+<a name="l00074"></a>00074   uint64_t Size = MemOpLength-><a class="code" href="classllvm_1_1ConstantInt.html#a024bb83a7f01e7661ea72ff7dcc460f5" title="Get the constant's value with a saturation limit.">getLimitedValue</a>();
+<a name="l00075"></a>00075   assert(Size && <span class="stringliteral">"0-sized memory transfering should be removed already."</span>);
+<a name="l00076"></a>00076 
+<a name="l00077"></a>00077   <span class="keywordflow">if</span> (Size > 8 || (Size&(Size-1)))
+<a name="l00078"></a>00078     <span class="keywordflow">return</span> 0;  <span class="comment">// If not 1/2/4/8 bytes, exit.</span>
+<a name="l00079"></a>00079 
+<a name="l00080"></a>00080   <span class="comment">// Use an integer load+store unless we can find something better.</span>
+<a name="l00081"></a>00081   <span class="keywordtype">unsigned</span> SrcAddrSp =
+<a name="l00082"></a>00082     cast<PointerType>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())->getAddressSpace();
+<a name="l00083"></a>00083   <span class="keywordtype">unsigned</span> DstAddrSp =
+<a name="l00084"></a>00084     cast<PointerType>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())->getAddressSpace();
+<a name="l00085"></a>00085 
+<a name="l00086"></a>00086   <a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a>* IntType = <a class="code" href="classllvm_1_1IntegerType.html#a14f7b4f1aed38192fb6b7772eb506bdb" title="Get or create an IntegerType instance.">IntegerType::get</a>(MI-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>(), Size<<3);
+<a name="l00087"></a>00087   <a class="code" href="classllvm_1_1Type.html">Type</a> *NewSrcPtrTy = <a class="code" href="classllvm_1_1PointerType.html#a050a395d1656e546679d8b144d951bb2">PointerType::get</a>(IntType, SrcAddrSp);
+<a name="l00088"></a>00088   <a class="code" href="classllvm_1_1Type.html">Type</a> *NewDstPtrTy = <a class="code" href="classllvm_1_1PointerType.html#a050a395d1656e546679d8b144d951bb2">PointerType::get</a>(IntType, DstAddrSp);
+<a name="l00089"></a>00089 
+<a name="l00090"></a>00090   <span class="comment">// Memcpy forces the use of i8* for the source and destination.  That means</span>
+<a name="l00091"></a>00091   <span class="comment">// that if you're using memcpy to move one double around, you'll get a cast</span>
+<a name="l00092"></a>00092   <span class="comment">// from double* to i8*.  We'd much rather use a double load+store rather than</span>
+<a name="l00093"></a>00093   <span class="comment">// an i64 load+store, here because this improves the odds that the source or</span>
+<a name="l00094"></a>00094   <span class="comment">// dest address will be promotable.  See if we can find a better type than the</span>
+<a name="l00095"></a>00095   <span class="comment">// integer datatype.</span>
+<a name="l00096"></a>00096   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *StrippedDest = MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a38ea12c04523d63adda732b9c5d6da0a">stripPointerCasts</a>();
+<a name="l00097"></a>00097   <a class="code" href="classllvm_1_1MDNode.html" title="MDNode - a tuple of other values.">MDNode</a> *CopyMD = 0;
+<a name="l00098"></a>00098   <span class="keywordflow">if</span> (StrippedDest != MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)) {
+<a name="l00099"></a>00099     <a class="code" href="classllvm_1_1Type.html">Type</a> *SrcETy = cast<PointerType>(StrippedDest-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())
+<a name="l00100"></a>00100                                     ->getElementType();
+<a name="l00101"></a>00101     <span class="keywordflow">if</span> (TD && SrcETy-><a class="code" href="classllvm_1_1Type.html#a9dc5111b1a9b1d5c4652d50f74fe850b">isSized</a>() && TD-><a class="code" href="classllvm_1_1DataLayout.html#a4b979cd93852fd44c48851c94ee00758">getTypeStoreSize</a>(SrcETy) == Size) {
+<a name="l00102"></a>00102       <span class="comment">// The SrcETy might be something like {{{double}}} or [1 x double].  Rip</span>
+<a name="l00103"></a>00103       <span class="comment">// down through these levels if so.</span>
+<a name="l00104"></a>00104       SrcETy = <a class="code" href="InstCombineCalls_8cpp.html#a5e9f35c62ddea741af99837acfaf6da4">reduceToSingleValueType</a>(SrcETy);
+<a name="l00105"></a>00105 
+<a name="l00106"></a>00106       <span class="keywordflow">if</span> (SrcETy-><a class="code" href="classllvm_1_1Type.html#a36e21267fe14e69d3251eab1cd3a0076">isSingleValueType</a>()) {
+<a name="l00107"></a>00107         NewSrcPtrTy = <a class="code" href="classllvm_1_1PointerType.html#a050a395d1656e546679d8b144d951bb2">PointerType::get</a>(SrcETy, SrcAddrSp);
+<a name="l00108"></a>00108         NewDstPtrTy = <a class="code" href="classllvm_1_1PointerType.html#a050a395d1656e546679d8b144d951bb2">PointerType::get</a>(SrcETy, DstAddrSp);
+<a name="l00109"></a>00109 
+<a name="l00110"></a>00110         <span class="comment">// If the memcpy has metadata describing the members, see if we can</span>
+<a name="l00111"></a>00111         <span class="comment">// get the TBAA tag describing our copy.</span>
+<a name="l00112"></a>00112         <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MDNode.html" title="MDNode - a tuple of other values.">MDNode</a> *M = MI-><a class="code" href="classllvm_1_1Instruction.html#aafa29112cbe02e4adc9b36752c771991">getMetadata</a>(<a class="code" href="classllvm_1_1LLVMContext.html#a19d63434356844e2fd7116a9c0866ec9ac2e4a5f4a1f5315d162394df7c17a18c">LLVMContext::MD_tbaa_struct</a>)) {
+<a name="l00113"></a>00113           <span class="keywordflow">if</span> (M->getNumOperands() == 3 &&
+<a name="l00114"></a>00114               M->getOperand(0) &&
+<a name="l00115"></a>00115               isa<ConstantInt>(M->getOperand(0)) &&
+<a name="l00116"></a>00116               cast<ConstantInt>(M->getOperand(0))->isNullValue() &&
+<a name="l00117"></a>00117               M->getOperand(1) &&
+<a name="l00118"></a>00118               isa<ConstantInt>(M->getOperand(1)) &&
+<a name="l00119"></a>00119               cast<ConstantInt>(M->getOperand(1))->getValue() == Size &&
+<a name="l00120"></a>00120               M->getOperand(2) &&
+<a name="l00121"></a>00121               isa<MDNode>(M->getOperand(2)))
+<a name="l00122"></a>00122             CopyMD = cast<MDNode>(M->getOperand(2));
+<a name="l00123"></a>00123         }
+<a name="l00124"></a>00124       }
+<a name="l00125"></a>00125     }
+<a name="l00126"></a>00126   }
+<a name="l00127"></a>00127 
+<a name="l00128"></a>00128   <span class="comment">// If the memcpy/memmove provides better alignment info than we can</span>
+<a name="l00129"></a>00129   <span class="comment">// infer, use it.</span>
+<a name="l00130"></a>00130   SrcAlign = std::max(SrcAlign, CopyAlign);
+<a name="l00131"></a>00131   DstAlign = std::max(DstAlign, CopyAlign);
+<a name="l00132"></a>00132 
+<a name="l00133"></a>00133   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Src = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1), NewSrcPtrTy);
+<a name="l00134"></a>00134   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Dest = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(MI-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), NewDstPtrTy);
+<a name="l00135"></a>00135   <a class="code" href="classllvm_1_1LoadInst.html">LoadInst</a> *L = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#af440b535b3b4e8d0d089dd0ed2283a0f">CreateLoad</a>(Src, MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a9558faebdbb62c072aed98e33604889d">isVolatile</a>());
+<a name="l00136"></a>00136   L-><a class="code" href="classllvm_1_1LoadInst.html#a218ef27c964707a907f12db0f9b002ba">setAlignment</a>(SrcAlign);
+<a name="l00137"></a>00137   <span class="keywordflow">if</span> (CopyMD)
+<a name="l00138"></a>00138     L-><a class="code" href="classllvm_1_1Instruction.html#a9247a212ea89acc9573fa7e7f557eaba">setMetadata</a>(<a class="code" href="classllvm_1_1LLVMContext.html#a19d63434356844e2fd7116a9c0866ec9a66682b7e33233c8e51196bbf274726a2">LLVMContext::MD_tbaa</a>, CopyMD);
+<a name="l00139"></a>00139   <a class="code" href="classllvm_1_1StoreInst.html">StoreInst</a> *S = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a43f7fa52a3fbe01e44c40d9db278ab3e">CreateStore</a>(L, Dest, MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a9558faebdbb62c072aed98e33604889d">isVolatile</a>());
+<a name="l00140"></a>00140   S-><a class="code" href="classllvm_1_1StoreInst.html#a50d3891cd26db1308e81540f468de8c8">setAlignment</a>(DstAlign);
+<a name="l00141"></a>00141   <span class="keywordflow">if</span> (CopyMD)
+<a name="l00142"></a>00142     S-><a class="code" href="classllvm_1_1Instruction.html#a9247a212ea89acc9573fa7e7f557eaba">setMetadata</a>(<a class="code" href="classllvm_1_1LLVMContext.html#a19d63434356844e2fd7116a9c0866ec9a66682b7e33233c8e51196bbf274726a2">LLVMContext::MD_tbaa</a>, CopyMD);
+<a name="l00143"></a>00143 
+<a name="l00144"></a>00144   <span class="comment">// Set the size of the copy to 0, it will be deleted on the next iteration.</span>
+<a name="l00145"></a>00145   MI-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(2, <a class="code" href="classllvm_1_1Constant.html#aa6574d526b3e38a28f688a7bb4325c2c">Constant::getNullValue</a>(MemOpLength-><a class="code" href="classllvm_1_1ConstantInt.html#a240475f85dea79ec272c578fdf89acf1">getType</a>()));
+<a name="l00146"></a>00146   <span class="keywordflow">return</span> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>;
+<a name="l00147"></a>00147 }
+<a name="l00148"></a>00148 
+<a name="l00149"></a>00149 <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *InstCombiner::SimplifyMemSet(<a class="code" href="classllvm_1_1MemSetInst.html">MemSetInst</a> *MI) {
+<a name="l00150"></a>00150   <span class="keywordtype">unsigned</span> Alignment = <a class="code" href="namespacellvm.html#a43b09383874e62945e0050480bf3d641" title="getKnownAlignment - Try to infer an alignment for the specified pointer.">getKnownAlignment</a>(MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#ad8bf46d46e8f14bc23bd30df57cc9a77">getDest</a>(), TD);
+<a name="l00151"></a>00151   <span class="keywordflow">if</span> (MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a42dd65db3521498f10afb8c6f66e1bb5">getAlignment</a>() < Alignment) {
+<a name="l00152"></a>00152     MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a2dc2a7867d2c559ae17261d3f595f0d9">setAlignment</a>(<a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#ac7d475ed63dc9c318e816f68ab2f7d89">getAlignmentType</a>(),
+<a name="l00153"></a>00153                                              Alignment, <span class="keyword">false</span>));
+<a name="l00154"></a>00154     <span class="keywordflow">return</span> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>;
+<a name="l00155"></a>00155   }
+<a name="l00156"></a>00156 
+<a name="l00157"></a>00157   <span class="comment">// Extract the length and alignment and fill if they are constant.</span>
+<a name="l00158"></a>00158   <a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *LenC = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a>>(MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#abad10f74789466601c7a025540c1c072">getLength</a>());
+<a name="l00159"></a>00159   <a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *FillC = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a>>(MI-><a class="code" href="classllvm_1_1MemSetInst.html#a357f35c4ac1c01e84d73a4a9e26f6aac">getValue</a>());
+<a name="l00160"></a>00160   <span class="keywordflow">if</span> (!LenC || !FillC || !FillC-><a class="code" href="classllvm_1_1ConstantInt.html#a240475f85dea79ec272c578fdf89acf1">getType</a>()-><a class="code" href="classllvm_1_1Type.html#a6e328feb83afa5cf1c966d6704e43fc1">isIntegerTy</a>(8))
+<a name="l00161"></a>00161     <span class="keywordflow">return</span> 0;
+<a name="l00162"></a>00162   uint64_t Len = LenC-><a class="code" href="classllvm_1_1ConstantInt.html#a024bb83a7f01e7661ea72ff7dcc460f5" title="Get the constant's value with a saturation limit.">getLimitedValue</a>();
+<a name="l00163"></a>00163   Alignment = MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a42dd65db3521498f10afb8c6f66e1bb5">getAlignment</a>();
+<a name="l00164"></a>00164   assert(Len && <span class="stringliteral">"0-sized memory setting should be removed already."</span>);
+<a name="l00165"></a>00165 
+<a name="l00166"></a>00166   <span class="comment">// memset(s,c,n) -> store s, c (for n=1,2,4,8)</span>
+<a name="l00167"></a>00167   <span class="keywordflow">if</span> (Len <= 8 && <a class="code" href="namespacellvm.html#af4d1a918800291e75b01ce1447be0e83">isPowerOf2_32</a>((uint32_t)Len)) {
+<a name="l00168"></a>00168     <a class="code" href="classllvm_1_1Type.html">Type</a> *ITy = <a class="code" href="classllvm_1_1IntegerType.html#a14f7b4f1aed38192fb6b7772eb506bdb" title="Get or create an IntegerType instance.">IntegerType::get</a>(MI-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>(), Len*8);  <span class="comment">// n=1 -> i8.</span>
+<a name="l00169"></a>00169 
+<a name="l00170"></a>00170     <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Dest = MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#ad8bf46d46e8f14bc23bd30df57cc9a77">getDest</a>();
+<a name="l00171"></a>00171     <span class="keywordtype">unsigned</span> DstAddrSp = cast<PointerType>(Dest->getType())->getAddressSpace();
+<a name="l00172"></a>00172     <a class="code" href="classllvm_1_1Type.html">Type</a> *NewDstPtrTy = <a class="code" href="classllvm_1_1PointerType.html#a050a395d1656e546679d8b144d951bb2">PointerType::get</a>(ITy, DstAddrSp);
+<a name="l00173"></a>00173     Dest = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(Dest, NewDstPtrTy);
+<a name="l00174"></a>00174 
+<a name="l00175"></a>00175     <span class="comment">// Alignment 0 is identity for alignment 1 for memset, but not store.</span>
+<a name="l00176"></a>00176     <span class="keywordflow">if</span> (Alignment == 0) Alignment = 1;
+<a name="l00177"></a>00177 
+<a name="l00178"></a>00178     <span class="comment">// Extract the fill value and store.</span>
+<a name="l00179"></a>00179     uint64_t Fill = FillC->getZExtValue()*0x0101010101010101ULL;
+<a name="l00180"></a>00180     <a class="code" href="classllvm_1_1StoreInst.html">StoreInst</a> *S = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a43f7fa52a3fbe01e44c40d9db278ab3e">CreateStore</a>(<a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(ITy, Fill), Dest,
+<a name="l00181"></a>00181                                         MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a9558faebdbb62c072aed98e33604889d">isVolatile</a>());
+<a name="l00182"></a>00182     S-><a class="code" href="classllvm_1_1StoreInst.html#a50d3891cd26db1308e81540f468de8c8">setAlignment</a>(Alignment);
+<a name="l00183"></a>00183 
+<a name="l00184"></a>00184     <span class="comment">// Set the size of the copy to 0, it will be deleted on the next iteration.</span>
+<a name="l00185"></a>00185     MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a898aa65c5d00f6073df71f3dd709a84d">setLength</a>(<a class="code" href="classllvm_1_1Constant.html#aa6574d526b3e38a28f688a7bb4325c2c">Constant::getNullValue</a>(LenC-><a class="code" href="classllvm_1_1ConstantInt.html#a240475f85dea79ec272c578fdf89acf1">getType</a>()));
+<a name="l00186"></a>00186     <span class="keywordflow">return</span> <a class="code" href="namespacellvm_1_1ARMCC.html#ac8391dd6b8083baa870dee5142ff22b6af6284b830f5e4fe2a8ddb9ff1a25ee46">MI</a>;
+<a name="l00187"></a>00187   }
+<a name="l00188"></a>00188 
+<a name="l00189"></a>00189   <span class="keywordflow">return</span> 0;
+<a name="l00190"></a>00190 }
+<a name="l00191"></a>00191 <span class="comment"></span>
+<a name="l00192"></a>00192 <span class="comment">/// visitCallInst - CallInst simplification.  This mostly only handles folding</span>
+<a name="l00193"></a>00193 <span class="comment">/// of intrinsic instructions.  For normal calls, it allows visitCallSite to do</span>
+<a name="l00194"></a>00194 <span class="comment">/// the heavy lifting.</span>
+<a name="l00195"></a>00195 <span class="comment">///</span>
+<a name="l00196"></a><a class="code" href="classllvm_1_1InstCombiner.html#a9d2e8928305b97554ece6ccf19fa8c5e">00196</a> <span class="comment"></span><a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *<a class="code" href="classllvm_1_1InstCombiner.html#a9d2e8928305b97554ece6ccf19fa8c5e">InstCombiner::visitCallInst</a>(<a class="code" href="classllvm_1_1CallInst.html">CallInst</a> &CI) {
+<a name="l00197"></a>00197   <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#a42a9f1e04ad580b344123c15dbb29d39" title="isFreeCall - Returns non-null if the value is a call to the builtin free()">isFreeCall</a>(&CI, TLI))
+<a name="l00198"></a>00198     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a53e5c6efc4d9b9efe54a0c1429b852ea">visitFree</a>(CI);
+<a name="l00199"></a>00199 
+<a name="l00200"></a>00200   <span class="comment">// If the caller function is nounwind, mark the call as nounwind, even if the</span>
+<a name="l00201"></a>00201   <span class="comment">// callee isn't.</span>
+<a name="l00202"></a>00202   <span class="keywordflow">if</span> (CI.<a class="code" href="classllvm_1_1Instruction.html#a9cd49851904f15060edb782ef4dd1b2d">getParent</a>()-><a class="code" href="classllvm_1_1BasicBlock.html#aca229503e4f5c83a187a6a921c625fa8">getParent</a>()-><a class="code" href="classllvm_1_1Function.html#a3230e5e96b10019ecf64b8c8562c4da4" title="Determine if the function cannot unwind.">doesNotThrow</a>() &&
+<a name="l00203"></a>00203       !CI.<a class="code" href="classllvm_1_1CallInst.html#ad5d54b274a058b7ebe313437325df069" title="Determine if the call cannot unwind.">doesNotThrow</a>()) {
+<a name="l00204"></a>00204     CI.<a class="code" href="classllvm_1_1CallInst.html#aaa3de05ef40ccacdcbc0326c1d951ad4">setDoesNotThrow</a>();
+<a name="l00205"></a>00205     <span class="keywordflow">return</span> &CI;
+<a name="l00206"></a>00206   }
+<a name="l00207"></a>00207 
+<a name="l00208"></a>00208   <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *II = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a>>(&CI);
+<a name="l00209"></a>00209   <span class="keywordflow">if</span> (!II) <span class="keywordflow">return</span> visitCallSite(&CI);
+<a name="l00210"></a>00210 
+<a name="l00211"></a>00211   <span class="comment">// Intrinsics cannot occur in an invoke, so handle them here instead of in</span>
+<a name="l00212"></a>00212   <span class="comment">// visitCallSite.</span>
+<a name="l00213"></a>00213   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MemIntrinsic.html">MemIntrinsic</a> *MI = dyn_cast<MemIntrinsic>(II)) {
+<a name="l00214"></a>00214     <span class="keywordtype">bool</span> Changed = <span class="keyword">false</span>;
+<a name="l00215"></a>00215 
+<a name="l00216"></a>00216     <span class="comment">// memmove/cpy/set of zero bytes is a noop.</span>
+<a name="l00217"></a>00217     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *NumBytes = dyn_cast<Constant>(MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#abad10f74789466601c7a025540c1c072">getLength</a>())) {
+<a name="l00218"></a>00218       <span class="keywordflow">if</span> (NumBytes->isNullValue())
+<a name="l00219"></a>00219         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(CI);
+<a name="l00220"></a>00220 
+<a name="l00221"></a>00221       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *CI = dyn_cast<ConstantInt>(NumBytes))
+<a name="l00222"></a>00222         <span class="keywordflow">if</span> (CI->getZExtValue() == 1) {
+<a name="l00223"></a>00223           <span class="comment">// Replace the instruction with just byte operations.  We would</span>
+<a name="l00224"></a>00224           <span class="comment">// transform other cases to loads/stores, but we don't know if</span>
+<a name="l00225"></a>00225           <span class="comment">// alignment is sufficient.</span>
+<a name="l00226"></a>00226         }
+<a name="l00227"></a>00227     }
+<a name="l00228"></a>00228 
+<a name="l00229"></a>00229     <span class="comment">// No other transformations apply to volatile transfers.</span>
+<a name="l00230"></a>00230     <span class="keywordflow">if</span> (MI-><a class="code" href="classllvm_1_1MemIntrinsic.html#a9558faebdbb62c072aed98e33604889d">isVolatile</a>())
+<a name="l00231"></a>00231       <span class="keywordflow">return</span> 0;
+<a name="l00232"></a>00232 
+<a name="l00233"></a>00233     <span class="comment">// If we have a memmove and the source operation is a constant global,</span>
+<a name="l00234"></a>00234     <span class="comment">// then the source and dest pointers can't alias, so we can change this</span>
+<a name="l00235"></a>00235     <span class="comment">// into a call to memcpy.</span>
+<a name="l00236"></a>00236     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MemMoveInst.html">MemMoveInst</a> *MMI = dyn_cast<MemMoveInst>(MI)) {
+<a name="l00237"></a>00237       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1GlobalVariable.html">GlobalVariable</a> *GVSrc = dyn_cast<GlobalVariable>(MMI->getSource()))
+<a name="l00238"></a>00238         <span class="keywordflow">if</span> (GVSrc->isConstant()) {
+<a name="l00239"></a>00239           <a class="code" href="classllvm_1_1Module.html" title="The main container class for the LLVM Intermediate Representation.">Module</a> *M = CI.<a class="code" href="classllvm_1_1Instruction.html#a9cd49851904f15060edb782ef4dd1b2d">getParent</a>()-><a class="code" href="classllvm_1_1BasicBlock.html#aca229503e4f5c83a187a6a921c625fa8">getParent</a>()-><a class="code" href="classllvm_1_1GlobalValue.html#a9e1fc23a17e97d2d1732e753ae9251ac">getParent</a>();
+<a name="l00240"></a>00240           <a class="code" href="namespacellvm_1_1Intrinsic.html#a73349916f7e54a6b988a3646c7a02e90">Intrinsic::ID</a> MemCpyID = <a class="code" href="namespacellvm_1_1LibFunc.html#abf8f6830387f338fed0bce2e65108c6fad5203242bc89eaa644dc7b7ba2371c1d" title="void *memcpy(void *s1, const void *s2, size_t n);">Intrinsic::memcpy</a>;
+<a name="l00241"></a>00241           <a class="code" href="classllvm_1_1Type.html">Type</a> *Tys[3] = { CI.<a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>(),
+<a name="l00242"></a>00242                            CI.<a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>(),
+<a name="l00243"></a>00243                            CI.<a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(2)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>() };
+<a name="l00244"></a>00244           CI.<a class="code" href="classllvm_1_1CallInst.html#a61f747edd1ca001427e02e02a320b709" title="setCalledFunction - Set the function called.">setCalledFunction</a>(<a class="code" href="namespacellvm_1_1Intrinsic.html#a77b5c176e55722134f1fa5bf16f4d0c1">Intrinsic::getDeclaration</a>(M, MemCpyID, Tys));
+<a name="l00245"></a>00245           Changed = <span class="keyword">true</span>;
+<a name="l00246"></a>00246         }
+<a name="l00247"></a>00247     }
+<a name="l00248"></a>00248 
+<a name="l00249"></a>00249     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MemTransferInst.html">MemTransferInst</a> *MTI = dyn_cast<MemTransferInst>(MI)) {
+<a name="l00250"></a>00250       <span class="comment">// memmove(x,x,size) -> noop.</span>
+<a name="l00251"></a>00251       <span class="keywordflow">if</span> (MTI->getSource() == MTI->getDest())
+<a name="l00252"></a>00252         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(CI);
+<a name="l00253"></a>00253     }
+<a name="l00254"></a>00254 
+<a name="l00255"></a>00255     <span class="comment">// If we can determine a pointer alignment that is bigger than currently</span>
+<a name="l00256"></a>00256     <span class="comment">// set, update the alignment.</span>
+<a name="l00257"></a>00257     <span class="keywordflow">if</span> (isa<MemTransferInst>(MI)) {
+<a name="l00258"></a>00258       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = SimplifyMemTransfer(MI))
+<a name="l00259"></a>00259         <span class="keywordflow">return</span> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00260"></a>00260     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1MemSetInst.html">MemSetInst</a> *MSI = dyn_cast<MemSetInst>(MI)) {
+<a name="l00261"></a>00261       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = SimplifyMemSet(MSI))
+<a name="l00262"></a>00262         <span class="keywordflow">return</span> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00263"></a>00263     }
+<a name="l00264"></a>00264 
+<a name="l00265"></a>00265     <span class="keywordflow">if</span> (Changed) <span class="keywordflow">return</span> II;
+<a name="l00266"></a>00266   }
+<a name="l00267"></a>00267 
+<a name="l00268"></a>00268   <span class="keywordflow">switch</span> (II-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>()) {
+<a name="l00269"></a>00269   <span class="keywordflow">default</span>: <span class="keywordflow">break</span>;
+<a name="l00270"></a>00270   <span class="keywordflow">case</span> Intrinsic::objectsize: {
+<a name="l00271"></a>00271     uint64_t Size;
+<a name="l00272"></a>00272     <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#a76cbd8988ba92c4b0704c865e44f8a3c" title="Compute the size of the object pointed by Ptr. Returns true and the object size in Size if successful...">getObjectSize</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), Size, TD, TLI))
+<a name="l00273"></a>00273       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(CI.<a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>(), Size));
+<a name="l00274"></a>00274     <span class="keywordflow">return</span> 0;
+<a name="l00275"></a>00275   }
+<a name="l00276"></a>00276   <span class="keywordflow">case</span> Intrinsic::bswap:
+<a name="l00277"></a>00277     <span class="comment">// bswap(bswap(x)) -> x</span>
+<a name="l00278"></a>00278     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *Operand = dyn_cast<IntrinsicInst>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)))
+<a name="l00279"></a>00279       <span class="keywordflow">if</span> (Operand->getIntrinsicID() == Intrinsic::bswap)
+<a name="l00280"></a>00280         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, Operand-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0));
+<a name="l00281"></a>00281 
+<a name="l00282"></a>00282     <span class="comment">// bswap(trunc(bswap(x))) -> trunc(lshr(x, c))</span>
+<a name="l00283"></a>00283     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1TruncInst.html" title="This class represents a truncation of integer types.">TruncInst</a> *TI = dyn_cast<TruncInst>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0))) {
+<a name="l00284"></a>00284       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *Operand = dyn_cast<IntrinsicInst>(TI->getOperand(0)))
+<a name="l00285"></a>00285         <span class="keywordflow">if</span> (Operand->getIntrinsicID() == Intrinsic::bswap) {
+<a name="l00286"></a>00286           <span class="keywordtype">unsigned</span> <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974afd841a49aec1539bc88abc8ff9e170fb">C</a> = Operand->getType()->getPrimitiveSizeInBits() -
+<a name="l00287"></a>00287                        TI->getType()->getPrimitiveSizeInBits();
+<a name="l00288"></a>00288           <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *CV = <a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(Operand->getType(), <a class="code" href="namespacellvm_1_1CallingConv.html#a4f861731fc6dbfdccc05af5968d98974afd841a49aec1539bc88abc8ff9e170fb">C</a>);
+<a name="l00289"></a>00289           <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *V = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a3f8c45ea10c393433221a508b750dcd5">CreateLShr</a>(Operand->getArgOperand(0), CV);
+<a name="l00290"></a>00290           <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classllvm_1_1TruncInst.html" title="This class represents a truncation of integer types.">TruncInst</a>(V, TI->getType());
+<a name="l00291"></a>00291         }
+<a name="l00292"></a>00292     }
+<a name="l00293"></a>00293 
+<a name="l00294"></a>00294     <span class="keywordflow">break</span>;
+<a name="l00295"></a>00295   <span class="keywordflow">case</span> Intrinsic::powi:
+<a name="l00296"></a>00296     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *Power = dyn_cast<ConstantInt>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1))) {
+<a name="l00297"></a>00297       <span class="comment">// powi(x, 0) -> 1.0</span>
+<a name="l00298"></a>00298       <span class="keywordflow">if</span> (Power->isZero())
+<a name="l00299"></a>00299         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1ConstantFP.html#a5eb8f7a5d3cfdd127ad9db2e425e14eb">ConstantFP::get</a>(CI.<a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>(), 1.0));
+<a name="l00300"></a>00300       <span class="comment">// powi(x, 1) -> x</span>
+<a name="l00301"></a>00301       <span class="keywordflow">if</span> (Power->isOne())
+<a name="l00302"></a>00302         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0));
+<a name="l00303"></a>00303       <span class="comment">// powi(x, -1) -> 1/x</span>
+<a name="l00304"></a>00304       <span class="keywordflow">if</span> (Power->isAllOnesValue())
+<a name="l00305"></a>00305         <span class="keywordflow">return</span> BinaryOperator::CreateFDiv(<a class="code" href="classllvm_1_1ConstantFP.html#a5eb8f7a5d3cfdd127ad9db2e425e14eb">ConstantFP::get</a>(CI.<a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>(), 1.0),
+<a name="l00306"></a>00306                                           II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0));
+<a name="l00307"></a>00307     }
+<a name="l00308"></a>00308     <span class="keywordflow">break</span>;
+<a name="l00309"></a>00309   <span class="keywordflow">case</span> Intrinsic::cttz: {
+<a name="l00310"></a>00310     <span class="comment">// If all bits below the first known one are known zero,</span>
+<a name="l00311"></a>00311     <span class="comment">// this value is constant.</span>
+<a name="l00312"></a>00312     <a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a> *IT = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a>>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00313"></a>00313     <span class="comment">// FIXME: Try to simplify vectors of integers.</span>
+<a name="l00314"></a>00314     <span class="keywordflow">if</span> (!IT) <span class="keywordflow">break</span>;
+<a name="l00315"></a>00315     uint32_t BitWidth = IT-><a class="code" href="classllvm_1_1IntegerType.html#a6f603ab84f6f7c79985036f58cca9d48" title="Get the number of bits in this IntegerType.">getBitWidth</a>();
+<a name="l00316"></a>00316     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> KnownZero(BitWidth, 0);
+<a name="l00317"></a>00317     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> KnownOne(BitWidth, 0);
+<a name="l00318"></a>00318     <a class="code" href="classllvm_1_1InstCombiner.html#a6bcb0da7d62f15fe7649f10caab3fb26">ComputeMaskedBits</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), KnownZero, KnownOne);
+<a name="l00319"></a>00319     <span class="keywordtype">unsigned</span> TrailingZeros = KnownOne.<a class="code" href="classllvm_1_1APInt.html#aac277496191547e487eea07f09dffd4b" title="Count the number of trailing zero bits.">countTrailingZeros</a>();
+<a name="l00320"></a>00320     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> Mask(<a class="code" href="classllvm_1_1APInt.html#ad960e1ff48d25c382b6d28e7961f074e" title="Get a value with low bits set.">APInt::getLowBitsSet</a>(BitWidth, TrailingZeros));
+<a name="l00321"></a>00321     <span class="keywordflow">if</span> ((Mask & KnownZero) == Mask)
+<a name="l00322"></a>00322       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(IT,
+<a name="l00323"></a>00323                                  <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a>(BitWidth, TrailingZeros)));
+<a name="l00324"></a>00324 
+<a name="l00325"></a>00325     }
+<a name="l00326"></a>00326     <span class="keywordflow">break</span>;
+<a name="l00327"></a>00327   <span class="keywordflow">case</span> Intrinsic::ctlz: {
+<a name="l00328"></a>00328     <span class="comment">// If all bits above the first known one are known zero,</span>
+<a name="l00329"></a>00329     <span class="comment">// this value is constant.</span>
+<a name="l00330"></a>00330     <a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a> *IT = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a>>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00331"></a>00331     <span class="comment">// FIXME: Try to simplify vectors of integers.</span>
+<a name="l00332"></a>00332     <span class="keywordflow">if</span> (!IT) <span class="keywordflow">break</span>;
+<a name="l00333"></a>00333     uint32_t BitWidth = IT-><a class="code" href="classllvm_1_1IntegerType.html#a6f603ab84f6f7c79985036f58cca9d48" title="Get the number of bits in this IntegerType.">getBitWidth</a>();
+<a name="l00334"></a>00334     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> KnownZero(BitWidth, 0);
+<a name="l00335"></a>00335     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> KnownOne(BitWidth, 0);
+<a name="l00336"></a>00336     <a class="code" href="classllvm_1_1InstCombiner.html#a6bcb0da7d62f15fe7649f10caab3fb26">ComputeMaskedBits</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), KnownZero, KnownOne);
+<a name="l00337"></a>00337     <span class="keywordtype">unsigned</span> LeadingZeros = KnownOne.<a class="code" href="classllvm_1_1APInt.html#af0336ea4c7f7f56354b2ca7c8859c1f9">countLeadingZeros</a>();
+<a name="l00338"></a>00338     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> Mask(<a class="code" href="classllvm_1_1APInt.html#adcb96bd09d7c75c7669fa5f9d1190899" title="Get a value with high bits set.">APInt::getHighBitsSet</a>(BitWidth, LeadingZeros));
+<a name="l00339"></a>00339     <span class="keywordflow">if</span> ((Mask & KnownZero) == Mask)
+<a name="l00340"></a>00340       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(IT,
+<a name="l00341"></a>00341                                  <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a>(BitWidth, LeadingZeros)));
+<a name="l00342"></a>00342 
+<a name="l00343"></a>00343     }
+<a name="l00344"></a>00344     <span class="keywordflow">break</span>;
+<a name="l00345"></a>00345   <span class="keywordflow">case</span> Intrinsic::uadd_with_overflow: {
+<a name="l00346"></a>00346     <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *LHS = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), *RHS = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1);
+<a name="l00347"></a>00347     <a class="code" href="classllvm_1_1IntegerType.html" title="Integer representation type.">IntegerType</a> *IT = cast<IntegerType>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00348"></a>00348     uint32_t BitWidth = IT-><a class="code" href="classllvm_1_1IntegerType.html#a6f603ab84f6f7c79985036f58cca9d48" title="Get the number of bits in this IntegerType.">getBitWidth</a>();
+<a name="l00349"></a>00349     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> LHSKnownZero(BitWidth, 0);
+<a name="l00350"></a>00350     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> LHSKnownOne(BitWidth, 0);
+<a name="l00351"></a>00351     <a class="code" href="classllvm_1_1InstCombiner.html#a6bcb0da7d62f15fe7649f10caab3fb26">ComputeMaskedBits</a>(LHS, LHSKnownZero, LHSKnownOne);
+<a name="l00352"></a>00352     <span class="keywordtype">bool</span> LHSKnownNegative = LHSKnownOne[BitWidth - 1];
+<a name="l00353"></a>00353     <span class="keywordtype">bool</span> LHSKnownPositive = LHSKnownZero[BitWidth - 1];
+<a name="l00354"></a>00354 
+<a name="l00355"></a>00355     <span class="keywordflow">if</span> (LHSKnownNegative || LHSKnownPositive) {
+<a name="l00356"></a>00356       <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> RHSKnownZero(BitWidth, 0);
+<a name="l00357"></a>00357       <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> RHSKnownOne(BitWidth, 0);
+<a name="l00358"></a>00358       <a class="code" href="classllvm_1_1InstCombiner.html#a6bcb0da7d62f15fe7649f10caab3fb26">ComputeMaskedBits</a>(RHS, RHSKnownZero, RHSKnownOne);
+<a name="l00359"></a>00359       <span class="keywordtype">bool</span> RHSKnownNegative = RHSKnownOne[BitWidth - 1];
+<a name="l00360"></a>00360       <span class="keywordtype">bool</span> RHSKnownPositive = RHSKnownZero[BitWidth - 1];
+<a name="l00361"></a>00361       <span class="keywordflow">if</span> (LHSKnownNegative && RHSKnownNegative) {
+<a name="l00362"></a>00362         <span class="comment">// The sign bit is set in both cases: this MUST overflow.</span>
+<a name="l00363"></a>00363         <span class="comment">// Create a simple add instruction, and insert it into the struct.</span>
+<a name="l00364"></a>00364         <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Add = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a112f87f5844b5d94c07940f3d47f1e99">CreateAdd</a>(LHS, RHS);
+<a name="l00365"></a>00365         Add-><a class="code" href="classllvm_1_1Value.html#ae855357b6c5e6e7ed1869272708a3a84">takeName</a>(&CI);
+<a name="l00366"></a>00366         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *V[] = {
+<a name="l00367"></a>00367           <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(LHS-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),
+<a name="l00368"></a>00368           <a class="code" href="classllvm_1_1ConstantInt.html#a82dbbd8e3688b0bc1eedb338864d0d0c">ConstantInt::getTrue</a>(II-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())
+<a name="l00369"></a>00369         };
+<a name="l00370"></a>00370         <a class="code" href="classllvm_1_1StructType.html">StructType</a> *<a class="code" href="namespacellvm_1_1ARM__MB.html#ad70272e2a9ec2a7e3a497458e1edbc85aed0b9bef861c96eee19e89db753db7b2">ST</a> = cast<StructType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00371"></a>00371         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Struct = <a class="code" href="classllvm_1_1ConstantStruct.html#a54fcfa620deb80373f489ba2fdad7643">ConstantStruct::get</a>(ST, V);
+<a name="l00372"></a>00372         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InsertValueInst.html#a6df8a5db1907e4cfed3029c0c786a40b">InsertValueInst::Create</a>(Struct, Add, 0);
+<a name="l00373"></a>00373       }
+<a name="l00374"></a>00374 
+<a name="l00375"></a>00375       <span class="keywordflow">if</span> (LHSKnownPositive && RHSKnownPositive) {
+<a name="l00376"></a>00376         <span class="comment">// The sign bit is clear in both cases: this CANNOT overflow.</span>
+<a name="l00377"></a>00377         <span class="comment">// Create a simple add instruction, and insert it into the struct.</span>
+<a name="l00378"></a>00378         <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Add = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a621a5f4ed562311ba3f8aa0f4a7f41b6">CreateNUWAdd</a>(LHS, RHS);
+<a name="l00379"></a>00379         Add-><a class="code" href="classllvm_1_1Value.html#ae855357b6c5e6e7ed1869272708a3a84">takeName</a>(&CI);
+<a name="l00380"></a>00380         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *V[] = {
+<a name="l00381"></a>00381           <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(LHS-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),
+<a name="l00382"></a>00382           <a class="code" href="classllvm_1_1ConstantInt.html#aa7cce62ac5cc6df09cce0535874336b7">ConstantInt::getFalse</a>(II-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())
+<a name="l00383"></a>00383         };
+<a name="l00384"></a>00384         <a class="code" href="classllvm_1_1StructType.html">StructType</a> *<a class="code" href="namespacellvm_1_1ARM__MB.html#ad70272e2a9ec2a7e3a497458e1edbc85aed0b9bef861c96eee19e89db753db7b2">ST</a> = cast<StructType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00385"></a>00385         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Struct = <a class="code" href="classllvm_1_1ConstantStruct.html#a54fcfa620deb80373f489ba2fdad7643">ConstantStruct::get</a>(ST, V);
+<a name="l00386"></a>00386         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InsertValueInst.html#a6df8a5db1907e4cfed3029c0c786a40b">InsertValueInst::Create</a>(Struct, Add, 0);
+<a name="l00387"></a>00387       }
+<a name="l00388"></a>00388     }
+<a name="l00389"></a>00389   }
+<a name="l00390"></a>00390   <span class="comment">// FALL THROUGH uadd into sadd</span>
+<a name="l00391"></a>00391   <span class="keywordflow">case</span> Intrinsic::sadd_with_overflow:
+<a name="l00392"></a>00392     <span class="comment">// Canonicalize constants into the RHS.</span>
+<a name="l00393"></a>00393     <span class="keywordflow">if</span> (isa<Constant>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)) &&
+<a name="l00394"></a>00394         !isa<Constant>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1))) {
+<a name="l00395"></a>00395       <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *LHS = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0);
+<a name="l00396"></a>00396       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(0, II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1));
+<a name="l00397"></a>00397       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(1, LHS);
+<a name="l00398"></a>00398       <span class="keywordflow">return</span> II;
+<a name="l00399"></a>00399     }
+<a name="l00400"></a>00400 
+<a name="l00401"></a>00401     <span class="comment">// X + undef -> undef</span>
+<a name="l00402"></a>00402     <span class="keywordflow">if</span> (isa<UndefValue>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)))
+<a name="l00403"></a>00403       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00404"></a>00404 
+<a name="l00405"></a>00405     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *RHS = dyn_cast<ConstantInt>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1))) {
+<a name="l00406"></a>00406       <span class="comment">// X + 0 -> {X, false}</span>
+<a name="l00407"></a>00407       <span class="keywordflow">if</span> (RHS->isZero()) {
+<a name="l00408"></a>00408         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *V[] = {
+<a name="l00409"></a>00409           <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),
+<a name="l00410"></a>00410           <a class="code" href="classllvm_1_1ConstantInt.html#aa7cce62ac5cc6df09cce0535874336b7">ConstantInt::getFalse</a>(II-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())
+<a name="l00411"></a>00411         };
+<a name="l00412"></a>00412         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Struct =
+<a name="l00413"></a>00413           <a class="code" href="classllvm_1_1ConstantStruct.html#a54fcfa620deb80373f489ba2fdad7643">ConstantStruct::get</a>(cast<StructType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()), V);
+<a name="l00414"></a>00414         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InsertValueInst.html#a6df8a5db1907e4cfed3029c0c786a40b">InsertValueInst::Create</a>(Struct, II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), 0);
+<a name="l00415"></a>00415       }
+<a name="l00416"></a>00416     }
+<a name="l00417"></a>00417     <span class="keywordflow">break</span>;
+<a name="l00418"></a>00418   <span class="keywordflow">case</span> Intrinsic::usub_with_overflow:
+<a name="l00419"></a>00419   <span class="keywordflow">case</span> Intrinsic::ssub_with_overflow:
+<a name="l00420"></a>00420     <span class="comment">// undef - X -> undef</span>
+<a name="l00421"></a>00421     <span class="comment">// X - undef -> undef</span>
+<a name="l00422"></a>00422     <span class="keywordflow">if</span> (isa<UndefValue>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)) ||
+<a name="l00423"></a>00423         isa<UndefValue>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)))
+<a name="l00424"></a>00424       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00425"></a>00425 
+<a name="l00426"></a>00426     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *RHS = dyn_cast<ConstantInt>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1))) {
+<a name="l00427"></a>00427       <span class="comment">// X - 0 -> {X, false}</span>
+<a name="l00428"></a>00428       <span class="keywordflow">if</span> (RHS->isZero()) {
+<a name="l00429"></a>00429         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *V[] = {
+<a name="l00430"></a>00430           <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),
+<a name="l00431"></a>00431           <a class="code" href="classllvm_1_1ConstantInt.html#aa7cce62ac5cc6df09cce0535874336b7">ConstantInt::getFalse</a>(II-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())
+<a name="l00432"></a>00432         };
+<a name="l00433"></a>00433         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Struct =
+<a name="l00434"></a>00434           <a class="code" href="classllvm_1_1ConstantStruct.html#a54fcfa620deb80373f489ba2fdad7643">ConstantStruct::get</a>(cast<StructType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()), V);
+<a name="l00435"></a>00435         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InsertValueInst.html#a6df8a5db1907e4cfed3029c0c786a40b">InsertValueInst::Create</a>(Struct, II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), 0);
+<a name="l00436"></a>00436       }
+<a name="l00437"></a>00437     }
+<a name="l00438"></a>00438     <span class="keywordflow">break</span>;
+<a name="l00439"></a>00439   <span class="keywordflow">case</span> Intrinsic::umul_with_overflow: {
+<a name="l00440"></a>00440     <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *LHS = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), *RHS = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1);
+<a name="l00441"></a>00441     <span class="keywordtype">unsigned</span> BitWidth = cast<IntegerType>(LHS-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())-><a class="code" href="ValueTracking_8cpp.html#a06c14477546c3a0eb4c79ff007ea2375">getBitWidth</a>();
+<a name="l00442"></a>00442 
+<a name="l00443"></a>00443     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> LHSKnownZero(BitWidth, 0);
+<a name="l00444"></a>00444     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> LHSKnownOne(BitWidth, 0);
+<a name="l00445"></a>00445     <a class="code" href="classllvm_1_1InstCombiner.html#a6bcb0da7d62f15fe7649f10caab3fb26">ComputeMaskedBits</a>(LHS, LHSKnownZero, LHSKnownOne);
+<a name="l00446"></a>00446     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> RHSKnownZero(BitWidth, 0);
+<a name="l00447"></a>00447     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> RHSKnownOne(BitWidth, 0);
+<a name="l00448"></a>00448     <a class="code" href="classllvm_1_1InstCombiner.html#a6bcb0da7d62f15fe7649f10caab3fb26">ComputeMaskedBits</a>(RHS, RHSKnownZero, RHSKnownOne);
+<a name="l00449"></a>00449 
+<a name="l00450"></a>00450     <span class="comment">// Get the largest possible values for each operand.</span>
+<a name="l00451"></a>00451     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> LHSMax = ~LHSKnownZero;
+<a name="l00452"></a>00452     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> RHSMax = ~RHSKnownZero;
+<a name="l00453"></a>00453 
+<a name="l00454"></a>00454     <span class="comment">// If multiplying the maximum values does not overflow then we can turn</span>
+<a name="l00455"></a>00455     <span class="comment">// this into a plain NUW mul.</span>
+<a name="l00456"></a>00456     <span class="keywordtype">bool</span> Overflow;
+<a name="l00457"></a>00457     LHSMax.<a class="code" href="classllvm_1_1APInt.html#a0fac4bb0300a0e8f35a02c20badb8092">umul_ov</a>(RHSMax, Overflow);
+<a name="l00458"></a>00458     <span class="keywordflow">if</span> (!Overflow) {
+<a name="l00459"></a>00459       <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Mul = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a472da121ef92dbbf5abf9b28e8e012cf">CreateNUWMul</a>(LHS, RHS, <span class="stringliteral">"umul_with_overflow"</span>);
+<a name="l00460"></a>00460       <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *V[] = {
+<a name="l00461"></a>00461         <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(LHS-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),
+<a name="l00462"></a>00462         <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilderBase.html#a337deb4326c2dbbe852f77d2d213a9fb" title="getFalse - Get the constant value for i1 false.">getFalse</a>()
+<a name="l00463"></a>00463       };
+<a name="l00464"></a>00464       <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Struct = <a class="code" href="classllvm_1_1ConstantStruct.html#a54fcfa620deb80373f489ba2fdad7643">ConstantStruct::get</a>(cast<StructType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),V);
+<a name="l00465"></a>00465       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InsertValueInst.html#a6df8a5db1907e4cfed3029c0c786a40b">InsertValueInst::Create</a>(Struct, Mul, 0);
+<a name="l00466"></a>00466     }
+<a name="l00467"></a>00467   } <span class="comment">// FALL THROUGH</span>
+<a name="l00468"></a>00468   <span class="keywordflow">case</span> Intrinsic::smul_with_overflow:
+<a name="l00469"></a>00469     <span class="comment">// Canonicalize constants into the RHS.</span>
+<a name="l00470"></a>00470     <span class="keywordflow">if</span> (isa<Constant>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)) &&
+<a name="l00471"></a>00471         !isa<Constant>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1))) {
+<a name="l00472"></a>00472       <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *LHS = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0);
+<a name="l00473"></a>00473       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(0, II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1));
+<a name="l00474"></a>00474       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(1, LHS);
+<a name="l00475"></a>00475       <span class="keywordflow">return</span> II;
+<a name="l00476"></a>00476     }
+<a name="l00477"></a>00477 
+<a name="l00478"></a>00478     <span class="comment">// X * undef -> undef</span>
+<a name="l00479"></a>00479     <span class="keywordflow">if</span> (isa<UndefValue>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)))
+<a name="l00480"></a>00480       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00481"></a>00481 
+<a name="l00482"></a>00482     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *RHSI = dyn_cast<ConstantInt>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1))) {
+<a name="l00483"></a>00483       <span class="comment">// X*0 -> {0, false}</span>
+<a name="l00484"></a>00484       <span class="keywordflow">if</span> (RHSI->isZero())
+<a name="l00485"></a>00485         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1Constant.html#aa6574d526b3e38a28f688a7bb4325c2c">Constant::getNullValue</a>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00486"></a>00486 
+<a name="l00487"></a>00487       <span class="comment">// X * 1 -> {X, false}</span>
+<a name="l00488"></a>00488       <span class="keywordflow">if</span> (RHSI->equalsInt(1)) {
+<a name="l00489"></a>00489         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *V[] = {
+<a name="l00490"></a>00490           <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()),
+<a name="l00491"></a>00491           <a class="code" href="classllvm_1_1ConstantInt.html#aa7cce62ac5cc6df09cce0535874336b7">ConstantInt::getFalse</a>(II-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())
+<a name="l00492"></a>00492         };
+<a name="l00493"></a>00493         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Struct =
+<a name="l00494"></a>00494           <a class="code" href="classllvm_1_1ConstantStruct.html#a54fcfa620deb80373f489ba2fdad7643">ConstantStruct::get</a>(cast<StructType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()), V);
+<a name="l00495"></a>00495         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InsertValueInst.html#a6df8a5db1907e4cfed3029c0c786a40b">InsertValueInst::Create</a>(Struct, II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), 0);
+<a name="l00496"></a>00496       }
+<a name="l00497"></a>00497     }
+<a name="l00498"></a>00498     <span class="keywordflow">break</span>;
+<a name="l00499"></a>00499   <span class="keywordflow">case</span> Intrinsic::ppc_altivec_lvx:
+<a name="l00500"></a>00500   <span class="keywordflow">case</span> Intrinsic::ppc_altivec_lvxl:
+<a name="l00501"></a>00501     <span class="comment">// Turn PPC lvx -> load if the pointer is known aligned.</span>
+<a name="l00502"></a>00502     <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#a3dd948f1535b4b28f2a7d45a5c11a34a">getOrEnforceKnownAlignment</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), 16, TD) >= 16) {
+<a name="l00503"></a>00503       <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Ptr = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0),
+<a name="l00504"></a>00504                                          <a class="code" href="classllvm_1_1PointerType.html#a8db49fd5069f21d514e7bb0fd11f0902">PointerType::getUnqual</a>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00505"></a>00505       <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classllvm_1_1LoadInst.html">LoadInst</a>(Ptr);
+<a name="l00506"></a>00506     }
+<a name="l00507"></a>00507     <span class="keywordflow">break</span>;
+<a name="l00508"></a>00508   <span class="keywordflow">case</span> Intrinsic::ppc_altivec_stvx:
+<a name="l00509"></a>00509   <span class="keywordflow">case</span> Intrinsic::ppc_altivec_stvxl:
+<a name="l00510"></a>00510     <span class="comment">// Turn stvx -> store if the pointer is known aligned.</span>
+<a name="l00511"></a>00511     <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#a3dd948f1535b4b28f2a7d45a5c11a34a">getOrEnforceKnownAlignment</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1), 16, TD) >= 16) {
+<a name="l00512"></a>00512       <a class="code" href="classllvm_1_1Type.html">Type</a> *OpPtrTy =
+<a name="l00513"></a>00513         <a class="code" href="classllvm_1_1PointerType.html#a8db49fd5069f21d514e7bb0fd11f0902">PointerType::getUnqual</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00514"></a>00514       <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Ptr = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1), OpPtrTy);
+<a name="l00515"></a>00515       <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classllvm_1_1StoreInst.html">StoreInst</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), Ptr);
+<a name="l00516"></a>00516     }
+<a name="l00517"></a>00517     <span class="keywordflow">break</span>;
+<a name="l00518"></a>00518   <span class="keywordflow">case</span> Intrinsic::x86_sse_storeu_ps:
+<a name="l00519"></a>00519   <span class="keywordflow">case</span> Intrinsic::x86_sse2_storeu_pd:
+<a name="l00520"></a>00520   <span class="keywordflow">case</span> Intrinsic::x86_sse2_storeu_dq:
+<a name="l00521"></a>00521     <span class="comment">// Turn X86 storeu -> store if the pointer is known aligned.</span>
+<a name="l00522"></a>00522     <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#a3dd948f1535b4b28f2a7d45a5c11a34a">getOrEnforceKnownAlignment</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), 16, TD) >= 16) {
+<a name="l00523"></a>00523       <a class="code" href="classllvm_1_1Type.html">Type</a> *OpPtrTy =
+<a name="l00524"></a>00524         <a class="code" href="classllvm_1_1PointerType.html#a8db49fd5069f21d514e7bb0fd11f0902">PointerType::getUnqual</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00525"></a>00525       <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Ptr = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), OpPtrTy);
+<a name="l00526"></a>00526       <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classllvm_1_1StoreInst.html">StoreInst</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1), Ptr);
+<a name="l00527"></a>00527     }
+<a name="l00528"></a>00528     <span class="keywordflow">break</span>;
+<a name="l00529"></a>00529 
+<a name="l00530"></a>00530   <span class="keywordflow">case</span> Intrinsic::x86_sse_cvtss2si:
+<a name="l00531"></a>00531   <span class="keywordflow">case</span> Intrinsic::x86_sse_cvtss2si64:
+<a name="l00532"></a>00532   <span class="keywordflow">case</span> Intrinsic::x86_sse_cvttss2si:
+<a name="l00533"></a>00533   <span class="keywordflow">case</span> Intrinsic::x86_sse_cvttss2si64:
+<a name="l00534"></a>00534   <span class="keywordflow">case</span> Intrinsic::x86_sse2_cvtsd2si:
+<a name="l00535"></a>00535   <span class="keywordflow">case</span> Intrinsic::x86_sse2_cvtsd2si64:
+<a name="l00536"></a>00536   <span class="keywordflow">case</span> Intrinsic::x86_sse2_cvttsd2si:
+<a name="l00537"></a>00537   <span class="keywordflow">case</span> Intrinsic::x86_sse2_cvttsd2si64: {
+<a name="l00538"></a>00538     <span class="comment">// These intrinsics only demand the 0th element of their input vectors. If</span>
+<a name="l00539"></a>00539     <span class="comment">// we can simplify the input based on that, do so now.</span>
+<a name="l00540"></a>00540     <span class="keywordtype">unsigned</span> VWidth =
+<a name="l00541"></a>00541       cast<VectorType>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())->getNumElements();
+<a name="l00542"></a>00542     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> DemandedElts(VWidth, 1);
+<a name="l00543"></a>00543     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> UndefElts(VWidth, 0);
+<a name="l00544"></a>00544     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *V = SimplifyDemandedVectorElts(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0),
+<a name="l00545"></a>00545                                               DemandedElts, UndefElts)) {
+<a name="l00546"></a>00546       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(0, V);
+<a name="l00547"></a>00547       <span class="keywordflow">return</span> II;
+<a name="l00548"></a>00548     }
+<a name="l00549"></a>00549     <span class="keywordflow">break</span>;
+<a name="l00550"></a>00550   }
+<a name="l00551"></a>00551 
+<a name="l00552"></a>00552 
+<a name="l00553"></a>00553   <span class="keywordflow">case</span> Intrinsic::x86_sse41_pmovsxbw:
+<a name="l00554"></a>00554   <span class="keywordflow">case</span> Intrinsic::x86_sse41_pmovsxwd:
+<a name="l00555"></a>00555   <span class="keywordflow">case</span> Intrinsic::x86_sse41_pmovsxdq:
+<a name="l00556"></a>00556   <span class="keywordflow">case</span> Intrinsic::x86_sse41_pmovzxbw:
+<a name="l00557"></a>00557   <span class="keywordflow">case</span> Intrinsic::x86_sse41_pmovzxwd:
+<a name="l00558"></a>00558   <span class="keywordflow">case</span> Intrinsic::x86_sse41_pmovzxdq: {
+<a name="l00559"></a>00559     <span class="comment">// pmov{s|z}x ignores the upper half of their input vectors.</span>
+<a name="l00560"></a>00560     <span class="keywordtype">unsigned</span> VWidth =
+<a name="l00561"></a>00561       cast<VectorType>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())->getNumElements();
+<a name="l00562"></a>00562     <span class="keywordtype">unsigned</span> LowHalfElts = VWidth / 2;
+<a name="l00563"></a>00563     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> InputDemandedElts(<a class="code" href="classllvm_1_1APInt.html#a46ceedee591f92727b85641794a96061" title="Get a value with a block of bits set.">APInt::getBitsSet</a>(VWidth, 0, LowHalfElts));
+<a name="l00564"></a>00564     <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> UndefElts(VWidth, 0);
+<a name="l00565"></a>00565     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *TmpV = SimplifyDemandedVectorElts(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0),
+<a name="l00566"></a>00566                                                  InputDemandedElts,
+<a name="l00567"></a>00567                                                  UndefElts)) {
+<a name="l00568"></a>00568       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(0, TmpV);
+<a name="l00569"></a>00569       <span class="keywordflow">return</span> II;
+<a name="l00570"></a>00570     }
+<a name="l00571"></a>00571     <span class="keywordflow">break</span>;
+<a name="l00572"></a>00572   }
+<a name="l00573"></a>00573 
+<a name="l00574"></a>00574   <span class="keywordflow">case</span> Intrinsic::ppc_altivec_vperm:
+<a name="l00575"></a>00575     <span class="comment">// Turn vperm(V1,V2,mask) -> shuffle(V1,V2,mask) if mask is a constant.</span>
+<a name="l00576"></a>00576     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Mask = dyn_cast<Constant>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(2))) {
+<a name="l00577"></a>00577       assert(Mask->getType()->getVectorNumElements() == 16 &&
+<a name="l00578"></a>00578              <span class="stringliteral">"Bad type for intrinsic!"</span>);
+<a name="l00579"></a>00579 
+<a name="l00580"></a>00580       <span class="comment">// Check that all of the elements are integer constants or undefs.</span>
+<a name="l00581"></a>00581       <span class="keywordtype">bool</span> AllEltsOk = <span class="keyword">true</span>;
+<a name="l00582"></a>00582       <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i != 16; ++i) {
+<a name="l00583"></a>00583         <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *Elt = Mask-><a class="code" href="classllvm_1_1Constant.html#a01fee21e2c679094ce5ab193369d5198">getAggregateElement</a>(i);
+<a name="l00584"></a>00584         <span class="keywordflow">if</span> (Elt == 0 ||
+<a name="l00585"></a>00585             !(isa<ConstantInt>(Elt) || isa<UndefValue>(Elt))) {
+<a name="l00586"></a>00586           AllEltsOk = <span class="keyword">false</span>;
+<a name="l00587"></a>00587           <span class="keywordflow">break</span>;
+<a name="l00588"></a>00588         }
+<a name="l00589"></a>00589       }
+<a name="l00590"></a>00590 
+<a name="l00591"></a>00591       <span class="keywordflow">if</span> (AllEltsOk) {
+<a name="l00592"></a>00592         <span class="comment">// Cast the input vectors to byte vectors.</span>
+<a name="l00593"></a>00593         <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Op0 = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0),
+<a name="l00594"></a>00594                                             Mask-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00595"></a>00595         <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Op1 = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1),
+<a name="l00596"></a>00596                                             Mask-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00597"></a>00597         <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Result = <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(Op0-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00598"></a>00598 
+<a name="l00599"></a>00599         <span class="comment">// Only extract each element once.</span>
+<a name="l00600"></a>00600         <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *ExtractedElts[32];
+<a name="l00601"></a>00601         <a class="code" href="namespacellvm_1_1LibFunc.html#abf8f6830387f338fed0bce2e65108c6fa9f7f1b6be1144152902121f2463d0368" title="void *memset(void *b, int c, size_t len);">memset</a>(ExtractedElts, 0, <span class="keyword">sizeof</span>(ExtractedElts));
+<a name="l00602"></a>00602 
+<a name="l00603"></a>00603         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i != 16; ++i) {
+<a name="l00604"></a>00604           <span class="keywordflow">if</span> (isa<UndefValue>(Mask->getAggregateElement(i)))
+<a name="l00605"></a>00605             <span class="keywordflow">continue</span>;
+<a name="l00606"></a>00606           <span class="keywordtype">unsigned</span> Idx =
+<a name="l00607"></a>00607             cast<ConstantInt>(Mask->getAggregateElement(i))->getZExtValue();
+<a name="l00608"></a>00608           Idx &= 31;  <span class="comment">// Match the hardware behavior.</span>
+<a name="l00609"></a>00609 
+<a name="l00610"></a>00610           <span class="keywordflow">if</span> (ExtractedElts[Idx] == 0) {
+<a name="l00611"></a>00611             ExtractedElts[Idx] =
+<a name="l00612"></a>00612               <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#ad0affa936bea7c530da1597e9bb60bbd">CreateExtractElement</a>(Idx < 16 ? Op0 : Op1,
+<a name="l00613"></a>00613                                             <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilderBase.html#ac0e8c554bf1c1e117a74d51df89c137d" title="getInt32 - Get a constant 32-bit value.">getInt32</a>(Idx&15));
+<a name="l00614"></a>00614           }
+<a name="l00615"></a>00615 
+<a name="l00616"></a>00616           <span class="comment">// Insert this value into the result vector.</span>
+<a name="l00617"></a>00617           Result = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a40e48df9196b3c092096138cd9af8465">CreateInsertElement</a>(Result, ExtractedElts[Idx],
+<a name="l00618"></a>00618                                                 <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilderBase.html#ac0e8c554bf1c1e117a74d51df89c137d" title="getInt32 - Get a constant 32-bit value.">getInt32</a>(i));
+<a name="l00619"></a>00619         }
+<a name="l00620"></a>00620         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1CastInst.html#a0f7dea9550778374905e12da6d6ba8a8" title="Construct any of the CastInst subclasses.">CastInst::Create</a>(Instruction::BitCast, Result, CI.<a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00621"></a>00621       }
+<a name="l00622"></a>00622     }
+<a name="l00623"></a>00623     <span class="keywordflow">break</span>;
+<a name="l00624"></a>00624 
+<a name="l00625"></a>00625   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld1:
+<a name="l00626"></a>00626   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld2:
+<a name="l00627"></a>00627   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld3:
+<a name="l00628"></a>00628   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld4:
+<a name="l00629"></a>00629   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld2lane:
+<a name="l00630"></a>00630   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld3lane:
+<a name="l00631"></a>00631   <span class="keywordflow">case</span> Intrinsic::arm_neon_vld4lane:
+<a name="l00632"></a>00632   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst1:
+<a name="l00633"></a>00633   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst2:
+<a name="l00634"></a>00634   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst3:
+<a name="l00635"></a>00635   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst4:
+<a name="l00636"></a>00636   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst2lane:
+<a name="l00637"></a>00637   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst3lane:
+<a name="l00638"></a>00638   <span class="keywordflow">case</span> Intrinsic::arm_neon_vst4lane: {
+<a name="l00639"></a>00639     <span class="keywordtype">unsigned</span> MemAlign = <a class="code" href="namespacellvm.html#a43b09383874e62945e0050480bf3d641" title="getKnownAlignment - Try to infer an alignment for the specified pointer.">getKnownAlignment</a>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0), TD);
+<a name="l00640"></a>00640     <span class="keywordtype">unsigned</span> AlignArg = II-><a class="code" href="classllvm_1_1CallInst.html#ac88b95273e6c753188f6a54d65548579">getNumArgOperands</a>() - 1;
+<a name="l00641"></a>00641     <a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *IntrAlign = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a>>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(AlignArg));
+<a name="l00642"></a>00642     <span class="keywordflow">if</span> (IntrAlign && IntrAlign-><a class="code" href="classllvm_1_1ConstantInt.html#a6edd823ba5e4e1effc8280ca8a1194ef" title="Return the zero extended value.">getZExtValue</a>() < MemAlign) {
+<a name="l00643"></a>00643       II-><a class="code" href="classllvm_1_1CallInst.html#abc04eae9879e3b4fe7f01ce0f4d4e71e">setArgOperand</a>(AlignArg,
+<a name="l00644"></a>00644                         <a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(<a class="code" href="classllvm_1_1Type.html#a30dd396c5b40cd86c1591872e574ccdf">Type::getInt32Ty</a>(II-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>()),
+<a name="l00645"></a>00645                                          MemAlign, <span class="keyword">false</span>));
+<a name="l00646"></a>00646       <span class="keywordflow">return</span> II;
+<a name="l00647"></a>00647     }
+<a name="l00648"></a>00648     <span class="keywordflow">break</span>;
+<a name="l00649"></a>00649   }
+<a name="l00650"></a>00650 
+<a name="l00651"></a>00651   <span class="keywordflow">case</span> Intrinsic::arm_neon_vmulls:
+<a name="l00652"></a>00652   <span class="keywordflow">case</span> Intrinsic::arm_neon_vmullu: {
+<a name="l00653"></a>00653     <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Arg0 = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0);
+<a name="l00654"></a>00654     <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Arg1 = II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1);
+<a name="l00655"></a>00655 
+<a name="l00656"></a>00656     <span class="comment">// Handle mul by zero first:</span>
+<a name="l00657"></a>00657     <span class="keywordflow">if</span> (isa<ConstantAggregateZero>(Arg0) || isa<ConstantAggregateZero>(Arg1)) {
+<a name="l00658"></a>00658       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1ConstantAggregateZero.html#abfa1cf8b4348407b167f93bc7c01055f">ConstantAggregateZero::get</a>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00659"></a>00659     }
+<a name="l00660"></a>00660 
+<a name="l00661"></a>00661     <span class="comment">// Check for constant LHS & RHS - in this case we just simplify.</span>
+<a name="l00662"></a>00662     <span class="keywordtype">bool</span> Zext = (II-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>() == Intrinsic::arm_neon_vmullu);
+<a name="l00663"></a>00663     <a class="code" href="classllvm_1_1VectorType.html">VectorType</a> *NewVT = cast<VectorType>(II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00664"></a>00664     <span class="keywordtype">unsigned</span> NewWidth = NewVT-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>()-><a class="code" href="classllvm_1_1Type.html#a0519dc6e2f153aaed61eed17d965a9f0">getIntegerBitWidth</a>();
+<a name="l00665"></a>00665     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantDataVector.html">ConstantDataVector</a> *CV0 = dyn_cast<ConstantDataVector>(Arg0)) {
+<a name="l00666"></a>00666       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantDataVector.html">ConstantDataVector</a> *CV1 = dyn_cast<ConstantDataVector>(Arg1)) {
+<a name="l00667"></a>00667         <a class="code" href="classllvm_1_1VectorType.html">VectorType</a>* VT = cast<VectorType>(CV0->getType());
+<a name="l00668"></a>00668         <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<Constant*, 4></a> NewElems;
+<a name="l00669"></a>00669         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < VT-><a class="code" href="classllvm_1_1VectorType.html#a580510fa692dccfb26d0e967d8f164e7" title="Return the number of elements in the Vector type.">getNumElements</a>(); ++i) {
+<a name="l00670"></a>00670           <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> CV0E =
+<a name="l00671"></a>00671             (cast<ConstantInt>(CV0->getAggregateElement(i)))->getValue();
+<a name="l00672"></a>00672           CV0E = Zext ? CV0E.<a class="code" href="classllvm_1_1APInt.html#a6142fc5662411269a7ca0217f49f338c" title="Zero extend to a new width.">zext</a>(NewWidth) : CV0E.<a class="code" href="classllvm_1_1APInt.html#aa3464694bcec68b89b4bffd71360b897" title="Sign extend to a new width.">sext</a>(NewWidth);
+<a name="l00673"></a>00673           <a class="code" href="classllvm_1_1APInt.html" title="Class for arbitrary precision integers.">APInt</a> CV1E =
+<a name="l00674"></a>00674             (cast<ConstantInt>(CV1->getAggregateElement(i)))->getValue();
+<a name="l00675"></a>00675           CV1E = Zext ? CV1E.<a class="code" href="classllvm_1_1APInt.html#a6142fc5662411269a7ca0217f49f338c" title="Zero extend to a new width.">zext</a>(NewWidth) : CV1E.<a class="code" href="classllvm_1_1APInt.html#aa3464694bcec68b89b4bffd71360b897" title="Sign extend to a new width.">sext</a>(NewWidth);
+<a name="l00676"></a>00676           NewElems.push_back(
+<a name="l00677"></a>00677             <a class="code" href="classllvm_1_1ConstantInt.html#a9105541412dab869e18b3cceebfff07d">ConstantInt::get</a>(NewVT-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>(), CV0E * CV1E));
+<a name="l00678"></a>00678         }
+<a name="l00679"></a>00679         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(CI, <a class="code" href="classllvm_1_1ConstantVector.html#ade9fa017ca3aa82f7694a47090547bc1">ConstantVector::get</a>(NewElems));
+<a name="l00680"></a>00680       }
+<a name="l00681"></a>00681 
+<a name="l00682"></a>00682       <span class="comment">// Couldn't simplify - cannonicalize constant to the RHS.</span>
+<a name="l00683"></a>00683       <a class="code" href="namespacellvm.html#a39bdaf6372ed2ef16d951fc0f6d54dd4">std::swap</a>(Arg0, Arg1);
+<a name="l00684"></a>00684     }
+<a name="l00685"></a>00685 
+<a name="l00686"></a>00686     <span class="comment">// Handle mul by one:</span>
+<a name="l00687"></a>00687     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantDataVector.html">ConstantDataVector</a> *CV1 = dyn_cast<ConstantDataVector>(Arg1)) {
+<a name="l00688"></a>00688       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1ConstantInt.html" title="Class for constant integers.">ConstantInt</a> *Splat =
+<a name="l00689"></a>00689             dyn_cast_or_null<ConstantInt>(CV1->getSplatValue())) {
+<a name="l00690"></a>00690         <span class="keywordflow">if</span> (Splat->isOne()) {
+<a name="l00691"></a>00691           <span class="keywordflow">if</span> (Zext)
+<a name="l00692"></a>00692             <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1CastInst.html#a0b0b5a5ac5a86ae0a3e58716d6c2cd72" title="Create a ZExt or BitCast cast instruction.">CastInst::CreateZExtOrBitCast</a>(Arg0, II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00693"></a>00693           <span class="comment">// else    </span>
+<a name="l00694"></a>00694           <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1CastInst.html#aa06c047a6ee4e8cdc63d08c079fc8503" title="Create a SExt or BitCast cast instruction.">CastInst::CreateSExtOrBitCast</a>(Arg0, II-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00695"></a>00695         }
+<a name="l00696"></a>00696       }
+<a name="l00697"></a>00697     }
+<a name="l00698"></a>00698 
+<a name="l00699"></a>00699     <span class="keywordflow">break</span>;
+<a name="l00700"></a>00700   }
+<a name="l00701"></a>00701 
+<a name="l00702"></a>00702   <span class="keywordflow">case</span> Intrinsic::stackrestore: {
+<a name="l00703"></a>00703     <span class="comment">// If the save is right next to the restore, remove the restore.  This can</span>
+<a name="l00704"></a>00704     <span class="comment">// happen when variable allocas are DCE'd.</span>
+<a name="l00705"></a>00705     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *SS = dyn_cast<IntrinsicInst>(II-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(0))) {
+<a name="l00706"></a>00706       <span class="keywordflow">if</span> (SS->getIntrinsicID() == Intrinsic::stacksave) {
+<a name="l00707"></a>00707         <a class="code" href="classllvm_1_1ilist__iterator.html">BasicBlock::iterator</a> BI = SS;
+<a name="l00708"></a>00708         <span class="keywordflow">if</span> (&*++BI == II)
+<a name="l00709"></a>00709           <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(CI);
+<a name="l00710"></a>00710       }
+<a name="l00711"></a>00711     }
+<a name="l00712"></a>00712 
+<a name="l00713"></a>00713     <span class="comment">// Scan down this block to see if there is another stack restore in the</span>
+<a name="l00714"></a>00714     <span class="comment">// same block without an intervening call/alloca.</span>
+<a name="l00715"></a>00715     <a class="code" href="classllvm_1_1ilist__iterator.html">BasicBlock::iterator</a> BI = II;
+<a name="l00716"></a>00716     <a class="code" href="classllvm_1_1TerminatorInst.html">TerminatorInst</a> *TI = II-><a class="code" href="classllvm_1_1Instruction.html#a9cd49851904f15060edb782ef4dd1b2d">getParent</a>()-><a class="code" href="classllvm_1_1BasicBlock.html#a5cb76a65b6524dba1493dd2b9dc3abbe">getTerminator</a>();
+<a name="l00717"></a>00717     <span class="keywordtype">bool</span> CannotRemove = <span class="keyword">false</span>;
+<a name="l00718"></a>00718     <span class="keywordflow">for</span> (++BI; &*BI != TI; ++BI) {
+<a name="l00719"></a>00719       <span class="keywordflow">if</span> (isa<AllocaInst>(BI)) {
+<a name="l00720"></a>00720         CannotRemove = <span class="keyword">true</span>;
+<a name="l00721"></a>00721         <span class="keywordflow">break</span>;
+<a name="l00722"></a>00722       }
+<a name="l00723"></a>00723       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1CallInst.html">CallInst</a> *BCI = dyn_cast<CallInst>(BI)) {
+<a name="l00724"></a>00724         <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *II = dyn_cast<IntrinsicInst>(BCI)) {
+<a name="l00725"></a>00725           <span class="comment">// If there is a stackrestore below this one, remove this one.</span>
+<a name="l00726"></a>00726           <span class="keywordflow">if</span> (II-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>() == Intrinsic::stackrestore)
+<a name="l00727"></a>00727             <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(CI);
+<a name="l00728"></a>00728           <span class="comment">// Otherwise, ignore the intrinsic.</span>
+<a name="l00729"></a>00729         } <span class="keywordflow">else</span> {
+<a name="l00730"></a>00730           <span class="comment">// If we found a non-intrinsic call, we can't remove the stack</span>
+<a name="l00731"></a>00731           <span class="comment">// restore.</span>
+<a name="l00732"></a>00732           CannotRemove = <span class="keyword">true</span>;
+<a name="l00733"></a>00733           <span class="keywordflow">break</span>;
+<a name="l00734"></a>00734         }
+<a name="l00735"></a>00735       }
+<a name="l00736"></a>00736     }
+<a name="l00737"></a>00737 
+<a name="l00738"></a>00738     <span class="comment">// If the stack restore is in a return, resume, or unwind block and if there</span>
+<a name="l00739"></a>00739     <span class="comment">// are no allocas or calls between the restore and the return, nuke the</span>
+<a name="l00740"></a>00740     <span class="comment">// restore.</span>
+<a name="l00741"></a>00741     <span class="keywordflow">if</span> (!CannotRemove && (isa<ReturnInst>(TI) || isa<ResumeInst>(TI)))
+<a name="l00742"></a>00742       <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(CI);
+<a name="l00743"></a>00743     <span class="keywordflow">break</span>;
+<a name="l00744"></a>00744   }
+<a name="l00745"></a>00745   }
+<a name="l00746"></a>00746 
+<a name="l00747"></a>00747   <span class="keywordflow">return</span> visitCallSite(II);
+<a name="l00748"></a>00748 }
+<a name="l00749"></a>00749 
+<a name="l00750"></a>00750 <span class="comment">// InvokeInst simplification</span>
+<a name="l00751"></a>00751 <span class="comment">//</span>
+<a name="l00752"></a><a class="code" href="classllvm_1_1InstCombiner.html#a51a4eaa43bac1997e0a9b2a5fc0e67bf">00752</a> <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *<a class="code" href="classllvm_1_1InstCombiner.html#a51a4eaa43bac1997e0a9b2a5fc0e67bf">InstCombiner::visitInvokeInst</a>(<a class="code" href="classllvm_1_1InvokeInst.html">InvokeInst</a> &II) {
+<a name="l00753"></a>00753   <span class="keywordflow">return</span> visitCallSite(&II);
+<a name="l00754"></a>00754 }
+<a name="l00755"></a>00755 <span class="comment"></span>
+<a name="l00756"></a>00756 <span class="comment">/// isSafeToEliminateVarargsCast - If this cast does not affect the value</span>
+<a name="l00757"></a>00757 <span class="comment">/// passed through the varargs area, we can eliminate the use of the cast.</span>
+<a name="l00758"></a><a class="code" href="InstCombineCalls_8cpp.html#adf068c88073fc2f83a9a1be5086c786e">00758</a> <span class="comment"></span><span class="keyword">static</span> <span class="keywordtype">bool</span> <a class="code" href="InstCombineCalls_8cpp.html#adf068c88073fc2f83a9a1be5086c786e">isSafeToEliminateVarargsCast</a>(<span class="keyword">const</span> <a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS,
+<a name="l00759"></a>00759                                          <span class="keyword">const</span> <a class="code" href="classllvm_1_1CastInst.html" title="Base class of casting instructions.">CastInst</a> * <span class="keyword">const</span> CI,
+<a name="l00760"></a>00760                                          <span class="keyword">const</span> <a class="code" href="classllvm_1_1DataLayout.html">DataLayout</a> * <span class="keyword">const</span> TD,
+<a name="l00761"></a>00761                                          <span class="keyword">const</span> <span class="keywordtype">int</span> ix) {
+<a name="l00762"></a>00762   <span class="keywordflow">if</span> (!CI-><a class="code" href="classllvm_1_1CastInst.html#ae41652f0ca51aa34fb95ca62b1699921" title="Determine if this is a lossless cast.">isLosslessCast</a>())
+<a name="l00763"></a>00763     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00764"></a>00764 
+<a name="l00765"></a>00765   <span class="comment">// The size of ByVal arguments is derived from the type, so we</span>
+<a name="l00766"></a>00766   <span class="comment">// can't change to a type with a different size.  If the size were</span>
+<a name="l00767"></a>00767   <span class="comment">// passed explicitly we could avoid this check.</span>
+<a name="l00768"></a>00768   <span class="keywordflow">if</span> (!CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a2b51df7c4694230be653c4b5a3186029" title="Determine whether this argument is passed by value.">isByValArgument</a>(ix))
+<a name="l00769"></a>00769     <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00770"></a>00770 
+<a name="l00771"></a>00771   <a class="code" href="classllvm_1_1Type.html">Type</a>* SrcTy =
+<a name="l00772"></a>00772             cast<PointerType>(CI-><a class="code" href="classllvm_1_1User.html#a997ff6a1758bf732b9b263fc61011644">getOperand</a>(0)-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())->getElementType();
+<a name="l00773"></a>00773   <a class="code" href="classllvm_1_1Type.html">Type</a>* DstTy = cast<PointerType>(CI-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>())->getElementType();
+<a name="l00774"></a>00774   <span class="keywordflow">if</span> (!SrcTy-><a class="code" href="classllvm_1_1Type.html#a9dc5111b1a9b1d5c4652d50f74fe850b">isSized</a>() || !DstTy-><a class="code" href="classllvm_1_1Type.html#a9dc5111b1a9b1d5c4652d50f74fe850b">isSized</a>())
+<a name="l00775"></a>00775     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00776"></a>00776   <span class="keywordflow">if</span> (!TD || TD-><a class="code" href="classllvm_1_1DataLayout.html#a1d6fcc02e91ba24510aba42660c90e29">getTypeAllocSize</a>(SrcTy) != TD-><a class="code" href="classllvm_1_1DataLayout.html#a1d6fcc02e91ba24510aba42660c90e29">getTypeAllocSize</a>(DstTy))
+<a name="l00777"></a>00777     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00778"></a>00778   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l00779"></a>00779 }
+<a name="l00780"></a>00780 
+<a name="l00781"></a>00781 <span class="comment">// Try to fold some different type of calls here.</span>
+<a name="l00782"></a>00782 <span class="comment">// Currently we're only working with the checking functions, memcpy_chk,</span>
+<a name="l00783"></a>00783 <span class="comment">// mempcpy_chk, memmove_chk, memset_chk, strcpy_chk, stpcpy_chk, strncpy_chk,</span>
+<a name="l00784"></a>00784 <span class="comment">// strcat_chk and strncat_chk.</span>
+<a name="l00785"></a>00785 <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *InstCombiner::tryOptimizeCall(<a class="code" href="classllvm_1_1CallInst.html">CallInst</a> *CI, <span class="keyword">const</span> <a class="code" href="classllvm_1_1DataLayout.html">DataLayout</a> *TD) {
+<a name="l00786"></a>00786   <span class="keywordflow">if</span> (CI-><a class="code" href="classllvm_1_1CallInst.html#a0bcd4131e1a1d92215f5385b4e16cd2e">getCalledFunction</a>() == 0) <span class="keywordflow">return</span> 0;
+<a name="l00787"></a>00787 
+<a name="l00788"></a>00788   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *With = Simplifier-><a class="code" href="classllvm_1_1LibCallSimplifier.html#a720db84f33d3d265af10e8703a0611b9">optimizeCall</a>(CI))
+<a name="l00789"></a>00789     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(*CI, With);
+<a name="l00790"></a>00790 
+<a name="l00791"></a>00791   <span class="keywordflow">return</span> 0;
+<a name="l00792"></a>00792 }
+<a name="l00793"></a>00793 
+<a name="l00794"></a><a class="code" href="InstCombineCalls_8cpp.html#a92e8a3e299322d1a0c036f7e6d7d03ee">00794</a> <span class="keyword">static</span> <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *<a class="code" href="InstCombineCalls_8cpp.html#a92e8a3e299322d1a0c036f7e6d7d03ee">FindInitTrampolineFromAlloca</a>(<a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *TrampMem) {
+<a name="l00795"></a>00795   <span class="comment">// Strip off at most one level of pointer casts, looking for an alloca.  This</span>
+<a name="l00796"></a>00796   <span class="comment">// is good enough in practice and simpler than handling any number of casts.</span>
+<a name="l00797"></a>00797   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Underlying = TrampMem-><a class="code" href="classllvm_1_1Value.html#a38ea12c04523d63adda732b9c5d6da0a">stripPointerCasts</a>();
+<a name="l00798"></a>00798   <span class="keywordflow">if</span> (Underlying != TrampMem &&
+<a name="l00799"></a>00799       (!Underlying-><a class="code" href="classllvm_1_1Value.html#a085b82f074c28030fb8e194377ed2d0c">hasOneUse</a>() || *Underlying-><a class="code" href="classllvm_1_1Value.html#a413abcab8dbc3900fc2fde96a5d8fca6">use_begin</a>() != TrampMem))
+<a name="l00800"></a>00800     <span class="keywordflow">return</span> 0;
+<a name="l00801"></a>00801   <span class="keywordflow">if</span> (!isa<AllocaInst>(Underlying))
+<a name="l00802"></a>00802     <span class="keywordflow">return</span> 0;
+<a name="l00803"></a>00803 
+<a name="l00804"></a>00804   <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *InitTrampoline = 0;
+<a name="l00805"></a>00805   <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1value__use__iterator.html">Value::use_iterator</a> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = TrampMem-><a class="code" href="classllvm_1_1Value.html#a413abcab8dbc3900fc2fde96a5d8fca6">use_begin</a>(), E = TrampMem-><a class="code" href="classllvm_1_1Value.html#ad86469939d2a8bdd4169be9403b89f5a">use_end</a>();
+<a name="l00806"></a>00806        <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> != E; <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>++) {
+<a name="l00807"></a>00807     <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *II = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a>>(*I);
+<a name="l00808"></a>00808     <span class="keywordflow">if</span> (!II)
+<a name="l00809"></a>00809       <span class="keywordflow">return</span> 0;
+<a name="l00810"></a>00810     <span class="keywordflow">if</span> (II-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>() == Intrinsic::init_trampoline) {
+<a name="l00811"></a>00811       <span class="keywordflow">if</span> (InitTrampoline)
+<a name="l00812"></a>00812         <span class="comment">// More than one init_trampoline writes to this value.  Give up.</span>
+<a name="l00813"></a>00813         <span class="keywordflow">return</span> 0;
+<a name="l00814"></a>00814       InitTrampoline = II;
+<a name="l00815"></a>00815       <span class="keywordflow">continue</span>;
+<a name="l00816"></a>00816     }
+<a name="l00817"></a>00817     <span class="keywordflow">if</span> (II-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>() == Intrinsic::adjust_trampoline)
+<a name="l00818"></a>00818       <span class="comment">// Allow any number of calls to adjust.trampoline.</span>
+<a name="l00819"></a>00819       <span class="keywordflow">continue</span>;
+<a name="l00820"></a>00820     <span class="keywordflow">return</span> 0;
+<a name="l00821"></a>00821   }
+<a name="l00822"></a>00822 
+<a name="l00823"></a>00823   <span class="comment">// No call to init.trampoline found.</span>
+<a name="l00824"></a>00824   <span class="keywordflow">if</span> (!InitTrampoline)
+<a name="l00825"></a>00825     <span class="keywordflow">return</span> 0;
+<a name="l00826"></a>00826 
+<a name="l00827"></a>00827   <span class="comment">// Check that the alloca is being used in the expected way.</span>
+<a name="l00828"></a>00828   <span class="keywordflow">if</span> (InitTrampoline-><a class="code" href="classllvm_1_1User.html#a997ff6a1758bf732b9b263fc61011644">getOperand</a>(0) != TrampMem)
+<a name="l00829"></a>00829     <span class="keywordflow">return</span> 0;
+<a name="l00830"></a>00830 
+<a name="l00831"></a>00831   <span class="keywordflow">return</span> InitTrampoline;
+<a name="l00832"></a>00832 }
+<a name="l00833"></a>00833 
+<a name="l00834"></a><a class="code" href="InstCombineCalls_8cpp.html#a3857dfc5897c46cd4946360189859e41">00834</a> <span class="keyword">static</span> <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *<a class="code" href="InstCombineCalls_8cpp.html#a3857dfc5897c46cd4946360189859e41">FindInitTrampolineFromBB</a>(<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *AdjustTramp,
+<a name="l00835"></a>00835                                                <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *TrampMem) {
+<a name="l00836"></a>00836   <span class="comment">// Visit all the previous instructions in the basic block, and try to find a</span>
+<a name="l00837"></a>00837   <span class="comment">// init.trampoline which has a direct path to the adjust.trampoline.</span>
+<a name="l00838"></a>00838   <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1ilist__iterator.html">BasicBlock::iterator</a> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = AdjustTramp,
+<a name="l00839"></a>00839        E = AdjustTramp-><a class="code" href="classllvm_1_1Instruction.html#a9cd49851904f15060edb782ef4dd1b2d">getParent</a>()-><a class="code" href="classllvm_1_1BasicBlock.html#a0ed5f3ab3c2e4196ee0cffffa080c062">begin</a>(); <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> != E; ) {
+<a name="l00840"></a>00840     <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *Inst = --<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l00841"></a>00841     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *II = dyn_cast<IntrinsicInst>(<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>))
+<a name="l00842"></a>00842       <span class="keywordflow">if</span> (II-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>() == Intrinsic::init_trampoline &&
+<a name="l00843"></a>00843           II-><a class="code" href="classllvm_1_1User.html#a997ff6a1758bf732b9b263fc61011644">getOperand</a>(0) == TrampMem)
+<a name="l00844"></a>00844         <span class="keywordflow">return</span> II;
+<a name="l00845"></a>00845     <span class="keywordflow">if</span> (Inst-><a class="code" href="classllvm_1_1Instruction.html#aa26de3d6e38997b9041e824ea558c770">mayWriteToMemory</a>())
+<a name="l00846"></a>00846       <span class="keywordflow">return</span> 0;
+<a name="l00847"></a>00847   }
+<a name="l00848"></a>00848   <span class="keywordflow">return</span> 0;
+<a name="l00849"></a>00849 }
+<a name="l00850"></a>00850 
+<a name="l00851"></a>00851 <span class="comment">// Given a call to llvm.adjust.trampoline, find and return the corresponding</span>
+<a name="l00852"></a>00852 <span class="comment">// call to llvm.init.trampoline if the call to the trampoline can be optimized</span>
+<a name="l00853"></a>00853 <span class="comment">// to a direct call to a function.  Otherwise return NULL.</span>
+<a name="l00854"></a>00854 <span class="comment">//</span>
+<a name="l00855"></a><a class="code" href="InstCombineCalls_8cpp.html#a2794a7d076d08b832fb4c14a403f70ae">00855</a> <span class="keyword">static</span> <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *<a class="code" href="InstCombineCalls_8cpp.html#a2794a7d076d08b832fb4c14a403f70ae">FindInitTrampoline</a>(<a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Callee) {
+<a name="l00856"></a>00856   Callee = Callee-><a class="code" href="classllvm_1_1Value.html#a38ea12c04523d63adda732b9c5d6da0a">stripPointerCasts</a>();
+<a name="l00857"></a>00857   <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *AdjustTramp = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a>>(Callee);
+<a name="l00858"></a>00858   <span class="keywordflow">if</span> (!AdjustTramp ||
+<a name="l00859"></a>00859       AdjustTramp-><a class="code" href="classllvm_1_1IntrinsicInst.html#a6cbb4809b81f3994ee0c79b38556bd66">getIntrinsicID</a>() != Intrinsic::adjust_trampoline)
+<a name="l00860"></a>00860     <span class="keywordflow">return</span> 0;
+<a name="l00861"></a>00861 
+<a name="l00862"></a>00862   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *TrampMem = AdjustTramp-><a class="code" href="classllvm_1_1User.html#a997ff6a1758bf732b9b263fc61011644">getOperand</a>(0);
+<a name="l00863"></a>00863 
+<a name="l00864"></a>00864   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *IT = <a class="code" href="InstCombineCalls_8cpp.html#a92e8a3e299322d1a0c036f7e6d7d03ee">FindInitTrampolineFromAlloca</a>(TrampMem))
+<a name="l00865"></a>00865     <span class="keywordflow">return</span> IT;
+<a name="l00866"></a>00866   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *IT = <a class="code" href="InstCombineCalls_8cpp.html#a3857dfc5897c46cd4946360189859e41">FindInitTrampolineFromBB</a>(AdjustTramp, TrampMem))
+<a name="l00867"></a>00867     <span class="keywordflow">return</span> IT;
+<a name="l00868"></a>00868   <span class="keywordflow">return</span> 0;
+<a name="l00869"></a>00869 }
+<a name="l00870"></a>00870 
+<a name="l00871"></a>00871 <span class="comment">// visitCallSite - Improvements for call and invoke instructions.</span>
+<a name="l00872"></a>00872 <span class="comment">//</span>
+<a name="l00873"></a>00873 <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *InstCombiner::visitCallSite(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS) {
+<a name="l00874"></a>00874   <span class="keywordflow">if</span> (<a class="code" href="namespacellvm.html#a0e0017717a140769348ff4379f97c28d" title="Tests if a value is a call or invoke to a library function that allocates memory (either malloc...">isAllocLikeFn</a>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>(), TLI))
+<a name="l00875"></a>00875     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#ad9114d86dbeaa0f40b79579f3836c5c6">visitAllocSite</a>(*CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>());
+<a name="l00876"></a>00876 
+<a name="l00877"></a>00877   <span class="keywordtype">bool</span> Changed = <span class="keyword">false</span>;
+<a name="l00878"></a>00878 
+<a name="l00879"></a>00879   <span class="comment">// If the callee is a pointer to a function, attempt to move any casts to the</span>
+<a name="l00880"></a>00880   <span class="comment">// arguments of the call/invoke.</span>
+<a name="l00881"></a>00881   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Callee = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a1abce20a9eff3d23ce05331962b1997c">getCalledValue</a>();
+<a name="l00882"></a>00882   <span class="keywordflow">if</span> (!isa<Function>(Callee) && transformConstExprCastCall(CS))
+<a name="l00883"></a>00883     <span class="keywordflow">return</span> 0;
+<a name="l00884"></a>00884 
+<a name="l00885"></a>00885   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1Function.html">Function</a> *CalleeF = dyn_cast<Function>(Callee))
+<a name="l00886"></a>00886     <span class="comment">// If the call and callee calling conventions don't match, this call must</span>
+<a name="l00887"></a>00887     <span class="comment">// be unreachable, as the call is undefined.</span>
+<a name="l00888"></a>00888     <span class="keywordflow">if</span> (CalleeF->getCallingConv() != CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ac651192f7bb4de8e675b000f406d6489">getCallingConv</a>() &&
+<a name="l00889"></a>00889         <span class="comment">// Only do this for calls to a function with a body.  A prototype may</span>
+<a name="l00890"></a>00890         <span class="comment">// not actually end up matching the implementation's calling conv for a</span>
+<a name="l00891"></a>00891         <span class="comment">// variety of reasons (e.g. it may be written in assembly).</span>
+<a name="l00892"></a>00892         !CalleeF->isDeclaration()) {
+<a name="l00893"></a>00893       <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *OldCall = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>();
+<a name="l00894"></a>00894       <span class="keyword">new</span> <a class="code" href="classllvm_1_1StoreInst.html">StoreInst</a>(<a class="code" href="classllvm_1_1ConstantInt.html#a82dbbd8e3688b0bc1eedb338864d0d0c">ConstantInt::getTrue</a>(Callee-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>()),
+<a name="l00895"></a>00895                 <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(<a class="code" href="classllvm_1_1Type.html#a2ee2de2efa05f2abb95007892fc559a4">Type::getInt1PtrTy</a>(Callee-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())),
+<a name="l00896"></a>00896                                   OldCall);
+<a name="l00897"></a>00897       <span class="comment">// If OldCall dues not return void then replaceAllUsesWith undef.</span>
+<a name="l00898"></a>00898       <span class="comment">// This allows ValueHandlers and custom metadata to adjust itself.</span>
+<a name="l00899"></a>00899       <span class="keywordflow">if</span> (!OldCall-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()-><a class="code" href="classllvm_1_1Type.html#af5c7041df3ad5edffe5da17b5264c1fc" title="isVoidTy - Return true if this is 'void'.">isVoidTy</a>())
+<a name="l00900"></a>00900         <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(*OldCall, <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(OldCall-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00901"></a>00901       <span class="keywordflow">if</span> (isa<CallInst>(OldCall))
+<a name="l00902"></a>00902         <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(*OldCall);
+<a name="l00903"></a>00903 
+<a name="l00904"></a>00904       <span class="comment">// We cannot remove an invoke, because it would change the CFG, just</span>
+<a name="l00905"></a>00905       <span class="comment">// change the callee to a null pointer.</span>
+<a name="l00906"></a>00906       cast<InvokeInst>(OldCall)->setCalledFunction(
+<a name="l00907"></a>00907                                     <a class="code" href="classllvm_1_1Constant.html#aa6574d526b3e38a28f688a7bb4325c2c">Constant::getNullValue</a>(CalleeF->getType()));
+<a name="l00908"></a>00908       <span class="keywordflow">return</span> 0;
+<a name="l00909"></a>00909     }
+<a name="l00910"></a>00910 
+<a name="l00911"></a>00911   <span class="keywordflow">if</span> (isa<ConstantPointerNull>(Callee) || isa<UndefValue>(Callee)) {
+<a name="l00912"></a>00912     <span class="comment">// If CS does not return void then replaceAllUsesWith undef.</span>
+<a name="l00913"></a>00913     <span class="comment">// This allows ValueHandlers and custom metadata to adjust itself.</span>
+<a name="l00914"></a>00914     <span class="keywordflow">if</span> (!CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>()-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()-><a class="code" href="classllvm_1_1Type.html#af5c7041df3ad5edffe5da17b5264c1fc" title="isVoidTy - Return true if this is 'void'.">isVoidTy</a>())
+<a name="l00915"></a>00915       <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(*CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>(),
+<a name="l00916"></a>00916                           <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>()-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()));
+<a name="l00917"></a>00917 
+<a name="l00918"></a>00918     <span class="keywordflow">if</span> (isa<InvokeInst>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>())) {
+<a name="l00919"></a>00919       <span class="comment">// Can't remove an invoke because we cannot change the CFG.</span>
+<a name="l00920"></a>00920       <span class="keywordflow">return</span> 0;
+<a name="l00921"></a>00921     }
+<a name="l00922"></a>00922 
+<a name="l00923"></a>00923     <span class="comment">// This instruction is not reachable, just remove it.  We insert a store to</span>
+<a name="l00924"></a>00924     <span class="comment">// undef so that we know that this code is not reachable, despite the fact</span>
+<a name="l00925"></a>00925     <span class="comment">// that we can't modify the CFG here.</span>
+<a name="l00926"></a>00926     <span class="keyword">new</span> <a class="code" href="classllvm_1_1StoreInst.html">StoreInst</a>(<a class="code" href="classllvm_1_1ConstantInt.html#a82dbbd8e3688b0bc1eedb338864d0d0c">ConstantInt::getTrue</a>(Callee-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>()),
+<a name="l00927"></a>00927                   <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(<a class="code" href="classllvm_1_1Type.html#a2ee2de2efa05f2abb95007892fc559a4">Type::getInt1PtrTy</a>(Callee-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())),
+<a name="l00928"></a>00928                   CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>());
+<a name="l00929"></a>00929 
+<a name="l00930"></a>00930     <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(*CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>());
+<a name="l00931"></a>00931   }
+<a name="l00932"></a>00932 
+<a name="l00933"></a>00933   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *II = <a class="code" href="InstCombineCalls_8cpp.html#a2794a7d076d08b832fb4c14a403f70ae">FindInitTrampoline</a>(Callee))
+<a name="l00934"></a>00934     <span class="keywordflow">return</span> transformCallThroughTrampoline(CS, II);
+<a name="l00935"></a>00935 
+<a name="l00936"></a>00936   <a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *PTy = cast<PointerType>(Callee-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l00937"></a>00937   <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *FTy = cast<FunctionType>(PTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>());
+<a name="l00938"></a>00938   <span class="keywordflow">if</span> (FTy->isVarArg()) {
+<a name="l00939"></a>00939     <span class="keywordtype">int</span> ix = FTy-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>();
+<a name="l00940"></a>00940     <span class="comment">// See if we can optimize any arguments passed through the varargs area of</span>
+<a name="l00941"></a>00941     <span class="comment">// the call.</span>
+<a name="l00942"></a>00942     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1CallSiteBase.html#a9c293af587813d72fdc976697dd07f23">CallSite::arg_iterator</a> <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#affa0f3ae92ab8696fccd107c0addf5a2">arg_begin</a>()+FTy->getNumParams(),
+<a name="l00943"></a>00943            E = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#acc2eeccdf71d83b3c08d6218317a1430">arg_end</a>(); <a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a> != E; ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>, ++ix) {
+<a name="l00944"></a>00944       <a class="code" href="classllvm_1_1CastInst.html" title="Base class of casting instructions.">CastInst</a> *CI = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1CastInst.html" title="Base class of casting instructions.">CastInst</a>>(*I);
+<a name="l00945"></a>00945       <span class="keywordflow">if</span> (CI && <a class="code" href="InstCombineCalls_8cpp.html#adf068c88073fc2f83a9a1be5086c786e">isSafeToEliminateVarargsCast</a>(CS, CI, TD, ix)) {
+<a name="l00946"></a>00946         *I = CI-><a class="code" href="classllvm_1_1User.html#a997ff6a1758bf732b9b263fc61011644">getOperand</a>(0);
+<a name="l00947"></a>00947         Changed = <span class="keyword">true</span>;
+<a name="l00948"></a>00948       }
+<a name="l00949"></a>00949     }
+<a name="l00950"></a>00950   }
+<a name="l00951"></a>00951 
+<a name="l00952"></a>00952   <span class="keywordflow">if</span> (isa<InlineAsm>(Callee) && !CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a4083036245b09eb316785a9535d3246c" title="Determine if the call cannot unwind.">doesNotThrow</a>()) {
+<a name="l00953"></a>00953     <span class="comment">// Inline asm calls cannot throw - mark them 'nounwind'.</span>
+<a name="l00954"></a>00954     CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a21de8b2f877e30641259beb2cec1c3d5">setDoesNotThrow</a>();
+<a name="l00955"></a>00955     Changed = <span class="keyword">true</span>;
+<a name="l00956"></a>00956   }
+<a name="l00957"></a>00957 
+<a name="l00958"></a>00958   <span class="comment">// Try to optimize the call if possible, we require DataLayout for most of</span>
+<a name="l00959"></a>00959   <span class="comment">// this.  None of these calls are seen as possibly dead so go ahead and</span>
+<a name="l00960"></a>00960   <span class="comment">// delete the instruction now.</span>
+<a name="l00961"></a>00961   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1CallInst.html">CallInst</a> *CI = dyn_cast<CallInst>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>())) {
+<a name="l00962"></a>00962     <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *I = tryOptimizeCall(CI, TD);
+<a name="l00963"></a>00963     <span class="comment">// If we changed something return the result, etc. Otherwise let</span>
+<a name="l00964"></a>00964     <span class="comment">// the fallthrough check.</span>
+<a name="l00965"></a>00965     <span class="keywordflow">if</span> (I) <span class="keywordflow">return</span> <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(*I);
+<a name="l00966"></a>00966   }
+<a name="l00967"></a>00967 
+<a name="l00968"></a>00968   <span class="keywordflow">return</span> Changed ? CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>() : 0;
+<a name="l00969"></a>00969 }
+<a name="l00970"></a>00970 
+<a name="l00971"></a>00971 <span class="comment">// transformConstExprCastCall - If the callee is a constexpr cast of a function,</span>
+<a name="l00972"></a>00972 <span class="comment">// attempt to move the cast to the arguments of the call/invoke.</span>
+<a name="l00973"></a>00973 <span class="comment">//</span>
+<a name="l00974"></a>00974 <span class="keywordtype">bool</span> InstCombiner::transformConstExprCastCall(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS) {
+<a name="l00975"></a>00975   <a class="code" href="classllvm_1_1Function.html">Function</a> *Callee =
+<a name="l00976"></a>00976     <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1Function.html">Function</a>>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a1abce20a9eff3d23ce05331962b1997c">getCalledValue</a>()-><a class="code" href="classllvm_1_1Value.html#a38ea12c04523d63adda732b9c5d6da0a">stripPointerCasts</a>());
+<a name="l00977"></a>00977   <span class="keywordflow">if</span> (Callee == 0)
+<a name="l00978"></a>00978     <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l00979"></a>00979   <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *Caller = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>();
+<a name="l00980"></a>00980   <span class="keyword">const</span> <a class="code" href="classllvm_1_1AttrListPtr.html">AttrListPtr</a> &CallerPAL = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#afe0517d6a11c6bf64016483a4810469a">getAttributes</a>();
+<a name="l00981"></a>00981 
+<a name="l00982"></a>00982   <span class="comment">// Okay, this is a cast from a function to a different type.  Unless doing so</span>
+<a name="l00983"></a>00983   <span class="comment">// would cause a type conversion of one of our arguments, change this call to</span>
+<a name="l00984"></a>00984   <span class="comment">// be a direct call with arguments casted to the appropriate types.</span>
+<a name="l00985"></a>00985   <span class="comment">//</span>
+<a name="l00986"></a>00986   <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *FT = Callee-><a class="code" href="classllvm_1_1Function.html#adf66d58e85fb4e46e9c1ae55186a6930">getFunctionType</a>();
+<a name="l00987"></a>00987   <a class="code" href="classllvm_1_1Type.html">Type</a> *OldRetTy = Caller-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>();
+<a name="l00988"></a>00988   <a class="code" href="classllvm_1_1Type.html">Type</a> *NewRetTy = FT-><a class="code" href="classllvm_1_1FunctionType.html#a9eda832d6e80bc19b98f22f4ec714e3f">getReturnType</a>();
+<a name="l00989"></a>00989 
+<a name="l00990"></a>00990   <span class="keywordflow">if</span> (NewRetTy-><a class="code" href="classllvm_1_1Type.html#aed87738661d539150b3fc4bb46e36aa3">isStructTy</a>())
+<a name="l00991"></a>00991     <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="comment">// TODO: Handle multiple return values.</span>
+<a name="l00992"></a>00992 
+<a name="l00993"></a>00993   <span class="comment">// Check to see if we are changing the return type...</span>
+<a name="l00994"></a>00994   <span class="keywordflow">if</span> (OldRetTy != NewRetTy) {
+<a name="l00995"></a>00995     <span class="keywordflow">if</span> (Callee-><a class="code" href="classllvm_1_1GlobalValue.html#a4640d98233102674ddb6d6efaf2b7f97">isDeclaration</a>() &&
+<a name="l00996"></a>00996         <span class="comment">// Conversion is ok if changing from one pointer type to another or from</span>
+<a name="l00997"></a>00997         <span class="comment">// a pointer to an integer of the same size.</span>
+<a name="l00998"></a>00998         !((OldRetTy-><a class="code" href="classllvm_1_1Type.html#a2eba483f5cc876e824aa6c085736086b">isPointerTy</a>() || !TD ||
+<a name="l00999"></a>00999            OldRetTy == TD-><a class="code" href="classllvm_1_1DataLayout.html#ae84bb2408dfffa4e8b5fe2ce0714a3bd">getIntPtrType</a>(Caller-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())) &&
+<a name="l01000"></a>01000           (NewRetTy-><a class="code" href="classllvm_1_1Type.html#a2eba483f5cc876e824aa6c085736086b">isPointerTy</a>() || !TD ||
+<a name="l01001"></a>01001            NewRetTy == TD-><a class="code" href="classllvm_1_1DataLayout.html#ae84bb2408dfffa4e8b5fe2ce0714a3bd">getIntPtrType</a>(Caller-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>()))))
+<a name="l01002"></a>01002       <span class="keywordflow">return</span> <span class="keyword">false</span>;   <span class="comment">// Cannot transform this return value.</span>
+<a name="l01003"></a>01003 
+<a name="l01004"></a>01004     <span class="keywordflow">if</span> (!Caller-><a class="code" href="classllvm_1_1Value.html#ac38c53f76ef532f91f1666c8a87370e9">use_empty</a>() &&
+<a name="l01005"></a>01005         <span class="comment">// void -> non-void is handled specially</span>
+<a name="l01006"></a>01006         !NewRetTy-><a class="code" href="classllvm_1_1Type.html#af5c7041df3ad5edffe5da17b5264c1fc" title="isVoidTy - Return true if this is 'void'.">isVoidTy</a>() && !<a class="code" href="classllvm_1_1CastInst.html#affa69ec356d641aa7f3e0a666400ae6e" title="Check whether it is valid to call getCastOpcode for these types.">CastInst::isCastable</a>(NewRetTy, OldRetTy))
+<a name="l01007"></a>01007       <span class="keywordflow">return</span> <span class="keyword">false</span>;   <span class="comment">// Cannot transform this return value.</span>
+<a name="l01008"></a>01008 
+<a name="l01009"></a>01009     <span class="keywordflow">if</span> (!CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a79030297696dc92b62cac5e9ae1e5cd0">isEmpty</a>() && !Caller-><a class="code" href="classllvm_1_1Value.html#ac38c53f76ef532f91f1666c8a87370e9">use_empty</a>()) {
+<a name="l01010"></a>01010       <a class="code" href="classllvm_1_1AttrBuilder.html">AttrBuilder</a> RAttrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a3e0d7269de82cafcae2596985b1e6fc9">getRetAttributes</a>();
+<a name="l01011"></a>01011       <span class="keywordflow">if</span> (RAttrs.<a class="code" href="classllvm_1_1AttrBuilder.html#ab7a2eaa7d3a7352124fd429329dea352" title="hasAttributes - Return true if the builder has IR-level attributes.">hasAttributes</a>(<a class="code" href="classllvm_1_1Attributes.html#a557333819ca596487763d5b440f3a253" title="Which attributes cannot be applied to a type.">Attributes::typeIncompatible</a>(NewRetTy)))
+<a name="l01012"></a>01012         <span class="keywordflow">return</span> <span class="keyword">false</span>;   <span class="comment">// Attribute not compatible with transformed value.</span>
+<a name="l01013"></a>01013     }
+<a name="l01014"></a>01014 
+<a name="l01015"></a>01015     <span class="comment">// If the callsite is an invoke instruction, and the return value is used by</span>
+<a name="l01016"></a>01016     <span class="comment">// a PHI node in a successor, we cannot change the return type of the call</span>
+<a name="l01017"></a>01017     <span class="comment">// because there is no place to put the cast instruction (without breaking</span>
+<a name="l01018"></a>01018     <span class="comment">// the critical edge).  Bail out in this case.</span>
+<a name="l01019"></a>01019     <span class="keywordflow">if</span> (!Caller-><a class="code" href="classllvm_1_1Value.html#ac38c53f76ef532f91f1666c8a87370e9">use_empty</a>())
+<a name="l01020"></a>01020       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1InvokeInst.html">InvokeInst</a> *II = dyn_cast<InvokeInst>(Caller))
+<a name="l01021"></a>01021         <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1value__use__iterator.html">Value::use_iterator</a> UI = II-><a class="code" href="classllvm_1_1Value.html#a413abcab8dbc3900fc2fde96a5d8fca6">use_begin</a>(), E = II-><a class="code" href="classllvm_1_1Value.html#ad86469939d2a8bdd4169be9403b89f5a">use_end</a>();
+<a name="l01022"></a>01022              UI != E; ++UI)
+<a name="l01023"></a>01023           <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1PHINode.html">PHINode</a> *PN = dyn_cast<PHINode>(*UI))
+<a name="l01024"></a>01024             <span class="keywordflow">if</span> (PN->getParent() == II->getNormalDest() ||
+<a name="l01025"></a>01025                 PN-><a class="code" href="classllvm_1_1Instruction.html#a9cd49851904f15060edb782ef4dd1b2d">getParent</a>() == II->getUnwindDest())
+<a name="l01026"></a>01026               <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01027"></a>01027   }
+<a name="l01028"></a>01028 
+<a name="l01029"></a>01029   <span class="keywordtype">unsigned</span> NumActualArgs = <a class="code" href="classunsigned.html">unsigned</a>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#acc2eeccdf71d83b3c08d6218317a1430">arg_end</a>()-CS.<a class="code" href="classllvm_1_1CallSiteBase.html#affa0f3ae92ab8696fccd107c0addf5a2">arg_begin</a>());
+<a name="l01030"></a>01030   <span class="keywordtype">unsigned</span> NumCommonArgs = std::min(FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>(), NumActualArgs);
+<a name="l01031"></a>01031 
+<a name="l01032"></a>01032   <a class="code" href="classllvm_1_1CallSiteBase.html#a9c293af587813d72fdc976697dd07f23">CallSite::arg_iterator</a> AI = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#affa0f3ae92ab8696fccd107c0addf5a2">arg_begin</a>();
+<a name="l01033"></a>01033   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0, e = NumCommonArgs; i != e; ++i, ++AI) {
+<a name="l01034"></a>01034     <a class="code" href="classllvm_1_1Type.html">Type</a> *ParamTy = FT-><a class="code" href="classllvm_1_1FunctionType.html#a176b84b12bc19326444728c6404dd068">getParamType</a>(i);
+<a name="l01035"></a>01035     <a class="code" href="classllvm_1_1Type.html">Type</a> *ActTy = (*AI)->getType();
+<a name="l01036"></a>01036 
+<a name="l01037"></a>01037     <span class="keywordflow">if</span> (!<a class="code" href="classllvm_1_1CastInst.html#affa69ec356d641aa7f3e0a666400ae6e" title="Check whether it is valid to call getCastOpcode for these types.">CastInst::isCastable</a>(ActTy, ParamTy))
+<a name="l01038"></a>01038       <span class="keywordflow">return</span> <span class="keyword">false</span>;   <span class="comment">// Cannot transform this parameter value.</span>
+<a name="l01039"></a>01039 
+<a name="l01040"></a>01040     <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> Attrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a3e508c92ff04476e16c9738dc2197e73">getParamAttributes</a>(i + 1);
+<a name="l01041"></a>01041     <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1AttrBuilder.html">AttrBuilder</a>(Attrs).
+<a name="l01042"></a>01042           hasAttributes(<a class="code" href="classllvm_1_1Attributes.html#a557333819ca596487763d5b440f3a253" title="Which attributes cannot be applied to a type.">Attributes::typeIncompatible</a>(ParamTy)))
+<a name="l01043"></a>01043       <span class="keywordflow">return</span> <span class="keyword">false</span>;   <span class="comment">// Attribute not compatible with transformed value.</span>
+<a name="l01044"></a>01044 
+<a name="l01045"></a>01045     <span class="comment">// If the parameter is passed as a byval argument, then we have to have a</span>
+<a name="l01046"></a>01046     <span class="comment">// sized type and the sized type has to have the same size as the old type.</span>
+<a name="l01047"></a>01047     <span class="keywordflow">if</span> (ParamTy != ActTy && Attrs.<a class="code" href="classllvm_1_1Attributes.html#ad68a7be4af7d92f3df681e13acbacc13" title="Return true if the attribute is present.">hasAttribute</a>(<a class="code" href="classllvm_1_1Attributes.html#a92f64dbb86772103c557c491dc1ebbe9ac2802bca25b4cd05c813af5d5a692e98" title="Pass structure by value.">Attributes::ByVal</a>)) {
+<a name="l01048"></a>01048       <a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *ParamPTy = <a class="code" href="namespacellvm.html#a8d8db3a5b2508f7086ef2d43036007b3">dyn_cast</a><<a class="code" href="classllvm_1_1PointerType.html">PointerType</a>>(ParamTy);
+<a name="l01049"></a>01049       <span class="keywordflow">if</span> (ParamPTy == 0 || !ParamPTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>()-><a class="code" href="classllvm_1_1Type.html#a9dc5111b1a9b1d5c4652d50f74fe850b">isSized</a>() || TD == 0)
+<a name="l01050"></a>01050         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01051"></a>01051 
+<a name="l01052"></a>01052       <a class="code" href="classllvm_1_1Type.html">Type</a> *CurElTy = cast<PointerType>(ActTy)->getElementType();
+<a name="l01053"></a>01053       <span class="keywordflow">if</span> (TD-><a class="code" href="classllvm_1_1DataLayout.html#a1d6fcc02e91ba24510aba42660c90e29">getTypeAllocSize</a>(CurElTy) !=
+<a name="l01054"></a>01054           TD-><a class="code" href="classllvm_1_1DataLayout.html#a1d6fcc02e91ba24510aba42660c90e29">getTypeAllocSize</a>(ParamPTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>()))
+<a name="l01055"></a>01055         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01056"></a>01056     }
+<a name="l01057"></a>01057 
+<a name="l01058"></a>01058     <span class="comment">// Converting from one pointer type to another or between a pointer and an</span>
+<a name="l01059"></a>01059     <span class="comment">// integer of the same size is safe even if we do not have a body.</span>
+<a name="l01060"></a>01060     <span class="keywordtype">bool</span> isConvertible = ActTy == ParamTy ||
+<a name="l01061"></a>01061       (TD && ((ParamTy-><a class="code" href="classllvm_1_1Type.html#a2eba483f5cc876e824aa6c085736086b">isPointerTy</a>() ||
+<a name="l01062"></a>01062       ParamTy == TD-><a class="code" href="classllvm_1_1DataLayout.html#ae84bb2408dfffa4e8b5fe2ce0714a3bd">getIntPtrType</a>(Caller-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>())) &&
+<a name="l01063"></a>01063               (ActTy-><a class="code" href="classllvm_1_1Type.html#a2eba483f5cc876e824aa6c085736086b">isPointerTy</a>() ||
+<a name="l01064"></a>01064               ActTy == TD-><a class="code" href="classllvm_1_1DataLayout.html#ae84bb2408dfffa4e8b5fe2ce0714a3bd">getIntPtrType</a>(Caller-><a class="code" href="classllvm_1_1Value.html#af85a4828b6b5a8de7fc0a55cc0e5b52f" title="All values hold a context through their type.">getContext</a>()))));
+<a name="l01065"></a>01065     <span class="keywordflow">if</span> (Callee-><a class="code" href="classllvm_1_1GlobalValue.html#a4640d98233102674ddb6d6efaf2b7f97">isDeclaration</a>() && !isConvertible) <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01066"></a>01066   }
+<a name="l01067"></a>01067 
+<a name="l01068"></a>01068   <span class="keywordflow">if</span> (Callee-><a class="code" href="classllvm_1_1GlobalValue.html#a4640d98233102674ddb6d6efaf2b7f97">isDeclaration</a>()) {
+<a name="l01069"></a>01069     <span class="comment">// Do not delete arguments unless we have a function body.</span>
+<a name="l01070"></a>01070     <span class="keywordflow">if</span> (FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>() < NumActualArgs && !FT-><a class="code" href="classllvm_1_1FunctionType.html#ab9b67f93a2231970abb3d95636660ffc">isVarArg</a>())
+<a name="l01071"></a>01071       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01072"></a>01072 
+<a name="l01073"></a>01073     <span class="comment">// If the callee is just a declaration, don't change the varargsness of the</span>
+<a name="l01074"></a>01074     <span class="comment">// call.  We don't want to introduce a varargs call where one doesn't</span>
+<a name="l01075"></a>01075     <span class="comment">// already exist.</span>
+<a name="l01076"></a>01076     <a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *APTy = cast<PointerType>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a1abce20a9eff3d23ce05331962b1997c">getCalledValue</a>()-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l01077"></a>01077     <span class="keywordflow">if</span> (FT-><a class="code" href="classllvm_1_1FunctionType.html#ab9b67f93a2231970abb3d95636660ffc">isVarArg</a>()!=cast<FunctionType>(APTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>())->isVarArg())
+<a name="l01078"></a>01078       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01079"></a>01079 
+<a name="l01080"></a>01080     <span class="comment">// If both the callee and the cast type are varargs, we still have to make</span>
+<a name="l01081"></a>01081     <span class="comment">// sure the number of fixed parameters are the same or we have the same</span>
+<a name="l01082"></a>01082     <span class="comment">// ABI issues as if we introduce a varargs call.</span>
+<a name="l01083"></a>01083     <span class="keywordflow">if</span> (FT-><a class="code" href="classllvm_1_1FunctionType.html#ab9b67f93a2231970abb3d95636660ffc">isVarArg</a>() &&
+<a name="l01084"></a>01084         cast<FunctionType>(APTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>())->isVarArg() &&
+<a name="l01085"></a>01085         FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>() !=
+<a name="l01086"></a>01086         cast<FunctionType>(APTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>())->getNumParams())
+<a name="l01087"></a>01087       <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01088"></a>01088   }
+<a name="l01089"></a>01089 
+<a name="l01090"></a>01090   <span class="keywordflow">if</span> (FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>() < NumActualArgs && FT-><a class="code" href="classllvm_1_1FunctionType.html#ab9b67f93a2231970abb3d95636660ffc">isVarArg</a>() &&
+<a name="l01091"></a>01091       !CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a79030297696dc92b62cac5e9ae1e5cd0">isEmpty</a>())
+<a name="l01092"></a>01092     <span class="comment">// In this case we have more arguments than the new function type, but we</span>
+<a name="l01093"></a>01093     <span class="comment">// won't be dropping them.  Check that these extra arguments have attributes</span>
+<a name="l01094"></a>01094     <span class="comment">// that are compatible with being a vararg call argument.</span>
+<a name="l01095"></a>01095     <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#ad34ac4250e6efe404c9b466d1d0f1a35">getNumSlots</a>(); i; --i) {
+<a name="l01096"></a>01096       <span class="keywordflow">if</span> (CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#ab36f713752744b77e9f08c30e77047bf">getSlot</a>(i - 1).<a class="code" href="structllvm_1_1AttributeWithIndex.html#ac521257770d78baff265563e545f14d3">Index</a> <= FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>())
+<a name="l01097"></a>01097         <span class="keywordflow">break</span>;
+<a name="l01098"></a>01098       <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> PAttrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#ab36f713752744b77e9f08c30e77047bf">getSlot</a>(i - 1).<a class="code" href="structllvm_1_1AttributeWithIndex.html#aff002b9c09e3b31f0a4f08c0717e5239" title="The attributes that are set, or'd together.">Attrs</a>;
+<a name="l01099"></a>01099       <span class="keywordflow">if</span> (PAttrs.<a class="code" href="classllvm_1_1Attributes.html#a8f16bec7747d78e01e505b56e41052e1" title="Parameter attributes that do not apply to vararg call arguments.">hasIncompatibleWithVarArgsAttrs</a>())
+<a name="l01100"></a>01100         <span class="keywordflow">return</span> <span class="keyword">false</span>;
+<a name="l01101"></a>01101     }
+<a name="l01102"></a>01102 
+<a name="l01103"></a>01103 
+<a name="l01104"></a>01104   <span class="comment">// Okay, we decided that this is a safe thing to do: go ahead and start</span>
+<a name="l01105"></a>01105   <span class="comment">// inserting cast instructions as necessary.</span>
+<a name="l01106"></a>01106   std::vector<Value*> Args;
+<a name="l01107"></a>01107   Args.reserve(NumActualArgs);
+<a name="l01108"></a>01108   <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<AttributeWithIndex, 8></a> attrVec;
+<a name="l01109"></a>01109   attrVec.<a class="code" href="classllvm_1_1SmallVectorImpl.html#a4786e64977a3af38f29adee46b70a863">reserve</a>(NumCommonArgs);
+<a name="l01110"></a>01110 
+<a name="l01111"></a>01111   <span class="comment">// Get any return attributes.</span>
+<a name="l01112"></a>01112   <a class="code" href="classllvm_1_1AttrBuilder.html">AttrBuilder</a> RAttrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a3e0d7269de82cafcae2596985b1e6fc9">getRetAttributes</a>();
+<a name="l01113"></a>01113 
+<a name="l01114"></a>01114   <span class="comment">// If the return value is not being used, the type may not be compatible</span>
+<a name="l01115"></a>01115   <span class="comment">// with the existing attributes.  Wipe out any problematic attributes.</span>
+<a name="l01116"></a>01116   RAttrs.<a class="code" href="classllvm_1_1AttrBuilder.html#ae296422bec4c0a8d63d88678b15ffecc" title="removeAttribute - Remove the attributes from A from the builder.">removeAttributes</a>(<a class="code" href="classllvm_1_1Attributes.html#a557333819ca596487763d5b440f3a253" title="Which attributes cannot be applied to a type.">Attributes::typeIncompatible</a>(NewRetTy));
+<a name="l01117"></a>01117 
+<a name="l01118"></a>01118   <span class="comment">// Add the new return attributes.</span>
+<a name="l01119"></a>01119   <span class="keywordflow">if</span> (RAttrs.<a class="code" href="classllvm_1_1AttrBuilder.html#ab7a2eaa7d3a7352124fd429329dea352" title="hasAttributes - Return true if the builder has IR-level attributes.">hasAttributes</a>())
+<a name="l01120"></a>01120     attrVec.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(
+<a name="l01121"></a>01121       <a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(<a class="code" href="classllvm_1_1AttrListPtr.html#ae891c2fafc52690f5192fd14b7d92866a454fc274ceb4da303c60c2a34826b085">AttrListPtr::ReturnIndex</a>,
+<a name="l01122"></a>01122                               <a class="code" href="classllvm_1_1Attributes.html#ad65c1e9ddb0cbc60da3fe67a0c695e32">Attributes::get</a>(FT-><a class="code" href="classllvm_1_1Type.html#af348d5ea83429d08ba891ca3dd0e92b2" title="getContext - Return the LLVMContext in which this type was uniqued.">getContext</a>(), RAttrs)));
+<a name="l01123"></a>01123 
+<a name="l01124"></a>01124   AI = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#affa0f3ae92ab8696fccd107c0addf5a2">arg_begin</a>();
+<a name="l01125"></a>01125   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i != NumCommonArgs; ++i, ++AI) {
+<a name="l01126"></a>01126     <a class="code" href="classllvm_1_1Type.html">Type</a> *ParamTy = FT-><a class="code" href="classllvm_1_1FunctionType.html#a176b84b12bc19326444728c6404dd068">getParamType</a>(i);
+<a name="l01127"></a>01127     <span class="keywordflow">if</span> ((*AI)->getType() == ParamTy) {
+<a name="l01128"></a>01128       Args.push_back(*AI);
+<a name="l01129"></a>01129     } <span class="keywordflow">else</span> {
+<a name="l01130"></a>01130       <a class="code" href="classllvm_1_1Instruction.html#afa0b2fa29ba074f2b6ec9ac11163f2d9">Instruction::CastOps</a> opcode = <a class="code" href="classllvm_1_1CastInst.html#a06dc25da1f16f389f5244304e8d33127" title="Infer the opcode for cast operand and type.">CastInst::getCastOpcode</a>(*AI,
+<a name="l01131"></a>01131           <span class="keyword">false</span>, ParamTy, <span class="keyword">false</span>);
+<a name="l01132"></a>01132       Args.push_back(<a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a8aca9237e5fbd3b1028d8fe92b5a74ee">CreateCast</a>(opcode, *AI, ParamTy));
+<a name="l01133"></a>01133     }
+<a name="l01134"></a>01134 
+<a name="l01135"></a>01135     <span class="comment">// Add any parameter attributes.</span>
+<a name="l01136"></a>01136     <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> PAttrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a3e508c92ff04476e16c9738dc2197e73">getParamAttributes</a>(i + 1);
+<a name="l01137"></a>01137     <span class="keywordflow">if</span> (PAttrs.<a class="code" href="classllvm_1_1Attributes.html#ac0393170c2b76cd5e9035225d5acf2f3" title="Return true if attributes exist.">hasAttributes</a>())
+<a name="l01138"></a>01138       attrVec.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(i + 1, PAttrs));
+<a name="l01139"></a>01139   }
+<a name="l01140"></a>01140 
+<a name="l01141"></a>01141   <span class="comment">// If the function takes more arguments than the call was taking, add them</span>
+<a name="l01142"></a>01142   <span class="comment">// now.</span>
+<a name="l01143"></a>01143   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = NumCommonArgs; i != FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>(); ++i)
+<a name="l01144"></a>01144     Args.push_back(<a class="code" href="classllvm_1_1Constant.html#aa6574d526b3e38a28f688a7bb4325c2c">Constant::getNullValue</a>(FT-><a class="code" href="classllvm_1_1FunctionType.html#a176b84b12bc19326444728c6404dd068">getParamType</a>(i)));
+<a name="l01145"></a>01145 
+<a name="l01146"></a>01146   <span class="comment">// If we are removing arguments to the function, emit an obnoxious warning.</span>
+<a name="l01147"></a>01147   <span class="keywordflow">if</span> (FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>() < NumActualArgs) {
+<a name="l01148"></a>01148     <span class="keywordflow">if</span> (!FT-><a class="code" href="classllvm_1_1FunctionType.html#ab9b67f93a2231970abb3d95636660ffc">isVarArg</a>()) {
+<a name="l01149"></a>01149       <a class="code" href="namespacellvm.html#ab8e34eca3b0817ef7a127913fbf6d9e4">errs</a>() << <span class="stringliteral">"WARNING: While resolving call to function '"</span>
+<a name="l01150"></a>01150              << Callee-><a class="code" href="classllvm_1_1Value.html#ad452febc1ac0b394876e640ec03ffa38">getName</a>() << <span class="stringliteral">"' arguments were dropped!\n"</span>;
+<a name="l01151"></a>01151     } <span class="keywordflow">else</span> {
+<a name="l01152"></a>01152       <span class="comment">// Add all of the arguments in their promoted form to the arg list.</span>
+<a name="l01153"></a>01153       <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = FT-><a class="code" href="classllvm_1_1FunctionType.html#a97cf043af111c14bb4d03a99cf42af03">getNumParams</a>(); i != NumActualArgs; ++i, ++AI) {
+<a name="l01154"></a>01154         <a class="code" href="classllvm_1_1Type.html">Type</a> *PTy = <a class="code" href="InstCombineCalls_8cpp.html#ae3e81cb5632a20699e7989bbfbb6c83e">getPromotedType</a>((*AI)->getType());
+<a name="l01155"></a>01155         <span class="keywordflow">if</span> (PTy != (*AI)->getType()) {
+<a name="l01156"></a>01156           <span class="comment">// Must promote to pass through va_arg area!</span>
+<a name="l01157"></a>01157           <a class="code" href="classllvm_1_1Instruction.html#afa0b2fa29ba074f2b6ec9ac11163f2d9">Instruction::CastOps</a> opcode =
+<a name="l01158"></a>01158             <a class="code" href="classllvm_1_1CastInst.html#a06dc25da1f16f389f5244304e8d33127" title="Infer the opcode for cast operand and type.">CastInst::getCastOpcode</a>(*AI, <span class="keyword">false</span>, PTy, <span class="keyword">false</span>);
+<a name="l01159"></a>01159           Args.push_back(<a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a8aca9237e5fbd3b1028d8fe92b5a74ee">CreateCast</a>(opcode, *AI, PTy));
+<a name="l01160"></a>01160         } <span class="keywordflow">else</span> {
+<a name="l01161"></a>01161           Args.push_back(*AI);
+<a name="l01162"></a>01162         }
+<a name="l01163"></a>01163 
+<a name="l01164"></a>01164         <span class="comment">// Add any parameter attributes.</span>
+<a name="l01165"></a>01165         <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> PAttrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a3e508c92ff04476e16c9738dc2197e73">getParamAttributes</a>(i + 1);
+<a name="l01166"></a>01166         <span class="keywordflow">if</span> (PAttrs.<a class="code" href="classllvm_1_1Attributes.html#ac0393170c2b76cd5e9035225d5acf2f3" title="Return true if attributes exist.">hasAttributes</a>())
+<a name="l01167"></a>01167           attrVec.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(i + 1, PAttrs));
+<a name="l01168"></a>01168       }
+<a name="l01169"></a>01169     }
+<a name="l01170"></a>01170   }
+<a name="l01171"></a>01171 
+<a name="l01172"></a>01172   <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> FnAttrs = CallerPAL.<a class="code" href="classllvm_1_1AttrListPtr.html#a60fc14387402931888f363ed42ef909a" title="getFnAttributes - The function attributes are returned.">getFnAttributes</a>();
+<a name="l01173"></a>01173   <span class="keywordflow">if</span> (FnAttrs.<a class="code" href="classllvm_1_1Attributes.html#ac0393170c2b76cd5e9035225d5acf2f3" title="Return true if attributes exist.">hasAttributes</a>())
+<a name="l01174"></a>01174     attrVec.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(<a class="code" href="classllvm_1_1AttrListPtr.html#ae891c2fafc52690f5192fd14b7d92866aa0ca5b17b28c0c286bc17f82606d5129">AttrListPtr::FunctionIndex</a>,
+<a name="l01175"></a>01175                                               FnAttrs));
+<a name="l01176"></a>01176 
+<a name="l01177"></a>01177   <span class="keywordflow">if</span> (NewRetTy-><a class="code" href="classllvm_1_1Type.html#af5c7041df3ad5edffe5da17b5264c1fc" title="isVoidTy - Return true if this is 'void'.">isVoidTy</a>())
+<a name="l01178"></a>01178     Caller-><a class="code" href="classllvm_1_1Value.html#a35ee267850af7c235474a8c46c7ac5af">setName</a>(<span class="stringliteral">""</span>);   <span class="comment">// Void type should not have a name.</span>
+<a name="l01179"></a>01179 
+<a name="l01180"></a>01180   <span class="keyword">const</span> <a class="code" href="classllvm_1_1AttrListPtr.html">AttrListPtr</a> &NewCallerPAL = <a class="code" href="classllvm_1_1AttrListPtr.html#a441f1b8947965a28166f853d9bdcc0c4" title="get - Return a Attributes list with the specified parameters in it.">AttrListPtr::get</a>(Callee-><a class="code" href="classllvm_1_1Function.html#a2da53ac53516a3f16191f4c8a8eaa3e5">getContext</a>(),
+<a name="l01181"></a>01181                                                      attrVec);
+<a name="l01182"></a>01182 
+<a name="l01183"></a>01183   <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *<a class="code" href="regutils_8h.html#a1fa2460e32327ade49189c95740bc1b5">NC</a>;
+<a name="l01184"></a>01184   <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1InvokeInst.html">InvokeInst</a> *II = dyn_cast<InvokeInst>(Caller)) {
+<a name="l01185"></a>01185     NC = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a18e7deb77ae50208aa44597f121878df">CreateInvoke</a>(Callee, II->getNormalDest(),
+<a name="l01186"></a>01186                                II->getUnwindDest(), Args);
+<a name="l01187"></a>01187     NC-><a class="code" href="classllvm_1_1Value.html#ae855357b6c5e6e7ed1869272708a3a84">takeName</a>(II);
+<a name="l01188"></a>01188     cast<InvokeInst>(<a class="code" href="regutils_8h.html#a1fa2460e32327ade49189c95740bc1b5">NC</a>)->setCallingConv(II-><a class="code" href="classllvm_1_1CallInst.html#a2a65eaf09953a013c2820f6857c647f0">getCallingConv</a>());
+<a name="l01189"></a>01189     cast<InvokeInst>(<a class="code" href="regutils_8h.html#a1fa2460e32327ade49189c95740bc1b5">NC</a>)->setAttributes(NewCallerPAL);
+<a name="l01190"></a>01190   } <span class="keywordflow">else</span> {
+<a name="l01191"></a>01191     <a class="code" href="classllvm_1_1CallInst.html">CallInst</a> *CI = cast<CallInst>(Caller);
+<a name="l01192"></a>01192     NC = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a7e31b0c02df2aeed261b103b790cc01e">CreateCall</a>(Callee, Args);
+<a name="l01193"></a>01193     NC-><a class="code" href="classllvm_1_1Value.html#ae855357b6c5e6e7ed1869272708a3a84">takeName</a>(CI);
+<a name="l01194"></a>01194     <span class="keywordflow">if</span> (CI-><a class="code" href="classllvm_1_1CallInst.html#a5e07dea70b41ad610edbfc21bd54154a">isTailCall</a>())
+<a name="l01195"></a>01195       cast<CallInst>(NC)->setTailCall();
+<a name="l01196"></a>01196     cast<CallInst>(<a class="code" href="regutils_8h.html#a1fa2460e32327ade49189c95740bc1b5">NC</a>)->setCallingConv(CI-><a class="code" href="classllvm_1_1CallInst.html#a2a65eaf09953a013c2820f6857c647f0">getCallingConv</a>());
+<a name="l01197"></a>01197     cast<CallInst>(<a class="code" href="regutils_8h.html#a1fa2460e32327ade49189c95740bc1b5">NC</a>)->setAttributes(NewCallerPAL);
+<a name="l01198"></a>01198   }
+<a name="l01199"></a>01199 
+<a name="l01200"></a>01200   <span class="comment">// Insert a cast of the return type as necessary.</span>
+<a name="l01201"></a>01201   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *NV = <a class="code" href="regutils_8h.html#a1fa2460e32327ade49189c95740bc1b5">NC</a>;
+<a name="l01202"></a>01202   <span class="keywordflow">if</span> (OldRetTy != NV-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>() && !Caller-><a class="code" href="classllvm_1_1Value.html#ac38c53f76ef532f91f1666c8a87370e9">use_empty</a>()) {
+<a name="l01203"></a>01203     <span class="keywordflow">if</span> (!NV-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>()-><a class="code" href="classllvm_1_1Type.html#af5c7041df3ad5edffe5da17b5264c1fc" title="isVoidTy - Return true if this is 'void'.">isVoidTy</a>()) {
+<a name="l01204"></a>01204       <a class="code" href="classllvm_1_1Instruction.html#afa0b2fa29ba074f2b6ec9ac11163f2d9">Instruction::CastOps</a> opcode =
+<a name="l01205"></a>01205         <a class="code" href="classllvm_1_1CastInst.html#a06dc25da1f16f389f5244304e8d33127" title="Infer the opcode for cast operand and type.">CastInst::getCastOpcode</a>(NC, <span class="keyword">false</span>, OldRetTy, <span class="keyword">false</span>);
+<a name="l01206"></a>01206       NV = NC = <a class="code" href="classllvm_1_1CastInst.html#a0f7dea9550778374905e12da6d6ba8a8" title="Construct any of the CastInst subclasses.">CastInst::Create</a>(opcode, NC, OldRetTy);
+<a name="l01207"></a>01207       NC->setDebugLoc(Caller-><a class="code" href="classllvm_1_1Instruction.html#aab8e16a35183ce39aad394714087bcff" title="getDebugLoc - Return the debug location for this node as a DebugLoc.">getDebugLoc</a>());
+<a name="l01208"></a>01208 
+<a name="l01209"></a>01209       <span class="comment">// If this is an invoke instruction, we should insert it after the first</span>
+<a name="l01210"></a>01210       <span class="comment">// non-phi, instruction in the normal successor block.</span>
+<a name="l01211"></a>01211       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1InvokeInst.html">InvokeInst</a> *II = dyn_cast<InvokeInst>(Caller)) {
+<a name="l01212"></a>01212         <a class="code" href="classllvm_1_1ilist__iterator.html">BasicBlock::iterator</a> I = II->getNormalDest()->getFirstInsertionPt();
+<a name="l01213"></a>01213         <a class="code" href="classllvm_1_1InstCombiner.html#af1dcd6c00214bd9c8c8b3c9f9aedcc04">InsertNewInstBefore</a>(NC, *I);
+<a name="l01214"></a>01214       } <span class="keywordflow">else</span> {
+<a name="l01215"></a>01215         <span class="comment">// Otherwise, it's a call, just insert cast right after the call.</span>
+<a name="l01216"></a>01216         <a class="code" href="classllvm_1_1InstCombiner.html#af1dcd6c00214bd9c8c8b3c9f9aedcc04">InsertNewInstBefore</a>(NC, *Caller);
+<a name="l01217"></a>01217       }
+<a name="l01218"></a>01218       <a class="code" href="classllvm_1_1InstCombiner.html#aaca490f77b8a0ca6b013db8c0de18972" title="Worklist - All of the instructions that need to be simplified.">Worklist</a>.<a class="code" href="classllvm_1_1InstCombineWorklist.html#a8bc2d436e1e97f005da67386b6a5cfb0">AddUsersToWorkList</a>(*Caller);
+<a name="l01219"></a>01219     } <span class="keywordflow">else</span> {
+<a name="l01220"></a>01220       NV = <a class="code" href="classllvm_1_1UndefValue.html#a4ae5ff22b700a42bcc5d889233721335">UndefValue::get</a>(Caller-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l01221"></a>01221     }
+<a name="l01222"></a>01222   }
+<a name="l01223"></a>01223 
+<a name="l01224"></a>01224   <span class="keywordflow">if</span> (!Caller-><a class="code" href="classllvm_1_1Value.html#ac38c53f76ef532f91f1666c8a87370e9">use_empty</a>())
+<a name="l01225"></a>01225     <a class="code" href="classllvm_1_1InstCombiner.html#af7c1b579548e5b90a8db22d2f26a4afc">ReplaceInstUsesWith</a>(*Caller, NV);
+<a name="l01226"></a>01226 
+<a name="l01227"></a>01227   <a class="code" href="classllvm_1_1InstCombiner.html#a0adb2c1eb77982ea83e5645c9d8bf3d1">EraseInstFromFunction</a>(*Caller);
+<a name="l01228"></a>01228   <span class="keywordflow">return</span> <span class="keyword">true</span>;
+<a name="l01229"></a>01229 }
+<a name="l01230"></a>01230 
+<a name="l01231"></a>01231 <span class="comment">// transformCallThroughTrampoline - Turn a call to a function created by</span>
+<a name="l01232"></a>01232 <span class="comment">// init_trampoline / adjust_trampoline intrinsic pair into a direct call to the</span>
+<a name="l01233"></a>01233 <span class="comment">// underlying function.</span>
+<a name="l01234"></a>01234 <span class="comment">//</span>
+<a name="l01235"></a>01235 <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *
+<a name="l01236"></a>01236 InstCombiner::transformCallThroughTrampoline(<a class="code" href="classllvm_1_1CallSite.html">CallSite</a> CS,
+<a name="l01237"></a>01237                                              <a class="code" href="classllvm_1_1IntrinsicInst.html">IntrinsicInst</a> *Tramp) {
+<a name="l01238"></a>01238   <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *Callee = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#a1abce20a9eff3d23ce05331962b1997c">getCalledValue</a>();
+<a name="l01239"></a>01239   <a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *PTy = cast<PointerType>(Callee-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>());
+<a name="l01240"></a>01240   <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *FTy = cast<FunctionType>(PTy-><a class="code" href="classllvm_1_1SequentialType.html#a39f2c3a62f293faf11ac28b15bc53359">getElementType</a>());
+<a name="l01241"></a>01241   <span class="keyword">const</span> <a class="code" href="classllvm_1_1AttrListPtr.html">AttrListPtr</a> &Attrs = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#afe0517d6a11c6bf64016483a4810469a">getAttributes</a>();
+<a name="l01242"></a>01242 
+<a name="l01243"></a>01243   <span class="comment">// If the call already has the 'nest' attribute somewhere then give up -</span>
+<a name="l01244"></a>01244   <span class="comment">// otherwise 'nest' would occur twice after splicing in the chain.</span>
+<a name="l01245"></a>01245   <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> I = 0, E = Attrs.getNumAttrs(); I != E; ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>)
+<a name="l01246"></a>01246     <span class="keywordflow">if</span> (Attrs.getAttributesAtIndex(I).hasAttribute(<a class="code" href="classllvm_1_1Attributes.html#a92f64dbb86772103c557c491dc1ebbe9a4c4107874148657396b2fcd5b08db69d" title="Nested function static chain.">Attributes::Nest</a>))
+<a name="l01247"></a>01247       <span class="keywordflow">return</span> 0;
+<a name="l01248"></a>01248 
+<a name="l01249"></a>01249   assert(Tramp &&
+<a name="l01250"></a>01250          <span class="stringliteral">"transformCallThroughTrampoline called with incorrect CallSite."</span>);
+<a name="l01251"></a>01251 
+<a name="l01252"></a>01252   <a class="code" href="classllvm_1_1Function.html">Function</a> *NestF =cast<Function>(Tramp-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(1)-><a class="code" href="classllvm_1_1Value.html#a38ea12c04523d63adda732b9c5d6da0a">stripPointerCasts</a>());
+<a name="l01253"></a>01253   <a class="code" href="classllvm_1_1PointerType.html">PointerType</a> *NestFPTy = cast<PointerType>(NestF-><a class="code" href="classllvm_1_1GlobalValue.html#ad60ec7475b0ffe7fc1f68a8019780643" title="getType - Global values are always pointers.">getType</a>());
+<a name="l01254"></a>01254   <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *NestFTy = cast<FunctionType>(NestFPTy->getElementType());
+<a name="l01255"></a>01255 
+<a name="l01256"></a>01256   <span class="keyword">const</span> <a class="code" href="classllvm_1_1AttrListPtr.html">AttrListPtr</a> &NestAttrs = NestF-><a class="code" href="classllvm_1_1Function.html#a04b883953d9706a93075c90c09fe1059">getAttributes</a>();
+<a name="l01257"></a>01257   <span class="keywordflow">if</span> (!NestAttrs.isEmpty()) {
+<a name="l01258"></a>01258     <span class="keywordtype">unsigned</span> NestIdx = 1;
+<a name="l01259"></a>01259     <a class="code" href="classllvm_1_1Type.html">Type</a> *NestTy = 0;
+<a name="l01260"></a>01260     <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> NestAttr;
+<a name="l01261"></a>01261 
+<a name="l01262"></a>01262     <span class="comment">// Look for a parameter marked with the 'nest' attribute.</span>
+<a name="l01263"></a>01263     <span class="keywordflow">for</span> (<a class="code" href="classllvm_1_1FunctionType.html#a14655c4dda465a4fad99d085d01ce5f9">FunctionType::param_iterator</a> I = NestFTy->param_begin(),
+<a name="l01264"></a>01264          E = NestFTy->param_end(); I != E; ++NestIdx, ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>)
+<a name="l01265"></a>01265       <span class="keywordflow">if</span> (NestAttrs.getParamAttributes(NestIdx).hasAttribute(<a class="code" href="classllvm_1_1Attributes.html#a92f64dbb86772103c557c491dc1ebbe9a4c4107874148657396b2fcd5b08db69d" title="Nested function static chain.">Attributes::Nest</a>)){
+<a name="l01266"></a>01266         <span class="comment">// Record the parameter type and any other attributes.</span>
+<a name="l01267"></a>01267         NestTy = *<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l01268"></a>01268         NestAttr = NestAttrs.getParamAttributes(NestIdx);
+<a name="l01269"></a>01269         <span class="keywordflow">break</span>;
+<a name="l01270"></a>01270       }
+<a name="l01271"></a>01271 
+<a name="l01272"></a>01272     <span class="keywordflow">if</span> (NestTy) {
+<a name="l01273"></a>01273       <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *Caller = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>();
+<a name="l01274"></a>01274       std::vector<Value*> NewArgs;
+<a name="l01275"></a>01275       NewArgs.reserve(<span class="keywordtype">unsigned</span>(CS.<a class="code" href="classllvm_1_1CallSiteBase.html#acc2eeccdf71d83b3c08d6218317a1430">arg_end</a>()-CS.<a class="code" href="classllvm_1_1CallSiteBase.html#affa0f3ae92ab8696fccd107c0addf5a2">arg_begin</a>())+1);
+<a name="l01276"></a>01276 
+<a name="l01277"></a>01277       <a class="code" href="classllvm_1_1SmallVector.html">SmallVector<AttributeWithIndex, 8></a> NewAttrs;
+<a name="l01278"></a>01278       NewAttrs.<a class="code" href="classllvm_1_1SmallVectorImpl.html#a4786e64977a3af38f29adee46b70a863">reserve</a>(Attrs.getNumSlots() + 1);
+<a name="l01279"></a>01279 
+<a name="l01280"></a>01280       <span class="comment">// Insert the nest argument into the call argument list, which may</span>
+<a name="l01281"></a>01281       <span class="comment">// mean appending it.  Likewise for attributes.</span>
+<a name="l01282"></a>01282 
+<a name="l01283"></a>01283       <span class="comment">// Add any result attributes.</span>
+<a name="l01284"></a>01284       <a class="code" href="classllvm_1_1Attributes.html" title="Attributes - A bitset of attributes.">Attributes</a> Attr = Attrs.getRetAttributes();
+<a name="l01285"></a>01285       <span class="keywordflow">if</span> (Attr.<a class="code" href="classllvm_1_1Attributes.html#ac0393170c2b76cd5e9035225d5acf2f3" title="Return true if attributes exist.">hasAttributes</a>())
+<a name="l01286"></a>01286         NewAttrs.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(<a class="code" href="classllvm_1_1AttrListPtr.html#ae891c2fafc52690f5192fd14b7d92866a454fc274ceb4da303c60c2a34826b085">AttrListPtr::ReturnIndex</a>,
+<a name="l01287"></a>01287                                                    Attr));
+<a name="l01288"></a>01288 
+<a name="l01289"></a>01289       {
+<a name="l01290"></a>01290         <span class="keywordtype">unsigned</span> Idx = 1;
+<a name="l01291"></a>01291         <a class="code" href="classllvm_1_1CallSiteBase.html#a9c293af587813d72fdc976697dd07f23">CallSite::arg_iterator</a> I = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#affa0f3ae92ab8696fccd107c0addf5a2">arg_begin</a>(), E = CS.<a class="code" href="classllvm_1_1CallSiteBase.html#acc2eeccdf71d83b3c08d6218317a1430">arg_end</a>();
+<a name="l01292"></a>01292         <span class="keywordflow">do</span> {
+<a name="l01293"></a>01293           <span class="keywordflow">if</span> (Idx == NestIdx) {
+<a name="l01294"></a>01294             <span class="comment">// Add the chain argument and attributes.</span>
+<a name="l01295"></a>01295             <a class="code" href="classllvm_1_1Value.html" title="LLVM Value Representation.">Value</a> *NestVal = Tramp-><a class="code" href="classllvm_1_1CallInst.html#a150b33ecedbc8c7803c2db8040fbe3f8">getArgOperand</a>(2);
+<a name="l01296"></a>01296             <span class="keywordflow">if</span> (NestVal-><a class="code" href="classllvm_1_1Value.html#a0cf3748dba54f931bb1241ae4adc76bc">getType</a>() != NestTy)
+<a name="l01297"></a>01297               NestVal = <a class="code" href="classllvm_1_1InstCombiner.html#a6e33228c0d5bb3b72f357677fa105185">Builder</a>-><a class="code" href="classllvm_1_1IRBuilder.html#a87b363b9dad9f5040ea7e29ea9e60ff5">CreateBitCast</a>(NestVal, NestTy, <span class="stringliteral">"nest"</span>);
+<a name="l01298"></a>01298             NewArgs.push_back(NestVal);
+<a name="l01299"></a>01299             NewAttrs.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(NestIdx, NestAttr));
+<a name="l01300"></a>01300           }
+<a name="l01301"></a>01301 
+<a name="l01302"></a>01302           <span class="keywordflow">if</span> (I == E)
+<a name="l01303"></a>01303             <span class="keywordflow">break</span>;
+<a name="l01304"></a>01304 
+<a name="l01305"></a>01305           <span class="comment">// Add the original argument and attributes.</span>
+<a name="l01306"></a>01306           NewArgs.push_back(*I);
+<a name="l01307"></a>01307           Attr = Attrs.getParamAttributes(Idx);
+<a name="l01308"></a>01308           <span class="keywordflow">if</span> (Attr.<a class="code" href="classllvm_1_1Attributes.html#ac0393170c2b76cd5e9035225d5acf2f3" title="Return true if attributes exist.">hasAttributes</a>())
+<a name="l01309"></a>01309             NewAttrs.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>
+<a name="l01310"></a>01310               (<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(Idx + (Idx >= NestIdx), Attr));
+<a name="l01311"></a>01311 
+<a name="l01312"></a>01312           ++Idx, ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l01313"></a>01313         } <span class="keywordflow">while</span> (1);
+<a name="l01314"></a>01314       }
+<a name="l01315"></a>01315 
+<a name="l01316"></a>01316       <span class="comment">// Add any function attributes.</span>
+<a name="l01317"></a>01317       Attr = Attrs.getFnAttributes();
+<a name="l01318"></a>01318       <span class="keywordflow">if</span> (Attr.<a class="code" href="classllvm_1_1Attributes.html#ac0393170c2b76cd5e9035225d5acf2f3" title="Return true if attributes exist.">hasAttributes</a>())
+<a name="l01319"></a>01319         NewAttrs.<a class="code" href="classllvm_1_1SmallVectorTemplateBase.html#ae1a10b90f22c0478960fb5798ff73916">push_back</a>(<a class="code" href="structllvm_1_1AttributeWithIndex.html#ab2c694b0c09cd5c1b50c88b6bc84053e">AttributeWithIndex::get</a>(<a class="code" href="classllvm_1_1AttrListPtr.html#ae891c2fafc52690f5192fd14b7d92866aa0ca5b17b28c0c286bc17f82606d5129">AttrListPtr::FunctionIndex</a>,
+<a name="l01320"></a>01320                                                    Attr));
+<a name="l01321"></a>01321 
+<a name="l01322"></a>01322       <span class="comment">// The trampoline may have been bitcast to a bogus type (FTy).</span>
+<a name="l01323"></a>01323       <span class="comment">// Handle this by synthesizing a new function type, equal to FTy</span>
+<a name="l01324"></a>01324       <span class="comment">// with the chain parameter inserted.</span>
+<a name="l01325"></a>01325 
+<a name="l01326"></a>01326       std::vector<Type*> NewTypes;
+<a name="l01327"></a>01327       NewTypes.reserve(FTy->getNumParams()+1);
+<a name="l01328"></a>01328 
+<a name="l01329"></a>01329       <span class="comment">// Insert the chain's type into the list of parameter types, which may</span>
+<a name="l01330"></a>01330       <span class="comment">// mean appending it.</span>
+<a name="l01331"></a>01331       {
+<a name="l01332"></a>01332         <span class="keywordtype">unsigned</span> Idx = 1;
+<a name="l01333"></a>01333         <a class="code" href="classllvm_1_1FunctionType.html#a14655c4dda465a4fad99d085d01ce5f9">FunctionType::param_iterator</a> I = FTy->param_begin(),
+<a name="l01334"></a>01334           E = FTy->param_end();
+<a name="l01335"></a>01335 
+<a name="l01336"></a>01336         <span class="keywordflow">do</span> {
+<a name="l01337"></a>01337           <span class="keywordflow">if</span> (Idx == NestIdx)
+<a name="l01338"></a>01338             <span class="comment">// Add the chain's type.</span>
+<a name="l01339"></a>01339             NewTypes.push_back(NestTy);
+<a name="l01340"></a>01340 
+<a name="l01341"></a>01341           <span class="keywordflow">if</span> (I == E)
+<a name="l01342"></a>01342             <span class="keywordflow">break</span>;
+<a name="l01343"></a>01343 
+<a name="l01344"></a>01344           <span class="comment">// Add the original type.</span>
+<a name="l01345"></a>01345           NewTypes.push_back(*I);
+<a name="l01346"></a>01346 
+<a name="l01347"></a>01347           ++Idx, ++<a class="code" href="namespacellvm_1_1ARM__PROC.html#aac31dd660a6f18140efdd62b351cb11ba41e4a98ca287d35fab0923aa355d63a5">I</a>;
+<a name="l01348"></a>01348         } <span class="keywordflow">while</span> (1);
+<a name="l01349"></a>01349       }
+<a name="l01350"></a>01350 
+<a name="l01351"></a>01351       <span class="comment">// Replace the trampoline call with a direct call.  Let the generic</span>
+<a name="l01352"></a>01352       <span class="comment">// code sort out any function type mismatches.</span>
+<a name="l01353"></a>01353       <a class="code" href="classllvm_1_1FunctionType.html">FunctionType</a> *NewFTy = <a class="code" href="classllvm_1_1FunctionType.html#a7e89b55242c964ae61b7850e99cacef0">FunctionType::get</a>(FTy->getReturnType(), NewTypes,
+<a name="l01354"></a>01354                                                 FTy->isVarArg());
+<a name="l01355"></a>01355       <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *NewCallee =
+<a name="l01356"></a>01356         NestF-><a class="code" href="classllvm_1_1GlobalValue.html#ad60ec7475b0ffe7fc1f68a8019780643" title="getType - Global values are always pointers.">getType</a>() == <a class="code" href="classllvm_1_1PointerType.html#a8db49fd5069f21d514e7bb0fd11f0902">PointerType::getUnqual</a>(NewFTy) ?
+<a name="l01357"></a>01357         NestF : <a class="code" href="classllvm_1_1ConstantExpr.html#aba93ec4079f8d709a1d5b4745310782e">ConstantExpr::getBitCast</a>(NestF,
+<a name="l01358"></a>01358                                          <a class="code" href="classllvm_1_1PointerType.html#a8db49fd5069f21d514e7bb0fd11f0902">PointerType::getUnqual</a>(NewFTy));
+<a name="l01359"></a>01359       <span class="keyword">const</span> <a class="code" href="classllvm_1_1AttrListPtr.html">AttrListPtr</a> &NewPAL = <a class="code" href="classllvm_1_1AttrListPtr.html#a441f1b8947965a28166f853d9bdcc0c4" title="get - Return a Attributes list with the specified parameters in it.">AttrListPtr::get</a>(FTy->getContext(), NewAttrs);
+<a name="l01360"></a>01360 
+<a name="l01361"></a>01361       <a class="code" href="classllvm_1_1Instruction.html">Instruction</a> *NewCaller;
+<a name="l01362"></a>01362       <span class="keywordflow">if</span> (<a class="code" href="classllvm_1_1InvokeInst.html">InvokeInst</a> *II = dyn_cast<InvokeInst>(Caller)) {
+<a name="l01363"></a>01363         NewCaller = <a class="code" href="classllvm_1_1InvokeInst.html#a03007b982a936464f7116e3c47df89ee">InvokeInst::Create</a>(NewCallee,
+<a name="l01364"></a>01364                                        II->getNormalDest(), II->getUnwindDest(),
+<a name="l01365"></a>01365                                        NewArgs);
+<a name="l01366"></a>01366         cast<InvokeInst>(NewCaller)->setCallingConv(II-><a class="code" href="classllvm_1_1CallInst.html#a2a65eaf09953a013c2820f6857c647f0">getCallingConv</a>());
+<a name="l01367"></a>01367         cast<InvokeInst>(NewCaller)->setAttributes(NewPAL);
+<a name="l01368"></a>01368       } <span class="keywordflow">else</span> {
+<a name="l01369"></a>01369         NewCaller = <a class="code" href="classllvm_1_1CallInst.html#a861226dd056dd2438da26760b8e7a9a0">CallInst::Create</a>(NewCallee, NewArgs);
+<a name="l01370"></a>01370         <span class="keywordflow">if</span> (cast<CallInst>(Caller)->isTailCall())
+<a name="l01371"></a>01371           cast<CallInst>(NewCaller)->setTailCall();
+<a name="l01372"></a>01372         cast<CallInst>(NewCaller)->
+<a name="l01373"></a>01373           setCallingConv(cast<CallInst>(Caller)->getCallingConv());
+<a name="l01374"></a>01374         cast<CallInst>(NewCaller)->setAttributes(NewPAL);
+<a name="l01375"></a>01375       }
+<a name="l01376"></a>01376 
+<a name="l01377"></a>01377       <span class="keywordflow">return</span> NewCaller;
+<a name="l01378"></a>01378     }
+<a name="l01379"></a>01379   }
+<a name="l01380"></a>01380 
+<a name="l01381"></a>01381   <span class="comment">// Replace the trampoline call with a direct call.  Since there is no 'nest'</span>
+<a name="l01382"></a>01382   <span class="comment">// parameter, there is no need to adjust the argument list.  Let the generic</span>
+<a name="l01383"></a>01383   <span class="comment">// code sort out any function type mismatches.</span>
+<a name="l01384"></a>01384   <a class="code" href="classllvm_1_1Constant.html" title="LLVM Constant Representation.">Constant</a> *NewCallee =
+<a name="l01385"></a>01385     NestF-><a class="code" href="classllvm_1_1GlobalValue.html#ad60ec7475b0ffe7fc1f68a8019780643" title="getType - Global values are always pointers.">getType</a>() == PTy ? NestF :
+<a name="l01386"></a>01386                               <a class="code" href="classllvm_1_1ConstantExpr.html#aba93ec4079f8d709a1d5b4745310782e">ConstantExpr::getBitCast</a>(NestF, PTy);
+<a name="l01387"></a>01387   CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae8db0b64d91fa18dfcc01a684708c00b">setCalledFunction</a>(NewCallee);
+<a name="l01388"></a>01388   <span class="keywordflow">return</span> CS.<a class="code" href="classllvm_1_1CallSiteBase.html#ae4c67f835911559821939fb23a2e7aff">getInstruction</a>();
+<a name="l01389"></a>01389 }
+</pre></div></div>
+</div>
+<hr>
+<p class="footer">
+Generated on Fri Dec 21 2012 00:34:46 for <a href="http://llvm.org/">LLVM</a> by
+<a href="http://www.doxygen.org"><img src="doxygen.png" alt="Doxygen"
+align="middle" border="0"/>1.7.5.1</a><br>
+Copyright © 2003-2012 University of Illinois at Urbana-Champaign.
+All Rights Reserved.</p>
+
+<hr>
+<!--#include virtual="/attrib.incl" -->
+
+</body>
+</html>





More information about the llvm-commits mailing list