svf-tools 1.0.280 → 1.0.284

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -66,7 +66,7 @@ $(function() {
66
66
  <div class="title">PersistentPointsToCache.h</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="PersistentPointsToCache_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- PersistentPointsToCache.h -- Persistent points-to sets ----------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * PersistentPointsToCache.h</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * Persistent, hash-consed points-to sets</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * Created on: Sep 28, 2020</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#ifndef PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#define PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &lt;iomanip&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFBasicTypes_8h.html">Util/SVFBasicTypes.h</a>&quot;</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Data&gt;</div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html"> 29</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1PersistentPointsToCache.html">PersistentPointsToCache</a></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;{</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943"> 32</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Data, PointsToID&gt;</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c"> 33</a></span>&#160; <span class="keyword">typedef</span> std::function&lt;Data(const Data &amp;, const Data &amp;)&gt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c">DataOp</a>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">// TODO: an unordered pair type may be better.</span></div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7"> 35</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::pair&lt;PointsToID, PointsToID&gt;</a>, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a>&gt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a>;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57"> 37</a></span>&#160; <span class="keyword">static</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> 0; };</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a63b6d7f44773394db09f75042db46f21"> 40</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a63b6d7f44773394db09f75042db46f21">PersistentPointsToCache</a>(<span class="keyword">const</span> Data &amp;emptyData) : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>(1)</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.push_back(<span class="keyword">new</span> Data(emptyData));</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[emptyData] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; }</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142"> 49</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142">reset</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keyword">const</span> Data *emptyData = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>[<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>()];</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Data *d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>) <a class="code" href="util_8h.html#a3110dcad20c2a6616d360901b94e06a1">free</a>(d);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; idToPts.clear();</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.clear();</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="comment">// Put the empty data back in.</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[*emptyData] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; idToPts.push_back(emptyData);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>.clear();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>.clear();</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>.clear();</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> = 1;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="comment">// Cache is empty...</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5"> 71</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">emplacePts</a>(<span class="keyword">const</span> Data &amp;pts)</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// Is it already in the cache?</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(pts);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) <span class="keywordflow">return</span> foundId-&gt;second;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// Otherwise, insert it.</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.push_back(<span class="keyword">new</span> Data(pts));</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[pts] = id;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa"> 86</a></span>&#160; <span class="keyword">const</span> Data &amp;<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="comment">// Check if the points-to set for ID has already been stored.</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.size() &gt; <span class="keywordtype">id</span> &amp;&amp; <span class="stringliteral">&quot;PPTC::getActualPts: points-to set not stored!&quot;</span>);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">return</span> *<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.at(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; }</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b"> 94</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b">unionPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> DataOp unionOp = [](<span class="keyword">const</span> Data &amp;lhs, <span class="keyword">const</span> Data &amp;rhs) { <span class="keywordflow">return</span> lhs | rhs; };</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="comment">// Order operands so we don&#39;t perform x U y and y U x separately.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; std::pair&lt;PointsToID, PointsToID&gt; operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">// Property cases.</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="comment">// EMPTY_SET U x</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; {</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordflow">return</span> operands.second;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// x U x</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, unionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">// We can use lhs/rhs here rather than our ordered operands,</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="comment">// because the operation was commutative.</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="comment">// if x U y = z, then x U z = z,</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (lhs != result)</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// and y U z = z.</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">if</span> (rhs != result)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; } <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14"> 149</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14">complementPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; {</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> DataOp complementOp = [](<span class="keyword">const</span> Data &amp;lhs, <span class="keyword">const</span> Data &amp;rhs) { <span class="keywordflow">return</span> lhs - rhs; };</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// Property cases.</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// x - x</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">if</span> (lhs == rhs)</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; }</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="comment">// x - EMPTY_SET</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">if</span> (rhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> lhs;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="comment">// EMPTY_SET - x</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">if</span> (lhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; {</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; }</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, complementOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>, <span class="keyword">false</span>, opPerformed);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">// We performed lhs - rhs = result, so...</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// result AND rhs = EMPTY_SET,</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = lhs;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="comment">// and result - rhs = result.</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>[std::make_pair(result, rhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; } <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; }</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494"> 208</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494">intersectPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; {</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> DataOp intersectionOp = [](<span class="keyword">const</span> Data &amp;lhs, <span class="keyword">const</span> Data &amp;rhs) { <span class="keywordflow">return</span> lhs &amp; rhs; };</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="comment">// Order operands so we don&#39;t perform x U y and y U x separately.</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; std::pair&lt;PointsToID, PointsToID&gt; operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// Property cases.</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">// EMPTY_SET &amp; x</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; }</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="comment">// x &amp; x</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; {</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, intersectionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="comment">// When the result is empty, we won&#39;t be adding anything of substance.</span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; {</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">// We performed lhs AND rhs = result, so...</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="comment">// result AND rhs = result,</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">if</span> (result != rhs)</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; {</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">if</span> (result != lhs)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// Also (thanks reviewer #2)</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// result U lhs = result,</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() &amp;&amp; result != lhs)</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; {</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = lhs;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; }</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// And result U rhs = rhs.</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() &amp;&amp; result != rhs)</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = rhs;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; }</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; } <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5"> 281</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5">printStats</a>(<span class="keyword">const</span> std::string subtitle)<span class="keyword"> const</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> fieldWidth = 25;</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; std::cout.flags(std::ios::left);</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot;****Persistent Points-To Cache Statistics: &quot;</span> &lt;&lt; subtitle &lt;&lt; <span class="stringliteral">&quot;****\n&quot;</span>;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniquePointsToSets&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.size() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;TotalUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;PropertyUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniqueUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;LookupUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;TotalComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;PropertyComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniqueComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;LookupComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;TotalIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;PropertyIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniqueIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;LookupIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; std::cout.flush();</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="comment">// TODO: ref count API for garbage collection.</span></div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127"> 311</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// Make sure we don&#39;t overflow.</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() &amp;&amp; <span class="stringliteral">&quot;PPTC::newPointsToId: PointsToIDs exhausted! Try a larger type.&quot;</span>);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>++;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639"> 321</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs, <span class="keyword">const</span> DataOp &amp;dataOp, OpCache &amp;opCache,</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keywordtype">bool</span> commutative, <span class="keywordtype">bool</span> &amp;opPerformed)</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; std::pair&lt;PointsToID, PointsToID&gt; operands;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="comment">// If we&#39;re commutative, we want to always perform the same operation: x op y.</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="comment">// Performing x op y sometimes and y op x other times is a waste of time.</span></div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordflow">if</span> (commutative) operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordflow">else</span> operands = std::make_pair(lhs, rhs);</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// Check if we have performed this operation</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; OpCache::const_iterator foundResult = opCache.find(operands);</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">if</span> (foundResult != opCache.end()) <span class="keywordflow">return</span> foundResult-&gt;second;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; opPerformed = <span class="keyword">true</span>;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keyword">const</span> Data &amp;lhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(lhs);</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keyword">const</span> Data &amp;rhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(rhs);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; Data <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = dataOp(lhsPts, rhsPts);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> resultId;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">// Intern points-to set: check if result already exists.</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(result);</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) resultId = foundId-&gt;second;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; resultId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.push_back(<span class="keyword">new</span> Data(result));</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[<a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>] = resultId;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="comment">// Cache the result, for hash-consing.</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; opCache[operands] = resultId;</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">return</span> resultId;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266"> 359</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; {</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> = 0;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> = 0;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> = 0;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> = 0;</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> = 0;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> = 0;</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> = 0;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> = 0;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> = 0;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> = 0;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> = 0;</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> = 0;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e"> 381</a></span>&#160; std::vector&lt;const Data *&gt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>;</div><div class="line"><a name="l00383"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c"> 383</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05"> 386</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>;</div><div class="line"><a name="l00388"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58"> 388</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>;</div><div class="line"><a name="l00390"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2"> 390</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5"> 393</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="comment">// Statistics:</span></div><div class="line"><a name="l00396"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2"> 396</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4"> 397</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00398"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd"> 398</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8"> 399</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00400"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0"> 400</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00401"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee"> 401</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00402"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8"> 402</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00403"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95"> 403</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00404"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22"> 404</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00405"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531"> 405</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991"> 406</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00407"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff"> 407</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;};</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;} <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* PERSISTENT_POINTS_TO_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ace976f138cf1b8ab6bbf7a5c5d0b60b8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">SVF::PersistentPointsToCache::lookupUnions</a></div><div class="ttdeci">u64_t lookupUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00399">PersistentPointsToCache.h:399</a></div></div>
69
+ <a href="PersistentPointsToCache_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="comment">//===- PersistentPointsToCache.h -- Persistent points-to sets ----------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;</div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * PersistentPointsToCache.h</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> * Persistent, hash-consed points-to sets</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="comment"> * Created on: Sep 28, 2020</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;</div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#ifndef PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#define PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="preprocessor">#include &lt;iomanip&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFBasicTypes_8h.html">Util/SVFBasicTypes.h</a>&quot;</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> Data&gt;</div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html"> 29</a></span>&#160;<span class="keyword">class </span><a class="code" href="classSVF_1_1PersistentPointsToCache.html">PersistentPointsToCache</a></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160;{</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943"> 32</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;Data, PointsToID&gt;</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c"> 33</a></span>&#160; <span class="keyword">typedef</span> std::function&lt;Data(const Data &amp;, const Data &amp;)&gt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c">DataOp</a>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; <span class="comment">// TODO: an unordered pair type may be better.</span></div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7"> 35</a></span>&#160; <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::pair&lt;PointsToID, PointsToID&gt;</a>, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a>&gt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a>;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57"> 37</a></span>&#160; <span class="keyword">static</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>(<span class="keywordtype">void</span>) { <span class="keywordflow">return</span> 0; };</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a63b6d7f44773394db09f75042db46f21"> 40</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a63b6d7f44773394db09f75042db46f21">PersistentPointsToCache</a>(<span class="keyword">const</span> Data &amp;emptyData) : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>(1)</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160; {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.push_back(<span class="keyword">new</span> Data(emptyData));</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[emptyData] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160; }</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142"> 49</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142">reset</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; {</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keyword">const</span> Data *emptyData = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>[<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>()];</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> Data *d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>) <a class="code" href="util_8h.html#a3110dcad20c2a6616d360901b94e06a1">free</a>(d);</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; idToPts.clear();</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.clear();</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="comment">// Put the empty data back in.</span></div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[*emptyData] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; idToPts.push_back(emptyData);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>.clear();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>.clear();</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>.clear();</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> = 1;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160; <span class="comment">// Cache is empty...</span></div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; }</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5"> 71</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">emplacePts</a>(<span class="keyword">const</span> Data &amp;pts)</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; {</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="comment">// Is it already in the cache?</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(pts);</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) <span class="keywordflow">return</span> foundId-&gt;second;</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; <span class="comment">// Otherwise, insert it.</span></div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.push_back(<span class="keyword">new</span> Data(pts));</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[pts] = id;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa"> 86</a></span>&#160; <span class="keyword">const</span> Data &amp;<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <span class="comment">// Check if the points-to set for ID has already been stored.</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.size() &gt; <span class="keywordtype">id</span> &amp;&amp; <span class="stringliteral">&quot;PPTC::getActualPts: points-to set not stored!&quot;</span>);</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160; <span class="keywordflow">return</span> *<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.at(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>&#160; }</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b"> 94</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b">unionPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; {</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> DataOp unionOp = [](<span class="keyword">const</span> Data &amp;lhs, <span class="keyword">const</span> Data &amp;rhs) { <span class="keywordflow">return</span> lhs | rhs; };</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160;</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="comment">// Order operands so we don&#39;t perform x U y and y U x separately.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; std::pair&lt;PointsToID, PointsToID&gt; operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="comment">// Property cases.</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="comment">// EMPTY_SET U x</span></div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; {</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; <span class="keywordflow">return</span> operands.second;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>&#160; }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; <span class="comment">// x U x</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; }</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, unionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160;</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; <span class="comment">// We can use lhs/rhs here rather than our ordered operands,</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="comment">// because the operation was commutative.</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="comment">// if x U y = z, then x U z = z,</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (lhs != result)</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; <span class="comment">// and y U z = z.</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; <span class="keywordflow">if</span> (rhs != result)</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160; {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160; }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>&#160; } <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160;</div><div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14"> 149</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14">complementPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; {</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> DataOp complementOp = [](<span class="keyword">const</span> Data &amp;lhs, <span class="keyword">const</span> Data &amp;rhs) { <span class="keywordflow">return</span> lhs - rhs; };</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <span class="comment">// Property cases.</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="comment">// x - x</span></div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordflow">if</span> (lhs == rhs)</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; {</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; }</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="comment">// x - EMPTY_SET</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; <span class="keywordflow">if</span> (rhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160; <span class="keywordflow">return</span> lhs;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; }</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160; <span class="comment">// EMPTY_SET - x</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160; <span class="keywordflow">if</span> (lhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160; {</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; }</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, complementOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>, <span class="keyword">false</span>, opPerformed);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160; <span class="comment">// We performed lhs - rhs = result, so...</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; {</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="comment">// result AND rhs = EMPTY_SET,</span></div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160;</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160; <span class="comment">// and result - rhs = result.</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>[std::make_pair(result, rhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; } <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160; }</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160;</div><div class="line"><a name="l00208"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494"> 208</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494">intersectPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; {</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> DataOp intersectionOp = [](<span class="keyword">const</span> Data &amp;lhs, <span class="keyword">const</span> Data &amp;rhs) { <span class="keywordflow">return</span> lhs &amp; rhs; };</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; <span class="comment">// Order operands so we don&#39;t perform x U y and y U x separately.</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160; std::pair&lt;PointsToID, PointsToID&gt; operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="comment">// Property cases.</span></div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="comment">// EMPTY_SET &amp; x</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; {</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; }</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="comment">// x &amp; x</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; {</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; }</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, intersectionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; <span class="comment">// When the result is empty, we won&#39;t be adding anything of substance.</span></div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; {</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="comment">// We performed lhs AND rhs = result, so...</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="comment">// result AND rhs = result,</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">if</span> (result != rhs)</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; {</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; }</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160;</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; <span class="keywordflow">if</span> (result != lhs)</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; {</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; }</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160;</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="comment">// Also (thanks reviewer #2)</span></div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <span class="comment">// result U lhs = result,</span></div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() &amp;&amp; result != lhs)</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; {</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = lhs;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; }</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="comment">// And result U rhs = rhs.</span></div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() &amp;&amp; result != rhs)</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = rhs;</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; }</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; }</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; } <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordflow">return</span> <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160; }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5"> 281</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5">printStats</a>(<span class="keyword">const</span> std::string subtitle)<span class="keyword"> const</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160;<span class="keyword"> </span>{</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> fieldWidth = 25;</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; std::cout.flags(std::ios::left);</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; std::cout &lt;&lt; <span class="stringliteral">&quot;****Persistent Points-To Cache Statistics: &quot;</span> &lt;&lt; subtitle &lt;&lt; <span class="stringliteral">&quot;****\n&quot;</span>;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniquePointsToSets&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.size() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160;</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;TotalUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;PropertyUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniqueUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;LookupUnions&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;TotalComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;PropertyComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniqueComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;LookupComplements&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;TotalIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;PropertyIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;UniqueIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; std::cout &lt;&lt; std::setw(fieldWidth) &lt;&lt; <span class="stringliteral">&quot;LookupIntersections&quot;</span> &lt;&lt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160; std::cout.flush();</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>&#160;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160; <span class="comment">// TODO: ref count API for garbage collection.</span></div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00311"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127"> 311</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; <span class="comment">// Make sure we don&#39;t overflow.</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() &amp;&amp; <span class="stringliteral">&quot;PPTC::newPointsToId: PointsToIDs exhausted! Try a larger type.&quot;</span>);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>++;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639"> 321</a></span>&#160; <span class="keyword">inline</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs, <span class="keyword">const</span> DataOp &amp;dataOp, OpCache &amp;opCache,</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keywordtype">bool</span> commutative, <span class="keywordtype">bool</span> &amp;opPerformed)</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; std::pair&lt;PointsToID, PointsToID&gt; operands;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; <span class="comment">// If we&#39;re commutative, we want to always perform the same operation: x op y.</span></div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160; <span class="comment">// Performing x op y sometimes and y op x other times is a waste of time.</span></div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160; <span class="keywordflow">if</span> (commutative) operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160; <span class="keywordflow">else</span> operands = std::make_pair(lhs, rhs);</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>&#160; <span class="comment">// Check if we have performed this operation</span></div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160; OpCache::const_iterator foundResult = opCache.find(operands);</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <span class="keywordflow">if</span> (foundResult != opCache.end()) <span class="keywordflow">return</span> foundResult-&gt;second;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>&#160; opPerformed = <span class="keyword">true</span>;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keyword">const</span> Data &amp;lhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(lhs);</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <span class="keyword">const</span> Data &amp;rhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(rhs);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; Data <a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a> = dataOp(lhsPts, rhsPts);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> resultId;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="comment">// Intern points-to set: check if result already exists.</span></div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(result);</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) resultId = foundId-&gt;second;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; resultId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>.push_back(<span class="keyword">new</span> Data(result));</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[<a class="code" href="cuddInt_8c.html#a8b2e13c78efca330f06b6ddcd7464b41">result</a>] = resultId;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>&#160; <span class="comment">// Cache the result, for hash-consing.</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; opCache[operands] = resultId;</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>&#160; <span class="keywordflow">return</span> resultId;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160;</div><div class="line"><a name="l00359"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266"> 359</a></span>&#160; <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; {</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> = 0;</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> = 0;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> = 0;</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> = 0;</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> = 0;</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> = 0;</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> = 0;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> = 0;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> = 0;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> = 0;</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> = 0;</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> = 0;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e"> 381</a></span>&#160; std::vector&lt;const Data *&gt; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac15f8dc2bd850d275c692c3001751c9e">idToPts</a>;</div><div class="line"><a name="l00383"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c"> 383</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05"> 386</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>;</div><div class="line"><a name="l00388"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58"> 388</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>;</div><div class="line"><a name="l00390"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2"> 390</a></span>&#160; <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160;</div><div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5"> 393</a></span>&#160; <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="comment">// Statistics:</span></div><div class="line"><a name="l00396"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2"> 396</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4"> 397</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00398"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd"> 398</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00399"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8"> 399</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00400"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0"> 400</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00401"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee"> 401</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00402"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8"> 402</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00403"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95"> 403</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00404"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22"> 404</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00405"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531"> 405</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991"> 406</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00407"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff"> 407</a></span>&#160; <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160;};</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;} <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160;<span class="preprocessor">#endif </span><span class="comment">/* PERSISTENT_POINTS_TO_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ace976f138cf1b8ab6bbf7a5c5d0b60b8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">SVF::PersistentPointsToCache::lookupUnions</a></div><div class="ttdeci">u64_t lookupUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00399">PersistentPointsToCache.h:399</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a7961dd7af7db2774e852beabcba1e5a8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">SVF::PersistentPointsToCache::propertyComplements</a></div><div class="ttdeci">u64_t propertyComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00402">PersistentPointsToCache.h:402</a></div></div>
71
71
  <div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ac7865b3ea1d76d2c522b465cc8e86639"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">SVF::PersistentPointsToCache::opPts</a></div><div class="ttdeci">PointsToID opPts(PointsToID lhs, PointsToID rhs, const DataOp &amp;dataOp, OpCache &amp;opCache, bool commutative, bool &amp;opPerformed)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00321">PersistentPointsToCache.h:321</a></div></div>
72
72
  <div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a98d176e384469e0308bfee2061ef84b5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">SVF::PersistentPointsToCache::emplacePts</a></div><div class="ttdeci">PointsToID emplacePts(const Data &amp;pts)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00071">PersistentPointsToCache.h:71</a></div></div>