What do c2 Phases do?

On the Forums, someone asked the good question of "What do the C2 phases actually do?"  Andy got some info from our documentation team about the phases, so I thought I'd also add them here.  Expect this info in future version of the SDK:

 

Phase

Phase Action

CxxIL Reader

Converts CxxIL to Phoenix IR.

Warnings Analysis Detection Phase

Detects and emits back-end warnings (C4700, C4701, and so on).

Add CallGraph Call Site Information

Modifies call graph (if present) to refer to specific call sites within the function.

Inliner

Inlines functions.

Type Checker

Verifies that IR is correctly typed.

Flow Optimization

Streamlines control flow (for example, eliminates jumps to jumps).

MIR Lower

Lowers object model instructions.

Loop recognition and loop transformations

Performs basic loop restructuring.

Global optimization

Performs optimizations such as constant propagation, global value numbering, constant subexpression elimination, and dead code elimination.

Loop optimizations

Recognizes induction variables for strength reduction and loop-invariant code motion.

GS Shadow Copying

Implements the /GS option (stack security).

GS Security Cookie Allocation

Implements the /GS option (stack security).

X86 scalar Sse

Prepares the compiler to use SSE floating point instead of x87 floating point.

Canonicalize

Transforms IR to canonical form in preparation for lowering.

ShiftExpansion Strength Reduction

Transform multiplications and divisions by constants into shifts and additions.

Address Mode Builder

Transforms HIR/MIR to take advantage of target architecture's built-in addressing modes.

Lower

Lowers most instructions to machine level.

SSA-based idioms optimization phase

Performs classic "peephole" optimizations.

Priority Order Register Allocation

Assigns registers to operands.

X87 Stack Allocation

Allocates the x87 stack.

GS Security Cookie Initialization and Check

Implements the /GS option (stack security).

Native EH Lower

Expresses exception handling the way that the run-time convention expects.

Stack Packer

Assigns stack locations to operands.

Frame Generation

Determines shape of stack frame for the function.

Switch Lower

Lowers switch instructions.

Dead Stores

Removes dead stores (that is, stores that are guaranteed not to be read).

Block Layout

Places IR in final order.

Flow Optimization

Removes jump-to-jump and jump-to-next instructions.

Finish EH Lower

Finishes the process begun by Native EH Lower.

Encoding

Produces machine encoding for IR, and debug information.

Emission

Puts encoded IR into the object file.

Emit Referenced Symbols

Verifies the references made from the encoded IR to ensure that the compiler emits a fully closed set of functions and data.

Assembly Listing

Produces the .asm listing file.