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",
);