Index: llvm/include/llvm/Analysis/DependenceAnalysis.h =================================================================== --- llvm/include/llvm/Analysis/DependenceAnalysis.h +++ llvm/include/llvm/Analysis/DependenceAnalysis.h @@ -275,6 +275,10 @@ LoopInfo *LI) : AA(AA), SE(SE), LI(LI), F(F) {} + /// Handle transitive invalidation when the cached analysis results go away. + bool invalidate(Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &Inv); + /// depends - Tests for a dependence between the Src and Dst instructions. /// Returns NULL if no dependence; otherwise, returns a Dependence (or a /// FullDependence) with as much information as can be gleaned. Index: llvm/lib/Analysis/DependenceAnalysis.cpp =================================================================== --- llvm/lib/Analysis/DependenceAnalysis.cpp +++ llvm/lib/Analysis/DependenceAnalysis.cpp @@ -3369,6 +3369,19 @@ } #endif +bool DependenceInfo::invalidate(Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &Inv) { + // Check if the analysis itself has been invalidated. + auto PAC = PA.getChecker(); + if (!PAC.preserved() && !PAC.preservedSet>()) + return true; + + // Check transitive dependencies. + return Inv.invalidate(F, PA) || + Inv.invalidate(F, PA) || + Inv.invalidate(F, PA); +} + // depends - // Returns NULL if there is no dependence. // Otherwise, return a Dependence with as many details as possible. Index: llvm/test/Analysis/DependenceAnalysis/new-pm-invalidation.ll =================================================================== --- /dev/null +++ llvm/test/Analysis/DependenceAnalysis/new-pm-invalidation.ll @@ -0,0 +1,16 @@ +; RUN: opt < %s -passes='require,invalidate,print' \ +; RUN: -disable-output -debug-pass-manager 2>&1 | FileCheck %s + +; CHECK: Running analysis: DependenceAnalysis on test_no_noalias +; CHECK: Running analysis: ScalarEvolutionAnalysis on test_no_noalias +; CHECK: Invalidating analysis: ScalarEvolutionAnalysis on test_no_noalias +; CHECK: Invalidating analysis: DependenceAnalysis on test_no_noalias +; CHECK: Running analysis: DependenceAnalysis on test_no_noalias +; CHECK: da analyze - none! +; CHECK: da analyze - confused! +; CHECK: da analyze - none! +define void @test_no_noalias(i32* %A, i32* %B) { + store i32 1, i32* %A + store i32 2, i32* %B + ret void +}