Make the addressing modes smarter
[oota-llvm.git] / docs / ProgrammersManual.html
index e4d50039f604c97135fdd863bb3fea1377eabd16..b6e3540e89c8dc79faad5e929e8469689ccf6c32 100644 (file)
@@ -28,7 +28,7 @@
     <ul>
       <li><a href="#isa">The <tt>isa&lt;&gt;</tt>, <tt>cast&lt;&gt;</tt>
 and <tt>dyn_cast&lt;&gt;</tt> templates</a> </li>
-      <li><a href="#DEBUG">The <tt>DEBUG()</tt> macro &amp; <tt>-debug</tt>
+      <li><a href="#DEBUG">The <tt>DEBUG()</tt> macro and <tt>-debug</tt>
 option</a>
         <ul>
           <li><a href="#DEBUG_TYPE">Fine grained debug info with <tt>DEBUG_TYPE</tt>
@@ -264,7 +264,8 @@ know about when writing transformations.</p>
 
 <!-- ======================================================================= -->
 <div class="doc_subsection">
-  <a name="isa">The isa&lt;&gt;, cast&lt;&gt; and dyn_cast&lt;&gt; templates</a>
+  <a name="isa">The <tt>isa&lt;&gt;</tt>, <tt>cast&lt;&gt;</tt> and
+  <tt>dyn_cast&lt;&gt;</tt> templates</a>
 </div>
 
 <div class="doc_text">
@@ -317,44 +318,45 @@ file (note that you very rarely have to include this file directly).</p>
   checks to see if the operand is of the specified type, and if so, returns a
   pointer to it (this operator does not work with references). If the operand is
   not of the correct type, a null pointer is returned.  Thus, this works very
-  much like the <tt>dynamic_cast</tt> operator in C++, and should be used in the
-  same circumstances.  Typically, the <tt>dyn_cast&lt;&gt;</tt> operator is used
-  in an <tt>if</tt> statement or some other flow control statement like this:
+  much like the <tt>dynamic_cast&lt;&gt;</tt> operator in C++, and should be
+  used in the same circumstances.  Typically, the <tt>dyn_cast&lt;&gt;</tt>
+  operator is used in an <tt>if</tt> statement or some other flow control
+  statement like this:
 
-   <pre>
+  <pre>
      if (<a href="#AllocationInst">AllocationInst</a> *AI = dyn_cast&lt;<a href="#AllocationInst">AllocationInst</a>&gt;(Val)) {
        ...
      }
-   </pre>
+  </pre>
    
-   <p> This form of the <tt>if</tt> statement effectively combines together a
-   call to <tt>isa&lt;&gt;</tt> and a call to <tt>cast&lt;&gt;</tt> into one
-   statement, which is very convenient.</p>
+  <p>This form of the <tt>if</tt> statement effectively combines together a call
+  to <tt>isa&lt;&gt;</tt> and a call to <tt>cast&lt;&gt;</tt> into one
+  statement, which is very convenient.</p>
 
-   <p>Note that the <tt>dyn_cast&lt;&gt;</tt> operator, like C++'s
-   <tt>dynamic_cast</tt> or Java's <tt>instanceof</tt> operator, can be abused.
-   In particular you should not use big chained <tt>if/then/else</tt> blocks to
-   check for lots of different variants of classes.  If you find yourself
-   wanting to do this, it is much cleaner and more efficient to use the
-   <tt>InstVisitor</tt> class to dispatch over the instruction type directly.</p>
+  <p>Note that the <tt>dyn_cast&lt;&gt;</tt> operator, like C++'s
+  <tt>dynamic_cast&lt;&gt;</tt> or Java's <tt>instanceof</tt> operator, can be
+  abused.  In particular, you should not use big chained <tt>if/then/else</tt>
+  blocks to check for lots of different variants of classes.  If you find
+  yourself wanting to do this, it is much cleaner and more efficient to use the
+  <tt>InstVisitor</tt> class to dispatch over the instruction type directly.</p>
 
-    </dd>
+  </dd>
 
-    <dt><tt>cast_or_null&lt;&gt;</tt>: </dt>
-   
-    <dd>The <tt>cast_or_null&lt;&gt;</tt> operator works just like the
-    <tt>cast&lt;&gt;</tt> operator, except that it allows for a null pointer as
-    an argument (which it then propagates).  This can sometimes be useful,
-    allowing you to combine several null checks into one.</dd>
+  <dt><tt>cast_or_null&lt;&gt;</tt>: </dt>
+  
+  <dd>The <tt>cast_or_null&lt;&gt;</tt> operator works just like the
+  <tt>cast&lt;&gt;</tt> operator, except that it allows for a null pointer as an
+  argument (which it then propagates).  This can sometimes be useful, allowing
+  you to combine several null checks into one.</dd>
 
-    <dt><tt>dyn_cast_or_null&lt;&gt;</tt>: </dt>
+  <dt><tt>dyn_cast_or_null&lt;&gt;</tt>: </dt>
 
-    <dd>The <tt>dyn_cast_or_null&lt;&gt;</tt> operator works just like the
-    <tt>dyn_cast&lt;&gt;</tt> operator, except that it allows for a null pointer
-    as an argument (which it then propagates).  This can sometimes be useful,
-    allowing you to combine several null checks into one.</dd>
+  <dd>The <tt>dyn_cast_or_null&lt;&gt;</tt> operator works just like the
+  <tt>dyn_cast&lt;&gt;</tt> operator, except that it allows for a null pointer
+  as an argument (which it then propagates).  This can sometimes be useful,
+  allowing you to combine several null checks into one.</dd>
 
-  </dl>
+</dl>
 
 <p>These five templates can be used with any classes, whether they have a
 v-table or not.  To add support for these templates, you simply need to add
@@ -366,7 +368,7 @@ are lots of examples in the LLVM source base.</p>
 
 <!-- ======================================================================= -->
 <div class="doc_subsection">
-  <a name="DEBUG">The <tt>DEBUG()</tt> macro &amp; <tt>-debug</tt> option</a>
+  <a name="DEBUG">The <tt>DEBUG()</tt> macro and <tt>-debug</tt> option</a>
 </div>
 
 <div class="doc_text">
@@ -588,7 +590,7 @@ the <tt>BasicBlock</tt>s that constitute the <tt>Function</tt>. The following is
 an example that prints the name of a <tt>BasicBlock</tt> and the number of
 <tt>Instruction</tt>s it contains:</p>
 
-  <pre>  // func is a pointer to a Function instance<br>  for (Function::iterator i = func-&gt;begin(), e = func-&gt;end(); i != e; ++i) {<br><br>      // print out the name of the basic block if it has one, and then the<br>      // number of instructions that it contains<br><br>      cerr &lt;&lt; "Basic block (name=" &lt;&lt; i-&gt;getName() &lt;&lt; ") has " <br>           &lt;&lt; i-&gt;size() &lt;&lt; " instructions.\n";<br>  }<br></pre>
+  <pre>  // func is a pointer to a Function instance<br>  for (Function::iterator i = func-&gt;begin(), e = func-&gt;end(); i != e; ++i) {<br><br>      // print out the name of the basic block if it has one, and then the<br>      // number of instructions that it contains<br><br>      std::cerr &lt;&lt; "Basic block (name=" &lt;&lt; i-&gt;getName() &lt;&lt; ") has " <br>           &lt;&lt; i-&gt;size() &lt;&lt; " instructions.\n";<br>  }<br></pre>
 
 <p>Note that i can be used as if it were a pointer for the purposes of
 invoking member functions of the <tt>Instruction</tt> class.  This is
@@ -643,7 +645,7 @@ href="/doxygen/InstIterator_8h-source.html"><tt>llvm/Support/InstIterator.h</tt>
 and then instantiate <tt>InstIterator</tt>s explicitly in your code.  Here's a
 small example that shows how to dump all instructions in a function to the standard error stream:<p>
 
-  <pre>#include "<a href="/doxygen/InstIterator_8h-source.html">llvm/Support/InstIterator.h</a>"<br>...<br>// Suppose F is a ptr to a function<br>for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)<br>  cerr &lt;&lt; *i &lt;&lt; "\n";<br></pre>
+  <pre>#include "<a href="/doxygen/InstIterator_8h-source.html">llvm/Support/InstIterator.h</a>"<br>...<br>// Suppose F is a ptr to a function<br>for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)<br>  std::cerr &lt;&lt; *i &lt;&lt; "\n";<br></pre>
 Easy, isn't it?  You can also use <tt>InstIterator</tt>s to fill a
 worklist with its initial contents.  For example, if you wanted to
 initialize a worklist to contain all instructions in a <tt>Function</tt>
@@ -691,7 +693,7 @@ snippet illustrates use of the conversion constructors provided by LLVM
 iterators.  By using these, you can explicitly grab the iterator of something
 without actually obtaining it via iteration over some structure:</p>
 
-  <pre>void printNextInstruction(Instruction* inst) {<br>    BasicBlock::iterator it(inst);<br>    ++it; // after this line, it refers to the instruction after *inst.<br>    if (it != inst-&gt;getParent()-&gt;end()) cerr &lt;&lt; *it &lt;&lt; "\n";<br>}<br></pre>
+  <pre>void printNextInstruction(Instruction* inst) {<br>    BasicBlock::iterator it(inst);<br>    ++it; // after this line, it refers to the instruction after *inst.<br>    if (it != inst-&gt;getParent()-&gt;end()) std::cerr &lt;&lt; *it &lt;&lt; "\n";<br>}<br></pre>
 
 </div>
 
@@ -766,7 +768,7 @@ particular function <tt>foo</tt>. Finding all of the instructions that
 <i>use</i> <tt>foo</tt> is as simple as iterating over the <i>def-use</i> chain
 of <tt>F</tt>:</p>
 
-  <pre>Function* F = ...;<br><br>for (Value::use_iterator i = F-&gt;use_begin(), e = F-&gt;use_end(); i != e; ++i) {<br>    if (Instruction *Inst = dyn_cast&lt;Instruction&gt;(*i)) {<br>        cerr &lt;&lt; "F is used in instruction:\n";<br>        cerr &lt;&lt; *Inst &lt;&lt; "\n";<br>    }<br>}<br></pre>
+  <pre>Function* F = ...;<br><br>for (Value::use_iterator i = F-&gt;use_begin(), e = F-&gt;use_end(); i != e; ++i) {<br>    if (Instruction *Inst = dyn_cast&lt;Instruction&gt;(*i)) {<br>        std::cerr &lt;&lt; "F is used in instruction:\n";<br>        std::cerr &lt;&lt; *Inst &lt;&lt; "\n";<br>    }<br>}<br></pre>
 
 <p>Alternately, it's common to have an instance of the <a
 href="/doxygen/classllvm_1_1User.html">User Class</a> and need to know what