compiler.cfg.save-contexts: refactoring of the vocab, using the simple-optimization combinator and union classes you can shorten it a lot
compiler.cfg.linear-scan.assignment: more docs and refactoring of the init-unhandled and assign-registers-in-block words
compiler.cfg.linear-scan.assignment: utility word heap-pop-while which lets you express expire-old-intervals and activate-new-intervals more nicely + tests
compiler.cfg.linear-scan.allocation: refactoring to simplify the (allocate-registers) recursion
compiler.cfg.linear-scan.*: refactoring to simplify init-allocator and get rid of init-unhandled
compiler.cfg.*: more docs
compiler.cfg.scheduling: refactoring to use the simple-optimization combinator
tools.gc-decode.tests: another tough test
compiler.cfg.linear-scan.allocation.*: maybe a fix for #1227

The register allocator pops from the unhandled-intervals and
unhandled-sync-points heaps. If two live intervals share the same
start slot, then they can be popped in either order leading to
differently generated code. So instead use one
heap (unhandled-min-heap) and both the start and end slot as the heap
key to resolve tie-breakers
compiler.cfg.linear-scan.allocation.state: doc fixing
compiler.cfg.linear-scan.allocation: using slurp-heap
compiler.cfg.linear-scan.assignment: forgot that i removed live-intervals>min-heap
compiler.cfg.linear-scan.allocation.state: don't use slot.syntax.