Right now, each pass/analysis we port has to keep a legacy shim which is actually a nontrivial amount of code (although it varies from pass to pass). Perhaps most importantly it forces awkward patterns for the core pass logic, essentially requiring there to be 3 interfaces to be implemented: 1. the old PM interface 2. the new PM interface 3. a weird (and inconsistent across passes) meta-interface that both 1. and 2. can be implemented in terms of. Often, 3. takes the form of passing in the analysis objects explicitly or passing a callback that lazily constructs them.