diff options
author | Misha Brukman <brukman+llvm@gmail.com> | 2004-07-28 22:18:33 +0000 |
---|---|---|
committer | Misha Brukman <brukman+llvm@gmail.com> | 2004-07-28 22:18:33 +0000 |
commit | 294611a6e4ddf4caf48699fe8c34b0c7ba72e932 (patch) | |
tree | d5252bdad6053361d80f43da5a738fb90189399c /docs/AliasAnalysis.html | |
parent | 08772dae1ef08a0d9d343c67d7a9360a97cacff1 (diff) | |
download | external_llvm-294611a6e4ddf4caf48699fe8c34b0c7ba72e932.zip external_llvm-294611a6e4ddf4caf48699fe8c34b0c7ba72e932.tar.gz external_llvm-294611a6e4ddf4caf48699fe8c34b0c7ba72e932.tar.bz2 |
* Use the doc_code class for code listings to make it stand out from text
* Wrap text in soft, comfortable <div>s and <p>s
* Wrap lines at 80 cols
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15311 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'docs/AliasAnalysis.html')
-rw-r--r-- | docs/AliasAnalysis.html | 119 |
1 files changed, 64 insertions, 55 deletions
diff --git a/docs/AliasAnalysis.html b/docs/AliasAnalysis.html index 10227fb..d137ffe 100644 --- a/docs/AliasAnalysis.html +++ b/docs/AliasAnalysis.html @@ -134,16 +134,18 @@ symbolic LLVM <tt>Value*</tt>) and a static size.</p> important for correct Alias Analyses. For example, consider this (silly, but possible) C code:</p> +<div class="doc_code"> <pre> - int i; - char C[2]; - char A[10]; - /* ... */ - for (i = 0; i != 10; ++i) { - C[0] = A[i]; /* One byte store */ - C[1] = A[9-i]; /* One byte store */ - } +int i; +char C[2]; +char A[10]; +/* ... */ +for (i = 0; i != 10; ++i) { + C[0] = A[i]; /* One byte store */ + C[1] = A[9-i]; /* One byte store */ +} </pre> +</div> <p>In this case, the <tt>basicaa</tt> pass will disambiguate the stores to <tt>C[0]</tt> and <tt>C[1]</tt> because they are accesses to two distinct @@ -151,16 +153,18 @@ locations one byte apart, and the accesses are each one byte. In this case, the LICM pass can use store motion to remove the stores from the loop. In constrast, the following code:</p> +<div class="doc_code"> <pre> - int i; - char C[2]; - char A[10]; - /* ... */ - for (i = 0; i != 10; ++i) { - ((short*)C)[0] = A[i]; /* Two byte store! */ - C[1] = A[9-i]; /* One byte store */ - } +int i; +char C[2]; +char A[10]; +/* ... */ +for (i = 0; i != 10; ++i) { + ((short*)C)[0] = A[i]; /* Two byte store! */ + C[1] = A[9-i]; /* One byte store */ +} </pre> +</div> <p>In this case, the two stores to C do alias each other, because the access to the <tt>&C[0]</tt> element is a two byte access. If size information wasn't @@ -361,25 +365,29 @@ the <tt>AliasAnalysis</tt> base class: <tt>getAnalysisUsage</tt> and declaring any pass dependencies your pass has. Thus you should have something like this:</p> +<div class="doc_code"> <pre> - void getAnalysisUsage(AnalysisUsage &AU) const { - AliasAnalysis::getAnalysisUsage(AU); - <i>// declare your dependencies here.</i> - } +void getAnalysisUsage(AnalysisUsage &AU) const { + AliasAnalysis::getAnalysisUsage(AU); + <i>// declare your dependencies here.</i> +} </pre> +</div> <p>Additionally, your must invoke the <tt>InitializeAliasAnalysis</tt> method from your analysis run method (<tt>run</tt> for a <tt>Pass</tt>, <tt>runOnFunction</tt> for a <tt>FunctionPass</tt>, or <tt>InitializePass</tt> for an <tt>ImmutablePass</tt>). For example (as part of a <tt>Pass</tt>):</p> +<div class="doc_code"> <pre> - bool run(Module &M) { - InitializeAliasAnalysis(this); - <i>// Perform analysis here...</i> - return false; - } +bool run(Module &M) { + InitializeAliasAnalysis(this); + <i>// Perform analysis here...</i> + return false; +} </pre> +</div> </div> @@ -419,17 +427,19 @@ for methods that you don't override. For methods that you do override, in code paths that return a conservative MayAlias or Mod/Ref result, simply return whatever the superclass computes. For example:</p> +<div class="doc_code"> <pre> - AliasAnalysis::AliasResult alias(const Value *V1, unsigned V1Size, - const Value *V2, unsigned V2Size) { - if (...) - return NoAlias; - ... - - <i>// Couldn't determine a must or no-alias result.</i> - return AliasAnalysis::alias(V1, V1Size, V2, V2Size); - } +AliasAnalysis::AliasResult alias(const Value *V1, unsigned V1Size, + const Value *V2, unsigned V2Size) { + if (...) + return NoAlias; + ... + + <i>// Couldn't determine a must or no-alias result.</i> + return AliasAnalysis::alias(V1, V1Size, V2, V2Size); +} </pre> +</div> <p>In addition to analysis queries, you must make sure to unconditionally pass LLVM <a href="#updating">update notification</a> methods to the superclass as @@ -473,7 +483,6 @@ for each value in the program. When this method is called, they should remove any entries for the specified value, if they exist. </div> - <!-- _______________________________________________________________________ --> <div class="doc_subsubsection">The <tt>copyValue</tt> method</div> @@ -485,7 +494,6 @@ this is the only way to introduce a new value. This method indicates that the new value has exactly the same properties as the value being copied. </div> - <!-- _______________________________________________________________________ --> <div class="doc_subsubsection">The <tt>replaceWithNewValue</tt> method</div> @@ -549,8 +557,8 @@ just use the <tt>load-vn</tt> pass, which uses alias analysis.</p> <p>Many transformations need information about alias <b>sets</b> that are active in some scope, rather than information about pairwise aliasing. The <tt><a -href="/doxygen/classllvm_1_1AliasSetTracker.html">AliasSetTracker</a></tt> class is used -to efficiently build these Alias Sets from the pairwise alias analysis +href="/doxygen/classllvm_1_1AliasSetTracker.html">AliasSetTracker</a></tt> class +is used to efficiently build these Alias Sets from the pairwise alias analysis information provided by the <tt>AliasAnalysis</tt> interface.</p> <p>First you initialize the AliasSetTracker by using the "<tt>add</tt>" methods @@ -602,7 +610,6 @@ are.</p> </div> - <!-- ======================================================================= --> <div class="doc_subsection"> <a name="direct">Using the <tt>AliasAnalysis</tt> interface directly</a> @@ -662,7 +669,6 @@ problem.</p> </div> - <!-- _______________________________________________________________________ --> <div class="doc_subsubsection"> <a name="basic-aa">The <tt>-basicaa</tt> pass</a> @@ -845,8 +851,8 @@ pointer.</p> </div> <div class="doc_text"> -<p> -The <tt>-load-vn</tt> pass uses alias analysis to "<a href="#loadvn">value + +<p>The <tt>-load-vn</tt> pass uses alias analysis to "<a href="#loadvn">value number</a>" loads and pointers values, which is used by the GCSE pass to eliminate instructions. The <tt>-load-vn</tt> pass relies on alias information and must-alias information. This combination of passes can make the following @@ -864,18 +870,19 @@ calls into direct calls.</li> </div> - - - <!-- ======================================================================= --> <div class="doc_subsection"> - <a name="aliasanalysis-debug">Clients for debugging and evaluation of implementations</a> + <a name="aliasanalysis-debug">Clients for debugging and evaluation of + implementations</a> </div> -These passes are useful for evaluating the various alias analysis +<div class="doc_text"> + +<p>These passes are useful for evaluating the various alias analysis implementations. You can use them with commands like '<tt>opt -anders-aa -ds-aa --aa-eval foo.bc -disable-output -stats</tt>'. +-aa-eval foo.bc -disable-output -stats</tt>'.</p> +</div> <!-- _______________________________________________________________________ --> <div class="doc_subsubsection"> @@ -900,17 +907,19 @@ the <tt>AliasSetTracker</tt> class.</p> <div class="doc_text"> <p>The <tt>-count-aa</tt> pass is useful to see how many queries a particular -pass is making and what responses are returned by the alias analysis. An -example usage is:</p> +pass is making and what responses are returned by the alias analysis. As an +example,</p> +<div class="doc_code"> <pre> - $ opt -basicaa -count-aa -ds-aa -count-aa -licm +% opt -basicaa -count-aa -ds-aa -count-aa -licm </pre> +</div> -<p>Which will print out how many queries (and what responses are returned) by -the <tt>-licm</tt> pass (of the <tt>-ds-aa</tt> pass) and how many queries are -made of the <tt>-basicaa</tt> pass by the <tt>-ds-aa</tt> pass. This can be -useful when debugging a transformation or an alias analysis implementation.</p> +<p>will print out how many queries (and what responses are returned) by the +<tt>-licm</tt> pass (of the <tt>-ds-aa</tt> pass) and how many queries are made +of the <tt>-basicaa</tt> pass by the <tt>-ds-aa</tt> pass. This can be useful +when debugging a transformation or an alias analysis implementation.</p> </div> |