SSA Destruction

SSA destruction compiler pass. It is preceded by and followed by compiler.cfg.linear-scan.

Because of the design of the register allocator, this pass has three peculiar properties.
Instead of renaming vreg usages in the CFG, a map from vregs to canonical representatives is computed. This allows the register allocator to use the original SSA names to get reaching definitions. See leader-map.
Useless ##copy instructions, and all ##phi instructions, are eliminated, so the register allocator does not have to remove any redundant operations.
This pass computes live sets and fills out the gc-roots slots of GC maps with compiler.cfg.liveness, so the linear scan register allocator does not need to compute liveness again.

Main entry point:
destruct-ssa ( cfg -- )