mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
Expand on the AliasSetTracker a bit, so I can remember this next time I come back to it. :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10537 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a3df8a964a
commit
539ca70112
@ -366,9 +366,9 @@ simply iterate through the constructed alias sets, using the AliasSetTracker
|
||||
<tt>begin()</tt>/<tt>end()</tt> methods.</p>
|
||||
|
||||
<p>The <tt>AliasSet</tt>s formed by the <tt>AliasSetTracker</tt> are guaranteed
|
||||
to be disjoint, calculate mod/ref information for the set, and keep track of
|
||||
whether or not all of the pointers in the set are Must aliases. The
|
||||
AliasSetTracker also makes sure that sets are properly folded due to call
|
||||
to be disjoint, calculate mod/ref information and volatility for the set, and
|
||||
keep track of whether or not all of the pointers in the set are Must aliases.
|
||||
The AliasSetTracker also makes sure that sets are properly folded due to call
|
||||
instructions, and can provide a list of pointers in each set.</p>
|
||||
|
||||
<p>As an example user of this, the <a href="/doxygen/structLICM.html">Loop
|
||||
@ -376,11 +376,38 @@ Invariant Code Motion</a> pass uses AliasSetTrackers to build alias information
|
||||
about each loop nest. If an AliasSet in a loop is not modified, then all load
|
||||
instructions from that set may be hoisted out of the loop. If any alias sets
|
||||
are stored <b>and</b> are must alias sets, then the stores may be sunk to
|
||||
outside of the loop. Both of these transformations obviously only apply if the
|
||||
pointer argument is loop-invariant.</p>
|
||||
outside of the loop, promoting the memory location to a register for the
|
||||
duration of the loop nest. Both of these transformations obviously only apply
|
||||
if the pointer argument is loop-invariant.</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="doc_subsubsection">
|
||||
The AliasSetTracker implementation
|
||||
</div>
|
||||
|
||||
<div class="doc_text">
|
||||
|
||||
<p>The AliasSetTracker class is implemented to be as efficient as possible. It
|
||||
uses the union-find algorithm to efficiently merge AliasSets when a pointer is
|
||||
inserted into the AliasSetTracker that aliases multiple sets. The primary data
|
||||
structure is a hash table mapping pointers to the AliasSet they are in.</p>
|
||||
|
||||
<p>The AliasSetTracker class must maintain a list of all of the LLVM Value*'s
|
||||
that are in each AliasSet. Since the hash table already has entries for each
|
||||
LLVM Value* of interest, the AliasesSets thread the linked list through these
|
||||
hash-table nodes to avoid having to allocate memory unnecessarily, and to make
|
||||
merging alias sets extremely efficient (the linked list merge is constant time).
|
||||
</p>
|
||||
|
||||
<p>You shouldn't need to understand these details if you are just a client of
|
||||
the AliasSetTracker, but if you look at the code, hopefully this brief
|
||||
description will help make sense of why things are designed the way they
|
||||
are.</p>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- ======================================================================= -->
|
||||
<div class="doc_subsection">
|
||||
<a name="direct">Using the AliasAnalysis interface directly</a>
|
||||
|
Loading…
x
Reference in New Issue
Block a user