| This folder contains tests for MIR optimizations. |
| |
| The `mir-opt` test format emits MIR to extra files that you can automatically update by specifying |
| `--bless` on the command line (just like `ui` tests updating `.stderr` files). |
| |
| # `--bless`able test format |
| |
| By default 32 bit and 64 bit targets use the same dump files, which can be problematic in the |
| presence of pointers in constants or other bit width dependent things. In that case you can add |
| |
| ``` |
| // EMIT_MIR_FOR_EACH_BIT_WIDTH |
| ``` |
| |
| to your test, causing separate files to be generated for 32bit and 64bit systems. |
| |
| ## Testing a particular MIR pass |
| |
| If you are only testing the behavior of a particular mir-opt pass on some specific input (as is |
| usually the case), you should add |
| |
| ``` |
| //@ test-mir-pass: PassName |
| ``` |
| |
| to the top of the file. This makes sure that other passes don't run which means you'll get the input |
| you expected and your test won't break when other code changes. This also lets you test passes |
| that are disabled by default. |
| |
| ## Emit a diff of the mir for a specific optimization |
| |
| This is what you want most often when you want to see how an optimization changes the MIR. |
| |
| ``` |
| // EMIT_MIR $file_name_of_some_mir_dump.diff |
| ``` |
| |
| ## Emit mir after a specific optimization |
| |
| Use this if you are just interested in the final state after an optimization. |
| |
| ``` |
| // EMIT_MIR $file_name_of_some_mir_dump.after.mir |
| ``` |
| |
| ## Emit mir before a specific optimization |
| |
| This exists mainly for completeness and is rarely useful. |
| |
| ``` |
| // EMIT_MIR $file_name_of_some_mir_dump.before.mir |
| ``` |
| |
| # FileCheck directives |
| |
| The LLVM FileCheck tool is used to verify the contents of output MIR against `CHECK` directives |
| present in the test file. This works on the runtime MIR, generated by `--emit=mir`, and not |
| on the output of a individual passes. |
| |
| Use `// skip-filecheck` to prevent FileCheck from running. |
| |
| To check MIR for function `foo`, start with a `// CHECK-LABEL fn foo(` directive. |
| |
| `{{regex}}` syntax allows to match `regex`. |
| |
| `[[name:regex]]` syntax allows to bind `name` to a string matching `regex`, and refer to it |
| as `[[name]]` in later directives, `regex` should be written not to match a leading space. |
| Use `[[my_local:_.*]]` to name a local, and `[[my_bb:bb.*]]` to name a block. |
| |
| Documentation for FileCheck is available here: https://www.llvm.org/docs/CommandGuide/FileCheck.html |