MimIR: The opt Plugin
MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
The opt Plugin

See also
mim::plug::opt

Manages the default compilation pipeline of Mim programs using plugins.

Dependencies

opt depends on compile and on mem, whose SEO is the general-purpose optimizer, so it references their phases directly. Every other plugin is referenced by name through compile.named (which resolves to the plugin's annex iff it is loaded) and compile.cond (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.

plugin compile;
plugin mem;

The default pipeline

extern lam _default_compile (): compile.Phase =
let optimize =
// fixed-point iteration off by default; enable with `-X compile:aggr`
compile.phases (compile.aggr ff) (
compile.scalarize,
compile.phases tt (
compile.beta_red,
compile.eta_conv,
),
mem.heap2stack,
mem.seo,
compile.adce,
compile.static_arg_opt,
);
compile.phases ff (
optimize,
// regex
compile.named "regex.lower_regex",
// tensor
compile.named "tensor.reassoc",
compile.named "tensor.lower_tensor",
compile.named "tensor.fuse_tensor",
compile.named "tensor.lower_to_mem",
// tensor bufferization emits mem.M placeholders that need a mem chain.
compile.cond "tensor" mem.add_mem,
// btensor
compile.named "gpu.lower_btensor_map_reduce",
compile.named "btensor.lower_map_reduce",
// gpu
compile.named "gpu.mem_checks",
// autodiff
compile.named "autodiff.eval",
compile.named "autodiff.zero_repl",
// buffer
compile.named "buffer.lower_ptr",
// affine + cps
compile.named "affine.lower_index",
compile.named "cps.conv",
compile.named "affine.lower_for",
// clos conv
let clos_opt_phases =
compile.phases ff (
compile.scalarize,
compile.named "clos.branch_clos",
mem.seo,
);
compile.cond "clos" (
compile.phases ff (
compile.named "clos.clos_conv_prep",
compile.named "clos.clos_conv",
clos_opt_phases,
compile.named "clos.lower_typed_clos_prep",
compile.named "clos.clos2sjlj",
// clos2sjlj introduces new branch closures; clean them up again
clos_opt_phases,
compile.named "clos.lower_typed_clos",
)
),
compile.lam_spec, // replace with lam-lifting
// type legalization
compile.nom_erasure,
compile.single_erasure,
// prepare codegen
optimize,
compile.dispatch_normalize,
compile.ret_wrap,
mem.free_locals,
mem.alloc2malloc_repl,
compile.named "refly.remove_dbg_repl",
compile.named "gpu.check_addr_spaces_repl",
compile.named "ll.emit",
compile.named "nvptx.emit",
);