Hoists all stack allocations to the entry basic block and maps class allocations to calls to the gc allocator.
Translates high-level casts to corresponding low-level instructions.
Translates Box/Unbox ops into static method calls.
Moves constant operands in Op.
Lowers class definitions, and field accesses to structs and corresponding derived pointer computation.
Translates high-level closures to corresponding class allocation.
Maps const values to top-level deduplicated constants.
For operations with constant operands and no side-effects, compute the resulting value
Propagates all copies down the use chain.
Eliminates pure computations that are not being used, as well as unused block parameters.
Translates high-level structural-type method calls into low-level dispatch based on a dynmethodtable
Hoists external members from external modules to top-level scope.
Eliminates redundant box/unbox operations within a single method definition.
Translates instance checks to range checks on type ids.
Translates high-level object-oriented method calls into low-level dispatch based on vtables for classes and dispatch tables for interfaces.
Lowers modules into module classes with singleton instance stored in a global variable that is accessed through a dedicated accessor function.
Short-circuits method calls that return nothing.
Simplifies single instruction patterns
Maps sizeof computation to pointer arithmetics over null pointer.
Maps string values to intrinsified global constants.
Eliminates traits and injects trait method and instance dispatch tables into the assembly.
Generates type instances for all classes, modules, traits and structs.
Eliminates returns of Unit values and replaces them with void.