Skip to content

Commit 3ca330e

Browse files
Orion GonzalezBoxyUwU
Orion Gonzalez
authored andcommitted
remove polymorphization
1 parent fcadf96 commit 3ca330e

File tree

1 file changed

+0
-74
lines changed

1 file changed

+0
-74
lines changed

src/backend/monomorph.md

-74
Original file line numberDiff line numberDiff line change
@@ -79,77 +79,3 @@ For more details about the partitioner read the module level [documentation].
7979
[mono]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/fn.collect_and_partition_mono_items.html
8080
[codegen1]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html
8181
[documentation]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/partitioning/index.html
82-
83-
## Polymorphization
84-
85-
As mentioned above, monomorphization produces fast code, but it comes at the
86-
cost of compile time and binary size. [MIR optimizations][miropt] can help a
87-
bit with this.
88-
89-
In addition to MIR optimizations, rustc attempts to determine when fewer
90-
copies of functions are necessary and avoid making those copies - known
91-
as "polymorphization". When a function-like item is found during
92-
monomorphization collection, the
93-
[`rustc_mir_monomorphize::polymorphize::unused_generic_params`][polymorph]
94-
query is invoked, which traverses the MIR of the item to determine on which
95-
generic parameters the item might not need duplicated.
96-
97-
Currently, polymorphization only looks for unused generic parameters. These
98-
are relatively rare in functions, but closures inherit the generic
99-
parameters of their parent function and it is common for closures to not
100-
use those inherited parameters. Without polymorphization, a copy of these
101-
closures would be created for each copy of the parent function. By
102-
creating fewer copies, less LLVM IR is generated; therefore less needs to be processed.
103-
104-
`unused_generic_params` returns a `FiniteBitSet<u64>` where a bit is set if
105-
the generic parameter of the corresponding index is unused. Any parameters
106-
after the first sixty-four are considered used.
107-
108-
The results of polymorphization analysis are used in the
109-
[`Instance::polymorphize`][inst_polymorph] function to replace the
110-
[`Instance`][inst]'s substitutions for the unused generic parameters with their
111-
identity substitutions.
112-
113-
Consider the example below:
114-
115-
```rust
116-
fn foo<A, B>() {
117-
let x: Option<B> = None;
118-
}
119-
120-
fn main() {
121-
foo::<u16, u32>();
122-
foo::<u64, u32>();
123-
}
124-
```
125-
126-
During monomorphization collection, `foo` will be collected with the
127-
substitutions `[u16, u32]` and `[u64, u32]` (from its invocations in `main`).
128-
`foo` has the identity substitutions `[A, B]` (or
129-
`[ty::Param(0), ty::Param(1)]`).
130-
131-
Polymorphization will identify `A` as being unused and it will be replaced in
132-
the substitutions with the identity parameter before being added to the set
133-
of collected items - thereby reducing the copies from two (`[u16, u32]` and
134-
`[u64, u32]`) to one (`[A, u32]`).
135-
136-
`unused_generic_params` will also be invoked during code generation when the
137-
symbol name for `foo` is being computed for use in the callsites of `foo`
138-
(which have the regular substitutions present, otherwise there would be a
139-
symbol mismatch between the caller and the function).
140-
141-
As a result of polymorphization, items collected during monomorphization
142-
cannot be assumed to be monomorphic.
143-
144-
It is intended that polymorphization be extended to more advanced cases,
145-
such as where only the size/alignment of a generic parameter are required.
146-
147-
More details on polymorphization are available in the
148-
[master's thesis][thesis] associated with polymorphization's initial
149-
implementation.
150-
151-
[miropt]: ../mir/optimizations.md
152-
[polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_monomorphize/polymorphize/fn.unused_generic_params.html
153-
[inst]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html
154-
[inst_polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html#method.polymorphize
155-
[thesis]: https://davidtw.co/media/masters_dissertation.pdf

0 commit comments

Comments
 (0)