add something for mir opt
This commit is contained in:
parent
0ff4bc9867
commit
3f6781eb0c
|
|
@ -1 +1,45 @@
|
|||
# MIR optimizations
|
||||
|
||||
MIR optimizations are optimizations run on the [MIR][mir] to produce better MIR
|
||||
before codegen. This is important for two reasons: first, it make the final
|
||||
generated executable code better, and second, it means that LLVM has less work
|
||||
to do, so compilation is faster.
|
||||
|
||||
[mir]: https://rust-lang.github.io/rustc-guide/mir/index.html
|
||||
|
||||
MIR optimizations run after borrow checking. We run a series of optimization
|
||||
passes over the MIR to improve it. Some passes are required to run on all code,
|
||||
some passes don't actually do optimizations but only check stuff, and some
|
||||
passes are only turned on in `release` mode.
|
||||
|
||||
The [`optimized_mir`][optmir] [query] is called to produce the optimized MIR
|
||||
for a given [`DefId`][defid]. This query makes sure that the borrow checker has
|
||||
run and that some validation has occured. Then, it [steals][steal] the MIR
|
||||
optimizes it, and returns the improved MIR.
|
||||
|
||||
[optmir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.optimized_mir.html
|
||||
[query]: https://rust-lang.github.io/rustc-guide/query.html
|
||||
[defid]: https://rust-lang.github.io/rustc-guide/appendix/glossary.html?highlight=DefId#appendix-c-glossary
|
||||
[steal]: https://rust-lang.github.io/rustc-guide/mir/passes.html?highlight=steal#stealing
|
||||
|
||||
## Defining optimization passes
|
||||
|
||||
The list of passes run and the order in which they are run is defined by the
|
||||
[`run_optimization_passes`][rop] function. It contains an array of passes to
|
||||
run. Each pass in the array is a struct that implements the [`MirPass`] trait.
|
||||
The array is an array of `&dyn MirPass` trait objects. Typically, a pass is
|
||||
implemented in its own submodule of the [`rustc_mir::transform`][trans] module.
|
||||
|
||||
[rop]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.run_optimization_passes.html
|
||||
[`MirPass`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/trait.MirPass.html
|
||||
[trans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/index.html
|
||||
|
||||
Some examples of passes are:
|
||||
- `CleanupNonCodegenStatements`: remove some of the info that is only need for
|
||||
analyses, rather than codegen.
|
||||
- `ConstProp`: Does [constant propagation][constprop]
|
||||
|
||||
You can see the ["Implementors" section of the `MirPass` rustdocs][impl] for more examples.
|
||||
|
||||
[impl]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/trait.MirPass.html#implementors
|
||||
[constprop]: https://en.wikipedia.org/wiki/Constant_folding#Constant_propagation
|
||||
|
|
|
|||
Loading…
Reference in New Issue