|  | ==================================== | 
|  | LLVM bugpoint tool: design and usage | 
|  | ==================================== | 
|  |  | 
|  | .. contents:: | 
|  | :local: | 
|  |  | 
|  | Description | 
|  | =========== | 
|  |  | 
|  | ``bugpoint`` narrows down the source of problems in LLVM tools and passes.  It | 
|  | can be used to debug three types of failures: optimizer crashes, miscompilations | 
|  | by optimizers, or bad native code generation (including problems in the static | 
|  | and JIT compilers).  It aims to reduce large test cases to small, useful ones. | 
|  | For example, if ``opt`` crashes while optimizing a 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. | 
|  |  | 
|  | For detailed case scenarios, such as debugging ``opt``, or one of the LLVM code | 
|  | generators, see :doc:`HowToSubmitABug`. | 
|  |  | 
|  | Design Philosophy | 
|  | ================= | 
|  |  | 
|  | ``bugpoint`` is designed to be a useful tool without requiring any hooks into | 
|  | the LLVM infrastructure at all.  It works with any and all LLVM passes and code | 
|  | generators, and does not need to "know" how they work.  Because of this, it may | 
|  | appear to do stupid things or miss obvious simplifications.  ``bugpoint`` is | 
|  | also designed to trade off programmer time for computer time in the | 
|  | compiler-debugging process; consequently, it may take a long period of | 
|  | (unattended) time to reduce a test case, but we feel it is still worth it. Note | 
|  | that ``bugpoint`` is generally very quick unless debugging a miscompilation | 
|  | where each test of the program (which requires executing it) takes a long time. | 
|  |  | 
|  | Automatic Debugger Selection | 
|  | ---------------------------- | 
|  |  | 
|  | ``bugpoint`` reads each ``.bc`` or ``.ll`` file specified on the command line | 
|  | and links them together into a single module, called the test program.  If any | 
|  | LLVM passes are specified on the command line, it runs these passes on the test | 
|  | program.  If any of the passes crash, or if they produce malformed output (which | 
|  | causes the verifier to abort), ``bugpoint`` starts the `crash debugger`_. | 
|  |  | 
|  | Otherwise, if the ``-output`` option was not specified, ``bugpoint`` runs the | 
|  | test program with the "safe" backend (which is assumed to generate good code) to | 
|  | generate a reference output.  Once ``bugpoint`` has a reference output for the | 
|  | test program, it tries executing it with the selected code generator.  If the | 
|  | selected code generator crashes, ``bugpoint`` starts the `crash debugger`_ on | 
|  | the code generator.  Otherwise, if the resulting output differs from the | 
|  | reference output, it assumes the difference resulted from a code generator | 
|  | failure, and starts the `code generator debugger`_. | 
|  |  | 
|  | Finally, if the output of the selected code generator matches the reference | 
|  | output, ``bugpoint`` runs the test program after all of the LLVM passes have | 
|  | been applied to it.  If its output differs from the reference output, it assumes | 
|  | the difference resulted from a failure in one of the LLVM passes, and enters the | 
|  | `miscompilation debugger`_.  Otherwise, there is no problem ``bugpoint`` can | 
|  | debug. | 
|  |  | 
|  | .. _crash debugger: | 
|  |  | 
|  | Crash debugger | 
|  | -------------- | 
|  |  | 
|  | If an optimizer or code generator crashes, ``bugpoint`` will try as hard as it | 
|  | can to reduce the list of passes (for optimizer crashes) and the size of the | 
|  | test program.  First, ``bugpoint`` figures out which combination of optimizer | 
|  | passes triggers the bug. This is useful when debugging a problem exposed by | 
|  | ``opt``, for example, because it runs over 38 passes. | 
|  |  | 
|  | Next, ``bugpoint`` tries removing functions from the test program, to reduce its | 
|  | size.  Usually it is able to reduce a test program to a single function, when | 
|  | debugging intraprocedural optimizations.  Once the number of functions has been | 
|  | reduced, it attempts to delete various edges in the control flow graph, to | 
|  | reduce the size of the function as much as possible.  Finally, ``bugpoint`` | 
|  | deletes any individual LLVM instructions whose absence does not eliminate the | 
|  | failure.  At the end, ``bugpoint`` should tell you what passes crash, give you a | 
|  | bitcode file, and give you instructions on how to reproduce the failure with | 
|  | ``opt`` or ``llc``. | 
|  |  | 
|  | .. _code generator debugger: | 
|  |  | 
|  | Code generator debugger | 
|  | ----------------------- | 
|  |  | 
|  | The code generator debugger attempts to narrow down the amount of code that is | 
|  | being miscompiled by the selected code generator.  To do this, it takes the test | 
|  | program and partitions it into two pieces: one piece which it compiles with the | 
|  | "safe" backend (into a shared object), and one piece which it runs with either | 
|  | the JIT or the static LLC compiler.  It uses several techniques to reduce the | 
|  | amount of code pushed through the LLVM code generator, to reduce the potential | 
|  | scope of the problem.  After it is finished, it emits two bitcode files (called | 
|  | "test" [to be compiled with the code generator] and "safe" [to be compiled with | 
|  | the "safe" backend], respectively), and instructions for reproducing the | 
|  | problem.  The code generator debugger assumes that the "safe" backend produces | 
|  | good code. | 
|  |  | 
|  | .. _miscompilation debugger: | 
|  |  | 
|  | Miscompilation debugger | 
|  | ----------------------- | 
|  |  | 
|  | The miscompilation debugger works similarly to the code generator debugger.  It | 
|  | works by splitting the test program into two pieces, running the optimizations | 
|  | specified on one piece, linking the two pieces back together, and then executing | 
|  | the result.  It attempts to narrow down the list of passes to the one (or few) | 
|  | which are causing the miscompilation, then reduce the portion of the test | 
|  | program which is being miscompiled.  The miscompilation debugger assumes that | 
|  | the selected code generator is working properly. | 
|  |  | 
|  | Advice for using bugpoint | 
|  | ========================= | 
|  |  | 
|  | ``bugpoint`` can be a remarkably useful tool, but it sometimes works in | 
|  | non-obvious ways.  Here are some hints and tips: | 
|  |  | 
|  | * In the code generator and miscompilation debuggers, ``bugpoint`` only works | 
|  | with programs that have deterministic output.  Thus, if the program outputs | 
|  | ``argv[0]``, the date, time, or any other "random" data, ``bugpoint`` may | 
|  | misinterpret differences in these data, when output, as the result of a | 
|  | miscompilation.  Programs should be temporarily modified to disable outputs | 
|  | that are likely to vary from run to run. | 
|  |  | 
|  | * In the code generator and miscompilation debuggers, debugging will go faster | 
|  | if you manually modify the program or its inputs to reduce the runtime, but | 
|  | still exhibit the problem. | 
|  |  | 
|  | * ``bugpoint`` is extremely useful when working on a new optimization: it helps | 
|  | track down regressions quickly.  To avoid having to relink ``bugpoint`` every | 
|  | time you change your optimization however, have ``bugpoint`` dynamically load | 
|  | your optimization with the ``-load`` option. | 
|  |  | 
|  | * ``bugpoint`` can generate a lot of output and run for a long period of time. | 
|  | It is often useful to capture the output of the program to file.  For example, | 
|  | in the C shell, you can run: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ bugpoint  ... |& tee bugpoint.log | 
|  |  | 
|  | to get a copy of ``bugpoint``'s output in the file ``bugpoint.log``, as well | 
|  | as on your terminal. | 
|  |  | 
|  | * ``bugpoint`` cannot debug problems with the LLVM linker. If ``bugpoint`` | 
|  | crashes before you see its "All input ok" message, you might try ``llvm-link | 
|  | -v`` on the same set of input files. If that also crashes, you may be | 
|  | experiencing a linker bug. | 
|  |  | 
|  | * ``bugpoint`` is useful for proactively finding bugs in LLVM.  Invoking | 
|  | ``bugpoint`` with the ``-find-bugs`` option will cause the list of specified | 
|  | optimizations to be randomized and applied to the program. This process will | 
|  | repeat until a bug is found or the user kills ``bugpoint``. | 
|  |  | 
|  | * ``bugpoint`` can produce IR which contains long names. Run ``opt | 
|  | -metarenamer`` over the IR to rename everything using easy-to-read, | 
|  | metasyntactic names. Alternatively, run ``opt -strip -instnamer`` to rename | 
|  | everything with very short (often purely numeric) names. | 
|  |  | 
|  | What to do when bugpoint isn't enough | 
|  | ===================================== | 
|  |  | 
|  | Sometimes, ``bugpoint`` 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. | 
|  |  | 
|  | Turn on ``-debug-only=instcombine`` and see which transformations within | 
|  | instcombine are firing by selecting out lines with "``IC``" in them. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | 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 "``visit*``" methods of ``InstCombiner`` (*e.g.* | 
|  | ``visitICmpInst``) by adding a "``return false``" as the first line of the | 
|  | method. | 
|  |  | 
|  | If that still doesn't remove enough, then change the caller of | 
|  | ``InstCombiner::DoOneIteration``, ``InstCombiner::runOnFunction`` to limit the | 
|  | number of iterations. | 
|  |  | 
|  | You may also find it useful to use "``-stats``" now to see what parts of | 
|  | instcombine are firing.  This can guide where to put additional reporting code. | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. code-block:: c++ | 
|  |  | 
|  |  | 
|  | static int calledCount = 0; | 
|  | calledCount++; | 
|  | LLVM_DEBUG(if (calledCount < 212) return false); | 
|  | LLVM_DEBUG(if (calledCount > 217) return false); | 
|  | LLVM_DEBUG(if (calledCount == 213) return false); | 
|  | LLVM_DEBUG(if (calledCount == 214) return false); | 
|  | LLVM_DEBUG(if (calledCount == 215) return false); | 
|  | LLVM_DEBUG(if (calledCount == 216) return false); | 
|  | LLVM_DEBUG(dbgs() << "visitXOR calledCount: " << calledCount << "\n"); | 
|  | LLVM_DEBUG(dbgs() << "I: "; I->dump()); | 
|  |  | 
|  | could be added to ``visitXOR`` to limit ``visitXor`` 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 | 
|  | ``return SDNode();`` instead of ``return false;``. | 
|  |  | 
|  | Now 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. |