remove polymorphization
This commit is contained in:
parent
fcadf9608b
commit
3ca330e1c3
|
|
@ -79,77 +79,3 @@ For more details about the partitioner read the module level [documentation].
|
||||||
[mono]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/fn.collect_and_partition_mono_items.html
|
[mono]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/fn.collect_and_partition_mono_items.html
|
||||||
[codegen1]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html
|
[codegen1]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html
|
||||||
[documentation]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/index.html
|
[documentation]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/index.html
|
||||||
|
|
||||||
## Polymorphization
|
|
||||||
|
|
||||||
As mentioned above, monomorphization produces fast code, but it comes at the
|
|
||||||
cost of compile time and binary size. [MIR optimizations][miropt] can help a
|
|
||||||
bit with this.
|
|
||||||
|
|
||||||
In addition to MIR optimizations, rustc attempts to determine when fewer
|
|
||||||
copies of functions are necessary and avoid making those copies - known
|
|
||||||
as "polymorphization". When a function-like item is found during
|
|
||||||
monomorphization collection, the
|
|
||||||
[`rustc_mir_monomorphize::polymorphize::unused_generic_params`][polymorph]
|
|
||||||
query is invoked, which traverses the MIR of the item to determine on which
|
|
||||||
generic parameters the item might not need duplicated.
|
|
||||||
|
|
||||||
Currently, polymorphization only looks for unused generic parameters. These
|
|
||||||
are relatively rare in functions, but closures inherit the generic
|
|
||||||
parameters of their parent function and it is common for closures to not
|
|
||||||
use those inherited parameters. Without polymorphization, a copy of these
|
|
||||||
closures would be created for each copy of the parent function. By
|
|
||||||
creating fewer copies, less LLVM IR is generated; therefore less needs to be processed.
|
|
||||||
|
|
||||||
`unused_generic_params` returns a `FiniteBitSet<u64>` where a bit is set if
|
|
||||||
the generic parameter of the corresponding index is unused. Any parameters
|
|
||||||
after the first sixty-four are considered used.
|
|
||||||
|
|
||||||
The results of polymorphization analysis are used in the
|
|
||||||
[`Instance::polymorphize`][inst_polymorph] function to replace the
|
|
||||||
[`Instance`][inst]'s substitutions for the unused generic parameters with their
|
|
||||||
identity substitutions.
|
|
||||||
|
|
||||||
Consider the example below:
|
|
||||||
|
|
||||||
```rust
|
|
||||||
fn foo<A, B>() {
|
|
||||||
let x: Option<B> = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
foo::<u16, u32>();
|
|
||||||
foo::<u64, u32>();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
During monomorphization collection, `foo` will be collected with the
|
|
||||||
substitutions `[u16, u32]` and `[u64, u32]` (from its invocations in `main`).
|
|
||||||
`foo` has the identity substitutions `[A, B]` (or
|
|
||||||
`[ty::Param(0), ty::Param(1)]`).
|
|
||||||
|
|
||||||
Polymorphization will identify `A` as being unused and it will be replaced in
|
|
||||||
the substitutions with the identity parameter before being added to the set
|
|
||||||
of collected items - thereby reducing the copies from two (`[u16, u32]` and
|
|
||||||
`[u64, u32]`) to one (`[A, u32]`).
|
|
||||||
|
|
||||||
`unused_generic_params` will also be invoked during code generation when the
|
|
||||||
symbol name for `foo` is being computed for use in the callsites of `foo`
|
|
||||||
(which have the regular substitutions present, otherwise there would be a
|
|
||||||
symbol mismatch between the caller and the function).
|
|
||||||
|
|
||||||
As a result of polymorphization, items collected during monomorphization
|
|
||||||
cannot be assumed to be monomorphic.
|
|
||||||
|
|
||||||
It is intended that polymorphization be extended to more advanced cases,
|
|
||||||
such as where only the size/alignment of a generic parameter are required.
|
|
||||||
|
|
||||||
More details on polymorphization are available in the
|
|
||||||
[master's thesis][thesis] associated with polymorphization's initial
|
|
||||||
implementation.
|
|
||||||
|
|
||||||
[miropt]: ../mir/optimizations.md
|
|
||||||
[polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/polymorphize/fn.unused_generic_params.html
|
|
||||||
[inst]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html
|
|
||||||
[inst_polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html#method.polymorphize
|
|
||||||
[thesis]: https://davidtw.co/media/masters_dissertation.pdf
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue