test commit
[oota-llvm.git] / docs / Bugpoint.html
index 5454ff40d2bb225d513bc1c05bb658a8ba82d0ee..71f288d7720ef33ad5ff1c03dd10a64f1bee3ed2 100644 (file)
@@ -4,7 +4,7 @@
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>LLVM bugpoint tool: design and usage</title>
-  <link rel="stylesheet" href="llvm.css" type="text/css">
+  <link rel="stylesheet" href="_static/llvm.css" type="text/css">
 </head>
 
 <h1>
@@ -21,6 +21,7 @@
     <li><a href="#miscompilationdebug">Miscompilation debugger</a></li>
   </ul></li>
   <li><a href="#advice">Advice for using <tt>bugpoint</tt></a></li>
+  <li><a href="#notEnough">What to do when <tt>bugpoint</tt> isn't enough</a></li>
 </ul>
 
 <div class="doc_author">
@@ -44,9 +45,9 @@ file, it will identify the optimization (or combination of optimizations) that
 causes the crash, and reduce the file down to a small example which triggers the
 crash.</p>
 
-<p>For detailed case scenarios, such as debugging <tt>opt</tt>,
-<tt>llvm-ld</tt>, or one of the LLVM code generators, see <a
-href="HowToSubmitABug.html">How To Submit a Bug Report document</a>.</p>
+<p>For detailed case scenarios, such as debugging <tt>opt</tt>, or one of the
+LLVM code generators, see <a href="HowToSubmitABug.html">How To Submit a Bug
+Report document</a>.</p>
 
 </div>
 
@@ -219,6 +220,82 @@ non-obvious ways.  Here are some hints and tips:<p>
     kills <tt>bugpoint</tt>.
 </ol>
 
+</div>
+<!-- *********************************************************************** -->
+<h2>
+  <a name="notEnough">What to do when bugpoint isn't enough</a>
+</h2>
+<!-- *********************************************************************** -->
+
+<div>
+       
+<p>Sometimes, <tt>bugpoint</tt> is not enough. In particular, InstCombine and
+TargetLowering both have visitor structured code with lots of potential
+transformations.  If the process of using bugpoint has left you with
+still too much code to figure out and the problem seems
+to be in instcombine, the following steps may help.  These same techniques
+are useful with TargetLowering as well.</p>
+
+<p>Turn on <tt>-debug-only=instcombine</tt> and see which transformations
+within instcombine are firing by selecting out lines with "<tt>IC</tt>"
+in them.</p>
+
+<p>At this point, you have a decision to make.  Is the number
+of transformations small enough to step through them using a debugger?
+If so, then try that.</p>
+
+<p>If there are too many transformations, then a source modification
+approach may be helpful.
+In this approach, you can modify the source code of instcombine
+to disable just those transformations that are being performed on your
+test input and perform a binary search over the set of transformations.
+One set of places to modify are the "<tt>visit*</tt>" methods of
+<tt>InstCombiner</tt> (<I>e.g.</I> <tt>visitICmpInst</tt>) by adding a
+"<tt>return false</tt>" as the first line of the method.</p>
+
+<p>If that still doesn't remove enough, then change the caller of
+<tt>InstCombiner::DoOneIteration</tt>, <tt>InstCombiner::runOnFunction</tt>
+to limit the number of iterations.</p>
+
+<p>You may also find it useful to use "<tt>-stats</tt>" now to see what parts
+of instcombine are firing.  This can guide where to put additional reporting
+code.</p>
+
+<p>At this point, if the amount of transformations is still too large, then
+inserting code to limit whether or not to execute the body of the code
+in the visit function can be helpful.  Add a static counter which is
+incremented on every invocation of the function.  Then add code which
+simply returns false on desired ranges.  For example:</p>
+
+<div class="doc_code">
+<p><tt>static int calledCount = 0;</tt></p>
+<p><tt>calledCount++;</tt></p>
+<p><tt>DEBUG(if (calledCount &lt; 212) return false);</tt></p>
+<p><tt>DEBUG(if (calledCount &gt; 217) return false);</tt></p>
+<p><tt>DEBUG(if (calledCount == 213) return false);</tt></p>
+<p><tt>DEBUG(if (calledCount == 214) return false);</tt></p>
+<p><tt>DEBUG(if (calledCount == 215) return false);</tt></p>
+<p><tt>DEBUG(if (calledCount == 216) return false);</tt></p>
+<p><tt>DEBUG(dbgs() &lt;&lt; "visitXOR calledCount: " &lt;&lt; calledCount
+       &lt;&lt; "\n");</tt></p>
+<p><tt>DEBUG(dbgs() &lt;&lt; "I: "; I->dump());</tt></p>
+</div>
+
+<p>could be added to <tt>visitXOR</tt> to limit <tt>visitXor</tt> to being
+applied only to calls 212 and 217. This is from an actual test case and raises
+an important point---a simple binary search may not be sufficient, as
+transformations that interact may require isolating more than one call.
+In TargetLowering, use <tt>return SDNode();</tt> instead of
+<tt>return false;</tt>.</p>
+
+<p>Now that that the number of transformations is down to a manageable
+number, try examining the output to see if you can figure out which
+transformations are being done.  If that can be figured out, then
+do the usual debugging.  If which code corresponds to the transformation
+being performed isn't obvious, set a breakpoint after the call count
+based disabling and step through the code.  Alternatively, you can use
+"printf" style debugging to report waypoints.</p>
+
 </div>
 
 <!-- *********************************************************************** -->