fn should_encode_mir(
tcx: TyCtxt<'_>,
reachable_set: &LocalDefIdSet,
def_id: LocalDefId,
) -> (bool, bool)
Expand description
Whether we should encode MIR. Return a pair, resp. for CTFE and for LLVM.
Computing, optimizing and encoding the MIR is a relatively expensive operation. We want to avoid this work when not required. Therefore:
- we only compute
mir_for_ctfe
on items with const-eval semantics; - we skip
optimized_mir
for check runs. - we only encode
optimized_mir
that could be generated in other crates, that is, a code that is either generic or has inline hint, and is reachable from the other crates (contained in reachable set).
Note: Reachable set describes definitions that might be generated or referenced from other
crates and it can be used to limit optimized MIR that needs to be encoded. On the other hand,
the reachable set doesn’t have much to say about which definitions might be evaluated at compile
time in other crates, so it cannot be used to omit CTFE MIR. For example, f
below is
unreachable and yet it can be evaluated in other crates:
const fn f() -> usize { 0 }
pub struct S { pub a: [usize; f()] }