CommonBlock =========== <:CommonBlock:> is an optimization pass for the <:SSA:> <:IntermediateLanguage:>, invoked from <:SSASimplify:>. == Description == It eliminates equivalent blocks in a <:SSA:> function. The equivalence criteria requires blocks to have no arguments or statements and transfer via `Raise`, `Return`, or `Goto` of a single global variable. == Implementation == * == Details and Notes == * Rewrites + ---- L_X () raise (global_Y) ---- + to + ---- L_X () L_Y' () ---- + and adds + ---- L_Y' () raise (global_Y) ---- + to the <:SSA:> function. * Rewrites + ---- L_X () return (global_Y) ---- + to + ---- L_X () L_Y' () ---- + and adds + ---- L_Y' () return (global_Y) ---- + to the <:SSA:> function. * Rewrites + ---- L_X () L_Z (global_Y) ---- + to + ---- L_X () L_Y' () ---- + and adds + ---- L_Y' () L_Z (global_Y) ---- + to the <:SSA:> function. The <:Shrink:> pass rewrites all uses of `L_X` to `L_Y'` and drops `L_X`. For example, all uncaught `Overflow` exceptions in a <:SSA:> function share the same raising block.