OSDN Git Service

[NewPM] Fix a nasty bug with analysis invalidation in the new PM.
authorChandler Carruth <chandlerc@gmail.com>
Thu, 28 Mar 2019 00:51:36 +0000 (00:51 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Thu, 28 Mar 2019 00:51:36 +0000 (00:51 +0000)
commit1cb1b3036825d64640a5a872a89782b8bd7ee42a
treeab8f6f1d5fa70d63802be8c676c06a663e53b93b
parentc6e896237f6aece77ee49b92ec907d6937d62e78
[NewPM] Fix a nasty bug with analysis invalidation in the new PM.

The issue here is that we actually allow CGSCC passes to mutate IR (and
therefore invalidate analyses) outside of the current SCC. At a minimum,
we need to support mutating parent and ancestor SCCs to support the
ArgumentPromotion pass which rewrites all calls to a function.

However, the analysis invalidation infrastructure is heavily based
around not needing to invalidate the same IR-unit at multiple levels.
With Loop passes for example, they don't invalidate other Loops. So we
need to customize how we handle CGSCC invalidation. Doing this without
gratuitously re-running analyses is even harder. I've avoided most of
these by using an out-of-band preserved set to accumulate the cross-SCC
invalidation, but it still isn't perfect in the case of re-visiting the
same SCC repeatedly *but* it coming off the worklist. Unclear how
important this use case really is, but I wanted to call it out.

Another wrinkle is that in order for this to successfully propagate to
function analyses, we have to make sure we have a proxy from the SCC to
the Function level. That requires pre-creating the necessary proxy.

The motivating test case now works cleanly and is added for
ArgumentPromotion.

Thanks for the review from Philip and Wei!

Differential Revision: https://reviews.llvm.org/D59869

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357137 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/CGSCCPassManager.h
lib/Analysis/CGSCCPassManager.cpp
test/Other/new-pass-manager.ll
test/Other/new-pm-defaults.ll
test/Other/new-pm-thinlto-defaults.ll
test/Transforms/ArgumentPromotion/invalidation.ll [new file with mode: 0644]
test/Transforms/Inline/cgscc-incremental-invalidate.ll
unittests/Analysis/CGSCCPassManagerTest.cpp