[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