- See also
- mim::plug::opt
Manages the default compilation pipeline of Mim programs using plugins.
Dependencies
opt only depends on compile. Every other plugin is referenced by name through compile.named_phase / compile.named_pass / compile.named_repl (which resolve to the plugin's annexes iff it is loaded) and compile.cond_phase (which gates a whole sub-pipeline on a plugin being loaded). This way the default pipeline does not have to import any of the optional plugins.
Inlined partial pipelines
These used to live in the respective plugins; they are inlined here so that opt does not depend on them. All foreign passes/phases are referenced by name.
let mem_opt_passes =
%compile.passes (
%compile.named_pass "%mem.ssa_pass",
%compile.named_pass "%mem.copy_prop_ff_pass",
);
let direct_phases =
%compile.phases ff (
%compile.named_phase "%direct.ds2cps_phase",
%compile.named_phase "%direct.cps2ds_phase",
optimization_phase,
);
let matrix_lower_phase =
%compile.phases ff (
%compile.pass2phase (
%compile.passes (
%compile.named_pass "%matrix.lower_matrix_high_level_map_reduce",
%compile.named_pass "%matrix.lower_matrix_medium_level",
)
),
%compile.named_phase "%matrix.lower_matrix_low_level",
);
let clos_opt1_passes =
%compile.passes (
%compile.eta_red_pass tt,
%compile.eta_exp_pass,
%compile.scalarize_pass,
);
let clos_opt2_passes =
%compile.passes (
%compile.scalarize_pass,
%compile.named_pass "%clos.branch_clos_pass",
%compile.named_pass "%mem.copy_prop_tt_pass",
%compile.named_pass "%clos.lower_typed_clos_prep_pass",
%compile.named_pass "%clos.clos2sjlj_pass",
);
let clos_phases =
%compile.phases ff (
optimization_phase,
%compile.pass2phase (%compile.named_pass "%mem.reshape_flat_pass"),
%compile.named_phase "%mem.add_mem_phase",
%compile.pass2phase (%compile.named_pass "%clos.clos_conv_prep_pass"),
%compile.pass2phase %compile.eta_exp_pass,
%compile.named_phase "%clos.clos_conv_phase",
%compile.pass2phase clos_opt1_passes,
%compile.pass2phase clos_opt2_passes,
%compile.named_phase "%clos.lower_typed_clos_phase",
);
The default pipeline
lam extern _default_compile (): %compile.Phase =
%compile.phases ff (
%compile.pass2phase %compile.scalarize_pass,
%compile.pass2phase (%compile.eta_red_pass ff),
%compile.pass2phase %compile.tail_rec_elim_pass,
%compile.pass2phase (%compile.named_pass "%regex.lower_regex"),
// optimize
%compile.phases tt (
%compile.beta_red_phase,
%compile.eta_red_phase,
),
%compile.eta_exp_phase,
%compile.sym_expr_opt,
%compile.cond_phase "tensor" (
%compile.phases ff (
%compile.named_phase "%tensor.lower_tensor",
%compile.named_phase "%tensor.fuse_tensor",
%compile.named_phase "%tensor.lower_map_reduce",
)
),
%compile.named_phase "%affine.lower_index_phase",
%compile.named_phase "%affine.lower_for_phase",
%compile.pass2phase (
%compile.passes (
optimization_passes,
mem_opt_passes,
)
),
%compile.cond_phase "autodiff" (
%compile.phases ff (
%compile.pass2phase (%compile.named_pass "%autodiff.eval_pass"),
%compile.repl2phase (%compile.named_repl "%autodiff.zero_repl"),
)
),
%compile.cond_phase "direct" direct_phases,
%compile.cond_phase "matrix" (
%compile.phases ff (
matrix_lower_phase,
%compile.cond_phase "direct" direct_phases,
)
),
%compile.named_phase "%affine.lower_for_phase",
%compile.internal_cleanup_phase,
%compile.cond_phase "clos" clos_phases,
%compile.pass2phase %compile.lam_spec_pass,
// CodeGenPrep
%compile.branch_normalize_phase,
%compile.ret_wrap_phase,
%compile.repl2phase (
%compile.repls (
%compile.named_repl "%mem.remem_repl",
%compile.named_repl "%mem.alloc2malloc_repl",
%compile.named_repl "%refly.remove_dbg_repl",
%compile.named_repl "%gpu.malloc2gpualloc_repl",
)
),
// emit LLVM IR to <world>.ll iff the `ll` plugin is loaded (`-p ll`)
%compile.named_phase "%ll.emit",
);