A mechanism for executing code against an IRScope or transforming the
IRScopes dependent data. A Compiler pass may or may not affect the state
of an IRScope (possibly including any child IRScopes) and it may
or may not depend on other compiler passes to execute first.
For dependencies between compiler passes, getDependencies will return
a list of all dependent passes. Those passes in turn will end up having
their own dependencies. The order of execution is depth-first, but if the
pass recognizes that the data it depends on already exists, then it does
not run the pass. It will just return the existing data. If you want to
guarantee (re)execution, then you should call invalidate().
The data that this pass is responsible for will get invalidated so that
if this pass is then execute()d it will generate new pass data. Note
that some data will destructively manipulate dependent compiler pass
data. In that case, the pass may wipe more than just it's data. In
that case an execute() should still rebuild everything fine because all
compiler passes list their dependencies.