From dc1a361ccdc710f2ec4b77d054e132ce84b06904 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Thu, 13 Apr 2017 23:45:14 +0000 Subject: [PATCH] MIRLangRef: Add a section on simplifying .mir tests Differential Revision: http://reviews.llvm.org/D32058 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300282 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/MIRLangRef.rst | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/MIRLangRef.rst b/docs/MIRLangRef.rst index aa4655c4366..d5e227a2018 100644 --- a/docs/MIRLangRef.rst +++ b/docs/MIRLangRef.rst @@ -72,6 +72,53 @@ specific test directories (``lib/CodeGen/TARGETNAME``). They also need to specify a target triple or a target architecture either in the run line or in the embedded LLVM IR module. +Simplifying MIR files +^^^^^^^^^^^^^^^^^^^^^ + +The MIR code coming out of ``-stop-after``/``-stop-before`` is very verbose; +Tests are more accessible and future proof when simplified: + +- Machine function attributes often have default values or the test works just + as well with default values. Typical candidates for this are: `alignment:`, + `exposesReturnsTwice`, `legalized`, `regBankSelected`, `selected`. + The whole `frameInfo` section is often unnecessary if there is no special + frame usage in the function. `tracksRegLiveness` on the other hand is often + necessary for some passes that care about block livein lists. + +- The (global) `liveins:` list is typically only interesting for early + instruction selection passes and can be removed when testing later passes. + The per-block `liveins:` on the other hand are necessary if + `tracksRegLiveness` is true. + +- Branch probability data in block `successors:` lists can be dropped if the + test doesn't depend on it. Example: + `successors: %bb.1(0x40000000), %bb.2(0x40000000)` can be replaced with + `successors: %bb.1, %bb.2`. + +- MIR code contains a whole IR module. This is necessary because there are + no equivalents in MIR for global variables, references to external functions, + function attributes, metadata, debug info. Instead some MIR data references + the IR constructs. You can often remove them if the test doesn't depend on + them. + +- Alias Analysis is performed on IR values. These are referenced by memory + operands in MIR. Example: `:: (load 8 from %ir.foobar, !alias.scope !9)`. + If the test doesn't depend on (good) alias analysis the references can be + dropped: `:: (load 8)` + +- MIR blocks can reference IR blocks for debug printing, profile information + or debug locations. Example: `bb.42.myblock` in MIR references the IR block + `myblock`. It is usually possible to drop the `.myblock` reference and simply + use `bb.42`. + +- If there are no memory operands or blocks referencing the IR then the + IR function can be replaced by a parameterless dummy function like + `define @func() { ret void }`. + +- It is possible to drop the whole IR section of the MIR file if it only + contains dummy functions (see above). The .mir loader will create the + IR functions automatically in this case. + Limitations ----------- -- 2.50.1