blob: 1e62e78b3dfb07528a7d7c241fd6193a5f33513f [file] [log] [blame]
Misha Brukman3896be22003-10-24 18:06:11 +00001<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2 "http://www.w3.org/TR/html4/strict.dtd">
Misha Brukmancd11e452003-10-22 23:27:16 +00003<html>
4<head>
Misha Brukman3896be22003-10-24 18:06:11 +00005 <link rel="stylesheet" href="llvm.css" type="text/css">
Misha Brukmancd11e452003-10-22 23:27:16 +00006 <title>Alias Analysis Infrastructure in LLVM</title>
7</head>
Misha Brukmancd11e452003-10-22 23:27:16 +00008<body>
Chris Lattner9f648752003-03-04 19:37:49 +00009
Misha Brukmancd11e452003-10-22 23:27:16 +000010<div class="doc_title">
11 Alias Analysis Infrastructure in LLVM
12</div>
Chris Lattner9f648752003-03-04 19:37:49 +000013
14<ol>
Misha Brukmanb2154252003-10-23 02:29:42 +000015 <li><a href="#introduction">Introduction</a></li>
Chris Lattner9f648752003-03-04 19:37:49 +000016
Misha Brukman3896be22003-10-24 18:06:11 +000017 <li><a href="#overview">AliasAnalysis Overview</a>
Chris Lattner9f648752003-03-04 19:37:49 +000018 <ul>
Misha Brukmanb2154252003-10-23 02:29:42 +000019 <li><a href="#pointers">Representation of Pointers</a></li>
20 <li><a href="#MustMayNo">Must, May, and No Alias Responses</a></li>
21 <li><a href="#ModRefInfo">The <tt>getModRefInfo</tt> methods</a></li>
Misha Brukman3896be22003-10-24 18:06:11 +000022 </ul></li>
Chris Lattner9f648752003-03-04 19:37:49 +000023
Misha Brukman3896be22003-10-24 18:06:11 +000024 <li><a href="#writingnew">Writing a new AliasAnalysis Implementation</a>
Chris Lattner9f648752003-03-04 19:37:49 +000025 <ul>
Misha Brukmanb2154252003-10-23 02:29:42 +000026 <li><a href="#passsubclasses">Different Pass styles</a></li>
27 <li><a href="#requiredcalls">Required initialization calls</a></li>
28 <li><a href="#interfaces">Interfaces which may be specified</a></li>
29 <li><a href="#chaining">The AliasAnalysis chaining behavior</a></li>
30 <li><a href="#implefficiency">Efficiency Issues</a></li>
Misha Brukman3896be22003-10-24 18:06:11 +000031 </ul></li>
Chris Lattner9f648752003-03-04 19:37:49 +000032
Misha Brukman3896be22003-10-24 18:06:11 +000033 <li><a href="#using">Using AliasAnalysis results</a>
Chris Lattner9f648752003-03-04 19:37:49 +000034 <ul>
Misha Brukmanb2154252003-10-23 02:29:42 +000035 <li><a href="#loadvn">Using the <tt>-load-vn</tt> Pass</a></li>
36 <li><a href="#ast">Using the <tt>AliasSetTracker</tt> class</a></li>
37 <li><a href="#direct">Using the AliasAnalysis interface directly</a></li>
Misha Brukman3896be22003-10-24 18:06:11 +000038 </ul></li>
39
40 <li><a href="#tools">Helpful alias analysis related tools</a>
Chris Lattner9f648752003-03-04 19:37:49 +000041 <ul>
Misha Brukmanb2154252003-10-23 02:29:42 +000042 <li><a href="#no-aa">The <tt>-no-aa</tt> pass</a></li>
43 <li><a href="#print-alias-sets">The <tt>-print-alias-sets</tt> pass</a></li>
44 <li><a href="#count-aa">The <tt>-count-aa</tt> pass</a></li>
45 <li><a href="#aa-eval">The <tt>-aa-eval</tt> pass</a></li>
Misha Brukman3896be22003-10-24 18:06:11 +000046 </ul></li>
Misha Brukmanb2154252003-10-23 02:29:42 +000047</ol>
Chris Lattner9f648752003-03-04 19:37:49 +000048
Misha Brukman3896be22003-10-24 18:06:11 +000049<div class="doc_text">
50 <p><b>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a></b></p>
51</div>
Chris Lattner9f648752003-03-04 19:37:49 +000052
Chris Lattner9f648752003-03-04 19:37:49 +000053<!-- *********************************************************************** -->
Misha Brukmancd11e452003-10-22 23:27:16 +000054<div class="doc_section">
55 <a name="introduction">Introduction</a>
56</div>
Chris Lattner9f648752003-03-04 19:37:49 +000057<!-- *********************************************************************** -->
58
Misha Brukmancd11e452003-10-22 23:27:16 +000059<div class="doc_text">
Misha Brukman1f254d52003-11-21 22:30:25 +000060
61<p>Alias Analysis (or Pointer Analysis) is a technique which attempts to
62determine whether or not two pointers ever can point to the same object in
63memory. Traditionally, Alias Analyses respond to a query with either a <a
Chris Lattner9f648752003-03-04 19:37:49 +000064href="#MustNoMay">Must, May, or No</a> alias response, indicating that two
65pointers do point to the same object, might point to the same object, or are
Misha Brukman1f254d52003-11-21 22:30:25 +000066known not to point to the same object.</p>
67
68<p>The <a href="/doxygen/classAliasAnalysis.html">AliasAnalysis</a> class is the
Chris Lattner9f648752003-03-04 19:37:49 +000069centerpiece of the LLVM Alias Analysis related infrastructure. This class is
70the common interface between clients of alias analysis information and the
71implementations providing it. In addition to simple alias analysis information,
72this class exposes Mod/Ref information from those implementations which can
73provide it, allowing for powerful analyses and transformations to work well
Misha Brukman1f254d52003-11-21 22:30:25 +000074together.</p>
75
76<p>This document contains information necessary to successfully implement this
Chris Lattner9f648752003-03-04 19:37:49 +000077interface, use it, and to test both sides. It also explains some of the finer
78points about what exactly results mean. If you feel that something is unclear
Misha Brukmancd11e452003-10-22 23:27:16 +000079or should be added, please <a href="mailto:sabre@nondot.org">let me
Misha Brukman1f254d52003-11-21 22:30:25 +000080know</a>.</p>
81
Misha Brukmancd11e452003-10-22 23:27:16 +000082</div>
Chris Lattner9f648752003-03-04 19:37:49 +000083
84<!-- *********************************************************************** -->
Misha Brukmancd11e452003-10-22 23:27:16 +000085<div class="doc_section">
86 <a name="overview">AliasAnalysis Overview</a>
87</div>
Chris Lattner9f648752003-03-04 19:37:49 +000088<!-- *********************************************************************** -->
89
Misha Brukmancd11e452003-10-22 23:27:16 +000090<div class="doc_text">
Misha Brukman1f254d52003-11-21 22:30:25 +000091
92<p>The <a href="/doxygen/classAliasAnalysis.html">AliasAnalysis</a> class
93defines the interface that Alias Analysis implementations should support. This
94class exports two important enums: <tt>AliasResult</tt> and
95<tt>ModRefResult</tt> which represent the result of an alias query or a mod/ref
96query, respectively.</p>
97
98<p>The AliasAnalysis interface exposes information about memory, represented in
Chris Lattner9f648752003-03-04 19:37:49 +000099several different ways. In particular, memory objects are represented as a
100starting address and size, and function calls are represented as the actual
101<tt>call</tt> or <tt>invoke</tt> instructions that performs the call. The
102AliasAnalysis interface also exposes some helper methods which allow you to get
Misha Brukman1f254d52003-11-21 22:30:25 +0000103mod/ref information for arbitrary instructions.</p>
104
Misha Brukmancd11e452003-10-22 23:27:16 +0000105</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000106
107<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000108<div class="doc_subsection">
109 <a name="pointers">Representation of Pointers</a>
110</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000111
Misha Brukmancd11e452003-10-22 23:27:16 +0000112<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000113
114<p>Most importantly, the AliasAnalysis class provides several methods which are
Chris Lattner9f648752003-03-04 19:37:49 +0000115used to query whether or not pointers alias, whether function calls can modify
Misha Brukman3896be22003-10-24 18:06:11 +0000116or read memory, etc.</p>
117
118<p>Representing memory objects as a starting address and a size is critically
Chris Lattner9f648752003-03-04 19:37:49 +0000119important for precise Alias Analyses. For example, consider this (silly) C
Misha Brukman3896be22003-10-24 18:06:11 +0000120code:</p>
121
Chris Lattner9f648752003-03-04 19:37:49 +0000122<pre>
123 int i;
124 char C[2];
125 char A[10];
126 /* ... */
127 for (i = 0; i != 10; ++i) {
128 C[0] = A[i]; /* One byte store */
129 C[1] = A[9-i]; /* One byte store */
130 }
131</pre>
Misha Brukman3896be22003-10-24 18:06:11 +0000132
133<p>In this case, the <tt>basicaa</tt> pass will disambiguate the stores to
Chris Lattner9f648752003-03-04 19:37:49 +0000134<tt>C[0]</tt> and <tt>C[1]</tt> because they are accesses to two distinct
135locations one byte apart, and the accesses are each one byte. In this case, the
136LICM pass can use store motion to remove the stores from the loop. In
Misha Brukman3896be22003-10-24 18:06:11 +0000137constrast, the following code:</p>
138
Chris Lattner9f648752003-03-04 19:37:49 +0000139<pre>
140 int i;
141 char C[2];
142 char A[10];
143 /* ... */
144 for (i = 0; i != 10; ++i) {
145 ((short*)C)[0] = A[i]; /* Two byte store! */
146 C[1] = A[9-i]; /* One byte store */
147 }
148</pre>
Misha Brukman3896be22003-10-24 18:06:11 +0000149
150<p>In this case, the two stores to C do alias each other, because the access to
151the <tt>&amp;C[0]</tt> element is a two byte access. If size information wasn't
Chris Lattner9f648752003-03-04 19:37:49 +0000152available in the query, even the first case would have to conservatively assume
Misha Brukman3896be22003-10-24 18:06:11 +0000153that the accesses alias.</p>
154
Misha Brukmancd11e452003-10-22 23:27:16 +0000155</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000156
157<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000158<div class="doc_subsection">
159 <a name="MustMayNo">Must, May, and No Alias Responses</a>
160</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000161
Misha Brukmancd11e452003-10-22 23:27:16 +0000162<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000163
164<p>An Alias Analysis implementation can return one of three responses:
165MustAlias, MayAlias, and NoAlias. The No and May alias results are obvious: if
166the two pointers may never equal each other, return NoAlias, if they might,
167return MayAlias.</p>
168
169<p>The Must Alias response is trickier though. In LLVM, the Must Alias response
Chris Lattner9f648752003-03-04 19:37:49 +0000170may only be returned if the two memory objects are guaranteed to always start at
171exactly the same location. If two memory objects overlap, but do not start at
Misha Brukman3896be22003-10-24 18:06:11 +0000172the same location, MayAlias must be returned.</p>
173
Misha Brukmancd11e452003-10-22 23:27:16 +0000174</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000175
176<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000177<div class="doc_subsection">
178 <a name="ModRefInfo">The <tt>getModRefInfo</tt> methods</a>
179</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000180
Misha Brukmancd11e452003-10-22 23:27:16 +0000181<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000182
183<p>The <tt>getModRefInfo</tt> methods return information about whether the
Chris Lattner9f648752003-03-04 19:37:49 +0000184execution of an instruction can read or modify a memory location. Mod/Ref
185information is always conservative: if an action <b>may</b> read a location, Ref
Misha Brukman3896be22003-10-24 18:06:11 +0000186is returned.</p>
187
Misha Brukmancd11e452003-10-22 23:27:16 +0000188</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000189
190<!-- *********************************************************************** -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000191<div class="doc_section">
192 <a name="writingnew">Writing a new AliasAnalysis Implementation</a>
193</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000194<!-- *********************************************************************** -->
195
Misha Brukmancd11e452003-10-22 23:27:16 +0000196<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000197
198<p>Writing a new alias analysis implementation for LLVM is quite
199straight-forward. There are already several implementations that you can use
200for examples, and the following information should help fill in any details.
201For a minimal example, take a look at the <a
Misha Brukman3e7ada62003-12-17 18:46:49 +0000202href="/doxygen/structllvm_1_1NoAA.html"><tt>no-aa</tt></a> implementation.</p>
Misha Brukman3896be22003-10-24 18:06:11 +0000203
Misha Brukmancd11e452003-10-22 23:27:16 +0000204</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000205
206<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000207<div class="doc_subsection">
208 <a name="passsubclasses">Different Pass styles</a>
209</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000210
Misha Brukmancd11e452003-10-22 23:27:16 +0000211<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000212
213<p>The first step to determining what type of <a
214href="WritingAnLLVMPass.html">LLVM pass</a> you need to use for your Alias
215Analysis. As is the case with most other analyses and transformations, the
216answer should be fairly obvious from what type of problem you are trying to
217solve:</p>
218
Chris Lattner9f648752003-03-04 19:37:49 +0000219<ol>
Misha Brukmancd11e452003-10-22 23:27:16 +0000220 <li>If you require interprocedural analysis, it should be a
221 <tt>Pass</tt>.</li>
222 <li>If you are a global analysis, subclass <tt>FunctionPass</tt>.</li>
223 <li>If you are a local pass, subclass <tt>BasicBlockPass</tt>.</li>
224 <li>If you don't need to look at the program at all, subclass
225 <tt>ImmutablePass</tt>.</li>
226</ol>
Misha Brukman3896be22003-10-24 18:06:11 +0000227
228<p>In addition to the pass that you subclass, you should also inherit from the
Misha Brukman700fd492003-05-07 21:47:16 +0000229<tt>AliasAnalysis</tt> interface, of course, and use the
Chris Lattner9f648752003-03-04 19:37:49 +0000230<tt>RegisterAnalysisGroup</tt> template to register as an implementation of
Misha Brukman3896be22003-10-24 18:06:11 +0000231<tt>AliasAnalysis</tt>.</p>
232
Misha Brukmancd11e452003-10-22 23:27:16 +0000233</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000234
235<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000236<div class="doc_subsection">
237 <a name="requiredcalls">Required initialization calls</a>
238</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000239
Misha Brukmancd11e452003-10-22 23:27:16 +0000240<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000241
242<p>Your subclass of AliasAnalysis is required to invoke two methods on the
Chris Lattner9f648752003-03-04 19:37:49 +0000243AliasAnalysis base class: <tt>getAnalysisUsage</tt> and
244<tt>InitializeAliasAnalysis</tt>. In particular, your implementation of
245<tt>getAnalysisUsage</tt> should explicitly call into the
246<tt>AliasAnalysis::getAnalysisUsage</tt> method in addition to doing any
247declaring any pass dependencies your pass has. Thus you should have something
Misha Brukman3896be22003-10-24 18:06:11 +0000248like this:</p>
249
Chris Lattner9f648752003-03-04 19:37:49 +0000250<pre>
251 void getAnalysisUsage(AnalysisUsage &amp;AU) const {
252 AliasAnalysis::getAnalysisUsage(AU);
253 <i>// declare your dependencies here.</i>
254 }
255</pre>
Misha Brukman3896be22003-10-24 18:06:11 +0000256
257<p>Additionally, your must invoke the <tt>InitializeAliasAnalysis</tt> method
258from your analysis run method (<tt>run</tt> for a <tt>Pass</tt>,
Chris Lattner9f648752003-03-04 19:37:49 +0000259<tt>runOnFunction</tt> for a <tt>FunctionPass</tt>, <tt>runOnBasicBlock</tt> for
260a <tt>BasicBlockPass</tt>, or <tt>InitializeAliasAnalysis</tt> for an
Misha Brukman3896be22003-10-24 18:06:11 +0000261<tt>ImmutablePass</tt>). For example (as part of a <tt>Pass</tt>):</p>
262
Chris Lattner9f648752003-03-04 19:37:49 +0000263<pre>
264 bool run(Module &amp;M) {
265 InitializeAliasAnalysis(this);
266 <i>// Perform analysis here...</i>
267 return false;
268 }
269</pre>
Misha Brukman3896be22003-10-24 18:06:11 +0000270
Misha Brukmancd11e452003-10-22 23:27:16 +0000271</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000272
273<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000274<div class="doc_subsection">
275 <a name="interfaces">Interfaces which may be specified</a>
276</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000277
Misha Brukmancd11e452003-10-22 23:27:16 +0000278<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000279
280<p>All of the <a href="/doxygen/classAliasAnalysis.html">AliasAnalysis</a>
281virtual methods default to providing conservatively correct information
282(returning "May" Alias and "Mod/Ref" for alias and mod/ref queries
283respectively). Depending on the capabilities of the analysis you are
284implementing, you just override the interfaces you can improve.</p>
285
Misha Brukmancd11e452003-10-22 23:27:16 +0000286</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000287
288<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000289<div class="doc_subsection">
290 <a name="chaining">The AliasAnalysis chaining behavior</a>
291</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000292
Misha Brukmancd11e452003-10-22 23:27:16 +0000293<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000294
295<p>With only two special exceptions (the <tt>basicaa</tt> and <a
Chris Lattner9f648752003-03-04 19:37:49 +0000296href="#no-aa"><tt>no-aa</tt></a> passes) every alias analysis pass should chain
297to another alias analysis implementation (for example, you could specify
298"<tt>-basic-aa -ds-aa -andersens-aa -licm</tt>" to get the maximum benefit from
299the three alias analyses). To do this, simply "Require" AliasAnalysis in your
300<tt>getAnalysisUsage</tt> method, and if you need to return a conservative
Misha Brukman3896be22003-10-24 18:06:11 +0000301MayAlias or Mod/Ref result, simply chain to a lower analysis.</p>
302
Misha Brukmancd11e452003-10-22 23:27:16 +0000303</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000304
305<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000306<div class="doc_subsection">
307 <a name="implefficiency">Efficiency Issues</a>
308</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000309
Misha Brukmancd11e452003-10-22 23:27:16 +0000310<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000311
312<p>From the LLVM perspective, the only thing you need to do to provide an
313efficient alias analysis is to make sure that alias analysis <b>queries</b> are
314serviced quickly. The actual calculation of the alias analysis results (the
315"run" method) is only performed once, but many (perhaps duplicate) queries may
316be performed. Because of this, try to move as much computation to the run
317method as possible (within reason).</p>
318
Misha Brukmancd11e452003-10-22 23:27:16 +0000319</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000320
321<!-- *********************************************************************** -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000322<div class="doc_section">
323 <a name="using">Using AliasAnalysis results</a>
324</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000325<!-- *********************************************************************** -->
326
Misha Brukmancd11e452003-10-22 23:27:16 +0000327<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000328
329<p>There are several different ways to use alias analysis results. In order of
330preference, these are...</p>
331
Misha Brukmancd11e452003-10-22 23:27:16 +0000332</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000333
334<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000335<div class="doc_subsection">
336 <a name="loadvn">Using the <tt>-load-vn</tt> Pass</a>
337</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000338
Misha Brukmancd11e452003-10-22 23:27:16 +0000339<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000340
341<p>The <tt>load-vn</tt> pass uses alias analysis to provide value numbering
Chris Lattner9f648752003-03-04 19:37:49 +0000342information for <tt>load</tt> instructions. If your analysis or transformation
343can be modelled in a form that uses value numbering information, you don't have
344to do anything special to handle load instructions: just use the
Misha Brukman3896be22003-10-24 18:06:11 +0000345<tt>load-vn</tt> pass, which uses alias analysis.</p>
346
Misha Brukmancd11e452003-10-22 23:27:16 +0000347</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000348
349<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000350<div class="doc_subsection">
351 <a name="ast">Using the <tt>AliasSetTracker</tt> class</a>
352</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000353
Misha Brukmancd11e452003-10-22 23:27:16 +0000354<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000355
356<p>Many transformations need information about alias <b>sets</b> that are active
357in some scope, rather than information about pairwise aliasing. The <tt><a
Chris Lattner9f648752003-03-04 19:37:49 +0000358href="/doxygen/classAliasSetTracker.html">AliasSetTracker</a></tt> class is used
359to efficiently build these Alias Sets from the pairwise alias analysis
Misha Brukman3896be22003-10-24 18:06:11 +0000360information provided by the AliasAnalysis interface.</p>
361
362<p>First you initialize the AliasSetTracker by use the "<tt>add</tt>" methods to
Chris Lattner9f648752003-03-04 19:37:49 +0000363add information about various potentially aliasing instructions in the scope you
364are interested in. Once all of the alias sets are completed, your pass should
365simply iterate through the constructed alias sets, using the AliasSetTracker
Misha Brukman3896be22003-10-24 18:06:11 +0000366<tt>begin()</tt>/<tt>end()</tt> methods.</p>
367
368<p>The <tt>AliasSet</tt>s formed by the <tt>AliasSetTracker</tt> are guaranteed
369to be disjoint, calculate mod/ref information for the set, and keep track of
Chris Lattner9f648752003-03-04 19:37:49 +0000370whether or not all of the pointers in the set are Must aliases. The
371AliasSetTracker also makes sure that sets are properly folded due to call
Misha Brukman3896be22003-10-24 18:06:11 +0000372instructions, and can provide a list of pointers in each set.</p>
373
374<p>As an example user of this, the <a href="/doxygen/structLICM.html">Loop
Chris Lattner9f648752003-03-04 19:37:49 +0000375Invariant Code Motion</a> pass uses AliasSetTrackers to build alias information
376about each loop nest. If an AliasSet in a loop is not modified, then all load
377instructions from that set may be hoisted out of the loop. If any alias sets
378are stored <b>and</b> are must alias sets, then the stores may be sunk to
379outside of the loop. Both of these transformations obviously only apply if the
Misha Brukman3896be22003-10-24 18:06:11 +0000380pointer argument is loop-invariant.</p>
381
Misha Brukmancd11e452003-10-22 23:27:16 +0000382</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000383
384<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000385<div class="doc_subsection">
386 <a name="direct">Using the AliasAnalysis interface directly</a>
387</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000388
Misha Brukmancd11e452003-10-22 23:27:16 +0000389<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000390
391<p>As a last resort, your pass could use the AliasAnalysis interface directly to
Chris Lattner9f648752003-03-04 19:37:49 +0000392service your pass. If you find the need to do this, please <a
393href="mailto:sabre@nondot.org">let me know</a> so I can see if something new
Misha Brukman3896be22003-10-24 18:06:11 +0000394needs to be added to LLVM.</p>
395
Misha Brukmancd11e452003-10-22 23:27:16 +0000396</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000397
398<!-- *********************************************************************** -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000399<div class="doc_section">
400 <a name="tools">Helpful alias-analysis-related tools</a>
401</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000402<!-- *********************************************************************** -->
403
Misha Brukmancd11e452003-10-22 23:27:16 +0000404<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000405
406<p>If you're going to be working with the AliasAnalysis infrastructure, there
407are several nice tools that may be useful for you and are worth knowing
408about...</p>
409
Misha Brukmancd11e452003-10-22 23:27:16 +0000410</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000411
412<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000413<div class="doc_subsection">
414 <a name="no-aa">The <tt>-no-aa</tt> pass</a>
415</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000416
Misha Brukmancd11e452003-10-22 23:27:16 +0000417<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000418
419<p>The <tt>-no-aa</tt> analysis is just like what it sounds: an alias analysis
420that never returns any useful information. This pass can be useful if you think
421that alias analysis is doing something wrong and are trying to narrow down a
422problem. If you don't specify an alias analysis, the default will be to use the
423<tt>basicaa</tt> pass which does quite a bit of disambiguation on its own.</p>
424
Misha Brukmancd11e452003-10-22 23:27:16 +0000425</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000426
427
428<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000429<div class="doc_subsection">
430 <a name="print-alias-sets">The <tt>-print-alias-sets</tt> pass</a>
431</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000432
Misha Brukmancd11e452003-10-22 23:27:16 +0000433<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000434
435<p>The <tt>-print-alias-sets</tt> pass is exposed as part of the
436<tt>analyze</tt> tool to print out the Alias Sets formed by the <a
Chris Lattner9f648752003-03-04 19:37:49 +0000437href="#ast"><tt>AliasSetTracker</tt></a> class. This is useful if you're using
Misha Brukman3896be22003-10-24 18:06:11 +0000438the <tt>AliasSetTracker</tt>.</p>
439
Misha Brukmancd11e452003-10-22 23:27:16 +0000440</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000441
442<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000443<div class="doc_subsection">
444 <a name="count-aa">The <tt>-count-aa</tt> pass</a>
445</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000446
Misha Brukmancd11e452003-10-22 23:27:16 +0000447<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000448
449<p>The <tt>-count-aa</tt> pass is useful to see how many queries a particular
450pass is making and what kinds of responses are returned by the alias analysis.
451An example usage is:</p>
452
Chris Lattner9f648752003-03-04 19:37:49 +0000453<pre>
454 $ opt -basicaa -count-aa -ds-aa -count-aa -licm
455</pre>
Misha Brukman3896be22003-10-24 18:06:11 +0000456
457<p>Which will print out how many queries (and what responses are returned) by
458the <tt>-licm</tt> pass (of the <tt>-ds-aa</tt> pass) and how many queries are
459made of the <tt>-basicaa</tt> pass by the <tt>-ds-aa</tt> pass. This can be
460useful when evaluating an alias analysis for precision.</p>
461
Misha Brukmancd11e452003-10-22 23:27:16 +0000462</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000463
464<!-- ======================================================================= -->
Misha Brukmancd11e452003-10-22 23:27:16 +0000465<div class="doc_subsection">
466 <a name="aa-eval">The <tt>-aa-eval</tt> pass</a>
467</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000468
Misha Brukmancd11e452003-10-22 23:27:16 +0000469<div class="doc_text">
Misha Brukman3896be22003-10-24 18:06:11 +0000470
471<p>The <tt>-aa-eval</tt> pass simply iterates through all pairs of pointers in a
Chris Lattner9f648752003-03-04 19:37:49 +0000472function and asks an alias analysis whether or not the pointers alias. This
473gives an indication of the precision of the alias analysis. Statistics are
Misha Brukman5feba4e2003-11-22 01:07:30 +0000474printed.</p>
Misha Brukman3896be22003-10-24 18:06:11 +0000475
Misha Brukmancd11e452003-10-22 23:27:16 +0000476</div>
Chris Lattner9f648752003-03-04 19:37:49 +0000477
Chris Lattner9f648752003-03-04 19:37:49 +0000478<!-- *********************************************************************** -->
479
Misha Brukman3896be22003-10-24 18:06:11 +0000480<hr>
Misha Brukman915cab22003-11-22 01:26:21 +0000481<address>
482 <a href="http://jigsaw.w3.org/css-validator/"><img
Misha Brukman5feba4e2003-11-22 01:07:30 +0000483 src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!"></a>
Misha Brukman915cab22003-11-22 01:26:21 +0000484 <a href="http://validator.w3.org/check/referer"><img
485 src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!" /></a>
486
487 <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
488 <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a><br>
489 Last modified: $Date$
490</address>
Misha Brukmancd11e452003-10-22 23:27:16 +0000491
492</body>
493</html>