[PM] Switch the downward invalidation to be incremental where only the
authorChandler Carruth <chandlerc@gmail.com>
Fri, 22 Nov 2013 23:38:07 +0000 (23:38 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 22 Nov 2013 23:38:07 +0000 (23:38 +0000)
commit4d32e85359363d2a6b3898a4d33322155b74eb67
tree0fc64be2c0f7282a97853e6312c3c85123d7ca94
parent2fd69d0fccd9cdfa91ea6a9e0ad2d8fe50f10b46
[PM] Switch the downward invalidation to be incremental where only the
one function's analyses are invalidated at a time. Also switch the
preservation of the proxy to *fully* preserve the lower (function)
analyses.

Combined, this gets both upward and downward analysis invalidation to
a point I'm happy with:

- A function pass invalidates its function analyses, and its parent's
  module analyses.
- A module pass invalidates all of its functions' analyses including the
  set of which functions are in the module.
- A function pass can preserve a module analysis pass.
- If all function passes preserve a module analysis pass, that
  preservation persists. If any doesn't the module analysis is
  invalidated.
- A module pass can opt into managing *all* function analysis
  invalidation itself or *none*.
- The conservative default is none, and the proxy takes the maximally
  conservative approach that works even if the set of functions has
  changed.
- If a module pass opts into managing function analysis invalidation it
  has to propagate the invalidation itself, the proxy just does nothing.

The only thing really missing is a way to query for a cached analysis or
nothing at all. With this, function passes can more safely request
a cached module analysis pass without fear of it accidentally running
part way through.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195519 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/IR/PassManager.h
lib/IR/PassManager.cpp
unittests/IR/PassManagerTest.cpp