A deep dive into value numbering as a compiler optimization technique. Covers local value numbering (LVN) for basic blocks using hash-consing, then extends to global value numbering (GVN) across control flow using dominator trees. Uses Maxine VM's Java implementation as a reference. Explains why pure vs. impure instructions
Table of contents
Eliminating common subexpressionsPure vs impureLocal value numberingGlobal value numberingState management and invalidationOut in the worldWrapping up; bits and bobblesSort: